From a9a3610dd4a168e473d2d6a2eb3fbc37aabb46c9 Mon Sep 17 00:00:00 2001 From: tmk Date: Thu, 28 Jun 2012 16:51:56 +0900 Subject: Add LUFA mouse feature and fix mouse report. - add LUFA boot mouse feature - remove report_id from mouse report - fix LUFA descriptor --- common/report.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'common') diff --git a/common/report.h b/common/report.h index b85b86c5f..45f5c0b88 100644 --- a/common/report.h +++ b/common/report.h @@ -82,15 +82,14 @@ typedef struct { uint8_t mods; uint8_t rserved; uint8_t keys[REPORT_KEYS]; -} report_keyboard_t; +} __attribute__ ((packed)) report_keyboard_t; typedef struct { - uint8_t report_id; uint8_t buttons; int8_t x; int8_t y; int8_t v; int8_t h; -} report_mouse_t; +} __attribute__ ((packed)) report_mouse_t; #endif -- cgit v1.2.3-70-g09d2 From 3d81d5221eac9ca9620ba9043a250dcb8371b22e Mon Sep 17 00:00:00 2001 From: tmk Date: Thu, 28 Jun 2012 20:15:56 +0900 Subject: Add consumer/system control feature to LUFA. --- common/keyboard.c | 17 ++---- common/mousekey.c | 4 +- keyboard/lufa/Makefile | 5 +- keyboard/lufa/config.h | 4 +- keyboard/lufa/descriptor.c | 143 +++++++++++++++++++++++++++++++++++++-------- keyboard/lufa/descriptor.h | 28 ++++++--- keyboard/lufa/keymap.c | 2 +- keyboard/lufa/lufa.c | 62 ++++++++++++++------ protocol/vusb/main.c | 5 -- protocol/vusb/vusb.c | 37 +++++------- 10 files changed, 210 insertions(+), 97 deletions(-) (limited to 'common') diff --git a/common/keyboard.c b/common/keyboard.c index 5c2643c95..25f32eb02 100644 --- a/common/keyboard.c +++ b/common/keyboard.c @@ -49,6 +49,7 @@ void keyboard_proc(void) uint8_t fn_bits = 0; #ifdef EXTRAKEY_ENABLE uint16_t consumer_code = 0; + uint16_t system_code = 0; #endif matrix_scan(); @@ -89,22 +90,13 @@ void keyboard_proc(void) #ifdef HOST_PJRC if (suspend && remote_wakeup) { usb_remote_wakeup(); - } else { - host_system_send(SYSTEM_POWER_DOWN); } -#else - host_system_send(SYSTEM_POWER_DOWN); #endif - host_system_send(0); - _delay_ms(500); + system_code = SYSTEM_POWER_DOWN; } else if (code == KB_SYSTEM_SLEEP) { - host_system_send(SYSTEM_SLEEP); - host_system_send(0); - _delay_ms(500); + system_code = SYSTEM_SLEEP; } else if (code == KB_SYSTEM_WAKE) { - host_system_send(SYSTEM_WAKE_UP); - host_system_send(0); - _delay_ms(500); + system_code = SYSTEM_WAKE_UP; } // Consumer Page else if (code == KB_AUDIO_MUTE) { @@ -173,6 +165,7 @@ void keyboard_proc(void) host_send_keyboard_report(); #ifdef EXTRAKEY_ENABLE host_consumer_send(consumer_code); + host_system_send(system_code); #endif #ifdef DEBUG_LED // LED flash for debug diff --git a/common/mousekey.c b/common/mousekey.c index 76bd0fd36..1d35355b4 100644 --- a/common/mousekey.c +++ b/common/mousekey.c @@ -121,12 +121,12 @@ void mousekey_clear_report(void) static void mousekey_debug(void) { if (!debug_mouse) return; - print("mousekey[btn|x y v h]: "); + print("mousekey [btn|x y v h]rep: ["); phex(report.buttons); print("|"); phex(report.x); print(" "); phex(report.y); print(" "); phex(report.v); print(" "); - phex(report.h); + phex(report.h); print("]"); phex(mousekey_repeat); print("\n"); } diff --git a/keyboard/lufa/Makefile b/keyboard/lufa/Makefile index b386fb381..030f4061d 100644 --- a/keyboard/lufa/Makefile +++ b/keyboard/lufa/Makefile @@ -128,7 +128,8 @@ LUFA_SRC = $(TARGET).c \ SRC = $(subst $(LUFA_PATH)/LUFA/,,$(LUFA_SRC)) SRC += keymap.c \ matrix.c \ - led.c + led.c \ + pjrc/bootloader_teensy.c CONFIG_H = config.h @@ -137,7 +138,7 @@ CONFIG_H = config.h # MOUSEKEY_ENABLE = yes # Mouse keys #PS2_MOUSE_ENABLE = yes # PS/2 mouse(TrackPoint) support -#EXTRAKEY_ENABLE = yes # Audio control and System control +EXTRAKEY_ENABLE = yes # Audio control and System control #NKRO_ENABLE = yes # USB Nkey Rollover diff --git a/keyboard/lufa/config.h b/keyboard/lufa/config.h index c375a576f..5368b38d2 100644 --- a/keyboard/lufa/config.h +++ b/keyboard/lufa/config.h @@ -24,8 +24,8 @@ along with this program. If not, see . /* USB Device descriptor */ #define VENDOR_ID 0xFEED -#define PRODUCT_ID 0xBEE1 -#define DEVICE_VER 0x0101 +#define PRODUCT_ID 0xBEE6 +#define DEVICE_VER 0x0202 #define MANUFACTURER t.m.k. #define PRODUCT Macway mod(LUFA) diff --git a/keyboard/lufa/descriptor.c b/keyboard/lufa/descriptor.c index f9ca355a6..e9925cca2 100644 --- a/keyboard/lufa/descriptor.c +++ b/keyboard/lufa/descriptor.c @@ -37,6 +37,7 @@ */ #include "util.h" +#include "report.h" #include "descriptor.h" @@ -86,27 +87,43 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM MouseReport[] = HID_RI_COLLECTION(8, 0x01), /* Application */ HID_RI_USAGE(8, 0x01), /* Pointer */ HID_RI_COLLECTION(8, 0x00), /* Physical */ + HID_RI_USAGE_PAGE(8, 0x09), /* Button */ - HID_RI_USAGE_MINIMUM(8, 0x01), - HID_RI_USAGE_MAXIMUM(8, 0x03), + HID_RI_USAGE_MINIMUM(8, 0x01), /* Button 1 */ + HID_RI_USAGE_MAXIMUM(8, 0x05), /* Button 5 */ HID_RI_LOGICAL_MINIMUM(8, 0x00), HID_RI_LOGICAL_MAXIMUM(8, 0x01), - HID_RI_REPORT_COUNT(8, 0x03), + HID_RI_REPORT_COUNT(8, 0x05), HID_RI_REPORT_SIZE(8, 0x01), HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), HID_RI_REPORT_COUNT(8, 0x01), - HID_RI_REPORT_SIZE(8, 0x05), + HID_RI_REPORT_SIZE(8, 0x03), HID_RI_INPUT(8, HID_IOF_CONSTANT), + HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */ HID_RI_USAGE(8, 0x30), /* Usage X */ HID_RI_USAGE(8, 0x31), /* Usage Y */ - HID_RI_LOGICAL_MINIMUM(8, -1), - HID_RI_LOGICAL_MAXIMUM(8, 1), - HID_RI_PHYSICAL_MINIMUM(8, -1), - HID_RI_PHYSICAL_MAXIMUM(8, 1), + HID_RI_LOGICAL_MINIMUM(8, -127), + HID_RI_LOGICAL_MAXIMUM(8, 127), HID_RI_REPORT_COUNT(8, 0x02), HID_RI_REPORT_SIZE(8, 0x08), HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE), + + HID_RI_USAGE(8, 0x38), /* Wheel */ + HID_RI_LOGICAL_MINIMUM(8, -127), + HID_RI_LOGICAL_MAXIMUM(8, 127), + HID_RI_REPORT_COUNT(8, 0x01), + HID_RI_REPORT_SIZE(8, 0x08), + HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE), + + HID_RI_USAGE_PAGE(8, 0x0C), /* Consumer */ + HID_RI_USAGE(16, 0x0238), /* AC Pan (Horizontal wheel) */ + HID_RI_LOGICAL_MINIMUM(8, -127), + HID_RI_LOGICAL_MAXIMUM(8, 127), + HID_RI_REPORT_COUNT(8, 0x01), + HID_RI_REPORT_SIZE(8, 0x08), + HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE), + HID_RI_END_COLLECTION(0), HID_RI_END_COLLECTION(0), }; @@ -115,22 +132,50 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM ConsoleReport[] = { HID_RI_USAGE_PAGE(16, 0xFF00), /* Vendor Page 0 */ HID_RI_USAGE(8, 0x01), /* Vendor Usage 1 */ - HID_RI_COLLECTION(8, 0x01), /* Vendor Usage 1 */ + HID_RI_COLLECTION(8, 0x01), /* Application */ HID_RI_USAGE(8, 0x02), /* Vendor Usage 2 */ HID_RI_LOGICAL_MINIMUM(8, 0x00), HID_RI_LOGICAL_MAXIMUM(8, 0xFF), HID_RI_REPORT_SIZE(8, 0x08), - HID_RI_REPORT_COUNT(8, GENERIC_REPORT_SIZE), + HID_RI_REPORT_COUNT(8, CONSOLE_EPSIZE), HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), HID_RI_USAGE(8, 0x03), /* Vendor Usage 3 */ HID_RI_LOGICAL_MINIMUM(8, 0x00), HID_RI_LOGICAL_MAXIMUM(8, 0xFF), HID_RI_REPORT_SIZE(8, 0x08), - HID_RI_REPORT_COUNT(8, GENERIC_REPORT_SIZE), + HID_RI_REPORT_COUNT(8, CONSOLE_EPSIZE), HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), HID_RI_END_COLLECTION(0), }; +const USB_Descriptor_HIDReport_Datatype_t PROGMEM ExtraReport[] = +{ + HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */ + HID_RI_USAGE(8, 0x80), /* System Control */ + HID_RI_COLLECTION(8, 0x01), /* Application */ + HID_RI_REPORT_ID(8, REPORT_ID_SYSTEM), + HID_RI_LOGICAL_MINIMUM(16, 0x0081), + HID_RI_LOGICAL_MAXIMUM(16, 0x00B7), + HID_RI_USAGE_MINIMUM(16, 0x0081), /* System Power Down */ + HID_RI_USAGE_MAXIMUM(16, 0x00B7), /* System Display LCD Autoscale */ + HID_RI_REPORT_SIZE(8, 16), + HID_RI_REPORT_COUNT(8, 1), + HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE), + HID_RI_END_COLLECTION(0), + + HID_RI_USAGE_PAGE(8, 0x0C), /* Consumer */ + HID_RI_USAGE(8, 0x01), /* Consumer Control */ + HID_RI_COLLECTION(8, 0x01), /* Application */ + HID_RI_REPORT_ID(8, REPORT_ID_CONSUMER), + HID_RI_LOGICAL_MINIMUM(16, 0x0010), + HID_RI_LOGICAL_MAXIMUM(16, 0x029C), + HID_RI_USAGE_MINIMUM(16, 0x0010), /* +10 */ + HID_RI_USAGE_MAXIMUM(16, 0x029C), /* AC Distribute Vertically */ + HID_RI_REPORT_SIZE(8, 16), + HID_RI_REPORT_COUNT(8, 1), + HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE), + HID_RI_END_COLLECTION(0), +}; /******************************************************************************* * Device Descriptors @@ -167,7 +212,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = .Header = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration}, .TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t), - .TotalInterfaces = 3, + .TotalInterfaces = TOTAL_INTERFACES, .ConfigurationNumber = 1, .ConfigurationStrIndex = NO_DESCRIPTOR, @@ -177,9 +222,9 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = .MaxPowerConsumption = USB_CONFIG_POWER_MA(100) }, - /* - * Keyboard - */ + /* + * Keyboard + */ .Keyboard_Interface = { .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, @@ -213,7 +258,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = .EndpointAddress = (ENDPOINT_DIR_IN | KEYBOARD_IN_EPNUM), .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), - .EndpointSize = HID_EPSIZE, + .EndpointSize = KEYBOARD_EPSIZE, .PollingIntervalMS = 0x01 }, @@ -253,7 +298,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = .EndpointAddress = (ENDPOINT_DIR_IN | MOUSE_IN_EPNUM), .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), - .EndpointSize = HID_EPSIZE, + .EndpointSize = MOUSE_EPSIZE, .PollingIntervalMS = 0x01 }, @@ -264,7 +309,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = { .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, - .InterfaceNumber = GENERIC_INTERFACE, + .InterfaceNumber = CONSOLE_INTERFACE, .AlternateSetting = 0x00, .TotalEndpoints = 2, @@ -291,9 +336,9 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = { .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, - .EndpointAddress = (ENDPOINT_DIR_IN | GENERIC_IN_EPNUM), + .EndpointAddress = (ENDPOINT_DIR_IN | CONSOLE_IN_EPNUM), .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), - .EndpointSize = GENERIC_EPSIZE, + .EndpointSize = CONSOLE_EPSIZE, .PollingIntervalMS = 0x01 }, @@ -301,11 +346,51 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = { .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, - .EndpointAddress = (ENDPOINT_DIR_OUT | GENERIC_OUT_EPNUM), + .EndpointAddress = (ENDPOINT_DIR_OUT | CONSOLE_OUT_EPNUM), + .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + .EndpointSize = CONSOLE_EPSIZE, + .PollingIntervalMS = 0x01 + }, + + /* + * Extra + */ + .Extra_Interface = + { + .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, + + .InterfaceNumber = EXTRA_INTERFACE, + .AlternateSetting = 0x00, + + .TotalEndpoints = 1, + + .Class = HID_CSCP_HIDClass, + .SubClass = HID_CSCP_NonBootSubclass, + .Protocol = HID_CSCP_NonBootProtocol, + + .InterfaceStrIndex = NO_DESCRIPTOR + }, + + .Extra_HID = + { + .Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, + + .HIDSpec = VERSION_BCD(01.11), + .CountryCode = 0x00, + .TotalReportDescriptors = 1, + .HIDReportType = HID_DTYPE_Report, + .HIDReportLength = sizeof(ExtraReport) + }, + + .Extra_INEndpoint = + { + .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, + + .EndpointAddress = (ENDPOINT_DIR_IN | EXTRA_IN_EPNUM), .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), - .EndpointSize = GENERIC_EPSIZE, + .EndpointSize = EXTRA_EPSIZE, .PollingIntervalMS = 0x01 - } + }, }; @@ -387,10 +472,14 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, Address = &ConfigurationDescriptor.Mouse_HID; Size = sizeof(USB_HID_Descriptor_HID_t); break; - case GENERIC_INTERFACE: + case CONSOLE_INTERFACE: Address = &ConfigurationDescriptor.Console_HID; Size = sizeof(USB_HID_Descriptor_HID_t); break; + case EXTRA_INTERFACE: + Address = &ConfigurationDescriptor.Extra_HID; + Size = sizeof(USB_HID_Descriptor_HID_t); + break; } break; case HID_DTYPE_Report: @@ -403,10 +492,14 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, Address = &MouseReport; Size = sizeof(MouseReport); break; - case GENERIC_INTERFACE: + case CONSOLE_INTERFACE: Address = &ConsoleReport; Size = sizeof(ConsoleReport); break; + case EXTRA_INTERFACE: + Address = &ExtraReport; + Size = sizeof(ExtraReport); + break; } break; } diff --git a/keyboard/lufa/descriptor.h b/keyboard/lufa/descriptor.h index d45e905c6..6b1b4d484 100644 --- a/keyboard/lufa/descriptor.h +++ b/keyboard/lufa/descriptor.h @@ -60,22 +60,34 @@ typedef struct USB_HID_Descriptor_HID_t Console_HID; USB_Descriptor_Endpoint_t Console_INEndpoint; USB_Descriptor_Endpoint_t Console_OUTEndpoint; + + // Extra HID Interface + USB_Descriptor_Interface_t Extra_Interface; + USB_HID_Descriptor_HID_t Extra_HID; + USB_Descriptor_Endpoint_t Extra_INEndpoint; } USB_Descriptor_Configuration_t; +/* nubmer of interfaces */ +#define TOTAL_INTERFACES 4 + +/* index of interface */ #define KEYBOARD_INTERFACE 0 #define MOUSE_INTERFACE 1 -#define GENERIC_INTERFACE 2 +#define CONSOLE_INTERFACE 2 +#define EXTRA_INTERFACE 3 -// Endopoint number/size +// Endopoint number and size #define KEYBOARD_IN_EPNUM 1 #define MOUSE_IN_EPNUM 2 -#define GENERIC_IN_EPNUM 3 -#define GENERIC_OUT_EPNUM 4 - -#define HID_EPSIZE 8 -#define GENERIC_EPSIZE 8 -#define GENERIC_REPORT_SIZE 8 +#define CONSOLE_IN_EPNUM 3 +#define CONSOLE_OUT_EPNUM 4 +#define EXTRA_IN_EPNUM 5 + +#define KEYBOARD_EPSIZE 8 +#define MOUSE_EPSIZE 8 +#define CONSOLE_EPSIZE 8 +#define EXTRA_EPSIZE 8 uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, diff --git a/keyboard/lufa/keymap.c b/keyboard/lufa/keymap.c index a223da731..aa563651a 100644 --- a/keyboard/lufa/keymap.c +++ b/keyboard/lufa/keymap.c @@ -110,7 +110,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | |Gui |Alt | |Alt |Gui| | |Ctr| * `-----------------------------------------------------------' */ - KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, \ + KEYMAP(PWR, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, \ CAPS,NO, NO, NO, NO, NO, NO, NO, PSCR,SLCK,BRK, UP, NO, NO, \ LCTL,VOLD,VOLU,MUTE,NO, NO, PAST,PSLS,HOME,PGUP,LEFT,RGHT,ENT, \ LSFT,NO, NO, NO, NO, NO, PPLS,PMNS,END, PGDN,DOWN,RSFT,FN1, \ diff --git a/keyboard/lufa/lufa.c b/keyboard/lufa/lufa.c index a87d8474a..09da96b2e 100644 --- a/keyboard/lufa/lufa.c +++ b/keyboard/lufa/lufa.c @@ -117,7 +117,7 @@ static void Console_HID_Task(void) return; // TODO: impl receivechar()/recvchar() - Endpoint_SelectEndpoint(GENERIC_OUT_EPNUM); + Endpoint_SelectEndpoint(CONSOLE_OUT_EPNUM); /* Check to see if a packet has been sent from the host */ if (Endpoint_IsOUTReceived()) @@ -126,7 +126,7 @@ static void Console_HID_Task(void) if (Endpoint_IsReadWriteAllowed()) { /* Create a temporary buffer to hold the read in report from the host */ - uint8_t ConsoleData[GENERIC_REPORT_SIZE]; + uint8_t ConsoleData[CONSOLE_EPSIZE]; /* Read Console Report Data */ Endpoint_Read_Stream_LE(&ConsoleData, sizeof(ConsoleData), NULL); @@ -140,7 +140,7 @@ static void Console_HID_Task(void) } /* IN packet */ - Endpoint_SelectEndpoint(GENERIC_IN_EPNUM); + Endpoint_SelectEndpoint(CONSOLE_IN_EPNUM); // send IN packet if (Endpoint_IsINReady()) Endpoint_ClearIN(); @@ -169,17 +169,21 @@ void EVENT_USB_Device_ConfigurationChanged(void) /* Setup Keyboard HID Report Endpoints */ ConfigSuccess &= Endpoint_ConfigureEndpoint(KEYBOARD_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, - HID_EPSIZE, ENDPOINT_BANK_SINGLE); + KEYBOARD_EPSIZE, ENDPOINT_BANK_SINGLE); /* Setup Mouse HID Report Endpoint */ ConfigSuccess &= Endpoint_ConfigureEndpoint(MOUSE_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, - HID_EPSIZE, ENDPOINT_BANK_SINGLE); + MOUSE_EPSIZE, ENDPOINT_BANK_SINGLE); /* Setup Console HID Report Endpoints */ - ConfigSuccess &= Endpoint_ConfigureEndpoint(GENERIC_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, - GENERIC_EPSIZE, ENDPOINT_BANK_SINGLE); - ConfigSuccess &= Endpoint_ConfigureEndpoint(GENERIC_OUT_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_OUT, - GENERIC_EPSIZE, ENDPOINT_BANK_SINGLE); + ConfigSuccess &= Endpoint_ConfigureEndpoint(CONSOLE_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, + CONSOLE_EPSIZE, ENDPOINT_BANK_SINGLE); + ConfigSuccess &= Endpoint_ConfigureEndpoint(CONSOLE_OUT_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_OUT, + CONSOLE_EPSIZE, ENDPOINT_BANK_SINGLE); + + /* Setup Extra HID Report Endpoint */ + ConfigSuccess &= Endpoint_ConfigureEndpoint(EXTRA_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, + EXTRA_EPSIZE, ENDPOINT_BANK_SINGLE); } /* @@ -223,7 +227,9 @@ void EVENT_USB_Device_ControlRequest(void) ReportData = (uint8_t*)&mouse_report_sent; ReportSize = sizeof(mouse_report_sent); break; - case GENERIC_INTERFACE: + case CONSOLE_INTERFACE: + break; + case EXTRA_INTERFACE: break; } @@ -254,7 +260,9 @@ void EVENT_USB_Device_ControlRequest(void) break; case MOUSE_INTERFACE: break; - case GENERIC_INTERFACE: + case CONSOLE_INTERFACE: + break; + case EXTRA_INTERFACE: break; } @@ -301,12 +309,7 @@ static void send_mouse(report_mouse_t *report) if (Endpoint_IsReadWriteAllowed()) { /* Write Mouse Report Data */ - /* Mouse report data structure - * LUFA: { buttons, x, y } - * tmk: { buttons, x, y, v, h } - */ - //Endpoint_Write_Stream_LE((uint8_t *)report+1, 3, NULL); - Endpoint_Write_Stream_LE(report, 3, NULL); + Endpoint_Write_Stream_LE(report, sizeof(report_mouse_t), NULL); /* Finalize the stream transfer to send the last packet */ Endpoint_ClearIN(); @@ -314,12 +317,35 @@ static void send_mouse(report_mouse_t *report) mouse_report_sent = *report; } +typedef struct { + uint8_t report_id; + uint16_t usage; +} __attribute__ ((packed)) report_extra_t; + static void send_system(uint16_t data) { + Endpoint_SelectEndpoint(EXTRA_IN_EPNUM); + if (Endpoint_IsReadWriteAllowed()) { + report_extra_t r = { + .report_id = REPORT_ID_SYSTEM, + .usage = data + }; + Endpoint_Write_Stream_LE(&r, sizeof(report_extra_t), NULL); + Endpoint_ClearIN(); + } } static void send_consumer(uint16_t data) { + Endpoint_SelectEndpoint(EXTRA_IN_EPNUM); + if (Endpoint_IsReadWriteAllowed()) { + report_extra_t r = { + .report_id = REPORT_ID_CONSUMER, + .usage = data + }; + Endpoint_Write_Stream_LE(&r, sizeof(report_extra_t), NULL); + Endpoint_ClearIN(); + } } @@ -331,7 +357,7 @@ int8_t sendchar(uint8_t c) if (USB_DeviceState != DEVICE_STATE_Configured) return -1; - Endpoint_SelectEndpoint(GENERIC_IN_EPNUM); + Endpoint_SelectEndpoint(CONSOLE_IN_EPNUM); uint8_t timeout = 10; uint16_t prevFN = USB_Device_GetFrameNumber(); diff --git a/protocol/vusb/main.c b/protocol/vusb/main.c index 1ba40a27a..3deb82238 100644 --- a/protocol/vusb/main.c +++ b/protocol/vusb/main.c @@ -62,11 +62,6 @@ int main(void) debug("initForUsbConnectivity()\n"); initForUsbConnectivity(); - int i; - while(--i){ /* To configured */ - usbPoll(); - _delay_ms(1); - } debug("main loop\n"); while (1) { diff --git a/protocol/vusb/vusb.c b/protocol/vusb/vusb.c index 1dff5dea2..4e11836e1 100644 --- a/protocol/vusb/vusb.c +++ b/protocol/vusb/vusb.c @@ -107,32 +107,25 @@ static void send_mouse(report_mouse_t *report) } } -/* + typedef struct { - uint8_t report_id; - uint8_t data0; - uint8_t data1; -} __attribute__ ((packed)) vusb_system_report_t; -*/ + 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; -*/ -/* - vusb_system_report_t r = { + static uint16_t last_data = 0; + if (data == last_data) return; + last_data = data; + + report_extra_t report = { .report_id = REPORT_ID_SYSTEM, - .data0 = data&0xFF, - .data1 = (data>>8)&0xFF + .usage = data }; if (usbInterruptIsReady3()) { - usbSetInterrupt3((void *)&r, sizeof(vusb_system_report_t)); + usbSetInterrupt3((void *)&report, sizeof(report)); } -*/ } static void send_consumer(uint16_t data) @@ -141,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)); } -- cgit v1.2.3-70-g09d2 From a112f3614e0e3204ce35dcdfbf2723c3382c4c35 Mon Sep 17 00:00:00 2001 From: tmk Date: Fri, 29 Jun 2012 16:48:36 +0900 Subject: confirm SetReport LED. --- common/command.c | 1 + common/host.c | 5 +- keyboard/macway/keymap.c | 2 +- protocol/lufa/descriptor.h | 7 +++ protocol/lufa/lufa.c | 122 ++++++++++++++++++++++++--------------------- protocol/lufa/lufa.h | 15 +++++- 6 files changed, 91 insertions(+), 61 deletions(-) (limited to 'common') diff --git a/common/command.c b/common/command.c index e325a5d84..13d37242d 100644 --- a/common/command.c +++ b/common/command.c @@ -138,6 +138,7 @@ static uint8_t command_common(void) } break; case KB_S: + print("host_keyboard_leds:"); phex(host_keyboard_leds()); print("\n"); #ifdef HOST_PJRC print("UDCON: "); phex(UDCON); print("\n"); print("UDIEN: "); phex(UDIEN); print("\n"); diff --git a/common/host.c b/common/host.c index cc26d55c2..8dd2abbee 100644 --- a/common/host.c +++ b/common/host.c @@ -168,13 +168,16 @@ void host_mouse_send(report_mouse_t *report) void host_system_send(uint16_t data) { + static uint16_t last_data = 0; + if (data == last_data) return; + last_data = data; + if (!driver) return; (*driver->send_system)(data); } void host_consumer_send(uint16_t data) { - // TODO: this is needed? static uint16_t last_data = 0; if (data == last_data) return; last_data = data; diff --git a/keyboard/macway/keymap.c b/keyboard/macway/keymap.c index 5ecea2569..76c0d8b72 100644 --- a/keyboard/macway/keymap.c +++ b/keyboard/macway/keymap.c @@ -111,7 +111,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------' */ KEYMAP(PWR, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, \ - CAPS,NO, NO, NO, NO, NO, NO, NO, PSCR,SLCK,BRK, UP, NO, NO, \ + CAPS,NO, NO, NO, NO, NO, NO, NO, PSCR,SLCK,BRK, UP, NO, NLCK,\ LCTL,VOLD,VOLU,MUTE,NO, NO, PAST,PSLS,HOME,PGUP,LEFT,RGHT,ENT, \ LSFT,NO, NO, NO, NO, NO, PPLS,PMNS,END, PGDN,DOWN,RSFT,FN1, \ NO, LGUI,LALT,SPC, RALT,NO, NO, NO, RCTL), diff --git a/protocol/lufa/descriptor.h b/protocol/lufa/descriptor.h index 19bce999f..001e072e6 100644 --- a/protocol/lufa/descriptor.h +++ b/protocol/lufa/descriptor.h @@ -1,3 +1,10 @@ +/* + * Copyright 2012 Jun Wako + * This file is based on: + * LUFA-120219/Demos/Device/Lowlevel/KeyboardMouse + * LUFA-120219/Demos/Device/Lowlevel/GenericHID + */ + /* LUFA Library Copyright (C) Dean Camera, 2012. diff --git a/protocol/lufa/lufa.c b/protocol/lufa/lufa.c index f485e24bf..8fa719bc9 100644 --- a/protocol/lufa/lufa.c +++ b/protocol/lufa/lufa.c @@ -46,13 +46,12 @@ #include "descriptor.h" #include "lufa.h" +static uint8_t idle_duration = 0; +static uint8_t protocol_report = 1; static uint8_t keyboard_led_stats = 0; -// TODO: impl Control Request GET_REPORT static report_keyboard_t keyboard_report_sent; -#ifdef MOUSE_ENABLE -static report_mouse_t mouse_report_sent; -#endif + /* Host driver */ static uint8_t keyboard_leds(void); @@ -83,12 +82,8 @@ int main(void) debug_keyboard = true; debug_mouse = true; -/* TODO: can't print here - _delay_ms(5000); - USB_USBTask(); - print("abcdefg\n"); - USB_USBTask(); -*/ + // TODO: can't print here + debug("LUFA init\n"); keyboard_init(); host_set_driver(&lufa_driver); @@ -228,19 +223,6 @@ void EVENT_USB_Device_ControlRequest(void) ReportData = (uint8_t*)&keyboard_report_sent; ReportSize = sizeof(keyboard_report_sent); break; -#ifdef MOUSE_ENABLE - case MOUSE_INTERFACE: - // TODO: test/check - ReportData = (uint8_t*)&mouse_report_sent; - ReportSize = sizeof(mouse_report_sent); - break; -#endif -#ifdef EXTRAKEY_ENABLE - case EXTRA_INTERFACE: - break; -#endif - case CONSOLE_INTERFACE: - break; } /* Write the report data to the control endpoint */ @@ -252,35 +234,65 @@ void EVENT_USB_Device_ControlRequest(void) case HID_REQ_SetReport: if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) { - Endpoint_ClearSETUP(); - - /* Wait until the LED report has been sent by the host */ - while (!(Endpoint_IsOUTReceived())) - { - if (USB_DeviceState == DEVICE_STATE_Unattached) - return; - } // Interface switch (USB_ControlRequest.wIndex) { case KEYBOARD_INTERFACE: - // TODO: test/check - /* Read in the LED report from the host */ + Endpoint_ClearSETUP(); + + while (!(Endpoint_IsOUTReceived())) { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return; + } keyboard_led_stats = Endpoint_Read_8(); - break; -#ifdef MOUSE_ENABLE - case MOUSE_INTERFACE: - break; -#endif -#ifdef EXTRAKEY_ENABLE - case EXTRA_INTERFACE: - break; -#endif - case CONSOLE_INTERFACE: + + Endpoint_ClearOUT(); + Endpoint_ClearStatusStage(); break; } - Endpoint_ClearOUT(); + } + + break; + + case HID_REQ_GetProtocol: + if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) + { + Endpoint_ClearSETUP(); + while (!(Endpoint_IsINReady())); + Endpoint_Write_8(protocol_report); + Endpoint_ClearIN(); + Endpoint_ClearStatusStage(); + } + + break; + case HID_REQ_SetProtocol: + if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) + { + Endpoint_ClearSETUP(); + Endpoint_ClearStatusStage(); + + protocol_report = ((USB_ControlRequest.wValue & 0xFF) != 0x00); + } + + break; + case HID_REQ_SetIdle: + if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) + { + Endpoint_ClearSETUP(); + Endpoint_ClearStatusStage(); + + idle_duration = ((USB_ControlRequest.wValue & 0xFF00) >> 8); + } + + break; + case HID_REQ_GetIdle: + if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) + { + Endpoint_ClearSETUP(); + while (!(Endpoint_IsINReady())); + Endpoint_Write_8(idle_duration); + Endpoint_ClearIN(); Endpoint_ClearStatusStage(); } @@ -329,23 +341,17 @@ static void send_mouse(report_mouse_t *report) /* Finalize the stream transfer to send the last packet */ Endpoint_ClearIN(); } - mouse_report_sent = *report; #endif } -typedef struct { - uint8_t report_id; - uint16_t usage; -} __attribute__ ((packed)) report_extra_t; - static void send_system(uint16_t data) { + report_extra_t r = { + .report_id = REPORT_ID_SYSTEM, + .usage = data + }; Endpoint_SelectEndpoint(EXTRA_IN_EPNUM); if (Endpoint_IsReadWriteAllowed()) { - report_extra_t r = { - .report_id = REPORT_ID_SYSTEM, - .usage = data - }; Endpoint_Write_Stream_LE(&r, sizeof(report_extra_t), NULL); Endpoint_ClearIN(); } @@ -353,12 +359,12 @@ static void send_system(uint16_t data) static void send_consumer(uint16_t data) { + report_extra_t r = { + .report_id = REPORT_ID_CONSUMER, + .usage = data + }; Endpoint_SelectEndpoint(EXTRA_IN_EPNUM); if (Endpoint_IsReadWriteAllowed()) { - report_extra_t r = { - .report_id = REPORT_ID_CONSUMER, - .usage = data - }; Endpoint_Write_Stream_LE(&r, sizeof(report_extra_t), NULL); Endpoint_ClearIN(); } diff --git a/protocol/lufa/lufa.h b/protocol/lufa/lufa.h index efb8c3837..71c279b0d 100644 --- a/protocol/lufa/lufa.h +++ b/protocol/lufa/lufa.h @@ -1,3 +1,10 @@ +/* + * Copyright 2012 Jun Wako + * This file is based on: + * LUFA-120219/Demos/Device/Lowlevel/KeyboardMouse + * LUFA-120219/Demos/Device/Lowlevel/GenericHID + */ + /* LUFA Library Copyright (C) Dean Camera, 2012. @@ -32,7 +39,6 @@ #ifndef _LUFA_H_ #define _LUFA_H_ - /* Includes: */ #include #include #include @@ -42,4 +48,11 @@ #include #include + +/* extra report structure */ +typedef struct { + uint8_t report_id; + uint16_t usage; +} __attribute__ ((packed)) report_extra_t; + #endif -- cgit v1.2.3-70-g09d2 From f427529a30487de45ebfbe6fbba9c290738878ab Mon Sep 17 00:00:00 2001 From: tmk Date: Sat, 30 Jun 2012 11:19:07 +0900 Subject: Fix bootloader.c --- common/bootloader.c | 68 +++++++++++++++++++++++++++++---------- keyboard/macway/Makefile.lufa | 13 ++++++-- protocol/pjrc.mk | 3 +- protocol/pjrc/bootloader_teensy.c | 40 ----------------------- 4 files changed, 62 insertions(+), 62 deletions(-) delete mode 100644 protocol/pjrc/bootloader_teensy.c (limited to 'common') diff --git a/common/bootloader.c b/common/bootloader.c index 5cbfc72e5..cb971c704 100644 --- a/common/bootloader.c +++ b/common/bootloader.c @@ -1,22 +1,56 @@ -/* -Copyright 2011 Jun Wako - -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. +#include +#include +#include +#include "bootloader.h" -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. +/* Start Bootloader from Application + * See + * http://www.pjrc.com/teensy/jump_to_bootloader.html + * http://www.fourwalledcubicle.com/files/LUFA/Doc/120219/html/_page__software_bootloader_start.html + */ -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ +/* Boot Section Size in bytes + * Teensy halfKay 512 + * Atmel DFU loader 4096 + * LUFA bootloader 4096 + */ +#ifndef BOOT_SIZE +#define BOOT_SIZE 512 +#endif -#include "bootloader.h" +#define FLASH_SIZE (FLASHEND + 1) +#define BOOTLOADER_START (FLASHEND - BOOT_SIZE) +void bootloader_jump(void) { + cli(); + // disable watchdog, if enabled + // disable all peripherals + UDCON = 1; + USBCON = (1< -#include -#include -#include "bootloader.h" - -void bootloader_jump(void) { - cli(); - // disable watchdog, if enabled - // disable all peripherals - UDCON = 1; - USBCON = (1< Date: Sat, 30 Jun 2012 13:26:09 +0900 Subject: Add Makefile.lufa to keyboard/hhkb and hbkb. --- common/bootloader.c | 1 + keyboard/hbkb/Makefile | 57 +------------------- keyboard/hbkb/Makefile.lufa | 119 ++++++++++++++++++++++++++++++++++++++++++ keyboard/hbkb/Makefile.pjrc | 56 ++++++++++++++++++++ keyboard/hbkb/config.h | 3 ++ keyboard/hhkb/Makefile.lufa | 119 ++++++++++++++++++++++++++++++++++++++++++ keyboard/hhkb/Makefile.pjrc | 7 ++- keyboard/hhkb/config.h | 65 +++++++++++++++++++++++ keyboard/hhkb/config_pjrc.h | 62 ---------------------- keyboard/hhkb/matrix.c | 10 ++-- keyboard/macway/Makefile.lufa | 4 +- keyboard/macway/Makefile.pjrc | 3 +- protocol/pjrc.mk | 3 +- rules.mk | 6 ++- 14 files changed, 383 insertions(+), 132 deletions(-) mode change 100644 => 120000 keyboard/hbkb/Makefile create mode 100644 keyboard/hbkb/Makefile.lufa create mode 100644 keyboard/hbkb/Makefile.pjrc create mode 100644 keyboard/hhkb/Makefile.lufa create mode 100644 keyboard/hhkb/config.h delete mode 100644 keyboard/hhkb/config_pjrc.h (limited to 'common') diff --git a/common/bootloader.c b/common/bootloader.c index cb971c704..e45295cd5 100644 --- a/common/bootloader.c +++ b/common/bootloader.c @@ -9,6 +9,7 @@ * http://www.fourwalledcubicle.com/files/LUFA/Doc/120219/html/_page__software_bootloader_start.html */ +// TODO: support usbasp /* Boot Section Size in bytes * Teensy halfKay 512 * Atmel DFU loader 4096 diff --git a/keyboard/hbkb/Makefile b/keyboard/hbkb/Makefile deleted file mode 100644 index 26be322e0..000000000 --- a/keyboard/hbkb/Makefile +++ /dev/null @@ -1,56 +0,0 @@ -# Target file name (without extension). -TARGET = hbk - -# Directory common source filess exist -TOP_DIR = ../.. - -# Directory keyboard dependent files exist -TARGET_DIR = . - -# keyboard dependent files -SRC = main.c \ - keymap.c \ - matrix.c \ - led.c - -CONFIG_H = config.h - - -# MCU name, you MUST set this to match the board you are using -# type "make clean" after changing this, so all files will be rebuilt -#MCU = at90usb162 # Teensy 1.0 -MCU = atmega32u4 # Teensy 2.0 -#MCU = at90usb646 # Teensy++ 1.0 -#MCU = at90usb1286 # Teensy++ 2.0 - - -# Processor frequency. -# Normally the first thing your program should do is set the clock prescaler, -# so your program will run at the correct speed. You should also set this -# variable to same clock speed. The _delay_ms() macro uses this, and many -# examples use this variable to calculate timings. Do not add a "UL" here. -F_CPU = 16000000 - - -# Build Options -# comment out to disable the options. -# -MOUSEKEY_ENABLE = yes # Mouse keys -#PS2_MOUSE_ENABLE = yes # PS/2 mouse(TrackPoint) support -EXTRAKEY_ENABLE = yes # Audio control and System control -#NKRO_ENABLE = yes # USB Nkey Rollover - - - -#---------------- Programming Options -------------------------- -#PROGRAM_CMD = teensy_loader_cli -mmcu=$(MCU) -w -v $(TARGET).hex -PROGRAM_CMD = /opt/dfu-programmer-0.5.2/bin/dfu-programmer $(MCU) erase && \ - /opt/dfu-programmer-0.5.2/bin/dfu-programmer $(MCU) flash $(TARGET).hex && \ - /opt/dfu-programmer-0.5.2/bin/dfu-programmer $(MCU) start - - - -include $(TOP_DIR)/protocol/pjrc.mk -include $(TOP_DIR)/protocol.mk -include $(TOP_DIR)/common.mk -include $(TOP_DIR)/rules.mk diff --git a/keyboard/hbkb/Makefile b/keyboard/hbkb/Makefile new file mode 120000 index 000000000..f00d036da --- /dev/null +++ b/keyboard/hbkb/Makefile @@ -0,0 +1 @@ +Makefile.lufa \ No newline at end of file diff --git a/keyboard/hbkb/Makefile.lufa b/keyboard/hbkb/Makefile.lufa new file mode 100644 index 000000000..c73a0ca7d --- /dev/null +++ b/keyboard/hbkb/Makefile.lufa @@ -0,0 +1,119 @@ +#---------------------------------------------------------------------------- +# On command line: +# +# make all = Make software. +# +# make clean = Clean out built project files. +# +# make coff = Convert ELF to AVR COFF. +# +# make extcoff = Convert ELF to AVR Extended COFF. +# +# make program = Download the hex file to the device. +# Please customize your programmer settings(PROGRAM_CMD) +# +# make teensy = Download the hex file to the device, using teensy_loader_cli. +# (must have teensy_loader_cli installed). +# +# make dfu = Download the hex file to the device, using dfu-programmer (must +# have dfu-programmer installed). +# +# make flip = Download the hex file to the device, using Atmel FLIP (must +# have Atmel FLIP installed). +# +# make dfu-ee = Download the eeprom file to the device, using dfu-programmer +# (must have dfu-programmer installed). +# +# make flip-ee = Download the eeprom file to the device, using Atmel FLIP +# (must have Atmel FLIP installed). +# +# make debug = Start either simulavr or avarice as specified for debugging, +# with avr-gdb or avr-insight as the front end for debugging. +# +# make filename.s = Just compile filename.c into the assembler code only. +# +# make filename.i = Create a preprocessed source file for use in submitting +# bug reports to the GCC project. +# +# To rebuild project do "make clean" then "make all". +#---------------------------------------------------------------------------- + +# Target file name (without extension). +TARGET = hbkb_lufa + +# Directory common source filess exist +TOP_DIR = ../.. + +# Directory keyboard dependent files exist +TARGET_DIR = . + + +# List C source files here. (C dependencies are automatically generated.) +SRC += keymap.c \ + matrix.c \ + led.c + +CONFIG_H = config.h + + +# MCU name +#MCU = at90usb1287 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + + +# Build Options +# comment out to disable the options. +# +MOUSEKEY_ENABLE = yes # Mouse keys +EXTRAKEY_ENABLE = yes # Audio control and System control +#NKRO_ENABLE = yes # USB Nkey Rollover +#PS2_MOUSE_ENABLE = yes # PS/2 mouse(TrackPoint) support + + +# Boot Section Size in bytes +# Teensy halfKay 512 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +OPT_DEFS += -DBOOT_SIZE=4096 + + +# Search Path +VPATH += $(TARGET_DIR) +VPATH += $(TOP_DIR) + +include $(TOP_DIR)/protocol/lufa.mk +include $(TOP_DIR)/common.mk +include $(TOP_DIR)/rules.mk diff --git a/keyboard/hbkb/Makefile.pjrc b/keyboard/hbkb/Makefile.pjrc new file mode 100644 index 000000000..159f56b44 --- /dev/null +++ b/keyboard/hbkb/Makefile.pjrc @@ -0,0 +1,56 @@ +# Target file name (without extension). +TARGET = hbkb + +# Directory common source filess exist +TOP_DIR = ../.. + +# Directory keyboard dependent files exist +TARGET_DIR = . + +# keyboard dependent files +SRC = main.c \ + keymap.c \ + matrix.c \ + led.c + +CONFIG_H = config.h + + +# MCU name, you MUST set this to match the board you are using +# type "make clean" after changing this, so all files will be rebuilt +#MCU = at90usb162 # Teensy 1.0 +MCU = atmega32u4 # Teensy 2.0 +#MCU = at90usb646 # Teensy++ 1.0 +#MCU = at90usb1286 # Teensy++ 2.0 + + +# Processor frequency. +# Normally the first thing your program should do is set the clock prescaler, +# so your program will run at the correct speed. You should also set this +# variable to same clock speed. The _delay_ms() macro uses this, and many +# examples use this variable to calculate timings. Do not add a "UL" here. +F_CPU = 16000000 + + +# Build Options +# comment out to disable the options. +# +MOUSEKEY_ENABLE = yes # Mouse keys +#PS2_MOUSE_ENABLE = yes # PS/2 mouse(TrackPoint) support +EXTRAKEY_ENABLE = yes # Audio control and System control +#NKRO_ENABLE = yes # USB Nkey Rollover + + + +#---------------- Programming Options -------------------------- +#PROGRAM_CMD = teensy_loader_cli -mmcu=$(MCU) -w -v $(TARGET).hex +PROGRAM_CMD = /opt/dfu-programmer-0.5.2/bin/dfu-programmer $(MCU) erase && \ + /opt/dfu-programmer-0.5.2/bin/dfu-programmer $(MCU) flash $(TARGET).hex && \ + /opt/dfu-programmer-0.5.2/bin/dfu-programmer $(MCU) start + + + +include $(TOP_DIR)/protocol/pjrc.mk +include $(TOP_DIR)/protocol.mk +include $(TOP_DIR)/common.mk +include $(TOP_DIR)/rules.mk diff --git a/keyboard/hbkb/config.h b/keyboard/hbkb/config.h index 5262399dc..deaabb249 100644 --- a/keyboard/hbkb/config.h +++ b/keyboard/hbkb/config.h @@ -24,7 +24,10 @@ along with this program. If not, see . #define VENDOR_ID 0xFEED #define PRODUCT_ID 0xBB00 #define MANUFACTURER t.m.k. +#define DEVICE_VER 0x0100 #define PRODUCT Happy Buckling Keyboard + + #define DESCRIPTION mod version of IBM Model M keyboard diff --git a/keyboard/hhkb/Makefile.lufa b/keyboard/hhkb/Makefile.lufa new file mode 100644 index 000000000..cdd68f40a --- /dev/null +++ b/keyboard/hhkb/Makefile.lufa @@ -0,0 +1,119 @@ +#---------------------------------------------------------------------------- +# On command line: +# +# make all = Make software. +# +# make clean = Clean out built project files. +# +# make coff = Convert ELF to AVR COFF. +# +# make extcoff = Convert ELF to AVR Extended COFF. +# +# make program = Download the hex file to the device. +# Please customize your programmer settings(PROGRAM_CMD) +# +# make teensy = Download the hex file to the device, using teensy_loader_cli. +# (must have teensy_loader_cli installed). +# +# make dfu = Download the hex file to the device, using dfu-programmer (must +# have dfu-programmer installed). +# +# make flip = Download the hex file to the device, using Atmel FLIP (must +# have Atmel FLIP installed). +# +# make dfu-ee = Download the eeprom file to the device, using dfu-programmer +# (must have dfu-programmer installed). +# +# make flip-ee = Download the eeprom file to the device, using Atmel FLIP +# (must have Atmel FLIP installed). +# +# make debug = Start either simulavr or avarice as specified for debugging, +# with avr-gdb or avr-insight as the front end for debugging. +# +# make filename.s = Just compile filename.c into the assembler code only. +# +# make filename.i = Create a preprocessed source file for use in submitting +# bug reports to the GCC project. +# +# To rebuild project do "make clean" then "make all". +#---------------------------------------------------------------------------- + +# Target file name (without extension). +TARGET = hhkb_lufa + +# Directory common source filess exist +TOP_DIR = ../.. + +# Directory keyboard dependent files exist +TARGET_DIR = . + + +# List C source files here. (C dependencies are automatically generated.) +SRC += keymap.c \ + matrix.c \ + led.c + +CONFIG_H = config.h + + +# MCU name +MCU = at90usb1286 +#MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + + +# Build Options +# comment out to disable the options. +# +MOUSEKEY_ENABLE = yes # Mouse keys +EXTRAKEY_ENABLE = yes # Audio control and System control +#NKRO_ENABLE = yes # USB Nkey Rollover +#PS2_MOUSE_ENABLE = yes # PS/2 mouse(TrackPoint) support + + +# Boot Section Size in bytes +# Teensy halfKay 512 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +#OPT_DEFS += -DBOOT_SIZE=4096 + + +# Search Path +VPATH += $(TARGET_DIR) +VPATH += $(TOP_DIR) + +include $(TOP_DIR)/protocol/lufa.mk +include $(TOP_DIR)/common.mk +include $(TOP_DIR)/rules.mk diff --git a/keyboard/hhkb/Makefile.pjrc b/keyboard/hhkb/Makefile.pjrc index f6d133eae..f8836a2ca 100644 --- a/keyboard/hhkb/Makefile.pjrc +++ b/keyboard/hhkb/Makefile.pjrc @@ -13,12 +13,11 @@ TOP_DIR = ../.. TARGET_DIR = . # keyboard dependent files -SRC = main.c \ - keymap.c \ +SRC = keymap.c \ matrix.c \ led.c -CONFIG_H = config_pjrc.h +CONFIG_H = config.h # MCU name, you MUST set this to match the board you are using @@ -53,8 +52,8 @@ PROGRAM_CMD = teensy_loader_cli -mmcu=$(MCU) -w -v $(TARGET).hex # Search Path VPATH = $(TARGET_DIR) +VPATH = $(TOP_DIR) include $(TOP_DIR)/protocol/pjrc.mk -include $(TOP_DIR)/protocol.mk include $(TOP_DIR)/common.mk include $(TOP_DIR)/rules.mk diff --git a/keyboard/hhkb/config.h b/keyboard/hhkb/config.h new file mode 100644 index 000000000..91446466f --- /dev/null +++ b/keyboard/hhkb/config.h @@ -0,0 +1,65 @@ +/* +Copyright 2011 Jun Wako + +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 . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +/* controller configuration */ +#include "controller_teensy.h" + + +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0xCAFF +#define DEVICE_VER 0x0101 +#define MANUFACTURER t.m.k. +#define PRODUCT HHKB mod + + +#define DESCRIPTION t.m.k. keyboard firmware for HHKB mod + + +/* matrix size */ +#define MATRIX_ROWS 8 +#define MATRIX_COLS 8 +/* define if matrix has ghost */ +//#define MATRIX_HAS_GHOST + + +/* key combination for command */ +#define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KB_LSHIFT) | MOD_BIT(KB_RSHIFT))) + +/* mouse keys */ +#ifdef MOUSEKEY_ENABLE +# define MOUSEKEY_DELAY_TIME 192 +#endif + + +/* PS/2 mouse */ +#ifdef PS2_MOUSE_ENABLE +/* +# define PS2_CLOCK_PORT PORTF +# define PS2_CLOCK_PIN PINF +# define PS2_CLOCK_DDR DDRF +# define PS2_CLOCK_BIT 0 +# define PS2_DATA_PORT PORTF +# define PS2_DATA_PIN PINF +# define PS2_DATA_DDR DDRF +# define PS2_DATA_BIT 1 +*/ +#endif + +#endif diff --git a/keyboard/hhkb/config_pjrc.h b/keyboard/hhkb/config_pjrc.h deleted file mode 100644 index fffe3522c..000000000 --- a/keyboard/hhkb/config_pjrc.h +++ /dev/null @@ -1,62 +0,0 @@ -/* -Copyright 2011 Jun Wako - -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 . -*/ - -#ifndef CONFIG_H -#define CONFIG_H - -/* controller configuration */ -#include "controller_teensy.h" - -#define VENDOR_ID 0xFEED -#define PRODUCT_ID 0xCAFE -#define DEVICE_VER 0x0101 -#define MANUFACTURER t.m.k. -#define PRODUCT HHKB mod -#define DESCRIPTION t.m.k. keyboard firmware for HHKB mod - - -/* matrix size */ -#define MATRIX_ROWS 8 -#define MATRIX_COLS 8 -/* define if matrix has ghost */ -//#define MATRIX_HAS_GHOST - - -/* key combination for command */ -#define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KB_LSHIFT) | MOD_BIT(KB_RSHIFT))) - -/* mouse keys */ -#ifdef MOUSEKEY_ENABLE -# define MOUSEKEY_DELAY_TIME 192 -#endif - - -/* PS/2 mouse */ -#ifdef PS2_MOUSE_ENABLE -/* -# define PS2_CLOCK_PORT PORTF -# define PS2_CLOCK_PIN PINF -# define PS2_CLOCK_DDR DDRF -# define PS2_CLOCK_BIT 0 -# define PS2_DATA_PORT PORTF -# define PS2_DATA_PIN PINF -# define PS2_DATA_DDR DDRF -# define PS2_DATA_BIT 1 -*/ -#endif - -#endif diff --git a/keyboard/hhkb/matrix.c b/keyboard/hhkb/matrix.c index 350066b90..79d2d9873 100644 --- a/keyboard/hhkb/matrix.c +++ b/keyboard/hhkb/matrix.c @@ -68,8 +68,8 @@ static bool matrix_has_ghost_in_row(uint8_t row); // key: on: 0/off: 1 // prev: unknown: output previous key state(negated)? -#ifdef HOST_PJRC -// Ports for Teensy +#if defined(__AVR_AT90USB1286__) +// Ports for Teensy++ // row: PB0-2 // col: PB3-5,6 // key: PE6(pull-uped) @@ -90,7 +90,8 @@ static bool matrix_has_ghost_in_row(uint8_t row); #define KEY_PREV_OFF() (PORTE &= ~(1<<7)) #define KEY_POWER_ON() #define KEY_POWER_OFF() -#else + +#elif defined(__AVR_ATmega328P__) // Ports for V-USB // key: PB0(pull-uped) // prev: PB1 @@ -126,6 +127,9 @@ static bool matrix_has_ghost_in_row(uint8_t row); DDRC &= ~0x0F; \ PORTC &= ~0x0F; \ } while (0) + +#else +# error "define code for matrix scan" #endif diff --git a/keyboard/macway/Makefile.lufa b/keyboard/macway/Makefile.lufa index 2f2b6401d..9c9388ee2 100644 --- a/keyboard/macway/Makefile.lufa +++ b/keyboard/macway/Makefile.lufa @@ -107,9 +107,7 @@ EXTRAKEY_ENABLE = yes # Audio control and System control # Teensy halfKay 512 # Atmel DFU loader 4096 # LUFA bootloader 4096 -#ifndef BOOT_SIZE -#define BOOT_SIZE 512 -#endif +#OPT_DEFS += -DBOOT_SIZE=4096 # Search Path diff --git a/keyboard/macway/Makefile.pjrc b/keyboard/macway/Makefile.pjrc index d2fb8ff2f..ecc236e3d 100644 --- a/keyboard/macway/Makefile.pjrc +++ b/keyboard/macway/Makefile.pjrc @@ -48,8 +48,7 @@ TOP_DIR = ../.. TARGET_DIR = . # keyboard dependent files -SRC = protocol/pjrc/main.c \ - keymap.c \ +SRC = keymap.c \ matrix.c \ led.c diff --git a/protocol/pjrc.mk b/protocol/pjrc.mk index 8aff6f28b..cccdf6204 100644 --- a/protocol/pjrc.mk +++ b/protocol/pjrc.mk @@ -2,7 +2,8 @@ PJRC_DIR = protocol/pjrc OPT_DEFS += -DHOST_PJRC -SRC += $(PJRC_DIR)/pjrc.c \ +SRC += $(PJRC_DIR)/main.c \ + $(PJRC_DIR)/pjrc.c \ $(PJRC_DIR)/usb_keyboard.c \ $(PJRC_DIR)/usb_debug.c \ $(PJRC_DIR)/usb.c diff --git a/rules.mk b/rules.mk index a58de2f11..e561eae63 100644 --- a/rules.mk +++ b/rules.mk @@ -416,6 +416,10 @@ dfu: $(TARGET).hex dfu-programmer $(MCU) erase dfu-programmer $(MCU) flash $(TARGET).hex dfu-programmer $(MCU) reset + +dfu-start: + dfu-programmer $(MCU) reset + dfu-programmer $(MCU) start flip-ee: $(TARGET).hex $(TARGET).eep $(COPY) $(TARGET).eep $(TARGET)eep.hex @@ -599,4 +603,4 @@ $(shell mkdir $(OBJDIR) 2>/dev/null) .PHONY : all begin finish end sizebefore sizeafter gccversion \ build elf hex eep lss sym coff extcoff \ clean clean_list debug gdb-config show_path \ -program teensy dfu flip dfu-ee flip-ee +program teensy dfu flip dfu-ee flip-ee dfu-start -- cgit v1.2.3-70-g09d2 From 6d79e6579f1b769f3547856b8af56bd357580adf Mon Sep 17 00:00:00 2001 From: tmk Date: Sat, 30 Jun 2012 14:44:14 +0900 Subject: Add support of USBasp bootloader. --- common/bootloader.c | 30 +++++++++++++++++++++++++ protocol/vusb.mk | 12 +++++----- protocol/vusb/bootloader_usbasp.c | 47 --------------------------------------- 3 files changed, 37 insertions(+), 52 deletions(-) delete mode 100644 protocol/vusb/bootloader_usbasp.c (limited to 'common') diff --git a/common/bootloader.c b/common/bootloader.c index e45295cd5..612b94964 100644 --- a/common/bootloader.c +++ b/common/bootloader.c @@ -24,12 +24,22 @@ void bootloader_jump(void) { cli(); + + // + //Teensy + // +#if defined(__AVR_AT90USB162__) || defined(__AVR_ATmega32U4__) || defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__) // disable watchdog, if enabled // disable all peripherals UDCON = 1; USBCON = (1< - -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 . -*/ - -#include -#include -#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"); -} -- cgit v1.2.3-70-g09d2