/* M0 Core Manage USB */ int main(void) { iap_cmd_res_t iap_cmd_res; usb_descriptor_serial_number_t serial_number; airspy_usb_req_init(); usb_set_configuration_changed_cb(usb_configuration_changed); usb_peripheral_reset(); usb_device_init(0, &usb_device); usb_queue_init(&usb_endpoint_control_out_queue); usb_queue_init(&usb_endpoint_control_in_queue); usb_queue_init(&usb_endpoint_bulk_out_queue); usb_queue_init(&usb_endpoint_bulk_in_queue); usb_endpoint_init(&usb_endpoint_control_out); usb_endpoint_init(&usb_endpoint_control_in); /* Read IAP Serial Number Identification */ iap_cmd_res.cmd_param.command_code = IAP_CMD_READ_SERIAL_NO; iap_cmd_call(&iap_cmd_res); if(iap_cmd_res.status_res.status_ret == CMD_SUCCESS) { /* Only retrieve 2 last 32bits for Serial Number */ serial_number.sn_32b[0] = iap_cmd_res.status_res.iap_result[2]; serial_number.sn_32b[1] = iap_cmd_res.status_res.iap_result[3]; usb_descriptor_fill_string_serial_number(serial_number); } nvic_set_priority(NVIC_USB0_IRQ, 255); nvic_set_priority(NVIC_M4CORE_IRQ, 1); nvic_enable_irq(NVIC_M4CORE_IRQ); usb_run(&usb_device); while(true) { signal_wfe(); if( (get_usb_buffer_offset() >= 16384) && (phase == 1) ) { usb_transfer_schedule_block(&usb_endpoint_bulk_in, &usb_bulk_buffer[0x0000], 0x4000, NULL, NULL); phase = 0; } if( (get_usb_buffer_offset() < 16384) && (phase == 0) ) { usb_transfer_schedule_block(&usb_endpoint_bulk_in, &usb_bulk_buffer[0x4000], 0x4000, NULL, NULL); phase = 1; } } }
void usb_set_descriptor_by_serial_number(void) { iap_cmd_res_t iap_cmd_res; /* Read IAP Serial Number Identification */ iap_cmd_res.cmd_param.command_code = IAP_CMD_READ_SERIAL_NO; iap_cmd_call(&iap_cmd_res); if (iap_cmd_res.status_res.status_ret == CMD_SUCCESS) { usb_descriptor_string_serial_number[0] = USB_DESCRIPTOR_STRING_SERIAL_BUF_LEN; usb_descriptor_string_serial_number[1] = USB_DESCRIPTOR_TYPE_STRING; /* 32 characters of serial number, convert to UTF-16LE */ for (size_t i=0; i<USB_DESCRIPTOR_STRING_SERIAL_LEN; i++) { const uint_fast8_t nibble = (iap_cmd_res.status_res.iap_result[i >> 3] >> (28 - (i & 7) * 4)) & 0xf; const char c = (nibble > 9) ? ('a' + nibble - 10) : ('0' + nibble); usb_descriptor_string_serial_number[2 + i * 2] = c; usb_descriptor_string_serial_number[3 + i * 2] = 0x00; } } else {