]> git.donarmstrong.com Git - tmk_firmware.git/commitdiff
Fix software serial configure
authortmk <nobody@nowhere>
Sun, 24 Feb 2013 23:40:15 +0000 (08:40 +0900)
committertmk <nobody@nowhere>
Mon, 25 Feb 2013 05:14:46 +0000 (14:14 +0900)
converter/pc98_usb/config.h
converter/sun_usb/config.h
protocol/serial_soft.c

index 04ee5b1101bbc1627fd2f79be6a566c1520443ab..4f91c07ce440e6777c926983acc1a4388579282b 100644 (file)
@@ -69,11 +69,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #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<<SERIAL_SOFT_RXD_BIT))
-#else
-    #define SERIAL_SOFT_RXD_READ()      (SERIAL_SOFT_RXD_PIN&(1<<SERIAL_SOFT_RXD_BIT))
-#endif
+#define SERIAL_SOFT_RXD_READ()          (SERIAL_SOFT_RXD_PIN&(1<<SERIAL_SOFT_RXD_BIT))
 /* RXD Interupt */
 #define SERIAL_SOFT_RXD_VECT            INT2_vect
 #define SERIAL_SOFT_RXD_INIT()          do { \
@@ -95,21 +91,8 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #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<<SERIAL_SOFT_TXD_BIT); \
-    } while (0)
-    #define SERIAL_SOFT_TXD_OFF()       do { \
-        SERIAL_SOFT_TXD_PORT |=  (1<<SERIAL_SOFT_TXD_BIT); \
-    } while (0)
-#else
-    #define SERIAL_SOFT_TXD_ON()        do { \
-        SERIAL_SOFT_TXD_PORT |=  (1<<SERIAL_SOFT_TXD_BIT); \
-    } while (0)
-    #define SERIAL_SOFT_TXD_OFF()       do { \
-        SERIAL_SOFT_TXD_PORT &= ~(1<<SERIAL_SOFT_TXD_BIT); \
-    } while (0)
-#endif
+#define SERIAL_SOFT_TXD_HI()            do { SERIAL_SOFT_TXD_PORT |=  (1<<SERIAL_SOFT_TXD_BIT); } while (0)
+#define SERIAL_SOFT_TXD_LO()            do { SERIAL_SOFT_TXD_PORT &= ~(1<<SERIAL_SOFT_TXD_BIT); } while (0)
 #define SERIAL_SOFT_TXD_INIT()          do { \
     /* pin configuration: output */ \
     SERIAL_SOFT_TXD_DDR |= (1<<SERIAL_SOFT_TXD_BIT); \
index b4f0ff977a46db6319f0cfe2f6561c88adbf3a11..65ce9daf6102a432652612a0c9c023292f5bec54 100644 (file)
@@ -43,40 +43,46 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
  *     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<<SERIAL_RXD_BIT);     \
-    SERIAL_RXD_PORT |= (1<<SERIAL_RXD_BIT);     \
-    /* enable interrupt: INT2(rising edge) */   \
-    EICRA |= ((1<<ISC21)|(1<<ISC20));           \
-    EIMSK |= (1<<INT2);                         \
+    SERIAL_SOFT_RXD_DDR &= ~(1<<SERIAL_SOFT_RXD_BIT); \
+    SERIAL_SOFT_RXD_PORT |= (1<<SERIAL_SOFT_RXD_BIT); \
+    /* enable interrupt: INT2(rising edge) */ \
+    EICRA |= ((1<<ISC21)|(1<<ISC20)); \
+    EIMSK |= (1<<INT2); \
+    sei(); \
 } while (0)
-#define SERIAL_RXD_INT_ENTER()
-#define SERIAL_RXD_INT_EXIT() do {  \
-    /* clear interrupt  flag */     \
-    EIFR = (1<<INTF2);              \
+#define SERIAL_SOFT_RXD_INT_ENTER()
+#define SERIAL_SOFT_RXD_INT_EXIT()  do { \
+    /* clear interrupt  flag */ \
+    EIFR = (1<<INTF2); \
 } while (0)
-#define SERIAL_RXD_READ()    (~SERIAL_RXD_PIN&(1<<SERIAL_RXD_BIT))
-
-#define SERIAL_TXD_DDR  DDRD
-#define SERIAL_TXD_PORT PORTD
-#define SERIAL_TXD_PIN  PIND
-#define SERIAL_TXD_BIT  3
-/* negative logic */
-#define SERIAL_TXD_ON()     do { SERIAL_TXD_PORT &= ~(1<<SERIAL_TXD_BIT); } while (0)
-#define SERIAL_TXD_OFF()    do { SERIAL_TXD_PORT |=  (1<<SERIAL_TXD_BIT); } while (0)
-#define SERIAL_TXD_INIT()   do { \
-    /* pin configuration: output */         \
-    SERIAL_TXD_DDR |= (1<<SERIAL_TXD_BIT);  \
-    /* idle */                              \
-    SERIAL_TXD_ON();                        \
+#define SERIAL_SOFT_RXD_READ()      (SERIAL_SOFT_RXD_PIN&(1<<SERIAL_SOFT_RXD_BIT))
+/* TXD Port */
+#define SERIAL_SOFT_TXD_ENABLE
+#define SERIAL_SOFT_TXD_DDR         DDRD
+#define SERIAL_SOFT_TXD_PORT        PORTD
+#define SERIAL_SOFT_TXD_PIN         PIND
+#define SERIAL_SOFT_TXD_BIT         3
+#define SERIAL_SOFT_TXD_HI()        do { SERIAL_SOFT_TXD_PORT |=  (1<<SERIAL_SOFT_TXD_BIT); } while (0)
+#define SERIAL_SOFT_TXD_LO()        do { SERIAL_SOFT_TXD_PORT &= ~(1<<SERIAL_SOFT_TXD_BIT); } while (0)
+#define SERIAL_SOFT_TXD_INIT()      do { \
+    /* pin configuration: output */ \
+    SERIAL_SOFT_TXD_DDR |= (1<<SERIAL_SOFT_TXD_BIT); \
+    /* idle */ \
+    SERIAL_SOFT_TXD_ON(); \
 } while (0)
 
 #endif
index c906c664727c200ff7bfb1d7a933ee6e922e655d..e8870bcd795f33efe89a6f7c26770de1882fd710 100644 (file)
@@ -43,12 +43,32 @@ POSSIBILITY OF SUCH DAMAGE.
 
 /*
  *  Stupid Inefficient Busy-wait Software Serial
- *  is still useful for negative logic signal like Sun protocol not supported by hardware USART.
+ *  which is still useful for negative logic signal like Sun protocol
+ *  if it is not supported by hardware UART.
+ *
+ *  TODO: delay is not accurate enough. Instruction cycle should be counted and inline assemby is needed.
  */
 
-#define WAIT_US     (1000000L/SERIAL_BAUD)
+#define WAIT_US     (1000000L/SERIAL_SOFT_BAUD)
+
+#ifdef SERIAL_SOFT_LOGIC_NEGATIVE
+    #define SERIAL_SOFT_RXD_IN()        !(SERIAL_SOFT_RXD_READ())
+    #define SERIAL_SOFT_TXD_ON()        SERIAL_SOFT_TXD_LO()
+    #define SERIAL_SOFT_TXD_OFF()       SERIAL_SOFT_TXD_HI()
+#else
+    #define SERIAL_SOFT_RXD_IN()        !!(SERIAL_SOFT_RXD_READ())
+    #define SERIAL_SOFT_TXD_ON()        SERIAL_SOFT_TXD_HI()
+    #define SERIAL_SOFT_TXD_OFF()       SERIAL_SOFT_TXD_LO()
+#endif
+
+#ifdef SERIAL_SOFT_PARITY_EVEN
+    #define SERIAL_SOFT_PARITY_VAL      0
+#elif defined(SERIAL_SOFT_PARITY_ODD)
+    #define SERIAL_SOFT_PARITY_VAL      1
+#endif
 
 /* debug for signal timing, see debug pin with oscilloscope */
+#define SERIAL_SOFT_DEBUG
 #ifdef SERIAL_SOFT_DEBUG
     #define SERIAL_SOFT_DEBUG_INIT()    (DDRD |= 1<<7)
     #define SERIAL_SOFT_DEBUG_TGL()     (PORTD ^= 1<<7)
@@ -62,8 +82,8 @@ void serial_init(void)
 {
     SERIAL_SOFT_DEBUG_INIT();
 
-    SERIAL_RXD_INIT();
-    SERIAL_TXD_INIT();
+    SERIAL_SOFT_RXD_INIT();
+    SERIAL_SOFT_TXD_INIT();
 }
 
 /* RX ring buffer */
@@ -101,109 +121,97 @@ void serial_send(uint8_t data)
 {
     /* signal state: IDLE: ON, START: OFF, STOP: ON, DATA0: OFF, DATA1: ON */
 
-#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 = 1;
-#elif defined(SERIAL_PARITY_EVEN)
     uint8_t parity = 0;
-#endif
 
     /* start bit */
-    SERIAL_TXD_OFF();
-    _delay_us(WAIT_US-2);
+    SERIAL_SOFT_TXD_OFF();
+    _delay_us(WAIT_US);
 
     while (mask) {
         if (data&mask) {
-            SERIAL_TXD_ON();
-#if defined(SERIAL_PARITY_EVEN) || defined(SERIAL_PARITY_ODD)
+            SERIAL_SOFT_TXD_ON();
             parity ^= 1;
-#endif
         } else {
-            SERIAL_TXD_OFF();
+            SERIAL_SOFT_TXD_OFF();
         }
-        _delay_us(WAIT_US-2);
+        _delay_us(WAIT_US);
 
-#ifdef SERIAL_BIT_ORDER_MSB
+#ifdef SERIAL_SOFT_BIT_ORDER_MSB
         mask >>= 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();
 }