diff --git a/lamparray.hid b/lamparray.hid new file mode 100644 index 0000000..0beded9 --- /dev/null +++ b/lamparray.hid @@ -0,0 +1,376 @@ +[[settings]] +packingInBytes = 1 + +[[applicationCollection]] +usage = ['Lighting And Illumination', 'LampArray'] + + [[applicationCollection.featureReport]] + + [[applicationCollection.featureReport.logicalCollection]] + usage = ['Lighting And Illumination', 'LampArrayAttributesReport'] + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'LampCount'] + sizeInBits = 16 + logicalValueRange = 'maxUnsignedSizeRange' + reportFlags = ['constant'] + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'BoundingBoxWidthInMicrometers'] + sizeInBits = 32 + logicalValueRange = 'maxUnsignedSizeRange' + reportFlags = ['constant'] + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'BoundingBoxHeightInMicrometers'] + sizeInBits = 32 + logicalValueRange = 'maxUnsignedSizeRange' + reportFlags = ['constant'] + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'BoundingBoxDepthInMicrometers'] + sizeInBits = 32 + logicalValueRange = 'maxUnsignedSizeRange' + reportFlags = ['constant'] + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'LampArrayKind'] + sizeInBits = 32 + logicalValueRange = 'maxUnsignedSizeRange' + reportFlags = ['constant'] + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'MinUpdateIntervalInMicroseconds'] + sizeInBits = 32 + logicalValueRange = 'maxUnsignedSizeRange' + reportFlags = ['constant'] + + [[applicationCollection.featureReport]] + + [[applicationCollection.featureReport.logicalCollection]] + usage = ['Lighting And Illumination', 'LampAttributesRequestReport'] + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'LampId'] + sizeInBits = 16 + logicalValueRange = 'maxUnsignedSizeRange' + + [[applicationCollection.featureReport]] + + [[applicationCollection.featureReport.logicalCollection]] + usage = ['Lighting And Illumination', 'LampAttributesResponseReport'] + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'LampId'] + sizeInBits = 16 + logicalValueRange = 'maxUnsignedSizeRange' + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'PositionXInMicrometers'] + sizeInBits = 32 + logicalValueRange = 'maxUnsignedSizeRange' + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'PositionYInMicrometers'] + sizeInBits = 32 + logicalValueRange = 'maxUnsignedSizeRange' + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'PositionZInMicrometers'] + sizeInBits = 32 + logicalValueRange = 'maxUnsignedSizeRange' + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'UpdateLatencyInMicroseconds'] + sizeInBits = 32 + logicalValueRange = 'maxUnsignedSizeRange' + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'LampPurposes'] + sizeInBits = 32 + logicalValueRange = 'maxUnsignedSizeRange' + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'RedLevelCount'] + sizeInBits = 8 + logicalValueRange = 'maxUnsignedSizeRange' + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'GreenLevelCount'] + sizeInBits = 8 + logicalValueRange = 'maxUnsignedSizeRange' + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'BlueLevelCount'] + sizeInBits = 8 + logicalValueRange = 'maxUnsignedSizeRange' + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'IntensityLevelCount'] + sizeInBits = 8 + logicalValueRange = 'maxUnsignedSizeRange' + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'IsProgrammable'] + sizeInBits = 8 + logicalValueRange = 'maxUnsignedSizeRange' + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'InputBinding'] + sizeInBits = 8 + logicalValueRange = 'maxUnsignedSizeRange' + + [[applicationCollection.featureReport]] + + [[applicationCollection.featureReport.logicalCollection]] + usage = ['Lighting And Illumination', 'LampMultiUpdateReport'] + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'LampCount'] + logicalValueRange = [0, 8] + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'LampUpdateFlags'] + logicalValueRange = [0, 1] + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'LampId'] + sizeInBits = 16 + logicalValueRange = 'maxUnsignedSizeRange' + count = 8 + + # + # Lamp 1 + # + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'RedUpdateChannel'] + sizeInBits = 8 + logicalValueRange = 'maxUnsignedSizeRange' + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'GreenUpdateChannel'] + sizeInBits = 8 + logicalValueRange = 'maxUnsignedSizeRange' + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'BlueUpdateChannel'] + sizeInBits = 8 + logicalValueRange = 'maxUnsignedSizeRange' + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'IntensityUpdateChannel'] + sizeInBits = 8 + logicalValueRange = 'maxUnsignedSizeRange' + + # + # Lamp 2 + # + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'RedUpdateChannel'] + sizeInBits = 8 + logicalValueRange = 'maxUnsignedSizeRange' + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'GreenUpdateChannel'] + sizeInBits = 8 + logicalValueRange = 'maxUnsignedSizeRange' + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'BlueUpdateChannel'] + sizeInBits = 8 + logicalValueRange = 'maxUnsignedSizeRange' + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'IntensityUpdateChannel'] + sizeInBits = 8 + logicalValueRange = 'maxUnsignedSizeRange' + + # + # Lamp 3 + # + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'RedUpdateChannel'] + sizeInBits = 8 + logicalValueRange = 'maxUnsignedSizeRange' + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'GreenUpdateChannel'] + sizeInBits = 8 + logicalValueRange = 'maxUnsignedSizeRange' + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'BlueUpdateChannel'] + sizeInBits = 8 + logicalValueRange = 'maxUnsignedSizeRange' + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'IntensityUpdateChannel'] + sizeInBits = 8 + logicalValueRange = 'maxUnsignedSizeRange' + + # + # Lamp 4 + # + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'RedUpdateChannel'] + sizeInBits = 8 + logicalValueRange = 'maxUnsignedSizeRange' + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'GreenUpdateChannel'] + sizeInBits = 8 + logicalValueRange = 'maxUnsignedSizeRange' + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'BlueUpdateChannel'] + sizeInBits = 8 + logicalValueRange = 'maxUnsignedSizeRange' + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'IntensityUpdateChannel'] + sizeInBits = 8 + logicalValueRange = 'maxUnsignedSizeRange' + + # + # Lamp 5 + # + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'RedUpdateChannel'] + sizeInBits = 8 + logicalValueRange = 'maxUnsignedSizeRange' + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'GreenUpdateChannel'] + sizeInBits = 8 + logicalValueRange = 'maxUnsignedSizeRange' + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'BlueUpdateChannel'] + sizeInBits = 8 + logicalValueRange = 'maxUnsignedSizeRange' + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'IntensityUpdateChannel'] + sizeInBits = 8 + logicalValueRange = 'maxUnsignedSizeRange' + + # + # Lamp 6 + # + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'RedUpdateChannel'] + sizeInBits = 8 + logicalValueRange = 'maxUnsignedSizeRange' + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'GreenUpdateChannel'] + sizeInBits = 8 + logicalValueRange = 'maxUnsignedSizeRange' + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'BlueUpdateChannel'] + sizeInBits = 8 + logicalValueRange = 'maxUnsignedSizeRange' + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'IntensityUpdateChannel'] + sizeInBits = 8 + logicalValueRange = 'maxUnsignedSizeRange' + + # + # Lamp 7 + # + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'RedUpdateChannel'] + sizeInBits = 8 + logicalValueRange = 'maxUnsignedSizeRange' + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'GreenUpdateChannel'] + sizeInBits = 8 + logicalValueRange = 'maxUnsignedSizeRange' + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'BlueUpdateChannel'] + sizeInBits = 8 + logicalValueRange = 'maxUnsignedSizeRange' + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'IntensityUpdateChannel'] + sizeInBits = 8 + logicalValueRange = 'maxUnsignedSizeRange' + + # + # Lamp 8 + # + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'RedUpdateChannel'] + sizeInBits = 8 + logicalValueRange = 'maxUnsignedSizeRange' + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'GreenUpdateChannel'] + sizeInBits = 8 + logicalValueRange = 'maxUnsignedSizeRange' + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'BlueUpdateChannel'] + sizeInBits = 8 + logicalValueRange = 'maxUnsignedSizeRange' + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'IntensityUpdateChannel'] + sizeInBits = 8 + logicalValueRange = 'maxUnsignedSizeRange' + + [[applicationCollection.featureReport]] + + [[applicationCollection.featureReport.logicalCollection]] + usage = ['Lighting And Illumination', 'LampRangeUpdateReport'] + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'LampUpdateFlags'] + logicalValueRange = [0, 1] + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'LampIdStart'] + sizeInBits = 16 + logicalValueRange = 'maxUnsignedSizeRange' + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'LampIdEnd'] + sizeInBits = 16 + logicalValueRange = 'maxUnsignedSizeRange' + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'RedUpdateChannel'] + sizeInBits = 8 + logicalValueRange = 'maxUnsignedSizeRange' + reportFlags = ['data', 'absolute'] + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'GreenUpdateChannel'] + sizeInBits = 8 + logicalValueRange = 'maxUnsignedSizeRange' + reportFlags = ['data', 'absolute'] + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'BlueUpdateChannel'] + sizeInBits = 8 + logicalValueRange = 'maxUnsignedSizeRange' + reportFlags = ['data', 'absolute'] + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'IntensityUpdateChannel'] + sizeInBits = 8 + logicalValueRange = 'maxUnsignedSizeRange' + reportFlags = ['data', 'absolute'] + + [[applicationCollection.featureReport]] + + [[applicationCollection.featureReport.logicalCollection]] + usage = ['Lighting And Illumination', 'LampArrayControlReport'] + + [[applicationCollection.featureReport.logicalCollection.variableItem]] + usage = ['Lighting And Illumination', 'AutonomousMode'] + logicalValueRange = [0, 1] diff --git a/main.c b/main.c index 19b4cf5..09a569c 100644 --- a/main.c +++ b/main.c @@ -1,54 +1,14 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - #include #include -#include "ch.h" #include "hal.h" -#include "shell.h" -#include "chprintf.h" - #include "usbcfg.h" -/*===========================================================================*/ -/* Generic code. */ -/*===========================================================================*/ - -/* - * Application entry point. - */ int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ halInit(); chSysInit(); - /* - * Activates the USB driver and then the USB bus pull-up on D+. - * Note, a delay is inserted in order to not have to disconnect the cable - * after a reset. - */ usbDisconnectBus(&USBD1); chThdSleepMilliseconds(1500); usbStart(&USBD1, &usbcfg); diff --git a/source/usbcfg.c b/source/usbcfg.c index 86da8ba..9d14069 100644 --- a/source/usbcfg.c +++ b/source/usbcfg.c @@ -1,34 +1,11 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - #include "hal.h" -/* - * Endpoints to be used for USBD1. - */ -#define USB1_DATA_REQUEST_EP 1 -#define USB1_DATA_AVAILABLE_EP 1 -#define USB1_INTERRUPT_REQUEST_EP 2 - /* * USB Device Descriptor. */ -static const uint8_t vcom_device_descriptor_data[18] = { +static const uint8_t device_descriptor_data[18] = { USB_DESC_DEVICE (0x0110, /* bcdUSB (1.1). */ - 0x02, /* bDeviceClass (CDC). */ + 0x00, /* bDeviceClass (Unknown). */ 0x00, /* bDeviceSubClass. */ 0x00, /* bDeviceProtocol. */ 0x40, /* bMaxPacketSize. */ @@ -44,16 +21,16 @@ static const uint8_t vcom_device_descriptor_data[18] = { /* * Device Descriptor wrapper. */ -static const USBDescriptor vcom_device_descriptor = { - sizeof vcom_device_descriptor_data, - vcom_device_descriptor_data +static const USBDescriptor device_descriptor = { + sizeof device_descriptor_data, + device_descriptor_data }; -/* Configuration Descriptor tree for a CDC.*/ -static const uint8_t vcom_configuration_descriptor_data[67] = { +/* Configuration Descriptor tree for an HID Lighting Array.*/ +static const uint8_t configuration_descriptor_data[41] = { /* Configuration Descriptor.*/ - USB_DESC_CONFIGURATION(67, /* wTotalLength. */ - 0x02, /* bNumInterfaces. */ + USB_DESC_CONFIGURATION(41, /* wTotalLength. */ + 0x01, /* bNumInterfaces. */ 0x01, /* bConfigurationValue. */ 0, /* iConfiguration. */ 0xC0, /* bmAttributes (self powered). */ @@ -61,83 +38,48 @@ static const uint8_t vcom_configuration_descriptor_data[67] = { /* Interface Descriptor.*/ USB_DESC_INTERFACE (0x00, /* bInterfaceNumber. */ 0x00, /* bAlternateSetting. */ - 0x01, /* bNumEndpoints. */ - 0x02, /* bInterfaceClass (Communications - Interface Class, CDC section - 4.2). */ - 0x02, /* bInterfaceSubClass (Abstract - Control Model, CDC section 4.3). */ - 0x01, /* bInterfaceProtocol (AT commands, - CDC section 4.4). */ + 0x02, /* bNumEndpoints. */ + 0x03, /* bInterfaceClass (HID). */ + 0x00, /* bInterfaceSubClass */ + 0x00, /* bInterfaceProtocol */ 0), /* iInterface. */ - /* Header Functional Descriptor (CDC section 5.2.3).*/ - USB_DESC_BYTE (5), /* bLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x00), /* bDescriptorSubtype (Header - Functional Descriptor. */ - USB_DESC_BCD (0x0110), /* bcdCDC. */ - /* Call Management Functional Descriptor. */ - USB_DESC_BYTE (5), /* bFunctionLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x01), /* bDescriptorSubtype (Call Management - Functional Descriptor). */ - USB_DESC_BYTE (0x00), /* bmCapabilities (D0+D1). */ - USB_DESC_BYTE (0x01), /* bDataInterface. */ - /* ACM Functional Descriptor.*/ - USB_DESC_BYTE (4), /* bFunctionLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x02), /* bDescriptorSubtype (Abstract - Control Management Descriptor). */ - USB_DESC_BYTE (0x02), /* bmCapabilities. */ - /* Union Functional Descriptor.*/ - USB_DESC_BYTE (5), /* bFunctionLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x06), /* bDescriptorSubtype (Union - Functional Descriptor). */ - USB_DESC_BYTE (0x00), /* bMasterInterface (Communication - Class Interface). */ - USB_DESC_BYTE (0x01), /* bSlaveInterface0 (Data Class - Interface). */ - /* Endpoint 2 Descriptor.*/ - USB_DESC_ENDPOINT (USB1_INTERRUPT_REQUEST_EP|0x80, - 0x03, /* bmAttributes (Interrupt). */ - 0x0008, /* wMaxPacketSize. */ + + + /* HID Descriptor (HID Section 6.2.1).*/ + USB_DESC_BYTE (6), /* bLength. */ + USB_DESC_BYTE (0x21), /* bDescriptorType (HID). */ + USB_DESC_BCD (0x110), /* bcdHID(1.1) */ + USB_DESC_BYTE (0x00), /* bCountryCode(None) */ + USB_DESC_BYTE (0x01), /* bNumDescriptors */ + USB_DESC_BYTE (0x34), /* bDescriptorType */ + USB_DESC_WORD (0x00), /* wDescriptorLength */ + + /* HID Report Descriptors */ + + /* Endpoint Descriptors */ + USB_DESC_ENDPOINT (0x81, /* bEndpointAddress */ + 0x03, /* bmAttributes */ + 0x0020, /* wMaxPacketSize. */ + 0xFF), /* bInterval. */ + + USB_DESC_ENDPOINT (0x01, /* bEndpointAddress */ + 0x03, /* bmAttributes */ + 0x0020, /* wMaxPacketSize. */ 0xFF), /* bInterval. */ - /* Interface Descriptor.*/ - USB_DESC_INTERFACE (0x01, /* bInterfaceNumber. */ - 0x00, /* bAlternateSetting. */ - 0x02, /* bNumEndpoints. */ - 0x0A, /* bInterfaceClass (Data Class - Interface, CDC section 4.5). */ - 0x00, /* bInterfaceSubClass (CDC section - 4.6). */ - 0x00, /* bInterfaceProtocol (CDC section - 4.7). */ - 0x00), /* iInterface. */ - /* Endpoint 3 Descriptor.*/ - USB_DESC_ENDPOINT (USB1_DATA_AVAILABLE_EP, /* bEndpointAddress.*/ - 0x02, /* bmAttributes (Bulk). */ - 0x0040, /* wMaxPacketSize. */ - 0x00), /* bInterval. */ - /* Endpoint 1 Descriptor.*/ - USB_DESC_ENDPOINT (USB1_DATA_REQUEST_EP|0x80, /* bEndpointAddress.*/ - 0x02, /* bmAttributes (Bulk). */ - 0x0040, /* wMaxPacketSize. */ - 0x00) /* bInterval. */ }; /* * Configuration Descriptor wrapper. */ -static const USBDescriptor vcom_configuration_descriptor = { - sizeof vcom_configuration_descriptor_data, - vcom_configuration_descriptor_data +static const USBDescriptor configuration_descriptor = { + sizeof configuration_descriptor_data, + configuration_descriptor_data }; /* * U.S. English language identifier. */ -static const uint8_t vcom_string0[] = { +static const uint8_t usb_string0[] = { USB_DESC_BYTE(4), /* bLength. */ USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ USB_DESC_WORD(0x0409) /* wLANGID (U.S. English). */ @@ -146,30 +88,26 @@ static const uint8_t vcom_string0[] = { /* * Vendor string. */ -static const uint8_t vcom_string1[] = { - USB_DESC_BYTE(38), /* bLength. */ +static const uint8_t usb_string1[] = { + USB_DESC_BYTE(16), /* bLength. */ USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - 'S', 0, 'T', 0, 'M', 0, 'i', 0, 'c', 0, 'r', 0, 'o', 0, 'e', 0, - 'l', 0, 'e', 0, 'c', 0, 't', 0, 'r', 0, 'o', 0, 'n', 0, 'i', 0, - 'c', 0, 's', 0 + 'M', 0, 'e', 0, 't', 0, 'z', 0, 'N', 0, 'e', 0, 't', 0 }; /* * Device Description string. */ -static const uint8_t vcom_string2[] = { - USB_DESC_BYTE(56), /* bLength. */ +static const uint8_t usb_string2[] = { + USB_DESC_BYTE(30), /* bLength. */ USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - 'C', 0, 'h', 0, 'i', 0, 'b', 0, 'i', 0, 'O', 0, 'S', 0, '/', 0, - 'R', 0, 'T', 0, ' ', 0, 'V', 0, 'i', 0, 'r', 0, 't', 0, 'u', 0, - 'a', 0, 'l', 0, ' ', 0, 'C', 0, 'O', 0, 'M', 0, ' ', 0, 'P', 0, - 'o', 0, 'r', 0, 't', 0 + 'T', 0, 'w', 0, 'i', 0, 'n', 0, 'k', 0, 'l', 0, 'e', 0, + 'S', 0, 't', 0, 'i', 0, 'c', 0, 'k', 0, 'V', 0, '2', 0 }; /* * Serial Number string. */ -static const uint8_t vcom_string3[] = { +static const uint8_t usb_string3[] = { USB_DESC_BYTE(8), /* bLength. */ USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ '0' + CH_KERNEL_MAJOR, 0, @@ -180,94 +118,48 @@ static const uint8_t vcom_string3[] = { /* * Strings wrappers array. */ -static const USBDescriptor vcom_strings[] = { - {sizeof vcom_string0, vcom_string0}, - {sizeof vcom_string1, vcom_string1}, - {sizeof vcom_string2, vcom_string2}, - {sizeof vcom_string3, vcom_string3} +static const USBDescriptor usb_strings[] = { + {sizeof usb_string0, usb_string0}, + {sizeof usb_string1, usb_string1}, + {sizeof usb_string2, usb_string2}, + {sizeof usb_string3, usb_string3} }; -/* - * Handles the GET_DESCRIPTOR callback. All required descriptors must be - * handled here. - */ -static const USBDescriptor *get_descriptor(USBDriver *usbp, - uint8_t dtype, - uint8_t dindex, - uint16_t lang) { - +static const USBDescriptor *get_descriptor(USBDriver *usbp, uint8_t dtype, uint8_t dindex, uint16_t lang) { (void)usbp; (void)lang; switch (dtype) { case USB_DESCRIPTOR_DEVICE: - return &vcom_device_descriptor; + return &device_descriptor; case USB_DESCRIPTOR_CONFIGURATION: - return &vcom_configuration_descriptor; + return &configuration_descriptor; case USB_DESCRIPTOR_STRING: if (dindex < 4) - return &vcom_strings[dindex]; + return &usb_strings[dindex]; } return NULL; } -/** - * @brief IN EP1 state. - */ static USBInEndpointState ep1instate; - -/** - * @brief OUT EP1 state. - */ static USBOutEndpointState ep1outstate; - -/** - * @brief EP1 initialization structure (both IN and OUT). - */ static const USBEndpointConfig ep1config = { - USB_EP_MODE_TYPE_BULK, + USB_EP_MODE_TYPE_INTR, NULL, NULL, NULL, - 0x0040, - 0x0040, + 0x0020, + 0x0020, &ep1instate, &ep1outstate, - 2, - NULL -}; - -/** - * @brief IN EP2 state. - */ -static USBInEndpointState ep2instate; - -/** - * @brief EP2 initialization structure (IN only). - */ -static const USBEndpointConfig ep2config = { - USB_EP_MODE_TYPE_INTR, - NULL, - NULL, - NULL, - 0x0010, - 0x0000, - &ep2instate, - NULL, 1, NULL }; -/* - * USB Request Hook - */ static bool usb_request(USBDriver *usbp) { (void)usbp; return false; } -/* - * Handles the USB driver global events. - */ static void usb_event(USBDriver *usbp, usbevent_t event) { switch (event) { case USB_EVENT_ADDRESS: @@ -275,11 +167,7 @@ static void usb_event(USBDriver *usbp, usbevent_t event) { case USB_EVENT_CONFIGURED: chSysLockFromISR(); - /* Enables the endpoints specified into the configuration. - Note, this callback is invoked from an ISR so I-Class functions - must be used.*/ - usbInitEndpointI(usbp, USB1_DATA_REQUEST_EP, &ep1config); - usbInitEndpointI(usbp, USB1_INTERRUPT_REQUEST_EP, &ep2config); + usbInitEndpointI(usbp, 0x02, &ep1config); chSysUnlockFromISR(); return; @@ -297,16 +185,10 @@ static void usb_event(USBDriver *usbp, usbevent_t event) { return; } -/* - * Handles the USB driver global events. - */ static void sof_handler(USBDriver *usbp) { (void)usbp; } -/* - * USB driver configuration. - */ const USBConfig usbcfg = { usb_event, get_descriptor, diff --git a/tools/debug.cfg b/tools/debug.cfg new file mode 100644 index 0000000..a6349a4 --- /dev/null +++ b/tools/debug.cfg @@ -0,0 +1,11 @@ +source [find interface/jlink.cfg] + +transport select swd + +source [find target/stm32f0x.cfg] + +reset_config srst_only srst_nogate connect_assert_srst + +program tools/firmware.bin verify reset 0x08000000 + +