@@ -0,0 +1,9 @@ | |||
#include <stdbool.h> | |||
#include "debug.h" | |||
bool debug_enable = false; | |||
bool debug_matrix = false; | |||
bool debug_keyboard = false; | |||
bool debug_mouse = false; | |||
@@ -22,7 +22,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
// counter resolution 1ms | |||
volatile uint16_t timer_count = 0; | |||
volatile uint32_t timer_count = 0; | |||
void timer_init(void) | |||
{ | |||
@@ -59,7 +59,20 @@ void timer_clear(void) | |||
inline | |||
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; | |||
cli(); | |||
@@ -72,14 +85,27 @@ uint16_t timer_read(void) | |||
inline | |||
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; | |||
cli(); | |||
t = timer_count; | |||
SREG = sreg; | |||
return TIMER_DIFF_MS(t, last); | |||
return TIMER_DIFF_32(t, last); | |||
} | |||
// excecuted once per 1ms.(excess for just timer count?) |
@@ -40,20 +40,23 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
#endif | |||
#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 | |||
extern "C" { | |||
#endif | |||
extern volatile uint16_t timer_count; | |||
extern volatile uint32_t timer_count; | |||
void timer_init(void); | |||
void timer_clear(void); | |||
uint16_t timer_read(void); | |||
uint32_t timer_read32(void); | |||
uint16_t timer_elapsed(uint16_t last); | |||
uint32_t timer_elapsed32(uint32_t last); | |||
#ifdef __cplusplus | |||
} | |||
#endif |
@@ -42,12 +42,6 @@ | |||
#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) | |||
{ | |||
DEBUG_LED_CONFIG; |
@@ -26,3 +26,11 @@ You can see HID keyboard reports on debug output. | |||
Restriction and Bug | |||
------------------- | |||
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. |
@@ -8,11 +8,11 @@ | |||
unsigned long millis() | |||
{ | |||
return timer_read(); | |||
return timer_read32(); | |||
} | |||
unsigned long micros() | |||
{ | |||
return timer_read() * 1000UL; | |||
return timer_read32() * 1000UL; | |||
} | |||
void delay(unsigned long ms) | |||
{ |
@@ -3,7 +3,6 @@ | |||
#include "parser.h" | |||
#include "usb_hid.h" | |||
#include "leonardo_led.h" | |||
#include "debug.h" | |||
@@ -16,9 +15,9 @@ void KBDReportParser::Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf) | |||
::memcpy(&usb_hid_keyboard_report, buf, sizeof(report_keyboard_t)); | |||
usb_hid_time_stamp = millis(); | |||
LED_TX_TOGGLE; | |||
debug("KBDReport: "); | |||
debug_hex(usb_hid_keyboard_report.mods); | |||
debug(" --"); | |||
for (uint8_t i = 0; i < 6; i++) { | |||
debug(" "); | |||
debug_hex(usb_hid_keyboard_report.keys[i]); |
@@ -0,0 +1,10 @@ | |||
#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 |