]> git.donarmstrong.com Git - qmk_firmware.git/blobdiff - tmk_core/protocol/iwrap/suart.S
fix the clueboard layout json
[qmk_firmware.git] / tmk_core / protocol / iwrap / suart.S
index 1b029096384df159b37019b2eeb0e40b237f7eb0..a873515e1041a6130a1ea9717b0b2e8830bf98e1 100644 (file)
-;---------------------------------------------------------------------------;\r
-; Software implemented UART module                                          ;\r
-; (C)ChaN, 2005 (http://elm-chan.org/)                                      ;\r
-;---------------------------------------------------------------------------;\r
-; Bit rate settings:\r
-;\r
-;            1MHz  2MHz  4MHz  6MHz  8MHz  10MHz  12MHz  16MHz  20MHz\r
-;   2.4kbps   138     -     -     -     -      -      -      -      -\r
-;   4.8kbps    68   138     -     -     -      -      -      -      -\r
-;   9.6kbps    33    68   138   208     -      -      -      -      -\r
-;  19.2kbps     -    33    68   102   138    173    208      -      -\r
-;  38.4kbps     -     -    33    50    68     85    102    138    172\r
-;  57.6kbps     -     -    21    33    44     56     68     91    114\r
-; 115.2kbps     -     -     -     -    21     27     33     44     56\r
-\r
-.nolist\r
-#include <avr/io.h>\r
-.list\r
-\r
-#define        BPS     102     /* Bit delay. (see above table) */\r
-#define        BIDIR   0       /* 0:Separated Tx/Rx, 1:Shared Tx/Rx */\r
-\r
-#define        OUT_1           sbi _SFR_IO_ADDR(SUART_OUT_PORT), SUART_OUT_BIT /* Output 1 */\r
-#define        OUT_0           cbi _SFR_IO_ADDR(SUART_OUT_PORT), SUART_OUT_BIT /* Output 0 */\r
-#define        SKIP_IN_1       sbis _SFR_IO_ADDR(SUART_IN_PIN), SUART_IN_BIT   /* Skip if 1 */\r
-#define        SKIP_IN_0       sbic _SFR_IO_ADDR(SUART_IN_PIN), SUART_IN_BIT   /* Skip if 0 */\r
-\r
-\r
-\r
-#ifdef SPM_PAGESIZE\r
-.macro _LPMI   reg\r
-       lpm     \reg, Z+\r
-.endm\r
-.macro _MOVW   dh,dl, sh,sl\r
-       movw    \dl, \sl\r
-.endm\r
-#else\r
-.macro _LPMI   reg\r
-       lpm\r
-       mov     \reg, r0\r
-       adiw    ZL, 1\r
-.endm\r
-.macro _MOVW   dh,dl, sh,sl\r
-       mov     \dl, \sl\r
-       mov     \dh, \sh\r
-.endm\r
-#endif\r
-\r
-\r
-\r
-;---------------------------------------------------------------------------;\r
-; Transmit a byte in serial format of N81\r
-;\r
-;Prototype: void xmit (uint8_t data);\r
-;Size: 16 words\r
-\r
-.global xmit\r
-.func xmit\r
-xmit:\r
-#if BIDIR\r
-       ldi     r23, BPS-1      ;Pre-idle time for bidirectional data line\r
-5:     dec     r23             ;\r
-       brne    5b              ;/\r
-#endif\r
-       in      r0, _SFR_IO_ADDR(SREG)  ;Save flags\r
-\r
-       com     r24             ;C = start bit\r
-       ldi     r25, 10         ;Bit counter\r
-       cli                     ;Start critical section\r
-\r
-1:     ldi     r23, BPS-1      ;----- Bit transferring loop \r
-2:     dec     r23             ;Wait for a bit time\r
-       brne    2b              ;/\r
-       brcs    3f              ;MISO = bit to be sent\r
-       OUT_1                   ;\r
-3:     brcc    4f              ;\r
-       OUT_0                   ;/\r
-4:     lsr     r24             ;Get next bit into C\r
-       dec     r25             ;All bits sent?\r
-       brne    1b              ;  no, coutinue\r
-\r
-       out     _SFR_IO_ADDR(SREG), r0  ;End of critical section\r
-       ret\r
-.endfunc\r
-\r
-\r
-\r
-;---------------------------------------------------------------------------;\r
-; Receive a byte\r
-;\r
-;Prototype: uint8_t rcvr (void);\r
-;Size: 19 words\r
-\r
-.global rcvr\r
-.func rcvr\r
-rcvr:\r
-       in      r0, _SFR_IO_ADDR(SREG)  ;Save flags\r
-\r
-       ldi     r24, 0x80       ;Receiving shift reg\r
-       cli                     ;Start critical section\r
-\r
-1:     SKIP_IN_1               ;Wait for idle\r
-       rjmp    1b\r
-2:     SKIP_IN_0               ;Wait for start bit\r
-       rjmp    2b\r
-       ldi     r25, BPS/2      ;Wait for half bit time\r
-3:     dec     r25\r
-       brne    3b\r
-\r
-4:     ldi     r25, BPS        ;----- Bit receiving loop\r
-5:     dec     r25             ;Wait for a bit time\r
-       brne    5b              ;/\r
-       lsr     r24             ;Next bit\r
-       SKIP_IN_0               ;Get a data bit into r24.7\r
-       ori     r24, 0x80\r
-       brcc    4b              ;All bits received?  no, continue\r
-\r
-       out     _SFR_IO_ADDR(SREG), r0  ;End of critical section\r
-       ret\r
-.endfunc\r
-\r
-\r
-; Not wait for start bit. This should be called after detecting start bit.\r
-.global recv\r
-.func recv\r
-recv:\r
-       in      r0, _SFR_IO_ADDR(SREG)  ;Save flags\r
-\r
-       ldi     r24, 0x80       ;Receiving shift reg\r
-       cli                     ;Start critical section\r
-\r
-;1:    SKIP_IN_1               ;Wait for idle\r
-;      rjmp    1b\r
-;2:    SKIP_IN_0               ;Wait for start bit\r
-;      rjmp    2b\r
-       ldi     r25, BPS/2      ;Wait for half bit time\r
-3:     dec     r25\r
-       brne    3b\r
-\r
-4:     ldi     r25, BPS        ;----- Bit receiving loop\r
-5:     dec     r25             ;Wait for a bit time\r
-       brne    5b              ;/\r
-       lsr     r24             ;Next bit\r
-       SKIP_IN_0               ;Get a data bit into r24.7\r
-       ori     r24, 0x80\r
-       brcc    4b              ;All bits received?  no, continue\r
-\r
-       ldi     r25, BPS/2      ;Wait for half bit time\r
-6:     dec     r25\r
-       brne    6b\r
-7:     SKIP_IN_1               ;Wait for stop bit\r
-       rjmp    7b\r
-\r
-       out     _SFR_IO_ADDR(SREG), r0  ;End of critical section\r
-       ret\r
-.endfunc\r
+;---------------------------------------------------------------------------;
+; Software implemented UART module                                          ;
+; (C)ChaN, 2005 (http://elm-chan.org/)                                      ;
+;---------------------------------------------------------------------------;
+; Bit rate settings:
+;
+;            1MHz  2MHz  4MHz  6MHz  8MHz  10MHz  12MHz  16MHz  20MHz
+;   2.4kbps   138     -     -     -     -      -      -      -      -
+;   4.8kbps    68   138     -     -     -      -      -      -      -
+;   9.6kbps    33    68   138   208     -      -      -      -      -
+;  19.2kbps     -    33    68   102   138    173    208      -      -
+;  38.4kbps     -     -    33    50    68     85    102    138    172
+;  57.6kbps     -     -    21    33    44     56     68     91    114
+; 115.2kbps     -     -     -     -    21     27     33     44     56
+
+.nolist
+#include <avr/io.h>
+.list
+
+#define        BPS     102     /* Bit delay. (see above table) */
+#define        BIDIR   0       /* 0:Separated Tx/Rx, 1:Shared Tx/Rx */
+
+#define        OUT_1           sbi _SFR_IO_ADDR(SUART_OUT_PORT), SUART_OUT_BIT /* Output 1 */
+#define        OUT_0           cbi _SFR_IO_ADDR(SUART_OUT_PORT), SUART_OUT_BIT /* Output 0 */
+#define        SKIP_IN_1       sbis _SFR_IO_ADDR(SUART_IN_PIN), SUART_IN_BIT   /* Skip if 1 */
+#define        SKIP_IN_0       sbic _SFR_IO_ADDR(SUART_IN_PIN), SUART_IN_BIT   /* Skip if 0 */
+
+
+
+#ifdef SPM_PAGESIZE
+.macro _LPMI   reg
+       lpm     \reg, Z+
+.endm
+.macro _MOVW   dh,dl, sh,sl
+       movw    \dl, \sl
+.endm
+#else
+.macro _LPMI   reg
+       lpm
+       mov     \reg, r0
+       adiw    ZL, 1
+.endm
+.macro _MOVW   dh,dl, sh,sl
+       mov     \dl, \sl
+       mov     \dh, \sh
+.endm
+#endif
+
+
+
+;---------------------------------------------------------------------------;
+; Transmit a byte in serial format of N81
+;
+;Prototype: void xmit (uint8_t data);
+;Size: 16 words
+
+.global xmit
+.func xmit
+xmit:
+#if BIDIR
+       ldi     r23, BPS-1      ;Pre-idle time for bidirectional data line
+5:     dec     r23             ;
+       brne    5b              ;/
+#endif
+       in      r0, _SFR_IO_ADDR(SREG)  ;Save flags
+
+       com     r24             ;C = start bit
+       ldi     r25, 10         ;Bit counter
+       cli                     ;Start critical section
+
+1:     ldi     r23, BPS-1      ;----- Bit transferring loop 
+2:     dec     r23             ;Wait for a bit time
+       brne    2b              ;/
+       brcs    3f              ;MISO = bit to be sent
+       OUT_1                   ;
+3:     brcc    4f              ;
+       OUT_0                   ;/
+4:     lsr     r24             ;Get next bit into C
+       dec     r25             ;All bits sent?
+       brne    1b              ;  no, coutinue
+
+       out     _SFR_IO_ADDR(SREG), r0  ;End of critical section
+       ret
+.endfunc
+
+
+
+;---------------------------------------------------------------------------;
+; Receive a byte
+;
+;Prototype: uint8_t rcvr (void);
+;Size: 19 words
+
+.global rcvr
+.func rcvr
+rcvr:
+       in      r0, _SFR_IO_ADDR(SREG)  ;Save flags
+
+       ldi     r24, 0x80       ;Receiving shift reg
+       cli                     ;Start critical section
+
+1:     SKIP_IN_1               ;Wait for idle
+       rjmp    1b
+2:     SKIP_IN_0               ;Wait for start bit
+       rjmp    2b
+       ldi     r25, BPS/2      ;Wait for half bit time
+3:     dec     r25
+       brne    3b
+
+4:     ldi     r25, BPS        ;----- Bit receiving loop
+5:     dec     r25             ;Wait for a bit time
+       brne    5b              ;/
+       lsr     r24             ;Next bit
+       SKIP_IN_0               ;Get a data bit into r24.7
+       ori     r24, 0x80
+       brcc    4b              ;All bits received?  no, continue
+
+       out     _SFR_IO_ADDR(SREG), r0  ;End of critical section
+       ret
+.endfunc
+
+
+; Not wait for start bit. This should be called after detecting start bit.
+.global recv
+.func recv
+recv:
+       in      r0, _SFR_IO_ADDR(SREG)  ;Save flags
+
+       ldi     r24, 0x80       ;Receiving shift reg
+       cli                     ;Start critical section
+
+;1:    SKIP_IN_1               ;Wait for idle
+;      rjmp    1b
+;2:    SKIP_IN_0               ;Wait for start bit
+;      rjmp    2b
+       ldi     r25, BPS/2      ;Wait for half bit time
+3:     dec     r25
+       brne    3b
+
+4:     ldi     r25, BPS        ;----- Bit receiving loop
+5:     dec     r25             ;Wait for a bit time
+       brne    5b              ;/
+       lsr     r24             ;Next bit
+       SKIP_IN_0               ;Get a data bit into r24.7
+       ori     r24, 0x80
+       brcc    4b              ;All bits received?  no, continue
+
+       ldi     r25, BPS/2      ;Wait for half bit time
+6:     dec     r25
+       brne    6b
+7:     SKIP_IN_1               ;Wait for stop bit
+       rjmp    7b
+
+       out     _SFR_IO_ADDR(SREG), r0  ;End of critical section
+       ret
+.endfunc