mirror of
https://github.com/raphnet/gc_n64_usb-v3
synced 2025-01-30 23:00:11 -05:00
New gcn64 transmit function (faster, lighter)
This commit is contained in:
parent
df629e9d28
commit
d36b9ee4ee
115
gcn64_protocol.c
115
gcn64_protocol.c
@ -109,6 +109,7 @@ void gcn64_protocol_getBytes(int offset, int n_bytes, unsigned char *dstbuf)
|
|||||||
#define TIMING_OFFSET 100 // gives about 12uS. Twice the expected maximum bit period.
|
#define TIMING_OFFSET 100 // gives about 12uS. Twice the expected maximum bit period.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if 1
|
||||||
static unsigned int gcn64_receive()
|
static unsigned int gcn64_receive()
|
||||||
{
|
{
|
||||||
register unsigned int count=0;
|
register unsigned int count=0;
|
||||||
@ -179,7 +180,119 @@ static unsigned int gcn64_receive()
|
|||||||
|
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void gcn64_sendBytes(unsigned char *data, unsigned char n_bytes)
|
||||||
|
{
|
||||||
|
|
||||||
|
// the value of the gpio is pre-configured to low. We simulate
|
||||||
|
// an open drain output by toggling the direction.
|
||||||
|
#define PULL_DATA " sbi %0, "GCN64_BIT_NUM_S"\n"
|
||||||
|
#define RELEASE_DATA " cbi %0, "GCN64_BIT_NUM_S"\n"
|
||||||
|
|
||||||
|
asm volatile(
|
||||||
|
"mov r23, %2 \n"
|
||||||
|
"tst r23 \n"
|
||||||
|
"breq done_send \n"
|
||||||
|
|
||||||
|
"send_next_byte: \n"
|
||||||
|
"; Check if this is the last byte. \n"
|
||||||
|
"tst r23 \n"
|
||||||
|
"breq send_stop \n"
|
||||||
|
"dec r23 \n"
|
||||||
|
"ld r16, z+ \n"
|
||||||
|
"ldi r17, 0x80 ; mask \n"
|
||||||
|
|
||||||
|
"send_next_bit: \n"
|
||||||
|
"mov r19, r16 \n"
|
||||||
|
"and r19, r17 \n"
|
||||||
|
"brne send1 \n"
|
||||||
|
"nop \n"
|
||||||
|
|
||||||
|
"send0: \n"
|
||||||
|
PULL_DATA
|
||||||
|
// "sbi IO_DDRD, DATA_BIT ; Pull bus to 0 \n"
|
||||||
|
|
||||||
|
"ldi r20, 15 \n"
|
||||||
|
"lp_send0_3us: \n"
|
||||||
|
"dec r20 \n"
|
||||||
|
"brne lp_send0_3us \n"
|
||||||
|
"nop \n"
|
||||||
|
|
||||||
|
RELEASE_DATA
|
||||||
|
// "cbi IO_DDRD, DATA_BIT ; Release bus to 1 \n"
|
||||||
|
"lsr r17 \n"
|
||||||
|
"breq send_next_byte \n"
|
||||||
|
"nop \n"
|
||||||
|
"nop \n"
|
||||||
|
"nop \n"
|
||||||
|
"nop \n"
|
||||||
|
"nop \n"
|
||||||
|
"nop \n"
|
||||||
|
"rjmp send_next_bit \n"
|
||||||
|
|
||||||
|
"send1: \n"
|
||||||
|
PULL_DATA
|
||||||
|
// "sbi IO_DDRD, DATA_BIT ; Pull bus to 0 \n"
|
||||||
|
|
||||||
|
"ldi r20, 4 \n"
|
||||||
|
"lp_send1_1us: \n"
|
||||||
|
"dec r20 \n"
|
||||||
|
"brne lp_send1_1us \n"
|
||||||
|
"nop \n"
|
||||||
|
"nop \n"
|
||||||
|
|
||||||
|
RELEASE_DATA
|
||||||
|
// "cbi IO_DDRD, DATA_BIT ; Release bus to 1 \n"
|
||||||
|
|
||||||
|
"ldi r20, 10 \n"
|
||||||
|
"lp_send1_3us: \n"
|
||||||
|
"dec r20 \n"
|
||||||
|
"brne lp_send1_3us \n"
|
||||||
|
"nop \n"
|
||||||
|
"nop \n"
|
||||||
|
|
||||||
|
"lsr r17 \n"
|
||||||
|
"breq send_next_byte \n"
|
||||||
|
"nop \n"
|
||||||
|
"nop \n"
|
||||||
|
"nop \n"
|
||||||
|
"nop \n"
|
||||||
|
"nop \n"
|
||||||
|
"nop \n"
|
||||||
|
"rjmp send_next_bit \n"
|
||||||
|
|
||||||
|
"send_stop: \n"
|
||||||
|
"nop \n"
|
||||||
|
"nop \n"
|
||||||
|
"nop \n"
|
||||||
|
"nop \n"
|
||||||
|
"nop \n"
|
||||||
|
"nop \n"
|
||||||
|
"nop \n"
|
||||||
|
"nop \n"
|
||||||
|
|
||||||
|
" ; STOP BIT \n"
|
||||||
|
PULL_DATA
|
||||||
|
//" sbi IO_DDRD, DATA_BIT ; Pull low for stop bit \n"
|
||||||
|
" ldi r20, 4 \n"
|
||||||
|
"stbdly0: \n"
|
||||||
|
" dec r20 \n"
|
||||||
|
" brne stbdly0 \n"
|
||||||
|
" nop \n"
|
||||||
|
RELEASE_DATA
|
||||||
|
//" cbi IO_DDRD, DATA_BIT ; Release \n"
|
||||||
|
|
||||||
|
"done_send: \n"
|
||||||
|
:
|
||||||
|
: "I" (_SFR_IO_ADDR(GCN64_DATA_DDR)), // %0
|
||||||
|
"z" ((unsigned char volatile *)gcn64_workbuf), // %1 (Z)
|
||||||
|
"r" (n_bytes) // %2
|
||||||
|
: "r19","r16","r17","r20","r23" );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
static void gcn64_sendBytes(unsigned char *data, unsigned char n_bytes)
|
static void gcn64_sendBytes(unsigned char *data, unsigned char n_bytes)
|
||||||
{
|
{
|
||||||
unsigned int bits;
|
unsigned int bits;
|
||||||
@ -289,7 +402,7 @@ static void gcn64_sendBytes(unsigned char *data, unsigned char n_bytes)
|
|||||||
"I" (_SFR_IO_ADDR(GCN64_DATA_PIN)) // %3
|
"I" (_SFR_IO_ADDR(GCN64_DATA_PIN)) // %3
|
||||||
: "r16", "r17");
|
: "r16", "r17");
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* \brief Decode the received length of low/high states to byte-per-bit format
|
/* \brief Decode the received length of low/high states to byte-per-bit format
|
||||||
*
|
*
|
||||||
|
Loading…
Reference in New Issue
Block a user