aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFred Sundvik <fsundvik@gmail.com>2016-05-15 11:36:39 +0300
committerFred Sundvik <fsundvik@gmail.com>2016-05-15 11:36:39 +0300
commit3b422d2ac4340ecea6b2fc2f3a855581c737faf8 (patch)
treea11bc699a3eb073ba4bcee5b27d2bb4004ed1942
parent59657355d22cd6f661fda307675c6f712b5542ec (diff)
downloadqmk_firmware-3b422d2ac4340ecea6b2fc2f3a855581c737faf8.tar.gz
qmk_firmware-3b422d2ac4340ecea6b2fc2f3a855581c737faf8.zip
Add debug print for serial link errors
This is disabled by default
-rw-r--r--serial_link/system/system.c52
1 files changed, 49 insertions, 3 deletions
diff --git a/serial_link/system/system.c b/serial_link/system/system.c
index f74d8c9e9..5a47d8b83 100644
--- a/serial_link/system/system.c
+++ b/serial_link/system/system.c
@@ -58,6 +58,8 @@ static SerialConfig config = {
58 .sc_speed = SERIAL_LINK_BAUD 58 .sc_speed = SERIAL_LINK_BAUD
59}; 59};
60 60
61//#define DEBUG_LINK_ERRORS
62
61static uint32_t read_from_serial(SerialDriver* driver, uint8_t link) { 63static uint32_t read_from_serial(SerialDriver* driver, uint8_t link) {
62 const uint32_t buffer_size = 16; 64 const uint32_t buffer_size = 16;
63 uint8_t buffer[buffer_size]; 65 uint8_t buffer[buffer_size];
@@ -71,6 +73,37 @@ static uint32_t read_from_serial(SerialDriver* driver, uint8_t link) {
71 return bytes_read; 73 return bytes_read;
72} 74}
73 75
76static void print_error(char* str, eventflags_t flags, SerialDriver* driver) {
77#ifdef DEBUG_LINK_ERRORS
78 if (flags & SD_PARITY_ERROR) {
79 print(str);
80 print(" Parity error\n");
81 }
82 if (flags & SD_FRAMING_ERROR) {
83 print(str);
84 print(" Framing error\n");
85 }
86 if (flags & SD_OVERRUN_ERROR) {
87 print(str);
88 uint32_t size = qSpaceI(&(driver->iqueue));
89 xprintf(" Overrun error, queue size %d\n", size);
90
91 }
92 if (flags & SD_NOISE_ERROR) {
93 print(str);
94 print(" Noise error\n");
95 }
96 if (flags & SD_BREAK_DETECTED) {
97 print(str);
98 print(" Break detected\n");
99 }
100#else
101 (void)str;
102 (void)flags;
103 (void)driver;
104#endif
105}
106
74// TODO: Optimize the stack size, this is probably way too big 107// TODO: Optimize the stack size, this is probably way too big
75static THD_WORKING_AREA(serialThreadStack, 1024); 108static THD_WORKING_AREA(serialThreadStack, 1024);
76static THD_FUNCTION(serialThread, arg) { 109static THD_FUNCTION(serialThread, arg) {
@@ -79,20 +112,33 @@ static THD_FUNCTION(serialThread, arg) {
79 event_listener_t sd1_listener; 112 event_listener_t sd1_listener;
80 event_listener_t sd2_listener; 113 event_listener_t sd2_listener;
81 chEvtRegister(&new_data_event, &new_data_listener, 0); 114 chEvtRegister(&new_data_event, &new_data_listener, 0);
115 eventflags_t events = CHN_INPUT_AVAILABLE
116 | SD_PARITY_ERROR | SD_FRAMING_ERROR | SD_OVERRUN_ERROR | SD_NOISE_ERROR | SD_BREAK_DETECTED;
82 chEvtRegisterMaskWithFlags(chnGetEventSource(&SD1), 117 chEvtRegisterMaskWithFlags(chnGetEventSource(&SD1),
83 &sd1_listener, 118 &sd1_listener,
84 EVENT_MASK(1), 119 EVENT_MASK(1),
85 CHN_INPUT_AVAILABLE); 120 events);
86 chEvtRegisterMaskWithFlags(chnGetEventSource(&SD2), 121 chEvtRegisterMaskWithFlags(chnGetEventSource(&SD2),
87 &sd2_listener, 122 &sd2_listener,
88 EVENT_MASK(2), 123 EVENT_MASK(2),
89 CHN_INPUT_AVAILABLE); 124 events);
90 bool need_wait = false; 125 bool need_wait = false;
91 bool is_master = false; 126 bool is_master = false;
92 while(true) { 127 while(true) {
128 eventflags_t flags1 = 0;
129 eventflags_t flags2 = 0;
93 if (need_wait) { 130 if (need_wait) {
94 chEvtWaitAnyTimeout(ALL_EVENTS, MS2ST(1000)); 131 eventmask_t mask = chEvtWaitAnyTimeout(ALL_EVENTS, MS2ST(1000));
132 if (mask & EVENT_MASK(1)) {
133 flags1 = chEvtGetAndClearFlags(&sd1_listener);
134 print_error("DOWNLINK", flags1, &SD1);
135 }
136 if (mask & EVENT_MASK(2)) {
137 flags2 = chEvtGetAndClearFlags(&sd2_listener);
138 print_error("UPLINK", flags2, &SD2);
139 }
95 } 140 }
141
96 // Always stay as master, even if the USB goes into sleep mode 142 // Always stay as master, even if the USB goes into sleep mode
97 is_master |= usbGetDriverStateI(&USBD1) == USB_ACTIVE; 143 is_master |= usbGetDriverStateI(&USBD1) == USB_ACTIVE;
98 router_set_master(is_master); 144 router_set_master(is_master);