Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- __xdata struct { uint8_t r [ 252 ], t [ 124 ]; } jay_buf;
- struct { uint8_t r, t; } jay_ind, jay_len;
- uint16_t jay_numbits;
- const uint8_t jay_caps [ 4 ] = { 3, 8, 2 }; /* hw_ver free_mem sel_if */
- const uint8_t jay_free_mem [ 4 ] = { 0xFC }; /* 252 */
- const uint8_t jay_hw_stat [ 8 ] = { 5, 0xD }; /* 3333 */
- const uint8_t jay_hw_ver [ 4 ] = { 0xD1, 0x2F, 1 }; /* 77777 */
- const uint8_t jay_sel_if [ 4 ] = { 2 }; /* mask */
- const uint8_t jay_ver [ 0x22 ] = "\x20\x00Jay CH55x";
- void jay_init ( void ) {
- GPIO_SWCLOCK( 0 );
- GPIO_SWCLOCK_MODE();
- GPIO_SWDIN_MODE();
- jay_ind.r = jay_len.r = 0;
- jay_ind.t = jay_len.t = 0;
- }
- void jay_reply ( uint8_t *buf, uint8_t len ) {
- jay_ind.t = jay_len.t = 0;
- for( uint8_t i = 0; i < len; i++ ) jay_buf.t[ jay_len.t++ ] = buf[ i ];
- }
- uint8_t jay_protocol ( void ) {
- switch( jay_buf.r[ 0 ] ) {
- case 0x01 : jay_reply( jay_ver, sizeof( jay_ver ));
- break;
- case 0x07 : jay_reply( jay_hw_stat, sizeof( jay_hw_stat ));
- break;
- case 0xC7 : jay_reply( jay_sel_if, sizeof( jay_sel_if ));
- if( jay_buf.r[ 1 ] != 0xFF ) jay_buf.t[ 0 ] = 1;
- break;
- case 0xCF : jay_numbits = *(( uint16_t* ) &jay_buf.r[ 2 ] );
- return 4 + 2 * (( jay_numbits + 7 ) >> 3 );
- case 0xD4 : jay_reply( jay_free_mem, sizeof( jay_free_mem ));
- break;
- case 0xDC : GPIO_RESET( 0 );
- break;
- case 0xDD : GPIO_RESET( 1 );
- break;
- case 0xE8 : jay_reply( jay_caps, sizeof( jay_caps ));
- break;
- case 0xF0 : jay_reply( jay_hw_ver, sizeof( jay_hw_ver ));
- }
- return 0;
- }
- void jay_swd ( void ) {
- uint8_t dir, in, mask, out;
- dir = in = mask = out = 0;
- jay_ind.r = 4;
- jay_len.r = 4 + (( jay_numbits + 7 ) >> 3 );
- jay_ind.t = jay_len.t = 0;
- while( jay_numbits-- ) {
- if( mask == 0 ) {
- mask = 1;
- dir = jay_buf.r[ jay_ind.r++ ];
- out = jay_buf.r[ jay_len.r++ ];
- in = 0;
- }
- if( dir & mask ) {
- GPIO_SWDOUT_MODE();
- GPIO_SWDOUT( out & mask );
- } else {
- GPIO_SWDIN_MODE();
- }
- GPIO_SWCLOCK( 0 ); GPIO_DELAY();
- GPIO_SWCLOCK( 1 ); GPIO_DELAY();
- in |= GPIO_SWDIN() ? mask : 0;
- mask <<= 1;
- if( mask == 0 ) jay_buf.t[ jay_len.t++ ] = in;
- }
- if( mask ) jay_buf.t[ jay_len.t++ ] = in;
- jay_buf.t[ jay_len.t++ ] = 0;
- GPIO_SWCLOCK( 0 );
- }
- void jay_poll ( uint8_t *rbuf, uint8_t *rlen, uint8_t *tbuf, uint8_t *tlen ) {
- uint8_t i, len;
- if( jay_len.t ) {
- if( *tlen == 0 ) {
- len = jay_len.t - jay_ind.t;
- if( len > 64 ) len = 64; else if( len > 1 ) len--;
- for( i = 0; i < len; i++ ) tbuf[ i ] = jay_buf.t[ jay_ind.t++ ];
- if( jay_ind.t >= jay_len.t ) jay_ind.t = jay_len.t = 0;
- *tlen = len;
- }
- } else if( *rlen ) {
- len = *rlen;
- for( i = 0; i < len; i++ ) jay_buf.r[ jay_ind.r++ ] = rbuf[ i ];
- if( jay_len.r == 0 ) jay_len.r = jay_protocol();
- if( jay_ind.r >= jay_len.r ) {
- if( jay_buf.r[ 0 ] == 0xCF ) jay_swd();
- jay_ind.r = jay_len.r = 0;
- }
- *rlen = 0;
- }
- }
Advertisement
Advertisement
Advertisement
RAW Paste Data
Copied
Advertisement