Open FFBoard
Open source force feedback firmware
USBdevice.cpp
Go to the documentation of this file.
1/*
2 * USBdevice.cpp
3 *
4 * Created on: 19.02.2021
5 * Author: Yannick
6 */
7
8#include "USBdevice.h"
9#include "tusb.h"
10
11uint16_t _desc_str[USB_STRING_DESC_BUF_SIZE]; // String buffer
12
13USBdevice::USBdevice(const tusb_desc_device_t* deviceDesc,const uint8_t (*confDesc),const usb_string_desc_t* strings, uint8_t appendSerial) :
14Thread("USB", 256, 40), desc_device(deviceDesc), desc_conf(confDesc), string_desc(strings),appendSerial(appendSerial) {
15
16}
17
19
20}
21
26 // Global callback pointer
27 extern USBdevice* usb_device;
28 usb_device = this;
29
30 this->Start();
31}
32
34 tusb_init();
35 while(1){
36 tud_task(); // Run until no usb events left
37 }
38}
39
44 std::string serial = std::to_string(HAL_GetUIDw0()) + std::to_string(HAL_GetUIDw1()) + std::to_string(HAL_GetUIDw2());
45
46 return serial;
47}
48
50 return (uint8_t*)desc_device;
51}
52
53const uint8_t* USBdevice::getUsbConfigurationDesc(uint8_t index){
54 return desc_conf;
55}
56
60uint16_t* USBdevice::getUsbStringDesc(uint8_t index,uint16_t langid){
61 (void) langid;
62 uint16_t chr_count = 0;
63 if (index == 0) // Language
64 {
66 chr_count = 1;
67 }else{
68 std::string field;
69 if(index == desc_device->iSerialNumber){
70 field = getUsbSerial();
71 }else if(index == desc_device->iProduct){
72 field = string_desc->product;
73 }else if(index == desc_device->iManufacturer){
75 }else if(index > 3 && ((index - 4) < (int)string_desc->interfaces.size())){
76 field = string_desc->interfaces[index-4];
77 if(appendSerial){
78 field += "(";
79 field.append(getUsbSerial().substr(0, appendSerial));
80 field += ")";
81 }
82 }else{
83 return NULL;
84 }
85 chr_count = std::min<uint8_t>(USB_STRING_DESC_BUF_SIZE-1,field.length());
86 // Convert ASCII string into UTF-16
87 for(uint8_t i=0; i < chr_count; i++)
88 {
89 _desc_str[1+i] = field[i];
90 }
91 }
92
93 // first byte is length (including header), second byte is string type
94 _desc_str[0] = (TUSB_DESC_STRING << 8 ) | (2*chr_count + 2);
95
96 return _desc_str;
97}
98
99
100
uint16_t _desc_str[USB_STRING_DESC_BUF_SIZE]
Definition: USBdevice.cpp:11
const uint8_t * desc_conf
Definition: USBdevice.h:40
virtual void registerUsb()
Definition: USBdevice.cpp:25
uint8_t appendSerial
Definition: USBdevice.h:42
virtual const uint8_t * getUsbDeviceDesc()
Definition: USBdevice.cpp:49
virtual const uint8_t * getUsbConfigurationDesc(uint8_t index)
Definition: USBdevice.cpp:53
virtual std::string getUsbSerial()
Definition: USBdevice.cpp:43
virtual ~USBdevice()
Definition: USBdevice.cpp:18
const usb_string_desc_t * string_desc
Definition: USBdevice.h:41
void Run()
Definition: USBdevice.cpp:33
const tusb_desc_device_t * desc_device
Definition: USBdevice.h:39
USBdevice(const tusb_desc_device_t *deviceDesc, const uint8_t(*confDesc), const usb_string_desc_t *strings, uint8_t appendSerial=4)
Definition: USBdevice.cpp:13
virtual uint16_t * getUsbStringDesc(uint8_t index, uint16_t langid)
Definition: USBdevice.cpp:60
USBdevice * usb_device
const std::string product
const std::string manufacturer
const uint16_t langId
const std::vector< std::string > interfaces
TU_ATTR_PACKED_BEGIN TU_ATTR_BIT_FIELD_ORDER_BEGIN struct TU_ATTR_PACKED tusb_desc_device_t
USB Device Descriptor.
@ TUSB_DESC_STRING
Definition: tusb_types.h:95
static TU_ATTR_ALWAYS_INLINE void tud_task(void)
Definition: usbd.h:68