summaryrefslogtreecommitdiffstats
path: root/protocol/vusb
diff options
context:
space:
mode:
Diffstat (limited to 'protocol/vusb')
-rw-r--r--protocol/vusb/bootloader_usbasp.c47
-rw-r--r--protocol/vusb/main.c11
-rw-r--r--protocol/vusb/vusb.c38
3 files changed, 36 insertions, 60 deletions
diff --git a/protocol/vusb/bootloader_usbasp.c b/protocol/vusb/bootloader_usbasp.c
deleted file mode 100644
index 6ec99cbf2..000000000
--- a/protocol/vusb/bootloader_usbasp.c
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
-Copyright 2011 Jun Wako <wakojun@gmail.com>
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <avr/io.h>
-#include <avr/interrupt.h>
-#include "bootloader.h"
-
-
-void bootloader_jump(void) {
- cli();
- // This makes custom USBasploader come up.
- MCUSR = 0;
-
- // ATmega168PA
- // initialize ports
- PORTB = 0; PORTC= 0; PORTD = 0;
- DDRB = 0; DDRC= 0; DDRD = 0;
-
- // disable interrupts
- EIMSK = 0; EECR = 0; SPCR = 0;
- ACSR = 0; SPMCSR = 0; WDTCSR = 0; PCICR = 0;
- TIMSK0 = 0; TIMSK1 = 0; TIMSK2 = 0;
- ADCSRA = 0; TWCR = 0; UCSR0B = 0;
-
- // Boot Loader Section Start Address:
- // BOOTSZ Size Address
- // (lock bit) (word) (word) (byte)
- // '11' 128 0x1F80 0x3F00
- // '10' 256 0x1F00 0x3E00
- // '01' 512 0x1E00 0x3C00
- // '00' 1024 0x1C00 0x3800
- asm volatile("jmp 0x3800");
-}
diff --git a/protocol/vusb/main.c b/protocol/vusb/main.c
index 1bf9035b3..3deb82238 100644
--- a/protocol/vusb/main.c
+++ b/protocol/vusb/main.c
@@ -90,10 +90,15 @@ int main(void)
}
}
#endif
- if (!suspended)
+ if (!suspended) {
usbPoll();
- keyboard_proc();
- if (!suspended)
+
+ // TODO: configuration process is incosistent. it sometime fails.
+ // To prevent failing to configure NOT scan keyboard during configuration
+ if (usbConfiguration && usbInterruptIsReady()) {
+ keyboard_proc();
+ }
vusb_transfer_keyboard();
+ }
}
}
diff --git a/protocol/vusb/vusb.c b/protocol/vusb/vusb.c
index 0bfe21e92..4e11836e1 100644
--- a/protocol/vusb/vusb.c
+++ b/protocol/vusb/vusb.c
@@ -91,20 +91,38 @@ static void send_keyboard(report_keyboard_t *report)
}
+typedef struct {
+ uint8_t report_id;
+ report_mouse_t report;
+} __attribute__ ((packed)) vusb_mouse_report_t;
+
static void send_mouse(report_mouse_t *report)
{
- report->report_id = REPORT_ID_MOUSE;
+ vusb_mouse_report_t r = {
+ .report_id = REPORT_ID_MOUSE,
+ .report = *report
+ };
if (usbInterruptIsReady3()) {
- usbSetInterrupt3((void *)report, sizeof(*report));
+ usbSetInterrupt3((void *)&r, sizeof(vusb_mouse_report_t));
}
}
+
+typedef struct {
+ uint8_t report_id;
+ uint16_t usage;
+} __attribute__ ((packed)) report_extra_t;
+
static void send_system(uint16_t data)
{
- // Not need static?
- static uint8_t report[] = { REPORT_ID_SYSTEM, 0, 0 };
- report[1] = data&0xFF;
- report[2] = (data>>8)&0xFF;
+ static uint16_t last_data = 0;
+ if (data == last_data) return;
+ last_data = data;
+
+ report_extra_t report = {
+ .report_id = REPORT_ID_SYSTEM,
+ .usage = data
+ };
if (usbInterruptIsReady3()) {
usbSetInterrupt3((void *)&report, sizeof(report));
}
@@ -116,10 +134,10 @@ static void send_consumer(uint16_t data)
if (data == last_data) return;
last_data = data;
- // Not need static?
- static uint8_t report[] = { REPORT_ID_CONSUMER, 0, 0 };
- report[1] = data&0xFF;
- report[2] = (data>>8)&0xFF;
+ report_extra_t report = {
+ .report_id = REPORT_ID_CONSUMER,
+ .usage = data
+ };
if (usbInterruptIsReady3()) {
usbSetInterrupt3((void *)&report, sizeof(report));
}