]> git.friedersdorff.com Git - max/tmk_keyboard.git/commitdiff
Add basic sleep_led for chibios.
authorflabbergast <s3+flabbergast@sdfeu.org>
Thu, 10 Sep 2015 09:31:19 +0000 (10:31 +0100)
committerflabbergast <s3+flabbergast@sdfeu.org>
Thu, 10 Sep 2015 09:31:19 +0000 (10:31 +0100)
tmk_core/common/chibios/printf.h
tmk_core/common/chibios/sleep_led.c [new file with mode: 0644]
tmk_core/common/chibios/timer.c
tmk_core/protocol/chibios/README.md
tmk_core/protocol/chibios/main.c
tmk_core/protocol/chibios/usb_main.c
tmk_core/protocol/chibios/usb_main.h

index 008131985f946ea2025c7344eb9d9a0ce1aa6a4a..678a100c6e00b894cd9d1b992f7119d16dd35bff 100644 (file)
@@ -55,16 +55,16 @@ many embedded systems.
 To use the printf you need to supply your own character output function, 
 something like :
 
-       void putc ( void* p, char c)
-               {
-               while (!SERIAL_PORT_EMPTY) ;
-               SERIAL_PORT_TX_REGISTER = c;
-               }
+    void putc ( void* p, char c)
+        {
+        while (!SERIAL_PORT_EMPTY) ;
+        SERIAL_PORT_TX_REGISTER = c;
+        }
 
 Before you can call printf you need to initialize it to use your 
 character output function with something like:
 
-       init_printf(NULL,putc);
+    init_printf(NULL,putc);
 
 Notice the 'NULL' in 'init_printf' and the parameter 'void* p' in 'putc', 
 the NULL (or any pointer) you pass into the 'init_printf' will eventually be 
diff --git a/tmk_core/common/chibios/sleep_led.c b/tmk_core/common/chibios/sleep_led.c
new file mode 100644 (file)
index 0000000..b08c9c2
--- /dev/null
@@ -0,0 +1,19 @@
+#include "ch.h"
+
+#include "led.h"
+#include "sleep_led.h"
+
+void sleep_led_init(void) {
+}
+
+void sleep_led_enable(void) {
+    led_set(1<<USB_LED_CAPS_LOCK);
+}
+
+void sleep_led_disable(void) {
+    led_set(0);
+}
+
+void sleep_led_toggle(void) {
+    // not working yet, state not saved anywhere currently
+}
index c812994b289ddaeebfbf58d816bb4c1f6c11bc93..3de4cc368bad9f82fa76544ec2b61c8970e580bb 100644 (file)
@@ -23,5 +23,5 @@ uint16_t timer_elapsed(uint16_t last)
 
 uint32_t timer_elapsed32(uint32_t last)
 {
-       return ST2MS(chVTTimeElapsedSinceX(MS2ST(last)));
+    return ST2MS(chVTTimeElapsedSinceX(MS2ST(last)));
 }
index 6fbc7c6eae2325af51893d715846add27b8fe24f..5df4c6e77d3e3969294ce824dd1ccde0fea9a8ed 100644 (file)
@@ -8,17 +8,22 @@ Also pay attention to `-O0` (enabled for debugging); for deployment use `-O2`.
 - USB string descriptors are a mess. I did not find a way to cleanly generate the right structures from actual strings, so the definitions in individual keyboards' `config.h` are ugly as heck.
 - There are some random constants left so far, e.g. 5ms sleep between calling `keyboard_task` in `main.c`. There should be no such in `usb_main.c`. Everything is based on timers/interrupts/kernel scheduling (well except `keyboard_task`), so no periodically called things (again, except `keyboard_task`, which is just how TMK is designed).
 - It is easy to add some code for testing (e.g. blink LED, do stuff on button press, etc...) - just create another thread in `main.c`, it will run independently of the keyboard business.
-- Jumping to bootloader works, but it is not entirely pleasant, since it is very much MCU dependent. So, one needs to dig out the right address to jump to, and pass it to the compiler in the `Makefile`. Also, a patch to upstream ChibiOS is needed (supplied), because it `ResetHandler` needs adjusting.
+- Jumping to bootloader works, but it is not entirely pleasant, since it is very much MCU dependent. The code is now geared towards STM32 chips and their built-in bootloaders. So, one needs to dig out the right address to jump to, and pass it to the compiler in the `Makefile`. Also, a patch to upstream ChibiOS is needed (supplied), because it `ResetHandler` needs adjusting.
+- Sleep LED works, but at the moment only on/off, i.e. no breathing.
 - The USB stack works pretty completely; however there are bits of other TMK stuff that are not done yet:
 
 ### Immediate todo
 
-- suspend
-- sleep led
+- power saving for suspend?
+- PWM for sleep led
+
+### Not tested, but possibly working
+
+- backlight
 
 ### Missing / not working (TMK vs ChibiOS bits)
 
-- eeprom / bootmagic (will be chip dependent)
+- eeprom / bootmagic (will be chip dependent; eeprom needs to be emulated in flash, which means less writes; wear-levelling?)
 
 ### Tried with
 
index 6b4ec350a40e5b1b648bd602328489d6bcec8e16..7aec7e3e107f8ba1e82cf572ebd1557c10018c92 100644 (file)
@@ -48,6 +48,28 @@ host_driver_t chibios_driver = {
   send_consumer
 };
 
+
+/* TESTING
+ * Amber LED blinker thread, times are in milliseconds.
+ */
+// uint8_t blinkLedState = 0;
+// static THD_WORKING_AREA(waThread1, 128);
+// static THD_FUNCTION(Thread1, arg) {
+//   (void)arg;
+//   chRegSetThreadName("blinker1");
+//   while(true) {
+//     if(blinkLedState) {
+//       blinkLedState = 0;
+//       palSetPad(GPIOC, GPIOC_LED_ORANGE);
+//       chThdSleepMilliseconds(100);
+//       palClearPad(GPIOC, GPIOC_LED_ORANGE);
+//     }
+//     chThdSleepMilliseconds(100);
+//   }
+// }
+
+
+
 /* Main thread
  */
 int main(void) {
@@ -59,6 +81,9 @@ int main(void) {
   chThdSleepMilliseconds(400);
   palClearPad(GPIOC, GPIOC_LED_BLUE);
 
+  // TESTING
+  // chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL);
+
   /* Init USB */
   init_usb_driver(&USB_DRIVER);
 
index f8a31593b039e373dc1fe8a029d6fcbc58f58e08..daefc49036fc5ca1756985fba2f9fa77c52cf0f3 100644 (file)
@@ -23,6 +23,8 @@
 #include "debug.h"
 #ifdef SLEEP_LED_ENABLE
 #include "sleep_led.h"
+#include "led.h"
+#include "host.h"
 #endif
 
 /* ---------------------------------------------------------
index baeae80a54083330b6dba15657abf8c1e6950b0a..5897375b55ece3f032ad1ae27bc33072e378820a 100644 (file)
@@ -19,6 +19,9 @@
 #ifndef _USB_MAIN_H_
 #define _USB_MAIN_H_
 
+// TESTING
+// extern uint8_t blinkLedState;
+
 #include "ch.h"
 #include "hal.h"