#include <stdbool.h> | |||||
#include "debug.h" | |||||
bool debug_enable = false; | |||||
bool debug_matrix = false; | |||||
bool debug_keyboard = false; | |||||
bool debug_mouse = false; | |||||
// counter resolution 1ms | // counter resolution 1ms | ||||
volatile uint16_t timer_count = 0; | |||||
volatile uint32_t timer_count = 0; | |||||
void timer_init(void) | void timer_init(void) | ||||
{ | { | ||||
inline | inline | ||||
uint16_t timer_read(void) | uint16_t timer_read(void) | ||||
{ | { | ||||
uint16_t t; | |||||
uint32_t t; | |||||
uint8_t sreg = SREG; | |||||
cli(); | |||||
t = timer_count; | |||||
SREG = sreg; | |||||
return (t & 0xFFFF); | |||||
} | |||||
inline | |||||
uint32_t timer_read32(void) | |||||
{ | |||||
uint32_t t; | |||||
uint8_t sreg = SREG; | uint8_t sreg = SREG; | ||||
cli(); | cli(); | ||||
inline | inline | ||||
uint16_t timer_elapsed(uint16_t last) | uint16_t timer_elapsed(uint16_t last) | ||||
{ | { | ||||
uint16_t t; | |||||
uint32_t t; | |||||
uint8_t sreg = SREG; | |||||
cli(); | |||||
t = timer_count; | |||||
SREG = sreg; | |||||
return TIMER_DIFF_16((t & 0xFFFF), last); | |||||
} | |||||
inline | |||||
uint32_t timer_elapsed32(uint32_t last) | |||||
{ | |||||
uint32_t t; | |||||
uint8_t sreg = SREG; | uint8_t sreg = SREG; | ||||
cli(); | cli(); | ||||
t = timer_count; | t = timer_count; | ||||
SREG = sreg; | SREG = sreg; | ||||
return TIMER_DIFF_MS(t, last); | |||||
return TIMER_DIFF_32(t, last); | |||||
} | } | ||||
// excecuted once per 1ms.(excess for just timer count?) | // excecuted once per 1ms.(excess for just timer count?) |
#endif | #endif | ||||
#define TIMER_DIFF(a, b, max) ((a) >= (b) ? (a) - (b) : (max) - (b) + (a)) | #define TIMER_DIFF(a, b, max) ((a) >= (b) ? (a) - (b) : (max) - (b) + (a)) | ||||
#define TIMER_DIFF_RAW(a, b) TIMER_DIFF(a, b, UINT8_MAX) | |||||
#define TIMER_DIFF_MS(a, b) TIMER_DIFF(a, b, UINT16_MAX) | |||||
#define TIMER_DIFF_8(a, b) TIMER_DIFF(a, b, UINT8_MAX) | |||||
#define TIMER_DIFF_16(a, b) TIMER_DIFF(a, b, UINT16_MAX) | |||||
#define TIMER_DIFF_32(a, b) TIMER_DIFF(a, b, UINT32_MAX) | |||||
#ifdef __cplusplus | #ifdef __cplusplus | ||||
extern "C" { | extern "C" { | ||||
#endif | #endif | ||||
extern volatile uint16_t timer_count; | |||||
extern volatile uint32_t timer_count; | |||||
void timer_init(void); | void timer_init(void); | ||||
void timer_clear(void); | void timer_clear(void); | ||||
uint16_t timer_read(void); | uint16_t timer_read(void); | ||||
uint32_t timer_read32(void); | |||||
uint16_t timer_elapsed(uint16_t last); | uint16_t timer_elapsed(uint16_t last); | ||||
uint32_t timer_elapsed32(uint32_t last); | |||||
#ifdef __cplusplus | #ifdef __cplusplus | ||||
} | } | ||||
#endif | #endif |
#define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n)) | #define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n)) | ||||
bool debug_enable = false; | |||||
bool debug_matrix = false; | |||||
bool debug_keyboard = false; | |||||
bool debug_mouse = false; | |||||
int main(void) | int main(void) | ||||
{ | { | ||||
DEBUG_LED_CONFIG; | DEBUG_LED_CONFIG; |
Restriction and Bug | Restriction and Bug | ||||
------------------- | ------------------- | ||||
Not statble yet. | Not statble yet. | ||||
Can't bus-reset a keyboard which already attached on bus properly. | |||||
Slow start up of Leonardo's bootloader causes this? | |||||
Need to unplug/plug a keyboard after firmware starts up. | |||||
MAX3421E doesn't work SAMPLEBUS well to know whether device connected or not. | |||||
Keyboard with other endpoints than boot keyboard may go wrong. | |||||
On my keyboard with mouse key the converter locks up when using mouse key function. |
unsigned long millis() | unsigned long millis() | ||||
{ | { | ||||
return timer_read(); | |||||
return timer_read32(); | |||||
} | } | ||||
unsigned long micros() | unsigned long micros() | ||||
{ | { | ||||
return timer_read() * 1000UL; | |||||
return timer_read32() * 1000UL; | |||||
} | } | ||||
void delay(unsigned long ms) | void delay(unsigned long ms) | ||||
{ | { |
#include "parser.h" | #include "parser.h" | ||||
#include "usb_hid.h" | #include "usb_hid.h" | ||||
#include "leonardo_led.h" | |||||
#include "debug.h" | #include "debug.h" | ||||
::memcpy(&usb_hid_keyboard_report, buf, sizeof(report_keyboard_t)); | ::memcpy(&usb_hid_keyboard_report, buf, sizeof(report_keyboard_t)); | ||||
usb_hid_time_stamp = millis(); | usb_hid_time_stamp = millis(); | ||||
LED_TX_TOGGLE; | |||||
debug("KBDReport: "); | debug("KBDReport: "); | ||||
debug_hex(usb_hid_keyboard_report.mods); | debug_hex(usb_hid_keyboard_report.mods); | ||||
debug(" --"); | |||||
for (uint8_t i = 0; i < 6; i++) { | for (uint8_t i = 0; i < 6; i++) { | ||||
debug(" "); | debug(" "); | ||||
debug_hex(usb_hid_keyboard_report.keys[i]); | debug_hex(usb_hid_keyboard_report.keys[i]); |
#ifndef USB_HID_H | |||||
#define USB_HID_H | |||||
#include "report.h" | |||||
extern report_keyboard_t usb_hid_keyboard_report; | |||||
extern uint16_t usb_hid_time_stamp; | |||||
#endif |