aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpatrickmt <40182064+patrickmt@users.noreply.github.com>2018-09-28 21:32:15 -0400
committerJack Humbert <jack.humb@gmail.com>2018-09-28 21:32:15 -0400
commit239f02408e219567be060be7e65e92e888304ed0 (patch)
treea5461db9b599dfb0fb7e3e6faccc064353cdfe78
parente2dee054d0649cb7b5b051a04a9bd82d14a0fdcd (diff)
downloadqmk_firmware-239f02408e219567be060be7e65e92e888304ed0.tar.gz
qmk_firmware-239f02408e219567be060be7e65e92e888304ed0.zip
Massdrop keyboard updates for SEND_STRING, syscalls, stdio, debug prints, Auto Shift (#3973)
* Update for SEND_STRING usage Update for SEND_STRING usage. Sending keyboard reports (kbd, nkro) now obey the minimum polling time. While attempting to send a keyboard report and waiting for a USB poll, other functions of the keyboard, including LED effects and power management, will continue to operate at their intended intervals. * Updates for send string, syscalls, stdio, debug prints, auto shift Now properly waiting for previous keys sent over USB to complete before sending new. Added heap to linker and now compiling with syscalls support. Removed custom string functions and now using stdio. dprintf now works as intended through virtser device. * CTRL and ALT keymap updates CTRL mac keymap updated ALT default and mac keymap updated ALT rules.mk added Auto Shift with default no * Code cleanup as per discussion with vomindoraan Code cleanup as per discussion with vomindoraan
-rw-r--r--keyboards/massdrop/alt/alt.h10
-rw-r--r--keyboards/massdrop/alt/keymaps/default/keymap.c35
-rw-r--r--keyboards/massdrop/alt/keymaps/mac/keymap.c33
-rw-r--r--keyboards/massdrop/alt/rules.mk1
-rw-r--r--keyboards/massdrop/ctrl/ctrl.h10
-rw-r--r--keyboards/massdrop/ctrl/keymaps/default/keymap.c39
-rw-r--r--keyboards/massdrop/ctrl/keymaps/mac/keymap.c41
-rw-r--r--keyboards/massdrop/ctrl/rules.mk1
-rw-r--r--lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/gcc/gcc/samd51j18a_flash.ld16
-rw-r--r--tmk_core/arm_atsam.mk2
-rw-r--r--tmk_core/common/arm_atsam/printf.h2
-rw-r--r--tmk_core/common/print.h2
-rw-r--r--tmk_core/protocol/arm_atsam.mk1
-rw-r--r--tmk_core/protocol/arm_atsam/arm_atsam_protocol.h1
-rw-r--r--tmk_core/protocol/arm_atsam/d51_util.h10
-rw-r--r--tmk_core/protocol/arm_atsam/main_arm_atsam.c136
-rw-r--r--tmk_core/protocol/arm_atsam/usb/spfssf.c268
-rw-r--r--tmk_core/protocol/arm_atsam/usb/spfssf.h57
-rw-r--r--tmk_core/protocol/arm_atsam/usb/udi_cdc.c8
-rw-r--r--tmk_core/protocol/arm_atsam/usb/udi_cdc.h10
-rw-r--r--tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c10
-rw-r--r--tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.h2
22 files changed, 175 insertions, 520 deletions
diff --git a/keyboards/massdrop/alt/alt.h b/keyboards/massdrop/alt/alt.h
index 387985512..8dfed8d2d 100644
--- a/keyboards/massdrop/alt/alt.h
+++ b/keyboards/massdrop/alt/alt.h
@@ -22,3 +22,13 @@
22 { K45, KC_NO, K46, K47, K48, K49, K50, K51, K52, K53, K54, K55, K56, K57, K58, }, \ 22 { K45, KC_NO, K46, K47, K48, K49, K50, K51, K52, K53, K54, K55, K56, K57, K58, }, \
23 { K59, K60, K61, KC_NO, KC_NO, KC_NO, K62, KC_NO, KC_NO, KC_NO, K63, K64, K65, K66, K67, }, \ 23 { K59, K60, K61, KC_NO, KC_NO, KC_NO, K62, KC_NO, KC_NO, KC_NO, K63, K64, K65, K66, K67, }, \
24} 24}
25
26#define TOGGLE_FLAG_AND_PRINT(var, name) { \
27 if (var) { \
28 dprintf(name " disabled\r\n"); \
29 var = !var; \
30 } else { \
31 var = !var; \
32 dprintf(name " enabled\r\n"); \
33 } \
34 }
diff --git a/keyboards/massdrop/alt/keymaps/default/keymap.c b/keyboards/massdrop/alt/keymaps/default/keymap.c
index 0cbce8629..a5c443ffc 100644
--- a/keyboards/massdrop/alt/keymaps/default/keymap.c
+++ b/keyboards/massdrop/alt/keymaps/default/keymap.c
@@ -136,8 +136,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
136 case L_T_BR: 136 case L_T_BR:
137 if (record->event.pressed) { 137 if (record->event.pressed) {
138 led_animation_breathing = !led_animation_breathing; 138 led_animation_breathing = !led_animation_breathing;
139 if (led_animation_breathing) 139 if (led_animation_breathing) {
140 {
141 gcr_breathe = gcr_desired; 140 gcr_breathe = gcr_desired;
142 led_animation_breathe_cur = BREATHE_MIN_STEP; 141 led_animation_breathe_cur = BREATHE_MIN_STEP;
143 breathe_dir = 1; 142 breathe_dir = 1;
@@ -151,50 +150,32 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
151 return false; 150 return false;
152 case U_T_AUTO: 151 case U_T_AUTO:
153 if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { 152 if (record->event.pressed && MODS_SHIFT && MODS_CTRL) {
154 usb_extra_manual = !usb_extra_manual; 153 TOGGLE_FLAG_AND_PRINT(usb_extra_manual, "USB extra port manual mode");
155 CDC_print("USB extra port manual mode ");
156 CDC_print(usb_extra_manual ? "enabled" : "disabled");
157 CDC_print("\r\n");
158 } 154 }
159 return false; 155 return false;
160 case U_T_AGCR: 156 case U_T_AGCR:
161 if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { 157 if (record->event.pressed && MODS_SHIFT && MODS_CTRL) {
162 usb_gcr_auto = !usb_gcr_auto; 158 TOGGLE_FLAG_AND_PRINT(usb_gcr_auto, "USB GCR auto mode");
163 CDC_print("USB GCR auto mode ");
164 CDC_print(usb_gcr_auto ? "enabled" : "disabled");
165 CDC_print("\r\n");
166 } 159 }
167 return false; 160 return false;
168 case DBG_TOG: 161 case DBG_TOG:
169 if (record->event.pressed) { 162 if (record->event.pressed) {
170 debug_enable = !debug_enable; 163 TOGGLE_FLAG_AND_PRINT(debug_enable, "Debug mode");
171 CDC_print("Debug mode ");
172 CDC_print(debug_enable ? "enabled" : "disabled");
173 CDC_print("\r\n");
174 } 164 }
175 return false; 165 return false;
176 case DBG_MTRX: 166 case DBG_MTRX:
177 if (record->event.pressed) { 167 if (record->event.pressed) {
178 debug_matrix = !debug_matrix; 168 TOGGLE_FLAG_AND_PRINT(debug_matrix, "Debug matrix");
179 CDC_print("Debug matrix ");
180 CDC_print(debug_matrix ? "enabled" : "disabled");
181 CDC_print("\r\n");
182 } 169 }
183 return false; 170 return false;
184 case DBG_KBD: 171 case DBG_KBD:
185 if (record->event.pressed) { 172 if (record->event.pressed) {
186 debug_keyboard = !debug_keyboard; 173 TOGGLE_FLAG_AND_PRINT(debug_keyboard, "Debug keyboard");
187 CDC_print("Debug keyboard ");
188 CDC_print(debug_keyboard ? "enabled" : "disabled");
189 CDC_print("\r\n");
190 } 174 }
191 return false; 175 return false;
192 case DBG_MOU: 176 case DBG_MOU:
193 if (record->event.pressed) { 177 if (record->event.pressed) {
194 debug_mouse = !debug_mouse; 178 TOGGLE_FLAG_AND_PRINT(debug_mouse, "Debug mouse");
195 CDC_print("Debug mouse ");
196 CDC_print(debug_mouse ? "enabled" : "disabled");
197 CDC_print("\r\n");
198 } 179 }
199 return false; 180 return false;
200 case MD_BOOT: 181 case MD_BOOT:
@@ -209,4 +190,4 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
209 default: 190 default:
210 return true; //Process all other keycodes normally 191 return true; //Process all other keycodes normally
211 } 192 }
212} \ No newline at end of file 193}
diff --git a/keyboards/massdrop/alt/keymaps/mac/keymap.c b/keyboards/massdrop/alt/keymaps/mac/keymap.c
index e886290e7..d6978fd80 100644
--- a/keyboards/massdrop/alt/keymaps/mac/keymap.c
+++ b/keyboards/massdrop/alt/keymaps/mac/keymap.c
@@ -136,8 +136,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
136 case L_T_BR: 136 case L_T_BR:
137 if (record->event.pressed) { 137 if (record->event.pressed) {
138 led_animation_breathing = !led_animation_breathing; 138 led_animation_breathing = !led_animation_breathing;
139 if (led_animation_breathing) 139 if (led_animation_breathing) {
140 {
141 gcr_breathe = gcr_desired; 140 gcr_breathe = gcr_desired;
142 led_animation_breathe_cur = BREATHE_MIN_STEP; 141 led_animation_breathe_cur = BREATHE_MIN_STEP;
143 breathe_dir = 1; 142 breathe_dir = 1;
@@ -151,50 +150,32 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
151 return false; 150 return false;
152 case U_T_AUTO: 151 case U_T_AUTO:
153 if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { 152 if (record->event.pressed && MODS_SHIFT && MODS_CTRL) {
154 usb_extra_manual = !usb_extra_manual; 153 TOGGLE_FLAG_AND_PRINT(usb_extra_manual, "USB extra port manual mode");
155 CDC_print("USB extra port manual mode ");
156 CDC_print(usb_extra_manual ? "enabled" : "disabled");
157 CDC_print("\r\n");
158 } 154 }
159 return false; 155 return false;
160 case U_T_AGCR: 156 case U_T_AGCR:
161 if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { 157 if (record->event.pressed && MODS_SHIFT && MODS_CTRL) {
162 usb_gcr_auto = !usb_gcr_auto; 158 TOGGLE_FLAG_AND_PRINT(usb_gcr_auto, "USB GCR auto mode");
163 CDC_print("USB GCR auto mode ");
164 CDC_print(usb_gcr_auto ? "enabled" : "disabled");
165 CDC_print("\r\n");
166 } 159 }
167 return false; 160 return false;
168 case DBG_TOG: 161 case DBG_TOG:
169 if (record->event.pressed) { 162 if (record->event.pressed) {
170 debug_enable = !debug_enable; 163 TOGGLE_FLAG_AND_PRINT(debug_enable, "Debug mode");
171 CDC_print("Debug mode ");
172 CDC_print(debug_enable ? "enabled" : "disabled");
173 CDC_print("\r\n");
174 } 164 }
175 return false; 165 return false;
176 case DBG_MTRX: 166 case DBG_MTRX:
177 if (record->event.pressed) { 167 if (record->event.pressed) {
178 debug_matrix = !debug_matrix; 168 TOGGLE_FLAG_AND_PRINT(debug_matrix, "Debug matrix");
179 CDC_print("Debug matrix ");
180 CDC_print(debug_matrix ? "enabled" : "disabled");
181 CDC_print("\r\n");
182 } 169 }
183 return false; 170 return false;
184 case DBG_KBD: 171 case DBG_KBD:
185 if (record->event.pressed) { 172 if (record->event.pressed) {
186 debug_keyboard = !debug_keyboard; 173 TOGGLE_FLAG_AND_PRINT(debug_keyboard, "Debug keyboard");
187 CDC_print("Debug keyboard ");
188 CDC_print(debug_keyboard ? "enabled" : "disabled");
189 CDC_print("\r\n");
190 } 174 }
191 return false; 175 return false;
192 case DBG_MOU: 176 case DBG_MOU:
193 if (record->event.pressed) { 177 if (record->event.pressed) {
194 debug_mouse = !debug_mouse; 178 TOGGLE_FLAG_AND_PRINT(debug_mouse, "Debug mouse");
195 CDC_print("Debug mouse ");
196 CDC_print(debug_mouse ? "enabled" : "disabled");
197 CDC_print("\r\n");
198 } 179 }
199 return false; 180 return false;
200 case MD_BOOT: 181 case MD_BOOT:
diff --git a/keyboards/massdrop/alt/rules.mk b/keyboards/massdrop/alt/rules.mk
index daf679585..c5539158f 100644
--- a/keyboards/massdrop/alt/rules.mk
+++ b/keyboards/massdrop/alt/rules.mk
@@ -30,3 +30,4 @@ FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
30HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) 30HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400)
31VIRTSER_ENABLE = no # USB Serial Driver 31VIRTSER_ENABLE = no # USB Serial Driver
32RAW_ENABLE = no # Raw device 32RAW_ENABLE = no # Raw device
33AUTO_SHIFT_ENABLE = no # Auto Shift
diff --git a/keyboards/massdrop/ctrl/ctrl.h b/keyboards/massdrop/ctrl/ctrl.h
index dc7c7eabe..c83efca16 100644
--- a/keyboards/massdrop/ctrl/ctrl.h
+++ b/keyboards/massdrop/ctrl/ctrl.h
@@ -30,3 +30,13 @@
30 { K59, K60, K61, K62, K63, K76, K50, K33 }, \ 30 { K59, K60, K61, K62, K63, K76, K50, K33 }, \
31 { K72, K73, K74, K75, K85, K86, K87, }, \ 31 { K72, K73, K74, K75, K85, K86, K87, }, \
32} 32}
33
34#define TOGGLE_FLAG_AND_PRINT(var, name) { \
35 if (var) { \
36 dprintf(name " disabled\r\n"); \
37 var = !var; \
38 } else { \
39 var = !var; \
40 dprintf(name " enabled\r\n"); \
41 } \
42 }
diff --git a/keyboards/massdrop/ctrl/keymaps/default/keymap.c b/keyboards/massdrop/ctrl/keymaps/default/keymap.c
index 9bfb7fec5..88c1ac312 100644
--- a/keyboards/massdrop/ctrl/keymaps/default/keymap.c
+++ b/keyboards/massdrop/ctrl/keymaps/default/keymap.c
@@ -33,7 +33,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
33 KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, \ 33 KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, \
34 KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ 34 KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \
35 KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, \ 35 KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, \
36 KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT \ 36 KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT \
37 ), 37 ),
38 [1] = LAYOUT( 38 [1] = LAYOUT(
39 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_TRNS, KC_TRNS, \ 39 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_TRNS, KC_TRNS, \
@@ -41,7 +41,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
41 L_T_BR, L_PSD, L_BRI, L_PSI, KC_TRNS, KC_TRNS, KC_TRNS, U_T_AUTO,U_T_AGCR,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_VOLD, \ 41 L_T_BR, L_PSD, L_BRI, L_PSI, KC_TRNS, KC_TRNS, KC_TRNS, U_T_AUTO,U_T_AGCR,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_VOLD, \
42 L_T_PTD, L_PTP, L_BRD, L_PTN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ 42 L_T_PTD, L_PTP, L_BRD, L_PTN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
43 KC_TRNS, L_T_MD, L_T_ONF, KC_TRNS, KC_TRNS, MD_BOOT, TG_NKRO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ 43 KC_TRNS, L_T_MD, L_T_ONF, KC_TRNS, KC_TRNS, MD_BOOT, TG_NKRO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
44 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ 44 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \
45 ), 45 ),
46 /* 46 /*
47 [X] = LAYOUT( 47 [X] = LAYOUT(
@@ -50,7 +50,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
50 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ 50 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
51 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ 51 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
52 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, TG_NKRO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ 52 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, TG_NKRO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
53 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ 53 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \
54 ), 54 ),
55 */ 55 */
56}; 56};
@@ -139,8 +139,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
139 case L_T_BR: 139 case L_T_BR:
140 if (record->event.pressed) { 140 if (record->event.pressed) {
141 led_animation_breathing = !led_animation_breathing; 141 led_animation_breathing = !led_animation_breathing;
142 if (led_animation_breathing) 142 if (led_animation_breathing) {
143 {
144 gcr_breathe = gcr_desired; 143 gcr_breathe = gcr_desired;
145 led_animation_breathe_cur = BREATHE_MIN_STEP; 144 led_animation_breathe_cur = BREATHE_MIN_STEP;
146 breathe_dir = 1; 145 breathe_dir = 1;
@@ -154,50 +153,32 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
154 return false; 153 return false;
155 case U_T_AUTO: 154 case U_T_AUTO:
156 if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { 155 if (record->event.pressed && MODS_SHIFT && MODS_CTRL) {
157 usb_extra_manual = !usb_extra_manual; 156 TOGGLE_FLAG_AND_PRINT(usb_extra_manual, "USB extra port manual mode");
158 CDC_print("USB extra port manual mode ");
159 CDC_print(usb_extra_manual ? "enabled" : "disabled");
160 CDC_print("\r\n");
161 } 157 }
162 return false; 158 return false;
163 case U_T_AGCR: 159 case U_T_AGCR:
164 if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { 160 if (record->event.pressed && MODS_SHIFT && MODS_CTRL) {
165 usb_gcr_auto = !usb_gcr_auto; 161 TOGGLE_FLAG_AND_PRINT(usb_gcr_auto, "USB GCR auto mode");
166 CDC_print("USB GCR auto mode ");
167 CDC_print(usb_gcr_auto ? "enabled" : "disabled");
168 CDC_print("\r\n");
169 } 162 }
170 return false; 163 return false;
171 case DBG_TOG: 164 case DBG_TOG:
172 if (record->event.pressed) { 165 if (record->event.pressed) {
173 debug_enable = !debug_enable; 166 TOGGLE_FLAG_AND_PRINT(debug_enable, "Debug mode");
174 CDC_print("Debug mode ");
175 CDC_print(debug_enable ? "enabled" : "disabled");
176 CDC_print("\r\n");
177 } 167 }
178 return false; 168 return false;
179 case DBG_MTRX: 169 case DBG_MTRX:
180 if (record->event.pressed) { 170 if (record->event.pressed) {
181 debug_matrix = !debug_matrix; 171 TOGGLE_FLAG_AND_PRINT(debug_matrix, "Debug matrix");
182 CDC_print("Debug matrix ");
183 CDC_print(debug_matrix ? "enabled" : "disabled");
184 CDC_print("\r\n");
185 } 172 }
186 return false; 173 return false;
187 case DBG_KBD: 174 case DBG_KBD:
188 if (record->event.pressed) { 175 if (record->event.pressed) {
189 debug_keyboard = !debug_keyboard; 176 TOGGLE_FLAG_AND_PRINT(debug_keyboard, "Debug keyboard");
190 CDC_print("Debug keyboard ");
191 CDC_print(debug_keyboard ? "enabled" : "disabled");
192 CDC_print("\r\n");
193 } 177 }
194 return false; 178 return false;
195 case DBG_MOU: 179 case DBG_MOU:
196 if (record->event.pressed) { 180 if (record->event.pressed) {
197 debug_mouse = !debug_mouse; 181 TOGGLE_FLAG_AND_PRINT(debug_mouse, "Debug mouse");
198 CDC_print("Debug mouse ");
199 CDC_print(debug_mouse ? "enabled" : "disabled");
200 CDC_print("\r\n");
201 } 182 }
202 return false; 183 return false;
203 case MD_BOOT: 184 case MD_BOOT:
diff --git a/keyboards/massdrop/ctrl/keymaps/mac/keymap.c b/keyboards/massdrop/ctrl/keymaps/mac/keymap.c
index a03f891e8..6c5dfe19c 100644
--- a/keyboards/massdrop/ctrl/keymaps/mac/keymap.c
+++ b/keyboards/massdrop/ctrl/keymaps/mac/keymap.c
@@ -33,15 +33,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
33 KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, \ 33 KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, \
34 KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ 34 KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \
35 KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, \ 35 KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, \
36 KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, MO(1), KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT \ 36 KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, MO(1), KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT \
37 ), 37 ),
38 [1] = LAYOUT( 38 [1] = LAYOUT(
39 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_TRNS, KC_TRNS, \ 39 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_TRNS, KC_TRNS, \
40 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, KC_MSTP, KC_VOLU, \ 40 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, KC_MSTP, KC_VOLU, \
41 L_T_BR, L_PSD, L_BRI, L_PSI, KC_TRNS, KC_TRNS, KC_TRNS, U_T_AUTO,U_T_AGCR,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_VOLD, \ 41 L_T_BR, L_PSD, L_BRI, L_PSI, KC_TRNS, KC_TRNS, KC_TRNS, U_T_AUTO,U_T_AGCR,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_VOLD, \
42 L_T_PTD, L_PTP, L_BRD, L_PTN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ 42 L_T_PTD, L_PTP, L_BRD, L_PTN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
43 KC_TRNS, L_T_MD, L_T_ONF, KC_TRNS, KC_TRNS, KC_TRNS, TG_NKRO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ 43 KC_TRNS, L_T_MD, L_T_ONF, KC_TRNS, KC_TRNS, MD_BOOT, TG_NKRO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
44 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ 44 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \
45 ), 45 ),
46 /* 46 /*
47 [X] = LAYOUT( 47 [X] = LAYOUT(
@@ -50,7 +50,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
50 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ 50 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
51 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ 51 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
52 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, TG_NKRO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ 52 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, TG_NKRO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
53 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ 53 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \
54 ), 54 ),
55 */ 55 */
56}; 56};
@@ -139,8 +139,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
139 case L_T_BR: 139 case L_T_BR:
140 if (record->event.pressed) { 140 if (record->event.pressed) {
141 led_animation_breathing = !led_animation_breathing; 141 led_animation_breathing = !led_animation_breathing;
142 if (led_animation_breathing) 142 if (led_animation_breathing) {
143 {
144 gcr_breathe = gcr_desired; 143 gcr_breathe = gcr_desired;
145 led_animation_breathe_cur = BREATHE_MIN_STEP; 144 led_animation_breathe_cur = BREATHE_MIN_STEP;
146 breathe_dir = 1; 145 breathe_dir = 1;
@@ -154,50 +153,32 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
154 return false; 153 return false;
155 case U_T_AUTO: 154 case U_T_AUTO:
156 if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { 155 if (record->event.pressed && MODS_SHIFT && MODS_CTRL) {
157 usb_extra_manual = !usb_extra_manual; 156 TOGGLE_FLAG_AND_PRINT(usb_extra_manual, "USB extra port manual mode");
158 CDC_print("USB extra port manual mode ");
159 CDC_print(usb_extra_manual ? "enabled" : "disabled");
160 CDC_print("\r\n");
161 } 157 }
162 return false; 158 return false;
163 case U_T_AGCR: 159 case U_T_AGCR:
164 if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { 160 if (record->event.pressed && MODS_SHIFT && MODS_CTRL) {
165 usb_gcr_auto = !usb_gcr_auto; 161 TOGGLE_FLAG_AND_PRINT(usb_gcr_auto, "USB GCR auto mode");
166 CDC_print("USB GCR auto mode ");
167 CDC_print(usb_gcr_auto ? "enabled" : "disabled");
168 CDC_print("\r\n");
169 } 162 }
170 return false; 163 return false;
171 case DBG_TOG: 164 case DBG_TOG:
172 if (record->event.pressed) { 165 if (record->event.pressed) {
173 debug_enable = !debug_enable; 166 TOGGLE_FLAG_AND_PRINT(debug_enable, "Debug mode");
174 CDC_print("Debug mode ");
175 CDC_print(debug_enable ? "enabled" : "disabled");
176 CDC_print("\r\n");
177 } 167 }
178 return false; 168 return false;
179 case DBG_MTRX: 169 case DBG_MTRX:
180 if (record->event.pressed) { 170 if (record->event.pressed) {
181 debug_matrix = !debug_matrix; 171 TOGGLE_FLAG_AND_PRINT(debug_matrix, "Debug matrix");
182 CDC_print("Debug matrix ");
183 CDC_print(debug_matrix ? "enabled" : "disabled");
184 CDC_print("\r\n");
185 } 172 }
186 return false; 173 return false;
187 case DBG_KBD: 174 case DBG_KBD:
188 if (record->event.pressed) { 175 if (record->event.pressed) {
189 debug_keyboard = !debug_keyboard; 176 TOGGLE_FLAG_AND_PRINT(debug_keyboard, "Debug keyboard");
190 CDC_print("Debug keyboard ");
191 CDC_print(debug_keyboard ? "enabled" : "disabled");
192 CDC_print("\r\n");
193 } 177 }
194 return false; 178 return false;
195 case DBG_MOU: 179 case DBG_MOU:
196 if (record->event.pressed) { 180 if (record->event.pressed) {
197 debug_mouse = !debug_mouse; 181 TOGGLE_FLAG_AND_PRINT(debug_mouse, "Debug mouse");
198 CDC_print("Debug mouse ");
199 CDC_print(debug_mouse ? "enabled" : "disabled");
200 CDC_print("\r\n");
201 } 182 }
202 return false; 183 return false;
203 case MD_BOOT: 184 case MD_BOOT:
diff --git a/keyboards/massdrop/ctrl/rules.mk b/keyboards/massdrop/ctrl/rules.mk
index daf679585..c5539158f 100644
--- a/keyboards/massdrop/ctrl/rules.mk
+++ b/keyboards/massdrop/ctrl/rules.mk
@@ -30,3 +30,4 @@ FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
30HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) 30HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400)
31VIRTSER_ENABLE = no # USB Serial Driver 31VIRTSER_ENABLE = no # USB Serial Driver
32RAW_ENABLE = no # Raw device 32RAW_ENABLE = no # Raw device
33AUTO_SHIFT_ENABLE = no # Auto Shift
diff --git a/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/gcc/gcc/samd51j18a_flash.ld b/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/gcc/gcc/samd51j18a_flash.ld
index 3d114f5b7..35db61971 100644
--- a/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/gcc/gcc/samd51j18a_flash.ld
+++ b/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/gcc/gcc/samd51j18a_flash.ld
@@ -35,7 +35,7 @@ SEARCH_DIR(.)
35/* Memory Spaces Definitions */ 35/* Memory Spaces Definitions */
36MEMORY 36MEMORY
37{ 37{
38 //rom (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 38/*rom (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000*/
39 rom (rx) : ORIGIN = 0x00004000, LENGTH = 0x0003C000 39 rom (rx) : ORIGIN = 0x00004000, LENGTH = 0x0003C000
40 ram (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00020000 40 ram (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00020000
41 bkupram (rwx) : ORIGIN = 0x47000000, LENGTH = 0x00002000 41 bkupram (rwx) : ORIGIN = 0x47000000, LENGTH = 0x00002000
@@ -45,6 +45,9 @@ MEMORY
45/* The stack size used by the application. NOTE: you need to adjust according to your application. */ 45/* The stack size used by the application. NOTE: you need to adjust according to your application. */
46STACK_SIZE = DEFINED(STACK_SIZE) ? STACK_SIZE : DEFINED(__stack_size__) ? __stack_size__ : 0x8000; 46STACK_SIZE = DEFINED(STACK_SIZE) ? STACK_SIZE : DEFINED(__stack_size__) ? __stack_size__ : 0x8000;
47 47
48/* The heap size used by the application. */
49HEAP_SIZE = DEFINED(HEAP_SIZE) ? HEAP_SIZE : DEFINED(__heap_size__) ? __heap_size__ : 0x800;
50
48_srom = ORIGIN(rom); 51_srom = ORIGIN(rom);
49_lrom = LENGTH(rom); 52_lrom = LENGTH(rom);
50_erom = ORIGIN(rom) + LENGTH(rom); 53_erom = ORIGIN(rom) + LENGTH(rom);
@@ -153,6 +156,17 @@ SECTIONS
153 _ezero = .; 156 _ezero = .;
154 } > ram 157 } > ram
155 158
159 /* .heap section for syscalls */
160 .heap (NOLOAD) :
161 {
162 . = ALIGN(4);
163 _end = .;
164 end = .;
165 _heap_start = .;
166 . = . + HEAP_SIZE;
167 _heap_end = .;
168 } > ram
169
156 /* stack section */ 170 /* stack section */
157 .stack (NOLOAD): 171 .stack (NOLOAD):
158 { 172 {
diff --git a/tmk_core/arm_atsam.mk b/tmk_core/arm_atsam.mk
index ef412d59d..06823fb62 100644
--- a/tmk_core/arm_atsam.mk
+++ b/tmk_core/arm_atsam.mk
@@ -36,7 +36,7 @@ LDFLAGS +=-Wl,--gc-sections
36LDFLAGS += -Wl,-Map="%OUT%%PROJ_NAME%.map" 36LDFLAGS += -Wl,-Map="%OUT%%PROJ_NAME%.map"
37LDFLAGS += -Wl,--start-group 37LDFLAGS += -Wl,--start-group
38LDFLAGS += -Wl,--end-group 38LDFLAGS += -Wl,--end-group
39LDFLAGS += -Wl,--gc-sections 39LDFLAGS += --specs=rdimon.specs
40LDFLAGS += -T$(LIB_PATH)/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/gcc/gcc/samd51j18a_flash.ld 40LDFLAGS += -T$(LIB_PATH)/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/gcc/gcc/samd51j18a_flash.ld
41 41
42OPT_DEFS += -DPROTOCOL_ARM_ATSAM 42OPT_DEFS += -DPROTOCOL_ARM_ATSAM
diff --git a/tmk_core/common/arm_atsam/printf.h b/tmk_core/common/arm_atsam/printf.h
index 582c83bf5..3206b40bd 100644
--- a/tmk_core/common/arm_atsam/printf.h
+++ b/tmk_core/common/arm_atsam/printf.h
@@ -1,8 +1,8 @@
1#ifndef _PRINTF_H_ 1#ifndef _PRINTF_H_
2#define _PRINTF_H_ 2#define _PRINTF_H_
3 3
4#define __xprintf dpf
5int dpf(const char *_Format, ...); 4int dpf(const char *_Format, ...);
5#define __xprintf dpf
6 6
7#endif //_PRINTF_H_ 7#endif //_PRINTF_H_
8 8
diff --git a/tmk_core/common/print.h b/tmk_core/common/print.h
index 9cbe67bad..d94527657 100644
--- a/tmk_core/common/print.h
+++ b/tmk_core/common/print.h
@@ -29,7 +29,7 @@
29#include <stdbool.h> 29#include <stdbool.h>
30#include "util.h" 30#include "util.h"
31 31
32#if defined(PROTOCOL_CHIBIOS) 32#if defined(PROTOCOL_CHIBIOS) || defined(PROTOCOL_ARM_ATSAM)
33#define PSTR(x) x 33#define PSTR(x) x
34#endif 34#endif
35 35
diff --git a/tmk_core/protocol/arm_atsam.mk b/tmk_core/protocol/arm_atsam.mk
index d535b64cd..04e02790a 100644
--- a/tmk_core/protocol/arm_atsam.mk
+++ b/tmk_core/protocol/arm_atsam.mk
@@ -10,7 +10,6 @@ SRC += $(ARM_ATSAM_DIR)/spi.c
10SRC += $(ARM_ATSAM_DIR)/startup.c 10SRC += $(ARM_ATSAM_DIR)/startup.c
11 11
12SRC += $(ARM_ATSAM_DIR)/usb/main_usb.c 12SRC += $(ARM_ATSAM_DIR)/usb/main_usb.c
13SRC += $(ARM_ATSAM_DIR)/usb/spfssf.c
14SRC += $(ARM_ATSAM_DIR)/usb/udc.c 13SRC += $(ARM_ATSAM_DIR)/usb/udc.c
15SRC += $(ARM_ATSAM_DIR)/usb/udi_cdc.c 14SRC += $(ARM_ATSAM_DIR)/usb/udi_cdc.c
16SRC += $(ARM_ATSAM_DIR)/usb/udi_hid.c 15SRC += $(ARM_ATSAM_DIR)/usb/udi_hid.c
diff --git a/tmk_core/protocol/arm_atsam/arm_atsam_protocol.h b/tmk_core/protocol/arm_atsam/arm_atsam_protocol.h
index be73beccd..2ba099174 100644
--- a/tmk_core/protocol/arm_atsam/arm_atsam_protocol.h
+++ b/tmk_core/protocol/arm_atsam/arm_atsam_protocol.h
@@ -36,7 +36,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
36#include "issi3733_driver.h" 36#include "issi3733_driver.h"
37#include "./usb/compiler.h" 37#include "./usb/compiler.h"
38#include "./usb/udc.h" 38#include "./usb/udc.h"
39#include "./usb/spfssf.h"
40#include "./usb/udi_cdc.h" 39#include "./usb/udi_cdc.h"
41 40
42#endif //MD_BOOTLOADER 41#endif //MD_BOOTLOADER
diff --git a/tmk_core/protocol/arm_atsam/d51_util.h b/tmk_core/protocol/arm_atsam/d51_util.h
index 465889c7c..7a35f7989 100644
--- a/tmk_core/protocol/arm_atsam/d51_util.h
+++ b/tmk_core/protocol/arm_atsam/d51_util.h
@@ -32,6 +32,16 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
32#define m15_on REG_PORT_OUTSET1 = 0x40000000 //PB30 High 32#define m15_on REG_PORT_OUTSET1 = 0x40000000 //PB30 High
33#define m15_off REG_PORT_OUTCLR1 = 0x40000000 //PB30 Low 33#define m15_off REG_PORT_OUTCLR1 = 0x40000000 //PB30 Low
34 34
35//Debug Port PB23
36#define m27_ena REG_PORT_DIRSET1 = 0x800000 //PB23 Output
37#define m27_on REG_PORT_OUTSET1 = 0x800000 //PB23 High
38#define m27_off REG_PORT_OUTCLR1 = 0x800000 //PB23 Low
39
40//Debug Port PB31
41#define m28_ena REG_PORT_DIRSET1 = 0x80000000 //PB31 Output
42#define m28_on REG_PORT_OUTSET1 = 0x80000000 //PB31 High
43#define m28_off REG_PORT_OUTCLR1 = 0x80000000 //PB31 Low
44
35#define m15_loop(M15X) {uint8_t M15L=M15X; while(M15L--){m15_on;CLK_delay_us(1);m15_off;}} 45#define m15_loop(M15X) {uint8_t M15L=M15X; while(M15L--){m15_on;CLK_delay_us(1);m15_off;}}
36 46
37void m15_print(uint32_t x); 47void m15_print(uint32_t x);
diff --git a/tmk_core/protocol/arm_atsam/main_arm_atsam.c b/tmk_core/protocol/arm_atsam/main_arm_atsam.c
index 8cc776703..676dac4ea 100644
--- a/tmk_core/protocol/arm_atsam/main_arm_atsam.c
+++ b/tmk_core/protocol/arm_atsam/main_arm_atsam.c
@@ -31,6 +31,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
31//From keyboard's directory 31//From keyboard's directory
32#include "config_led.h" 32#include "config_led.h"
33 33
34void main_subtasks(void);
34uint8_t keyboard_leds(void); 35uint8_t keyboard_leds(void);
35void send_keyboard(report_keyboard_t *report); 36void send_keyboard(report_keyboard_t *report);
36void send_mouse(report_mouse_t *report); 37void send_mouse(report_mouse_t *report);
@@ -65,7 +66,7 @@ void send_keyboard(report_keyboard_t *report)
65 if (!keymap_config.nkro) 66 if (!keymap_config.nkro)
66 { 67 {
67#endif //NKRO_ENABLE 68#endif //NKRO_ENABLE
68 dprint("s-kbd\r\n"); 69 while (udi_hid_kbd_b_report_trans_ongoing) { main_subtasks(); } //Run other tasks while waiting for USB to be free
69 70
70 irqflags = __get_PRIMASK(); 71 irqflags = __get_PRIMASK();
71 __disable_irq(); 72 __disable_irq();
@@ -81,7 +82,7 @@ void send_keyboard(report_keyboard_t *report)
81 } 82 }
82 else 83 else
83 { 84 {
84 dprint("s-nkro\r\n"); 85 while (udi_hid_nkro_b_report_trans_ongoing) { main_subtasks(); } //Run other tasks while waiting for USB to be free
85 86
86 irqflags = __get_PRIMASK(); 87 irqflags = __get_PRIMASK();
87 __disable_irq(); 88 __disable_irq();
@@ -102,8 +103,6 @@ void send_mouse(report_mouse_t *report)
102#ifdef MOUSEKEY_ENABLE 103#ifdef MOUSEKEY_ENABLE
103 uint32_t irqflags; 104 uint32_t irqflags;
104 105
105 dprint("s-mou\r\n");
106
107 irqflags = __get_PRIMASK(); 106 irqflags = __get_PRIMASK();
108 __disable_irq(); 107 __disable_irq();
109 __DMB(); 108 __DMB();
@@ -120,8 +119,6 @@ void send_mouse(report_mouse_t *report)
120void send_system(uint16_t data) 119void send_system(uint16_t data)
121{ 120{
122#ifdef EXTRAKEY_ENABLE 121#ifdef EXTRAKEY_ENABLE
123 dprintf("s-exks %i\r\n", data);
124
125 uint32_t irqflags; 122 uint32_t irqflags;
126 123
127 irqflags = __get_PRIMASK(); 124 irqflags = __get_PRIMASK();
@@ -142,8 +139,6 @@ void send_system(uint16_t data)
142void send_consumer(uint16_t data) 139void send_consumer(uint16_t data)
143{ 140{
144#ifdef EXTRAKEY_ENABLE 141#ifdef EXTRAKEY_ENABLE
145 dprintf("s-exkc %i\r\n",data);
146
147 uint32_t irqflags; 142 uint32_t irqflags;
148 143
149 irqflags = __get_PRIMASK(); 144 irqflags = __get_PRIMASK();
@@ -160,6 +155,77 @@ void send_consumer(uint16_t data)
160#endif //EXTRAKEY_ENABLE 155#endif //EXTRAKEY_ENABLE
161} 156}
162 157
158uint8_t g_drvid;
159
160void main_subtask_usb_state(void)
161{
162 if (usb_state == USB_STATE_POWERDOWN)
163 {
164 uint32_t timer_led = timer_read32();
165
166 led_on;
167 if (led_enabled)
168 {
169 for (g_drvid = 0; g_drvid < ISSI3733_DRIVER_COUNT; g_drvid++)
170 {
171 I2C3733_Control_Set(0);
172 }
173 }
174 while (usb_state == USB_STATE_POWERDOWN)
175 {
176 if (timer_read32() - timer_led > 1000) led_off; //Good to indicate went to sleep, but only for a second
177 }
178 if (led_enabled)
179 {
180 for (g_drvid = 0; g_drvid < ISSI3733_DRIVER_COUNT; g_drvid++)
181 {
182 I2C3733_Control_Set(1);
183 }
184 }
185 led_off;
186 }
187}
188
189void main_subtask_led(void)
190{
191 led_matrix_task();
192}
193
194void main_subtask_power_check(void)
195{
196 static uint64_t next_5v_checkup = 0;
197
198 if (CLK_get_ms() > next_5v_checkup)
199 {
200 next_5v_checkup = CLK_get_ms() + 5;
201
202 v_5v = adc_get(ADC_5V);
203 v_5v_avg = 0.9 * v_5v_avg + 0.1 * v_5v;
204
205 gcr_compute();
206 }
207}
208
209void main_subtask_usb_extra_device(void)
210{
211 static uint64_t next_usb_checkup = 0;
212
213 if (CLK_get_ms() > next_usb_checkup)
214 {
215 next_usb_checkup = CLK_get_ms() + 10;
216
217 USB_HandleExtraDevice();
218 }
219}
220
221void main_subtasks(void)
222{
223 main_subtask_usb_state();
224 main_subtask_led();
225 main_subtask_power_check();
226 main_subtask_usb_extra_device();
227}
228
163int main(void) 229int main(void)
164{ 230{
165 led_ena; 231 led_ena;
@@ -201,9 +267,8 @@ int main(void)
201 267
202 i2c_led_q_init(); 268 i2c_led_q_init();
203 269
204 uint8_t drvid; 270 for (g_drvid = 0; g_drvid < ISSI3733_DRIVER_COUNT; g_drvid++)
205 for (drvid=0;drvid<ISSI3733_DRIVER_COUNT;drvid++) 271 I2C_LED_Q_ONOFF(g_drvid); //Queue data
206 I2C_LED_Q_ONOFF(drvid); //Queue data
207 272
208 keyboard_setup(); 273 keyboard_setup();
209 274
@@ -214,8 +279,6 @@ int main(void)
214#ifdef VIRTSER_ENABLE 279#ifdef VIRTSER_ENABLE
215 uint64_t next_print = 0; 280 uint64_t next_print = 0;
216#endif //VIRTSER_ENABLE 281#endif //VIRTSER_ENABLE
217 uint64_t next_usb_checkup = 0;
218 uint64_t next_5v_checkup = 0;
219 282
220 v_5v_avg = adc_get(ADC_5V); 283 v_5v_avg = adc_get(ADC_5V);
221 284
@@ -223,58 +286,15 @@ int main(void)
223 286
224 while (1) 287 while (1)
225 { 288 {
226 if (usb_state == USB_STATE_POWERDOWN)
227 {
228 uint32_t timer_led = timer_read32();
229
230 led_on;
231 if (led_enabled)
232 {
233 for (drvid=0;drvid<ISSI3733_DRIVER_COUNT;drvid++)
234 {
235 I2C3733_Control_Set(0);
236 }
237 }
238 while (usb_state == USB_STATE_POWERDOWN)
239 {
240 if (timer_read32() - timer_led > 1000) led_off; //Good to indicate went to sleep, but only for a second
241 }
242 if (led_enabled)
243 {
244 for (drvid=0;drvid<ISSI3733_DRIVER_COUNT;drvid++)
245 {
246 I2C3733_Control_Set(1);
247 }
248 }
249 led_off;
250 }
251
252 keyboard_task(); 289 keyboard_task();
253 290
254 led_matrix_task(); 291 main_subtasks(); //Note these tasks will also be run while waiting for USB keyboard polling intervals
255
256 if (CLK_get_ms() > next_5v_checkup)
257 {
258 next_5v_checkup = CLK_get_ms() + 5;
259
260 v_5v = adc_get(ADC_5V);
261 v_5v_avg = 0.9 * v_5v_avg + 0.1 * v_5v;
262
263 gcr_compute();
264 }
265
266 if (CLK_get_ms() > next_usb_checkup)
267 {
268 next_usb_checkup = CLK_get_ms() + 10;
269
270 USB_HandleExtraDevice();
271 }
272 292
273#ifdef VIRTSER_ENABLE 293#ifdef VIRTSER_ENABLE
274 if (CLK_get_ms() > next_print) 294 if (CLK_get_ms() > next_print)
275 { 295 {
276 next_print = CLK_get_ms() + 250; 296 next_print = CLK_get_ms() + 250;
277 //dpf("5v=%i 5vu=%i dlow=%i dhi=%i gca=%i gcd=%i\r\n",v_5v,v_5v_avg,v_5v_avg-V5_LOW,v_5v_avg-V5_HIGH,gcr_actual,gcr_desired); 297 dprintf("5v=%u 5vu=%u dlow=%u dhi=%u gca=%u gcd=%u\r\n",v_5v,v_5v_avg,v_5v_avg-V5_LOW,v_5v_avg-V5_HIGH,gcr_actual,gcr_desired);
278 } 298 }
279#endif //VIRTSER_ENABLE 299#endif //VIRTSER_ENABLE
280 } 300 }
diff --git a/tmk_core/protocol/arm_atsam/usb/spfssf.c b/tmk_core/protocol/arm_atsam/usb/spfssf.c
deleted file mode 100644
index 449a8bb7d..000000000
--- a/tmk_core/protocol/arm_atsam/usb/spfssf.c
+++ /dev/null
@@ -1,268 +0,0 @@
1#include "samd51j18a.h"
2#include "stdarg.h"
3#include "spfssf.h"
4#include "usb_util.h"
5
6int vspf(char *_Dest, const char *_Format, va_list va)
7{
8 //va_list va; //Variable argument list variable
9 char *d = _Dest; //Pointer to dest
10
11 //va_start(va,_Format); //Initialize the variable argument list
12 while (*_Format) //While not end of format string
13 {
14 if (*_Format == SPF_SPEC_START) //If current format string character is the specifier start character
15 {
16 _Format++; //Skip over the character
17 while (*_Format && *_Format <= 64) _Format++; //Forward past any options
18 if (*_Format == SPF_SPEC_START) *d++ = *_Format; //If the character is the specifier start character, output the character and advance dest
19 else if (*_Format == SPF_SPEC_LONG) //If the character is the long type
20 {
21 _Format++; //Skip over the character
22 if (*_Format == SPF_SPEC_DECIMAL) //If the character is the decimal type
23 {
24 int64_t buf = va_arg(va,int64_t); //Get the next value from the va list
25 //if (buf < 0) { *d++ = '-'; buf = -buf; } //If the given number is negative, add a negative sign to the dest and invert number
26 //spf_uint2str_32_3t(&d,buf,32); //Perform the conversion
27 d += UTIL_ltoa_radix(buf, d, 10);
28 }
29 else if (*_Format == SPF_SPEC_UNSIGNED) //If the character is the unsigned type
30 {
31 uint64_t num = va_arg(va,uint64_t); //Get the next value from the va list
32 //spf_uint2str_32_3t(&d,num,32); //Perform the conversion
33 d += UTIL_ltoa_radix(num, d, 10);
34 }
35 else if (*_Format == SPF_SPEC_UHINT || *_Format == SPF_SPEC_UHINT_UP) //If the character is the unsigned type
36 {
37 uint64_t buf = va_arg(va,uint64_t); //Get the next value from the va list
38 //spf_uint2hex_32(&d,(unsigned long) buf);
39 d += UTIL_ltoa_radix(buf, d, 16);
40 }
41 else //If the character was not a known type
42 {
43 *d++ = SPF_SPEC_START; //Output the start specifier
44 *d++ = SPF_SPEC_LONG; //Output the long type
45 *d++ = *_Format; //Output the unknown type
46 }
47 }
48 else if (*_Format == SPF_SPEC_DECIMAL) //If the character is the decimal type
49 {
50 int buf = va_arg(va,int); //Get the next value from the va list
51 //if (buf < 0) { *d++ = '-'; buf = -buf; } //If the given number is negative, add a negative sign to the dest and invert number
52 //spf_uint2str_32_3t(&d,buf,16); //Perform the conversion
53 d += UTIL_itoa(buf, d);
54 }
55 else if (*_Format == SPF_SPEC_INT) //If the character is the integer type
56 {
57 int buf = va_arg(va,int); //Get the next value from the va list
58 //if (buf < 0) { *d++ = '-'; buf = -buf; } //If the given number is negative, add a negative sign to the dest and inverted number
59 //spf_uint2str_32_3t(&d,buf,16); //Perform the conversion
60 d += UTIL_itoa(buf, d);
61 }
62 else if (*_Format == SPF_SPEC_UINT) //If the character is the unsigned integer type
63 {
64 int buf = va_arg(va,int); //Get the next value from the va list
65 //spf_uint2str_32_3t(&d,buf,16); //Perform the conversion
66 d += UTIL_utoa(buf, d);
67 }
68 else if (*_Format == SPF_SPEC_STRING) //If the character is the string type
69 {
70 char *buf = va_arg(va,char*); //Get the next value from the va list
71 while (*buf) *d++ = *buf++; //Perform the conversion (simply output characters and adcance pointers)
72 }
73 else if (*_Format == SPF_SPEC_UHINT || *_Format == SPF_SPEC_UHINT_UP) //If the character is the short type
74 {
75 int buf = va_arg(va,unsigned int); //Get the next value from the va list
76 //spf_uint2hex_32(&d,(unsigned long) buf); //Perform the conversion
77 d += UTIL_utoa(buf, d);
78 }
79 else //If the character type is unknown
80 {
81 *d++ = SPF_SPEC_START; //Output the start specifier
82 *d++ = *_Format; //Output the unknown type
83 }
84 }
85 else *d++ = *_Format; //If the character is unknown, output it to dest and advance dest
86 _Format++; //Advance the format buffer pointer to next character
87 }
88 //va_end(va); //End the variable argument list
89
90 *d = '\0'; //Cap off the destination string with a zero
91
92 return d - _Dest; //Return the length of the destintion buffer
93}
94
95int spf(char *_Dest, const char *_Format, ...)
96{
97 va_list va; //Variable argument list variable
98 int result;
99
100 va_start(va,_Format); //Initialize the variable argument list
101 result = vspf(_Dest, _Format, va);
102 va_end(va);
103 return result;
104}
105
106//sscanf string to number (integer types)
107int64_t ssf_ston(const char **_Src, uint32_t count, uint32_t *conv_count)
108{
109 int64_t value = 0; //Return value accumulator
110 uint32_t counter=count; //Counter to keep track of numbers converted
111 const char* p; //Pointer to first non space character
112
113 while (*(*_Src) == SSF_SKIP_SPACE) (*_Src)++; //Forward through the whitespace to next non whitespace
114
115 p = (*_Src); //Set pointer to first non space character
116 if (*p == '+' || *p == '-') (*_Src)++; //Skip over sign if any
117 while (*(*_Src) >= ASCII_NUM_START &&
118 *(*_Src) <= ASCII_NUM_END &&
119 counter) //While the source character is a digit and counter is not zero
120 {
121 value *= 10; //Multiply result by 10 to make room for next 1's place number
122 value += *(*_Src)++ - ASCII_NUM_START; //Add source number to value
123 counter--; //Decrement counter
124 }
125 if (counter - count == 0) return 0; //If no number conversion were performed, return 0
126 if (*p == '-') value = -value; //If the number given was negative, make the result negative
127
128 if (conv_count) (*conv_count)++; //Increment the converted count
129 return value; //Return the value
130}
131
132uint64_t ssf_hton(const char **_Src, uint32_t count,uint32_t *conv_count)
133{
134 int64_t value=0; //Return value accumulator
135 uint32_t counter=count; //Counter to keep track of numbers converted
136 //const char* p; //Pointer to first non space character
137 char c;
138
139 while (*(*_Src) == SSF_SKIP_SPACE) (*_Src)++; //Forward through the whitespace to next non whitespace
140
141 //p = (*_Src); //Set pointer to first non space character
142
143 while (counter)
144 {
145 c = *(*_Src)++;
146 if (c >= 'a' && c <= 'f') c -= ('a'-'A'); //toupper
147 if (c < '0' || (c > '9' && c < 'A') || c > 'F') break;
148 value *= 16; //Multiply result by 10 to make room for next 1's place number
149 c = c - '0';
150 if (c > 9) c -= 7;
151 value += c; //Add source number to value
152 counter--; //Decrement counter
153 }
154
155 if (counter - count == 0) return 0; //If no number conversion were performed, return 0
156 //if (*p == '-') value = -value; //If the number given was negative, make the result negative
157
158 if (conv_count) (*conv_count)++; //Increment the converted count
159 return value;
160}
161
162//sscanf
163int ssf(const char *_Src, const char *_Format, ...)
164{
165 va_list va; //Variable argument list variable
166 unsigned char looking_for=0; //Static char specified in format to be found in source
167 uint32_t conv_count=0; //Count of conversions made
168
169 va_start(va,_Format); //Initialize the variable argument list
170 while (*_Format) //While the format string has not been fully read
171 {
172 if (looking_for != 0) //If we are looking for a matching character in the source string
173 {
174 while (*_Src != looking_for && *_Src) _Src++; //While the character is not found in the source string and not the end of the source
175 // string, increment the pointer position
176 if (*_Src == looking_for) _Src++; //If the character was found, step over it
177 else break; //Else the end was reached and the scan is now invalid (Could not find static character)
178 looking_for = 0; //Clear the looking for character
179 }
180 if (*_Format == SSF_SPEC_START) //If the current format character is the specifier start character
181 {
182 _Format++; //Step over the specifier start character
183 if (*_Format == SSF_SPEC_DECIMAL) //If the decimal specifier type is found
184 {
185 int *value=va_arg(va,int*); //User given destination address
186 //*value = (int)ssf_ston(&_Src,5,&conv_count); //Run conversion
187 *value = (int)ssf_ston(&_Src,10,&conv_count); //Run conversion
188 }
189 else if (*_Format == SSF_SPEC_LONG) //If the long specifier type is found
190 {
191 _Format++; //Skip over the specifier type
192 if (*_Format == SSF_SPEC_DECIMAL) //If the decimal specifier type is found
193 {
194 int64_t *value=va_arg(va,int64_t*); //User given destination address
195 //*value = (int64_t)ssf_ston(&_Src,10,&conv_count); //Run conversion
196 *value = (int64_t)ssf_ston(&_Src,19,&conv_count); //Run conversion
197 }
198 else if (*_Format == SSF_SPEC_UHINT) //If the decimal specifier type is found
199 {
200 uint64_t *value=va_arg(va,uint64_t *); //User given destination address
201 //*value = (uint64_t int)ssf_hton(&_Src,12,&conv_count); //Run conversion
202 *value = (uint64_t)ssf_hton(&_Src,16,&conv_count); //Run conversion
203 }
204 }
205 else if (*_Format == SSF_SPEC_SHORTINT) //If the short int specifier type is found
206 {
207 _Format++; //Skip over the specifier type
208 if (*_Format == SSF_SPEC_SHORTINT) //If the short int specifier type is found
209 {
210 _Format++; //Skip over the specifier type
211 if (*_Format == SSF_SPEC_DECIMAL) //If the decimal specifier type is found
212 {
213 unsigned char *value=va_arg(va,unsigned char*); //User given destination address
214 //*value = (unsigned char)ssf_ston(&_Src,3,&conv_count); //Run conversion
215 *value = (unsigned char)ssf_ston(&_Src,5,&conv_count); //Run conversion
216 }
217 }
218 }
219 else if (*_Format == SSF_SPEC_STRING) //If the specifier type is string
220 {
221 char *value=va_arg(va,char*); //User given destination address, max chars read pointer
222 while (*_Src == SSF_SKIP_SPACE) _Src++; //Forward through the whitespace to next non whitespace
223 while (*_Src != SSF_SKIP_SPACE && *_Src) *value++ = *_Src++; //While any character but space and not end of string and not end location, copy char to dest
224 *value = 0; //Cap off the string pointer with zero
225 conv_count++; //Increment the converted count
226 }
227 else if (*_Format == SSF_SPEC_VERSION) //If the specifier type is string
228 {
229 char *value=va_arg(va,char*); //User given destination address, max chars read pointer
230 while (*_Src == SSF_SKIP_SPACE) _Src++; //Forward through the whitespace to next non whitespace
231 while (*_Src != SSF_DELIM_COMMA && *_Src) *value++ = *_Src++; //While any character but space and not end of string and not end location, copy char to dest
232 *value = 0; //Cap off the string pointer with zero
233 conv_count++; //Increment the converted count
234 }
235 else if (*_Format >= ASCII_NUM_START && *_Format <= ASCII_NUM_END)
236 {
237 uint32_t len = (uint32_t)ssf_ston(&_Format,3,NULL); //Convert the given length
238 if (*_Format == SSF_SPEC_STRING) //If the specifier type is string
239 {
240 char *value=va_arg(va,char*),*e; //User given destination address, max chars read pointer
241 while (*_Src == SSF_SKIP_SPACE) _Src++; //Forward through the whitespace to next non whitespace
242 e = (char*)_Src+len; //Set a maximum length pointer location
243 while (*_Src != SSF_SKIP_SPACE && *_Src && _Src != e) *value++ = *_Src++; //While any character but space and not end of string and not end location, copy char to dest
244 *value = 0; //Cap off the string pointer with zero
245 conv_count++; //Increment the converted count
246 }
247 else if (*_Format == SSF_SPEC_VERSION) //If the specifier type is string
248 {
249 char *value=va_arg(va,char*),*e; //User given destination address, max chars read pointer
250 while (*_Src == SSF_SKIP_SPACE) _Src++; //Forward through the whitespace to next non whitespace
251 e = (char*)_Src+len; //Set a maximum length pointer location
252 while (*_Src != SSF_DELIM_COMMA && *_Src && _Src != e) *value++ = *_Src++; //While any character but space and not end of string and not end location, copy char to dest
253 *value = 0; //Cap off the string pointer with zero
254 conv_count++; //Increment the converted count
255 }
256 }
257 else if (*_Format == SSF_SPEC_START) looking_for = *_Format; //If another start specifier character is found, output a specifier character
258 else break; //Scan is now invalid (Uknown type specified)
259 }
260 else if (*_Format == SSF_SKIP_SPACE) { } //If a space is found, ignore it
261 else looking_for = *_Format; //If any other character is found, it is static and should be found in src as well
262 _Format++; //Skip over current format character
263 }
264
265 va_end(va); //End the variable argument list
266 return conv_count; //Return the number of conversions made
267}
268
diff --git a/tmk_core/protocol/arm_atsam/usb/spfssf.h b/tmk_core/protocol/arm_atsam/usb/spfssf.h
deleted file mode 100644
index 337a904df..000000000
--- a/tmk_core/protocol/arm_atsam/usb/spfssf.h
+++ /dev/null
@@ -1,57 +0,0 @@
1#ifndef ____spfssf_h
2#define ____spfssf_h
3
4#include <stdarg.h>
5
6#define sprintf spf
7#define sscanf ssf
8
9#define SIZEOF_OFFSET 1
10
11#ifndef NULL
12#define NULL 0
13#endif
14
15#define SPF_NONE 0
16
17#define SPF_SPEC_START 37 //%
18#define SPF_SPEC_DECIMAL 100 //d 16bit dec signed (-32767 to 32767) DONE same as i
19#define SPF_SPEC_INT 105 //i 16bit dec signed (-32767 to 32767) DONE same as d
20#define SPF_SPEC_UINT 117 //u 16bit dec unsigned (0 to 65535) DONE
21#define SPF_SPEC_STRING 115 //s variable length (abcd...) DONE
22#define SPF_SPEC_UHINT 120 //x 16bit hex lwrc (7fa) DONE
23#define SPF_SPEC_UHINT_UP 88 //x 16bit hex lwrc (7fa) DONE
24#define SPF_SPEC_LONG 108 //l start of either ld or lu DONE
25#define SPF_SPEC_DECIMAL 100 //ld 32bit dec signed (-2147483647 to 2147483647) DONE
26#define SPF_SPEC_UNSIGNED 117 //lu 32bit dec unsigned (0 to 4294967295) DONE
27#define SPF_SPEC_UHINT 120 //lx 32bit hex unsigned (0 to ffffffff) DONE
28
29#define SSF_SPEC_START 37 //%
30#define SSF_SPEC_SHORTINT 104 //h 8bit dec signed (-127 to 127) DONE
31#define SSF_LEN_SHORTINT 3 //hhd
32#define SSF_SPEC_DECIMAL 100 //d 16bit dec signed (-32767 to 32767) DONE
33#define SSF_LEN_DECIMAL 5 //32767
34#define SSF_SPEC_INT 105 //i 16bit dec signed (-32767 to 32767) DONE
35#define SSF_LEN_INT 5 //32767
36#define SSF_SPEC_LONG 108 //l start of either ld or lu DONE
37#define SSF_SPEC_DECIMAL 100 //ld 32bit dec signed (-2147483647 to 2147483647) DONE
38#define SSF_SPEC_UHINT 120 //lx 32bit hex unsigned DONE
39#define SSF_LEN_LDECIMAL 10 //2147483647
40#define SSF_SPEC_STRING 115 //s variable length (abcd...) DONE
41#define SSF_SKIP_SPACE 32 //space
42
43#define SSF_SPEC_VERSION 118 //v collect to comma delimiter - special
44#define SSF_DELIM_COMMA 44 //,
45
46#define ASCII_NUM_START 48 //0
47#define ASCII_NUM_END 58 //9
48
49#define T_UINT32_0_LIMIT 14
50#define T_UINT32_1_LIMIT 27
51
52int vspf(char *_Dest, const char *_Format, va_list va);
53int spf(char *_Dest, const char *_Format, ...);
54int ssf(const char *_Src, const char *_Format, ...);
55
56#endif //____spfssf_h
57
diff --git a/tmk_core/protocol/arm_atsam/usb/udi_cdc.c b/tmk_core/protocol/arm_atsam/usb/udi_cdc.c
index b4159d325..15f0f760c 100644
--- a/tmk_core/protocol/arm_atsam/usb/udi_cdc.c
+++ b/tmk_core/protocol/arm_atsam/usb/udi_cdc.c
@@ -54,7 +54,6 @@
54#include <string.h> 54#include <string.h>
55#include "udi_cdc_conf.h" 55#include "udi_cdc_conf.h"
56#include "udi_device_conf.h" 56#include "udi_device_conf.h"
57#include "spfssf.h"
58#include "stdarg.h" 57#include "stdarg.h"
59#include "tmk_core/protocol/arm_atsam/clks.h" 58#include "tmk_core/protocol/arm_atsam/clks.h"
60 59
@@ -1259,7 +1258,6 @@ uint32_t CDC_print(char *printbuf)
1259 return 1; 1258 return 1;
1260} 1259}
1261 1260
1262
1263char printbuf[CDC_PRINTBUF_SIZE]; 1261char printbuf[CDC_PRINTBUF_SIZE];
1264 1262
1265int dpf(const char *_Format, ...) 1263int dpf(const char *_Format, ...)
@@ -1267,8 +1265,8 @@ int dpf(const char *_Format, ...)
1267 va_list va; //Variable argument list variable 1265 va_list va; //Variable argument list variable
1268 int result; 1266 int result;
1269 1267
1270 va_start(va,_Format); //Initialize the variable argument list 1268 va_start(va, _Format); //Initialize the variable argument list
1271 result = vspf(printbuf, _Format, va); 1269 result = vsnprintf(printbuf, CDC_PRINTBUF_SIZE, _Format, va);
1272 va_end(va); 1270 va_end(va);
1273 1271
1274 CDC_print(printbuf); 1272 CDC_print(printbuf);
@@ -1377,8 +1375,6 @@ void CDC_init(void)
1377 printbuf[0]=0; 1375 printbuf[0]=0;
1378} 1376}
1379 1377
1380char printbuf[CDC_PRINTBUF_SIZE];
1381
1382#endif //CDC line 62 1378#endif //CDC line 62
1383 1379
1384//@} 1380//@}
diff --git a/tmk_core/protocol/arm_atsam/usb/udi_cdc.h b/tmk_core/protocol/arm_atsam/usb/udi_cdc.h
index 6b70e96d0..e134cf236 100644
--- a/tmk_core/protocol/arm_atsam/usb/udi_cdc.h
+++ b/tmk_core/protocol/arm_atsam/usb/udi_cdc.h
@@ -57,8 +57,8 @@
57#include "udi.h" 57#include "udi.h"
58 58
59// Check the number of port 59// Check the number of port
60#ifndef UDI_CDC_PORT_NB 60#ifndef UDI_CDC_PORT_NB
61# define UDI_CDC_PORT_NB 1 61# define UDI_CDC_PORT_NB 1
62#endif 62#endif
63#if (UDI_CDC_PORT_NB > 1) 63#if (UDI_CDC_PORT_NB > 1)
64# error UDI_CDC_PORT_NB must be at most 1 64# error UDI_CDC_PORT_NB must be at most 1
@@ -86,9 +86,6 @@ extern UDC_DESC_STORAGE udi_api_t udi_api_cdc_data;
86//! CDC data endpoints size for FS speed (8B, 16B, 32B, 64B) 86//! CDC data endpoints size for FS speed (8B, 16B, 32B, 64B)
87#define UDI_CDC_DATA_EPS_FS_SIZE CDC_RX_SIZE 87#define UDI_CDC_DATA_EPS_FS_SIZE CDC_RX_SIZE
88 88
89#define CDC_PRINT_BUF_SIZE 256
90extern char printbuf[CDC_PRINT_BUF_SIZE];
91
92//@} 89//@}
93 90
94/** 91/**
@@ -371,9 +368,6 @@ uint32_t CDC_print(char *printbuf);
371uint32_t CDC_input(void); 368uint32_t CDC_input(void);
372void CDC_init(void); 369void CDC_init(void);
373 370
374#define __xprintf dpf
375int dpf(const char *_Format, ...);
376
377#ifdef __cplusplus 371#ifdef __cplusplus
378} 372}
379#endif 373#endif
diff --git a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c
index 18f69350c..1a6f7905e 100644
--- a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c
+++ b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c
@@ -45,6 +45,7 @@
45 */ 45 */
46 46
47#include "samd51j18a.h" 47#include "samd51j18a.h"
48#include "d51_util.h"
48#include "conf_usb.h" 49#include "conf_usb.h"
49#include "usb_protocol.h" 50#include "usb_protocol.h"
50#include "udd.h" 51#include "udd.h"
@@ -86,7 +87,7 @@ bool udi_hid_kbd_b_report_valid;
86COMPILER_WORD_ALIGNED 87COMPILER_WORD_ALIGNED
87uint8_t udi_hid_kbd_report[UDI_HID_KBD_REPORT_SIZE]; 88uint8_t udi_hid_kbd_report[UDI_HID_KBD_REPORT_SIZE];
88 89
89static bool udi_hid_kbd_b_report_trans_ongoing; 90volatile bool udi_hid_kbd_b_report_trans_ongoing;
90 91
91COMPILER_WORD_ALIGNED 92COMPILER_WORD_ALIGNED
92static uint8_t udi_hid_kbd_report_trans[UDI_HID_KBD_REPORT_SIZE]; 93static uint8_t udi_hid_kbd_report_trans[UDI_HID_KBD_REPORT_SIZE];
@@ -186,8 +187,7 @@ bool udi_hid_kbd_send_report(void)
186 return false; 187 return false;
187 } 188 }
188 189
189 memcpy(udi_hid_kbd_report_trans, udi_hid_kbd_report, 190 memcpy(udi_hid_kbd_report_trans, udi_hid_kbd_report, UDI_HID_KBD_REPORT_SIZE);
190 UDI_HID_KBD_REPORT_SIZE);
191 udi_hid_kbd_b_report_valid = false; 191 udi_hid_kbd_b_report_valid = false;
192 udi_hid_kbd_b_report_trans_ongoing = 192 udi_hid_kbd_b_report_trans_ongoing =
193 udd_ep_run(UDI_HID_KBD_EP_IN | USB_EP_DIR_IN, 193 udd_ep_run(UDI_HID_KBD_EP_IN | USB_EP_DIR_IN,
@@ -249,7 +249,7 @@ bool udi_hid_nkro_b_report_valid;
249COMPILER_WORD_ALIGNED 249COMPILER_WORD_ALIGNED
250uint8_t udi_hid_nkro_report[UDI_HID_NKRO_REPORT_SIZE]; 250uint8_t udi_hid_nkro_report[UDI_HID_NKRO_REPORT_SIZE];
251 251
252static bool udi_hid_nkro_b_report_trans_ongoing; 252volatile bool udi_hid_nkro_b_report_trans_ongoing;
253 253
254COMPILER_WORD_ALIGNED 254COMPILER_WORD_ALIGNED
255static uint8_t udi_hid_nkro_report_trans[UDI_HID_NKRO_REPORT_SIZE]; 255static uint8_t udi_hid_nkro_report_trans[UDI_HID_NKRO_REPORT_SIZE];
@@ -355,7 +355,7 @@ bool udi_hid_nkro_send_report(void)
355 return false; 355 return false;
356 } 356 }
357 357
358 memcpy(udi_hid_nkro_report_trans, udi_hid_nkro_report,UDI_HID_NKRO_REPORT_SIZE); 358 memcpy(udi_hid_nkro_report_trans, udi_hid_nkro_report, UDI_HID_NKRO_REPORT_SIZE);
359 udi_hid_nkro_b_report_valid = false; 359 udi_hid_nkro_b_report_valid = false;
360 udi_hid_nkro_b_report_trans_ongoing = 360 udi_hid_nkro_b_report_trans_ongoing =
361 udd_ep_run(UDI_HID_NKRO_EP_IN | USB_EP_DIR_IN, 361 udd_ep_run(UDI_HID_NKRO_EP_IN | USB_EP_DIR_IN,
diff --git a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.h b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.h
index 9a2741534..babfdb7a7 100644
--- a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.h
+++ b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.h
@@ -60,6 +60,7 @@ extern "C" {
60#ifdef KBD 60#ifdef KBD
61extern UDC_DESC_STORAGE udi_api_t udi_api_hid_kbd; 61extern UDC_DESC_STORAGE udi_api_t udi_api_hid_kbd;
62extern bool udi_hid_kbd_b_report_valid; 62extern bool udi_hid_kbd_b_report_valid;
63extern volatile bool udi_hid_kbd_b_report_trans_ongoing;
63extern uint8_t udi_hid_kbd_report_set; 64extern uint8_t udi_hid_kbd_report_set;
64bool udi_hid_kbd_send_report(void); 65bool udi_hid_kbd_send_report(void);
65#endif //KBD 66#endif //KBD
@@ -70,6 +71,7 @@ bool udi_hid_kbd_send_report(void);
70#ifdef NKRO 71#ifdef NKRO
71extern UDC_DESC_STORAGE udi_api_t udi_api_hid_nkro; 72extern UDC_DESC_STORAGE udi_api_t udi_api_hid_nkro;
72extern bool udi_hid_nkro_b_report_valid; 73extern bool udi_hid_nkro_b_report_valid;
74extern volatile bool udi_hid_nkro_b_report_trans_ongoing;
73bool udi_hid_nkro_send_report(void); 75bool udi_hid_nkro_send_report(void);
74#endif //NKRO 76#endif //NKRO
75 77