X-Git-Url: https://git.friedersdorff.com/?a=blobdiff_plain;f=protocol%2Fserial_soft.c;h=3c9c914ed6d9c7e4e7ac21c6913c708e640863ff;hb=6215727b0bd827a18456b21a26d6175abe365ada;hp=47b1e4571df7d70845f9e31f9696552e5b7f13fc;hpb=eb776c1b7918f320b717cedfd8957f55e53c5adf;p=max%2Ftmk_keyboard.git diff --git a/protocol/serial_soft.c b/protocol/serial_soft.c index 47b1e457..3c9c914e 100644 --- a/protocol/serial_soft.c +++ b/protocol/serial_soft.c @@ -48,25 +48,20 @@ POSSIBILITY OF SUCH DAMAGE. #define WAIT_US (1000000/SERIAL_BAUD) -#if 1 -#define WAIT_TICK (1000000/SERIAL_BAUD) -#define WAIT4(tick) _delay_us(tick) +/* debug for signal timing, see debug pin with oscilloscope */ +#ifdef SERIAL_SOFT_DEBUG + #define SERIAL_SOFT_DEBUG_INIT() (DDRD |= 1<<7) + #define SERIAL_SOFT_DEBUG_TGL() (PORTD ^= 1<<7) #else -#define WAIT_TICK ((16000000/SERIAL_BAUD)/4 - 5) -static inline void WAIT4(uint8_t tick) -{ - __asm__ __volatile__ ( - "1: dec %0" "\n\t" - "nop" "\n\t" - "brne 1b" - : - : "r" (tick) - ); -} + #define SERIAL_SOFT_DEBUG_INIT() + #define SERIAL_SOFT_DEBUG_TGL() #endif + void serial_init(void) { + SERIAL_SOFT_DEBUG_INIT(); + SERIAL_RXD_INIT(); SERIAL_TXD_INIT(); } @@ -90,6 +85,18 @@ uint8_t serial_recv(void) return data; } +int16_t serial_recv2(void) +{ + uint8_t data = 0; + if (rbuf_head == rbuf_tail) { + return -1; + } + + data = rbuf[rbuf_tail]; + rbuf_tail = (rbuf_tail + 1) % RBUF_SIZE; + return data; +} + void serial_send(uint8_t data) { /* signal state: IDLE: ON, START: OFF, STOP: ON, DATA0: OFF, DATA1: ON */ @@ -121,7 +128,7 @@ void serial_send(uint8_t data) /* detect edge of start bit */ ISR(SERIAL_RXD_VECT) { -PORTD ^= 1<<7; + SERIAL_SOFT_DEBUG_TGL() SERIAL_RXD_INT_ENTER() uint8_t data = 0; @@ -134,23 +141,23 @@ PORTD ^= 1<<7; #ifdef SERIAL_PARITY_ODD uint8_t parity = 0; -#else +#elif defined(SERIAL_PARITY_EVEN) uint8_t parity = 1; #endif /* to center of start bit */ - //_delay_us(WAIT_US/2); - WAIT4(WAIT_TICK/2); -PORTD ^= 1<<7; + _delay_us(WAIT_US/2); + SERIAL_SOFT_DEBUG_TGL() do { /* to center of next bit */ - //_delay_us(WAIT_US); - WAIT4(WAIT_TICK); + _delay_us(WAIT_US); -PORTD ^= 1<<7; + SERIAL_SOFT_DEBUG_TGL() if (SERIAL_RXD_READ()) { data |= mask; +#if defined(SERIAL_PARITY_EVEN) || defined(SERIAL_PARITY_ODD) parity ^= 1; +#endif } #ifdef SERIAL_BIT_ORDER_MSB mask >>= 1; @@ -159,23 +166,26 @@ PORTD ^= 1<<7; #endif } while (mask); +#if defined(SERIAL_PARITY_EVEN) || defined(SERIAL_PARITY_ODD) /* to center of parity bit */ - //_delay_us(WAIT_US); - WAIT4(WAIT_TICK); + _delay_us(WAIT_US); if (SERIAL_RXD_READ()) { parity ^= 1; } -PORTD ^= 1<<7; + SERIAL_SOFT_DEBUG_TGL() +#endif /* to center of stop bit */ - //_delay_us(WAIT_US); - WAIT4(WAIT_TICK); + _delay_us(WAIT_US); uint8_t next = (rbuf_head + 1) % RBUF_SIZE; - //if (parity && next != rbuf_tail) { +#if defined(SERIAL_PARITY_EVEN) || defined(SERIAL_PARITY_ODD) + if (parity && next != rbuf_tail) { +#else if (next != rbuf_tail) { +#endif rbuf[rbuf_head] = data; rbuf_head = next; } SERIAL_RXD_INT_EXIT(); -PORTD ^= 1<<7; + SERIAL_SOFT_DEBUG_TGL() }