M include/usb.h => include/usb.h +1 -1
@@ 267,7 267,7 @@ typedef struct {
typedef struct {
usb_descriptor_t header;
- uint8_t *bString;
+ uint16_t *bString;
} usb_unicode_string_descriptor_t;
// NOTE: End of structs from usb specification here
M include/usb_device.h => include/usb_device.h +6 -4
@@ 3,6 3,8 @@
#include "generic.h"
#include "queue.h"
+typedef uint16_t char16_t;
+
#ifndef USB_DEVICE_H
#define USB_DEVICE_H
@@ 85,8 87,8 @@ typedef struct {
*/
struct usb_class_header_t *(*init)(usb_device_t *device,
uint16_t id_vendor, uint16_t id_product,
- char *vendor_name, char *product_name,
- uint16_t serial_number, char* serial_name);
+ char16_t *vendor_name, char16_t *product_name,
+ uint16_t serial_number, char16_t* serial_name);
/**
* @brief Configure the endpoint zero, and send configuration, including writing to the fifo.
@@ 290,8 292,8 @@ extern usb_device_t usb_devices[2];
*/
void *usb_device_init(usb_device_slot_t slot, usb_class_vtable_t *class,
uint16_t id_vendor, uint16_t id_product,
- char *vendor_name, char *product_name,
- uint16_t serial_number, char* serial_name);
+ char16_t *vendor_name, char16_t *product_name,
+ uint16_t serial_number, char16_t* serial_name);
/**
* @brief Setup device endpoint 0
M src/main.c => src/main.c +2 -5
@@ 158,12 158,9 @@ void main()
pin_into_input_highspeed(&otg_hs_overcurrent);
// TODO: why can't I send string descriptors?
- /* void *usb_dev = usb_device_init(USB_OTG_HS1, &USB_CLASS_CDC_ACM, */
- /* 0x1234, 0x1111, "Frantisek Bohacek", */
- /* "Display", 1, NULL); */
void *usb_dev = usb_device_init(USB_OTG_HS1, &USB_CLASS_CDC_ACM,
- 0x1234, 0x1111, NULL,
- NULL, 1, NULL);
+ 0x1234, 0x1111, u"Frantisek Bohacek",
+ u"Display", 1, NULL);
cdc_acm_configure(usb_dev, 512);
usb_device_setup(usb_dev);
M src/usb.c => src/usb.c +1 -1
@@ 263,7 263,7 @@ task_result_t usb_send_unicode_string_descriptor(
usb_generic_fill_fifo(endpoint, &data.bytes[0], 4, fifo_tx_target);
if (string_descriptor->header.bLength > 4) {
- usb_generic_fill_fifo(endpoint, &string_descriptor->bString[2], string_descriptor->header.bLength - 4, fifo_tx_target);
+ usb_generic_fill_fifo(endpoint, (uint8_t*)&string_descriptor->bString[1], string_descriptor->header.bLength - 4, fifo_tx_target);
}
/* endpoint->DIEPCTL |= USB_OTG_DIEPCTL_CNAK; */
M src/usb_device.c => src/usb_device.c +3 -12
@@ 14,8 14,8 @@ void* usb_periph_addresses[] =
void* usb_device_init(usb_device_slot_t slot, usb_class_vtable_t *class,
uint16_t id_vendor, uint16_t id_product,
- char *vendor_name, char *product_name,
- uint16_t serial_number, char* serial_name) {
+ char16_t *vendor_name, char16_t *product_name,
+ uint16_t serial_number, char16_t* serial_name) {
usb_device_t* device = &usb_devices[slot];
void* peripheral_address = usb_periph_addresses[slot];
@@ 71,10 71,6 @@ void usb_device_wait_for_handshake(void* device_ptr) {
void usb_device_setup(void* device_ptr) {
RCC->AHB1ENR |= RCC_AHB1ENR_USB1OTGHSEN | RCC_AHB1ENR_USB1OTGHSULPIEN;
- volatile uint32_t dummy;
- dummy = RCC->AHB1ENR;
- dummy = RCC->AHB1ENR;
-
NVIC_SetPriority(OTG_HS_IRQn, 2);
NVIC_EnableIRQ(OTG_HS_IRQn);
@@ 163,7 159,7 @@ task_result_t usb_handle_setup_command(usb_device_t *device, usb_setup_command_t
size = sizeof(usb_endpoint_status_t);
endpoint_status.halt = 0;
endpoint_status.reserved_zeros = 0;
- packet = (uint8_t*)&interface_status;
+ packet = (uint8_t*)&endpoint_status;
}
break;
}
@@ 420,7 416,6 @@ task_result_t usb_handle_setup(usb_device_t *device, usb_event_t event) {
void usb_handle_rxflvl_control_int(usb_device_t *device,
packet_info_t *packet_info) {
- uint32_t dummy;
uint8_t data[64];
volatile uint32_t *fifo = device->fifos[0].data;
@@ 433,10 428,6 @@ void usb_handle_rxflvl_control_int(usb_device_t *device,
usb_setup_command_t command;
usb_generic_read((uint8_t*)&command, 8, fifo);
- if (command.wLength > 60000) {
- dummy = 0;
- }
-
if (!queue_enqueue(device->setup.received_setup_commands, &command)) {
// Got a problem, setup command lost!
device->setup.detected_setup_errors++;
M src/usb_device_cdc.c => src/usb_device_cdc.c +18 -15
@@ 10,8 10,8 @@
usb_class_header_t* usb_device_cdc_init(usb_device_t *device,
uint16_t id_vendor, uint16_t id_product,
- char *vendor_name, char *product_name,
- uint16_t serial_number, char* serial_name);
+ char16_t *vendor_name, char16_t *product_name,
+ uint16_t serial_number, char16_t* serial_name);
task_result_t usb_device_cdc_send_configuration(usb_device_t* device, usb_setup_command_t* cmd);
void usb_device_cdc_setup_endpoints(usb_device_t* device, uint8_t configuration);
@@ 51,10 51,17 @@ usb_class_vtable_t USB_CLASS_CDC_ACM = {
.received_data_callback = usb_device_cdc_received_data_callback,
};
+static inline size_t strlen16(register const char16_t * string) {
+ if (!string) return 0;
+ register size_t len = 0;
+ while(string[len++]);
+ return len;
+}
+
usb_class_header_t *usb_device_cdc_init(usb_device_t *device, uint16_t id_vendor,
- uint16_t id_product, char *vendor_name,
- char *product_name, uint16_t serial_number,
- char *serial_name) {
+ uint16_t id_product, char16_t *vendor_name,
+ char16_t *product_name, uint16_t serial_number,
+ char16_t *serial_name) {
usb_class_header_t* class = (usb_class_header_t*)calloc(1, sizeof(usb_device_cdc_t));
class->device_descriptor.idProduct = id_product;
@@ 86,21 93,21 @@ usb_class_header_t *usb_device_cdc_init(usb_device_t *device, uint16_t id_vendor
if (vendor_name != NULL) {
descriptor->header.bDescriptorType = DESCRIPTOR_STRING;
- descriptor->header.bLength = 4 + strlen(vendor_name);
- descriptor->bString = (uint8_t*)vendor_name;
+ descriptor->header.bLength = 2 + strlen16(vendor_name) * sizeof(char16_t);
+ descriptor->bString = (uint16_t*)vendor_name;
descriptor++;
}
if (product_name != NULL) {
descriptor->header.bDescriptorType = DESCRIPTOR_STRING;
- descriptor->header.bLength = 4 + strlen(product_name);
- descriptor->bString = (uint8_t*)product_name;
+ descriptor->header.bLength = 2 + strlen16(product_name) * sizeof(char16_t);
+ descriptor->bString = (uint16_t*)product_name;
descriptor++;
}
if (serial_name != NULL) {
descriptor->header.bDescriptorType = DESCRIPTOR_STRING;
- descriptor->header.bLength = 4 + strlen(serial_name);
- descriptor->bString = (uint8_t*)serial_name;
+ descriptor->header.bLength = 2 + strlen16(serial_name) * sizeof(char16_t);
+ descriptor->bString = (uint16_t*)serial_name;
descriptor++;
}
@@ 504,7 511,6 @@ task_result_t cdc_transmit(usb_device_t *device, uint8_t* data, uint16_t* size)
}
void cdc_process_tx(usb_device_t *device, cdc_event_t event) {
- usb_device_cdc_t* cdc = (usb_device_cdc_t*)device->class;
switch (event) {
case CDC_TX_REQ:
break;
@@ 633,8 639,6 @@ int32_t cdc_data_send(usb_device_t *device, uint8_t* data, uint16_t size) {
size = strlen((char*)data);
}
- usb_device_cdc_t* cdc = (usb_device_cdc_t*)device->class;
-
task_result_t result = cdc_transmit(device, data, &size);
// If would block, just send back nothing was sent
@@ 654,7 658,6 @@ uint16_t cdc_data_receive(usb_device_t *device, uint8_t* buffer,
uint16_t size = max_size;
for (uint16_t i = 0; i < max_size; i++) {
- uint8_t element;
if (!queue_dequeue_safely(cdc->rx_buffer, buffer + i)) {
size = i;
break;