Got ps2avrGB to work with the V-USB protocol
This commit is contained in:
parent
10ff962321
commit
f7462aaa61
19 changed files with 886 additions and 17 deletions
|
@ -80,6 +80,14 @@ ifeq ($(strip $(SLEEP_LED_ENABLE)), yes)
|
|||
TMK_COMMON_DEFS += -DNO_SUSPEND_POWER_DOWN
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(NO_UART)), yes)
|
||||
TMK_COMMON_DEFS += -DNO_UART
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(NO_SUSPEND_POWER_DOWN)), yes)
|
||||
TMK_COMMON_DEFS += -DNO_SUSPEND_POWER_DOWN
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(BACKLIGHT_ENABLE)), yes)
|
||||
TMK_COMMON_SRC += $(COMMON_DIR)/backlight.c
|
||||
TMK_COMMON_DEFS += -DBACKLIGHT_ENABLE
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <avr/io.h>
|
||||
#include <avr/eeprom.h>
|
||||
#include <avr/interrupt.h>
|
||||
#include <avr/wdt.h>
|
||||
#include <util/delay.h>
|
||||
|
@ -89,6 +90,10 @@ void bootloader_jump(void) {
|
|||
_delay_ms(5);
|
||||
#endif
|
||||
|
||||
#ifdef EEPROM_BOOTLOADER_START
|
||||
eeprom_write_byte((uint8_t *)EEPROM_BOOTLOADER_START, 0x00);
|
||||
#endif
|
||||
|
||||
// watchdog reset
|
||||
reset_key = BOOTLOADER_RESET_KEY;
|
||||
wdt_enable(WDTO_250MS);
|
||||
|
@ -114,6 +119,11 @@ void bootloader_jump(void) {
|
|||
#endif
|
||||
}
|
||||
|
||||
#ifdef __AVR_ATmega32A__
|
||||
// MCUSR is actually called MCUCSR in ATmega32A
|
||||
#define MCUSR MCUCSR
|
||||
#endif
|
||||
|
||||
/* this runs before main() */
|
||||
void bootloader_jump_after_watchdog_reset(void) __attribute__ ((used, naked, section (".init3")));
|
||||
void bootloader_jump_after_watchdog_reset(void)
|
||||
|
|
|
@ -65,6 +65,7 @@ static uint8_t wdt_timeout = 0;
|
|||
|
||||
static void power_down(uint8_t wdto)
|
||||
{
|
||||
#ifndef __AVR_ATmega32A__
|
||||
#ifdef PROTOCOL_LUFA
|
||||
if (USB_DeviceState == DEVICE_STATE_Configured) return;
|
||||
#endif
|
||||
|
@ -99,6 +100,7 @@ static void power_down(uint8_t wdto)
|
|||
|
||||
// Disable watchdog after sleep
|
||||
wdt_disable();
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
@ -29,25 +29,35 @@ volatile uint32_t timer_count;
|
|||
|
||||
void timer_init(void)
|
||||
{
|
||||
// Timer0 CTC mode
|
||||
TCCR0A = 0x02;
|
||||
|
||||
#if TIMER_PRESCALER == 1
|
||||
TCCR0B = 0x01;
|
||||
uint8_t prescaler = 0x01;
|
||||
#elif TIMER_PRESCALER == 8
|
||||
TCCR0B = 0x02;
|
||||
uint8_t prescaler = 0x02;
|
||||
#elif TIMER_PRESCALER == 64
|
||||
TCCR0B = 0x03;
|
||||
uint8_t prescaler = 0x03;
|
||||
#elif TIMER_PRESCALER == 256
|
||||
TCCR0B = 0x04;
|
||||
uint8_t prescaler = 0x04;
|
||||
#elif TIMER_PRESCALER == 1024
|
||||
TCCR0B = 0x05;
|
||||
uint8_t prescaler = 0x05;
|
||||
#else
|
||||
# error "Timer prescaler value is NOT vaild."
|
||||
#endif
|
||||
|
||||
#ifndef __AVR_ATmega32A__
|
||||
// Timer0 CTC mode
|
||||
TCCR0A = 0x02;
|
||||
|
||||
TCCR0B = prescaler;
|
||||
|
||||
OCR0A = TIMER_RAW_TOP;
|
||||
TIMSK0 = (1<<OCIE0A);
|
||||
#else
|
||||
// Timer0 CTC mode
|
||||
TCCR0 = (1 << WGM01) | prescaler;
|
||||
|
||||
OCR0 = TIMER_RAW_TOP;
|
||||
TIMSK = (1 << OCIE0);
|
||||
#endif
|
||||
}
|
||||
|
||||
inline
|
||||
|
@ -107,7 +117,12 @@ uint32_t timer_elapsed32(uint32_t last)
|
|||
}
|
||||
|
||||
// excecuted once per 1ms.(excess for just timer count?)
|
||||
ISR(TIMER0_COMPA_vect)
|
||||
#ifndef __AVR_ATmega32A__
|
||||
#define TIMER_INTERRUPT_VECTOR TIMER0_COMPA_vect
|
||||
#else
|
||||
#define TIMER_INTERRUPT_VECTOR TIMER0_COMP_vect
|
||||
#endif
|
||||
ISR(TIMER_INTERRUPT_VECTOR, ISR_NOBLOCK)
|
||||
{
|
||||
timer_count++;
|
||||
}
|
||||
|
|
|
@ -235,8 +235,10 @@ static void print_status(void)
|
|||
print("\n\t- Status -\n");
|
||||
|
||||
print_val_hex8(host_keyboard_leds());
|
||||
#ifndef PROTOCOL_VUSB
|
||||
print_val_hex8(keyboard_protocol);
|
||||
print_val_hex8(keyboard_idle);
|
||||
#endif
|
||||
#ifdef NKRO_ENABLE
|
||||
print_val_hex8(keymap_config.nkro);
|
||||
#endif
|
||||
|
|
|
@ -2,7 +2,7 @@ VUSB_DIR = protocol/vusb
|
|||
|
||||
OPT_DEFS += -DPROTOCOL_VUSB
|
||||
|
||||
SRC += $(VUSB_DIR)/main.c \
|
||||
SRC += $(VUSB_DIR)/main.c \
|
||||
$(VUSB_DIR)/vusb.c \
|
||||
$(VUSB_DIR)/usbdrv/usbdrv.c \
|
||||
$(VUSB_DIR)/usbdrv/usbdrvasm.S \
|
||||
|
@ -16,6 +16,7 @@ SRC += $(COMMON_DIR)/sendchar_uart.c \
|
|||
$(COMMON_DIR)/uart.c
|
||||
endif
|
||||
|
||||
|
||||
# Search Path
|
||||
VPATH += $(TMK_DIR)/protocol/vusb:$(TMK_DIR)/protocol/vusb/usbdrv
|
||||
#VPATH += $(TMK_PATH)/$(VUSB_DIR)
|
||||
VPATH += $(TMK_PATH)/$(VUSB_DIR)
|
||||
VPATH += $(TMK_PATH)/$(VUSB_DIR)/usbdrv
|
||||
|
|
|
@ -48,8 +48,12 @@ int main(void)
|
|||
uint16_t last_timer = timer_read();
|
||||
#endif
|
||||
|
||||
#ifdef CLKPR
|
||||
// avoid unintentional changes of clock frequency in devices that have a
|
||||
// clock prescaler
|
||||
CLKPR = 0x80, CLKPR = 0;
|
||||
#ifndef PS2_USE_USART
|
||||
#endif
|
||||
#ifndef NO_UART
|
||||
uart_init(UART_BAUD_RATE);
|
||||
#endif
|
||||
|
||||
|
|
|
@ -15,6 +15,8 @@ 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/eeprom.h>
|
||||
#include <avr/wdt.h>
|
||||
#include <stdint.h>
|
||||
#include "usbdrv.h"
|
||||
#include "usbconfig.h"
|
||||
|
@ -24,6 +26,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
#include "debug.h"
|
||||
#include "host_driver.h"
|
||||
#include "vusb.h"
|
||||
#include "bootloader.h"
|
||||
|
||||
|
||||
static uint8_t vusb_keyboard_leds = 0;
|
||||
|
@ -163,6 +166,7 @@ static struct {
|
|||
uint16_t len;
|
||||
enum {
|
||||
NONE,
|
||||
BOOTLOADER,
|
||||
SET_LED
|
||||
} kind;
|
||||
} last_req;
|
||||
|
@ -193,6 +197,11 @@ usbRequest_t *rq = (void *)data;
|
|||
debug("SET_LED: ");
|
||||
last_req.kind = SET_LED;
|
||||
last_req.len = rq->wLength.word;
|
||||
#ifdef BOOTLOADER_SIZE
|
||||
} else if(rq->wValue.word == 0x0301) {
|
||||
last_req.kind = BOOTLOADER;
|
||||
last_req.len = rq->wLength.word;
|
||||
#endif
|
||||
}
|
||||
return USB_NO_MSG; // to get data in usbFunctionWrite
|
||||
} else {
|
||||
|
@ -220,6 +229,11 @@ uchar usbFunctionWrite(uchar *data, uchar len)
|
|||
last_req.len = 0;
|
||||
return 1;
|
||||
break;
|
||||
case BOOTLOADER:
|
||||
usbDeviceDisconnect();
|
||||
bootloader_jump();
|
||||
return 1;
|
||||
break;
|
||||
case NONE:
|
||||
default:
|
||||
return -1;
|
||||
|
@ -266,7 +280,7 @@ const PROGMEM uchar keyboard_hid_report[] = {
|
|||
0x95, 0x06, // Report Count (6),
|
||||
0x75, 0x08, // Report Size (8),
|
||||
0x15, 0x00, // Logical Minimum (0),
|
||||
0x25, 0xFF, 0x00 // Logical Maximum(255),
|
||||
0x25, 0xFF, 0x00, // Logical Maximum(255),
|
||||
0x05, 0x07, // Usage Page (Key Codes),
|
||||
0x19, 0x00, // Usage Minimum (0),
|
||||
0x29, 0xFF, // Usage Maximum (255),
|
||||
|
@ -336,7 +350,7 @@ const PROGMEM uchar mouse_hid_report[] = {
|
|||
0xa1, 0x01, // COLLECTION (Application)
|
||||
0x85, REPORT_ID_SYSTEM, // REPORT_ID (2)
|
||||
0x15, 0x01, // LOGICAL_MINIMUM (0x1)
|
||||
0x25, 0xb7, 0x00 // LOGICAL_MAXIMUM (0xb7)
|
||||
0x25, 0xb7, 0x00, // LOGICAL_MAXIMUM (0xb7)
|
||||
0x19, 0x01, // USAGE_MINIMUM (0x1)
|
||||
0x29, 0xb7, // USAGE_MAXIMUM (0xb7)
|
||||
0x75, 0x10, // REPORT_SIZE (16)
|
||||
|
@ -481,11 +495,11 @@ USB_PUBLIC usbMsgLen_t usbFunctionDescriptor(struct usbRequest *rq)
|
|||
/* interface index */
|
||||
switch (rq->wIndex.word) {
|
||||
case 0:
|
||||
usbMsgPtr = keyboard_hid_report;
|
||||
usbMsgPtr = (unsigned char *)keyboard_hid_report;
|
||||
len = sizeof(keyboard_hid_report);
|
||||
break;
|
||||
case 1:
|
||||
usbMsgPtr = mouse_hid_report;
|
||||
usbMsgPtr = (unsigned char *)mouse_hid_report;
|
||||
len = sizeof(mouse_hid_report);
|
||||
break;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue