usb_hid: Fix timer size uint16_t to uint32_t;

example_keyboards
tmk 12 years ago
parent b17f52ebe1
commit c77c5043a1

@ -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 // counter resolution 1ms
volatile uint16_t timer_count = 0; volatile uint32_t timer_count = 0;
void timer_init(void) void timer_init(void)
{ {
@ -59,7 +59,20 @@ void timer_clear(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();
@ -72,14 +85,27 @@ uint16_t timer_read(void)
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?)

@ -40,20 +40,23 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#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_8(a, b) TIMER_DIFF(a, b, UINT8_MAX)
#define TIMER_DIFF_MS(a, b) TIMER_DIFF(a, b, UINT16_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

@ -42,12 +42,6 @@
#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;

@ -26,3 +26,11 @@ You can see HID keyboard reports on debug output.
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.

@ -8,11 +8,11 @@
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)
{ {

@ -3,7 +3,6 @@
#include "parser.h" #include "parser.h"
#include "usb_hid.h" #include "usb_hid.h"
#include "leonardo_led.h"
#include "debug.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)); ::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]);

@ -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
Loading…
Cancel
Save