core: LUFA_DEBUG_SUART for serial debug
This commit is contained in:
parent
5e97fd78cb
commit
8758035677
156
tmk_core/common/avr/suart.S
Normal file
156
tmk_core/common/avr/suart.S
Normal file
@ -0,0 +1,156 @@
|
|||||||
|
;---------------------------------------------------------------------------;
|
||||||
|
; 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 44 /* 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
|
8
tmk_core/common/avr/suart.h
Normal file
8
tmk_core/common/avr/suart.h
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#ifndef SUART
|
||||||
|
#define SUART
|
||||||
|
|
||||||
|
void xmit(uint8_t);
|
||||||
|
uint8_t rcvr(void);
|
||||||
|
uint8_t recv(void);
|
||||||
|
|
||||||
|
#endif /* SUART */
|
@ -48,3 +48,8 @@ OPT_DEFS += $(LUFA_OPTS)
|
|||||||
|
|
||||||
# This indicates using LUFA stack
|
# This indicates using LUFA stack
|
||||||
OPT_DEFS += -DPROTOCOL_LUFA
|
OPT_DEFS += -DPROTOCOL_LUFA
|
||||||
|
|
||||||
|
ifeq (yes,$(strip $(LUFA_DEBUG_SUART)))
|
||||||
|
SRC += common/avr/suart.S
|
||||||
|
LUFA_OPTS += -DLUFA_DEBUG_SUART
|
||||||
|
endif
|
||||||
|
@ -50,6 +50,10 @@
|
|||||||
#include "suspend.h"
|
#include "suspend.h"
|
||||||
#include "hook.h"
|
#include "hook.h"
|
||||||
|
|
||||||
|
#ifdef LUFA_DEBUG_SUART
|
||||||
|
#include "avr/suart.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "descriptor.h"
|
#include "descriptor.h"
|
||||||
#include "lufa.h"
|
#include "lufa.h"
|
||||||
|
|
||||||
@ -217,6 +221,7 @@ void EVENT_USB_Device_StartOfFrame(void)
|
|||||||
*/
|
*/
|
||||||
void EVENT_USB_Device_ConfigurationChanged(void)
|
void EVENT_USB_Device_ConfigurationChanged(void)
|
||||||
{
|
{
|
||||||
|
print("[c]");
|
||||||
bool ConfigSuccess = true;
|
bool ConfigSuccess = true;
|
||||||
|
|
||||||
/* Setup Keyboard HID Report Endpoints */
|
/* Setup Keyboard HID Report Endpoints */
|
||||||
@ -270,6 +275,7 @@ Other Device Required Optional Optional Optional Optional Opti
|
|||||||
*/
|
*/
|
||||||
void EVENT_USB_Device_ControlRequest(void)
|
void EVENT_USB_Device_ControlRequest(void)
|
||||||
{
|
{
|
||||||
|
print("[r]");
|
||||||
uint8_t* ReportData = NULL;
|
uint8_t* ReportData = NULL;
|
||||||
uint8_t ReportSize = 0;
|
uint8_t ReportSize = 0;
|
||||||
|
|
||||||
@ -494,6 +500,9 @@ static void send_consumer(uint16_t data)
|
|||||||
#define SEND_TIMEOUT 5
|
#define SEND_TIMEOUT 5
|
||||||
int8_t sendchar(uint8_t c)
|
int8_t sendchar(uint8_t c)
|
||||||
{
|
{
|
||||||
|
#ifdef LUFA_DEBUG_SUART
|
||||||
|
xmit(c);
|
||||||
|
#endif
|
||||||
// Not wait once timeouted.
|
// Not wait once timeouted.
|
||||||
// Because sendchar() is called so many times, waiting each call causes big lag.
|
// Because sendchar() is called so many times, waiting each call causes big lag.
|
||||||
static bool timeouted = false;
|
static bool timeouted = false;
|
||||||
@ -551,6 +560,9 @@ ERROR_EXIT:
|
|||||||
#else
|
#else
|
||||||
int8_t sendchar(uint8_t c)
|
int8_t sendchar(uint8_t c)
|
||||||
{
|
{
|
||||||
|
#ifdef LUFA_DEBUG_SUART
|
||||||
|
xmit(c);
|
||||||
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -578,12 +590,15 @@ static void setup_usb(void)
|
|||||||
|
|
||||||
// for Console_Task
|
// for Console_Task
|
||||||
USB_Device_EnableSOFEvents();
|
USB_Device_EnableSOFEvents();
|
||||||
print_set_sendchar(sendchar);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(void) __attribute__ ((weak));
|
int main(void) __attribute__ ((weak));
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
|
#ifdef LUFA_DEBUG_SUART
|
||||||
|
DDRD |= (1<<SUART_OUT_BIT);
|
||||||
|
#endif
|
||||||
|
print_set_sendchar(sendchar);
|
||||||
setup_mcu();
|
setup_mcu();
|
||||||
hook_early_init();
|
hook_early_init();
|
||||||
keyboard_setup();
|
keyboard_setup();
|
||||||
|
Loading…
Reference in New Issue
Block a user