1
0
Fork 0

Got ps2avrGB to work with the V-USB protocol

This commit is contained in:
Luiz Ribeiro 2017-01-21 12:30:06 -05:00
parent 10ff962321
commit f7462aaa61
19 changed files with 886 additions and 17 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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