From f68c5bf0d30dc1300c71dabc63d2c2970f7337c9 Mon Sep 17 00:00:00 2001 From: tmk Date: Fri, 22 Feb 2013 09:53:46 +0900 Subject: Add initial files for PC98 --- protocol/serial_soft.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) (limited to 'protocol/serial_soft.c') diff --git a/protocol/serial_soft.c b/protocol/serial_soft.c index beddc353c0..e0661c3aa1 100644 --- a/protocol/serial_soft.c +++ b/protocol/serial_soft.c @@ -106,11 +106,19 @@ ISR(SERIAL_RXD_VECT) SERIAL_RXD_INT_ENTER() uint8_t data = 0; + #ifdef SERIAL_BIT_ORDER_MSB uint8_t mask = 0x80; #else uint8_t mask = 0x01; #endif + +#ifdef SERIAL_PARITY_ODD + uint8_t parity = 0; +#else + uint8_t parity = 1; +#endif + /* to center of start bit */ _delay_us(WAIT_US/2); do { @@ -119,6 +127,7 @@ ISR(SERIAL_RXD_VECT) if (SERIAL_RXD_READ()) { data |= mask; + parity ^= 1; } #ifdef SERIAL_BIT_ORDER_MSB mask >>= 1; @@ -126,11 +135,18 @@ ISR(SERIAL_RXD_VECT) mask <<= 1; #endif } while (mask); + + /* to center of parity bit */ + _delay_us(WAIT_US); + parity ^= SERIAL_RXD_READ(); + /* to center of stop bit */ _delay_us(WAIT_US); + _delay_us(WAIT_US/2); + parity = 1; uint8_t next = (rbuf_head + 1) % RBUF_SIZE; - if (next != rbuf_tail) { + if (parity && next != rbuf_tail) { rbuf[rbuf_head] = data; rbuf_head = next; } -- cgit v1.2.3 From eb776c1b7918f320b717cedfd8957f55e53c5adf Mon Sep 17 00:00:00 2001 From: tmk Date: Fri, 22 Feb 2013 15:48:35 +0900 Subject: Quick Fix: read scan code from PC98 --- converter/pc98_usb/config.h | 9 ++++++--- converter/pc98_usb/matrix.c | 6 ++++++ protocol/serial_soft.c | 42 ++++++++++++++++++++++++++++++++++-------- 3 files changed, 46 insertions(+), 11 deletions(-) (limited to 'protocol/serial_soft.c') diff --git a/converter/pc98_usb/config.h b/converter/pc98_usb/config.h index 8bcaa26db9..6f9f8fc3cf 100644 --- a/converter/pc98_usb/config.h +++ b/converter/pc98_usb/config.h @@ -55,7 +55,7 @@ along with this program. If not, see . */ #define SERIAL_BAUD 19200 #define SERIAL_PARITY_ODD -#define SERIAL_BIT_ORDER_MSB +#define SERIAL_BIT_ORDER_LSB #define SERIAL_RXD_DDR DDRD #define SERIAL_RXD_PORT PORTD @@ -67,7 +67,9 @@ along with this program. If not, see . SERIAL_RXD_DDR &= ~(1<. /* clear interrupt flag */ \ EIFR = (1< Date: Fri, 22 Feb 2013 19:38:06 +0900 Subject: Fix softwere serial --- protocol/serial.h | 1 + protocol/serial_soft.c | 44 +++++++++++++++++--------------------------- 2 files changed, 18 insertions(+), 27 deletions(-) (limited to 'protocol/serial_soft.c') diff --git a/protocol/serial.h b/protocol/serial.h index bd071bec92..96913c8675 100644 --- a/protocol/serial.h +++ b/protocol/serial.h @@ -41,6 +41,7 @@ POSSIBILITY OF SUCH DAMAGE. /* host role */ void serial_init(void); uint8_t serial_recv(void); +int16_t serial_recv2(void); void serial_send(uint8_t data); #endif diff --git a/protocol/serial_soft.c b/protocol/serial_soft.c index 47b1e4571d..af5110b4f6 100644 --- a/protocol/serial_soft.c +++ b/protocol/serial_soft.c @@ -48,23 +48,6 @@ POSSIBILITY OF SUCH DAMAGE. #define WAIT_US (1000000/SERIAL_BAUD) -#if 1 -#define WAIT_TICK (1000000/SERIAL_BAUD) -#define WAIT4(tick) _delay_us(tick) -#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) - ); -} -#endif - void serial_init(void) { SERIAL_RXD_INIT(); @@ -90,6 +73,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 */ @@ -139,13 +134,11 @@ PORTD ^= 1<<7; #endif /* to center of start bit */ - //_delay_us(WAIT_US/2); - WAIT4(WAIT_TICK/2); + _delay_us(WAIT_US/2); PORTD ^= 1<<7; do { /* to center of next bit */ - //_delay_us(WAIT_US); - WAIT4(WAIT_TICK); + _delay_us(WAIT_US); PORTD ^= 1<<7; if (SERIAL_RXD_READ()) { @@ -160,18 +153,15 @@ PORTD ^= 1<<7; } while (mask); /* 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; /* 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 (next != rbuf_tail) { + if (parity && next != rbuf_tail) { rbuf[rbuf_head] = data; rbuf_head = next; } -- cgit v1.2.3 From 6215727b0bd827a18456b21a26d6175abe365ada Mon Sep 17 00:00:00 2001 From: tmk Date: Sat, 23 Feb 2013 14:32:34 +0900 Subject: Fix debug code of serial_soft.c --- protocol/serial_soft.c | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) (limited to 'protocol/serial_soft.c') diff --git a/protocol/serial_soft.c b/protocol/serial_soft.c index af5110b4f6..3c9c914ed6 100644 --- a/protocol/serial_soft.c +++ b/protocol/serial_soft.c @@ -48,8 +48,20 @@ POSSIBILITY OF SUCH DAMAGE. #define WAIT_US (1000000/SERIAL_BAUD) +/* 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 SERIAL_SOFT_DEBUG_INIT() + #define SERIAL_SOFT_DEBUG_TGL() +#endif + + void serial_init(void) { + SERIAL_SOFT_DEBUG_INIT(); + SERIAL_RXD_INIT(); SERIAL_TXD_INIT(); } @@ -116,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; @@ -129,21 +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); -PORTD ^= 1<<7; + SERIAL_SOFT_DEBUG_TGL() do { /* to center of next bit */ _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; @@ -152,20 +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); if (SERIAL_RXD_READ()) { parity ^= 1; } -PORTD ^= 1<<7; + SERIAL_SOFT_DEBUG_TGL() +#endif /* to center of stop bit */ _delay_us(WAIT_US); uint8_t next = (rbuf_head + 1) % RBUF_SIZE; +#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() } -- cgit v1.2.3 From 90e6ff92f44511c7ef75f62ceaa186458be3dba2 Mon Sep 17 00:00:00 2001 From: tmk Date: Mon, 25 Feb 2013 01:02:14 +0900 Subject: Add parity option in serial_soft.c --- protocol/serial_soft.c | 39 ++++++++++++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 7 deletions(-) (limited to 'protocol/serial_soft.c') diff --git a/protocol/serial_soft.c b/protocol/serial_soft.c index 3c9c914ed6..c906c66472 100644 --- a/protocol/serial_soft.c +++ b/protocol/serial_soft.c @@ -46,7 +46,7 @@ POSSIBILITY OF SUCH DAMAGE. * is still useful for negative logic signal like Sun protocol not supported by hardware USART. */ -#define WAIT_US (1000000/SERIAL_BAUD) +#define WAIT_US (1000000L/SERIAL_BAUD) /* debug for signal timing, see debug pin with oscilloscope */ #ifdef SERIAL_SOFT_DEBUG @@ -100,18 +100,33 @@ int16_t serial_recv2(void) void serial_send(uint8_t data) { /* signal state: IDLE: ON, START: OFF, STOP: ON, DATA0: OFF, DATA1: ON */ - /* start bit */ - SERIAL_TXD_OFF(); - _delay_us(WAIT_US); #ifdef SERIAL_BIT_ORDER_MSB uint8_t mask = 0x80; #else uint8_t mask = 0x01; #endif + +#ifdef SERIAL_PARITY_ODD + uint8_t parity = 1; +#elif defined(SERIAL_PARITY_EVEN) + uint8_t parity = 0; +#endif + + /* start bit */ + SERIAL_TXD_OFF(); + _delay_us(WAIT_US-2); + while (mask) { - if (data&mask) { SERIAL_TXD_ON(); } else { SERIAL_TXD_OFF(); } - _delay_us(WAIT_US); + if (data&mask) { + SERIAL_TXD_ON(); +#if defined(SERIAL_PARITY_EVEN) || defined(SERIAL_PARITY_ODD) + parity ^= 1; +#endif + } else { + SERIAL_TXD_OFF(); + } + _delay_us(WAIT_US-2); #ifdef SERIAL_BIT_ORDER_MSB mask >>= 1; @@ -120,9 +135,19 @@ void serial_send(uint8_t data) #endif } +#if defined(SERIAL_PARITY_EVEN) || defined(SERIAL_PARITY_ODD) + /* to center of parity bit */ + if (parity) { + SERIAL_TXD_ON(); + } else { + SERIAL_TXD_OFF(); + } + _delay_us(WAIT_US-2); +#endif + /* stop bit */ SERIAL_TXD_ON(); - _delay_us(WAIT_US); + _delay_us(WAIT_US-2); } /* detect edge of start bit */ -- cgit v1.2.3 From 308abf598d4cc19be3c5b137bbd13d18510a083a Mon Sep 17 00:00:00 2001 From: tmk Date: Mon, 25 Feb 2013 08:40:15 +0900 Subject: Fix software serial configure --- converter/pc98_usb/config.h | 23 ++--------- converter/sun_usb/config.h | 68 +++++++++++++++++-------------- protocol/serial_soft.c | 98 ++++++++++++++++++++++++--------------------- 3 files changed, 93 insertions(+), 96 deletions(-) (limited to 'protocol/serial_soft.c') diff --git a/converter/pc98_usb/config.h b/converter/pc98_usb/config.h index 04ee5b1101..4f91c07ce4 100644 --- a/converter/pc98_usb/config.h +++ b/converter/pc98_usb/config.h @@ -69,11 +69,7 @@ along with this program. If not, see . #define SERIAL_SOFT_RXD_PORT PORTD #define SERIAL_SOFT_RXD_PIN PIND #define SERIAL_SOFT_RXD_BIT 2 -#ifdef SERIAL_SOFT_LOGIC_NEGATIVE - #define SERIAL_SOFT_RXD_READ() ~(SERIAL_SOFT_RXD_PIN&(1<. #define SERIAL_SOFT_TXD_PORT PORTD #define SERIAL_SOFT_TXD_PIN PIND #define SERIAL_SOFT_TXD_BIT 3 -#ifdef SERIAL_SOFT_LOGIC_NEGATIVE - #define SERIAL_SOFT_TXD_ON() do { \ - SERIAL_SOFT_TXD_PORT &= ~(1<. * asynchronous, negative logic, 1200baud, no flow control * 1-start bit, 8-data bit, non parity, 1-stop bit */ -#define SERIAL_BAUD 1200 - -#define SERIAL_RXD_DDR DDRD -#define SERIAL_RXD_PORT PORTD -#define SERIAL_RXD_PIN PIND -#define SERIAL_RXD_BIT 2 -#define SERIAL_RXD_VECT INT2_vect -#define SERIAL_RXD_INIT() do { \ +#define SERIAL_SOFT_BAUD 1200 +#define SERIAL_SOFT_PARITY_NONE +#define SERIAL_SOFT_BIT_ORDER_LSB +#define SERIAL_SOFT_LOGIC_NEGATIVE +/* RXD Port */ +#define SERIAL_SOFT_RXD_ENABLE +#define SERIAL_SOFT_RXD_DDR DDRD +#define SERIAL_SOFT_RXD_PORT PORTD +#define SERIAL_SOFT_RXD_PIN PIND +#define SERIAL_SOFT_RXD_BIT 2 +#define SERIAL_SOFT_RXD_VECT INT2_vect +/* RXD Interupt */ +#define SERIAL_SOFT_RXD_INIT() do { \ /* pin configuration: input with pull-up */ \ - SERIAL_RXD_DDR &= ~(1<>= 1; #else mask <<= 1; #endif } -#if defined(SERIAL_PARITY_EVEN) || defined(SERIAL_PARITY_ODD) +#if defined(SERIAL_SOFT_PARITY_EVEN) || defined(SERIAL_SOFT_PARITY_ODD) /* to center of parity bit */ - if (parity) { - SERIAL_TXD_ON(); + if (parity != SERIAL_SOFT_PARITY_VAL) { + SERIAL_SOFT_TXD_ON(); } else { - SERIAL_TXD_OFF(); + SERIAL_SOFT_TXD_OFF(); } - _delay_us(WAIT_US-2); + _delay_us(WAIT_US); #endif /* stop bit */ - SERIAL_TXD_ON(); - _delay_us(WAIT_US-2); + SERIAL_SOFT_TXD_ON(); + _delay_us(WAIT_US); } /* detect edge of start bit */ -ISR(SERIAL_RXD_VECT) +ISR(SERIAL_SOFT_RXD_VECT) { - SERIAL_SOFT_DEBUG_TGL() - SERIAL_RXD_INT_ENTER() + SERIAL_SOFT_DEBUG_TGL(); + SERIAL_SOFT_RXD_INT_ENTER() uint8_t data = 0; -#ifdef SERIAL_BIT_ORDER_MSB +#ifdef SERIAL_SOFT_BIT_ORDER_MSB uint8_t mask = 0x80; #else uint8_t mask = 0x01; #endif -#ifdef SERIAL_PARITY_ODD uint8_t parity = 0; -#elif defined(SERIAL_PARITY_EVEN) - uint8_t parity = 1; -#endif /* to center of start bit */ _delay_us(WAIT_US/2); - SERIAL_SOFT_DEBUG_TGL() + SERIAL_SOFT_DEBUG_TGL(); do { /* to center of next bit */ _delay_us(WAIT_US); - SERIAL_SOFT_DEBUG_TGL() - if (SERIAL_RXD_READ()) { + SERIAL_SOFT_DEBUG_TGL(); + if (SERIAL_SOFT_RXD_IN()) { data |= mask; -#if defined(SERIAL_PARITY_EVEN) || defined(SERIAL_PARITY_ODD) parity ^= 1; -#endif } -#ifdef SERIAL_BIT_ORDER_MSB +#ifdef SERIAL_SOFT_BIT_ORDER_MSB mask >>= 1; #else mask <<= 1; #endif } while (mask); -#if defined(SERIAL_PARITY_EVEN) || defined(SERIAL_PARITY_ODD) +#if defined(SERIAL_SOFT_PARITY_EVEN) || defined(SERIAL_SOFT_PARITY_ODD) /* to center of parity bit */ _delay_us(WAIT_US); - if (SERIAL_RXD_READ()) { parity ^= 1; } - SERIAL_SOFT_DEBUG_TGL() + if (SERIAL_SOFT_RXD_IN()) { parity ^= 1; } + SERIAL_SOFT_DEBUG_TGL(); #endif /* to center of stop bit */ _delay_us(WAIT_US); uint8_t next = (rbuf_head + 1) % RBUF_SIZE; -#if defined(SERIAL_PARITY_EVEN) || defined(SERIAL_PARITY_ODD) - if (parity && next != rbuf_tail) { +#if defined(SERIAL_SOFT_PARITY_EVEN) || defined(SERIAL_SOFT_PARITY_ODD) + if ((parity == SERIAL_SOFT_PARITY_VAL) && next != rbuf_tail) { #else if (next != rbuf_tail) { #endif @@ -211,6 +219,6 @@ ISR(SERIAL_RXD_VECT) rbuf_head = next; } - SERIAL_RXD_INT_EXIT(); - SERIAL_SOFT_DEBUG_TGL() + SERIAL_SOFT_RXD_INT_EXIT(); + SERIAL_SOFT_DEBUG_TGL(); } -- cgit v1.2.3