usb_hid: Fix timer size uint16_t to uint32_t;

master
tmk 2012-09-02 23:47:18 +09:00
parent b17f52ebe1
commit c77c5043a1
8 changed files with 66 additions and 17 deletions

9
common/debug.c 100644
View File

@ -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;

View File

@ -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_MS(t, last);
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_32(t, last);
}
// excecuted once per 1ms.(excess for just timer count?)

View File

@ -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

View File

@ -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;

View File

@ -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.

View File

@ -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)
{

View File

@ -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]);

View File

@ -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