Open FFBoard
Open source force feedback firmware
Loading...
Searching...
No Matches
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", 330, 40), desc_device(deviceDesc), desc_conf(confDesc), string_desc(strings),appendSerial(appendSerial) {
15
16}
17
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 char buf[25];
45 std::snprintf(buf,25,"%08lx%08lx%08lx",HAL_GetUIDw2(),HAL_GetUIDw1(),HAL_GetUIDw0()); // Print as hex string
46 std::string serial{buf}; //std::to_string(HAL_GetUIDw0()) + std::to_string(HAL_GetUIDw1()) + std::to_string(HAL_GetUIDw2());
47
48 return serial;
49}
50
52 return (uint8_t*)desc_device;
53}
54
55const uint8_t* USBdevice::getUsbConfigurationDesc(uint8_t index){
56 return desc_conf;
57}
58
62uint16_t* USBdevice::getUsbStringDesc(uint8_t index,uint16_t langid){
63 (void) langid;
64 uint16_t chr_count = 0;
65 if (index == 0) // Language
66 {
67 _desc_str[1] = string_desc->langId;
68 chr_count = 1;
69 }else{
70 std::string field;
71 if(index == desc_device->iSerialNumber){
72 field = getUsbSerial();
73 }else if(index == desc_device->iProduct){
74 field = string_desc->product;
75 }else if(index == desc_device->iManufacturer){
76 field = string_desc->manufacturer;
77 }else if(index > 3 && ((index - 4) < (int)string_desc->interfaces.size())){
78 field = string_desc->interfaces[index-4];
79 if(appendSerial){
80 field += "(";
81 field.append(std::to_string(HAL_GetUIDw0()).substr(0, appendSerial));
82 field += ")";
83 }
84 }else{
85 return NULL;
86 }
87 chr_count = std::min<uint8_t>(USB_STRING_DESC_BUF_SIZE-1,field.length());
88 // Convert ASCII string into UTF-16
89 for(uint8_t i=0; i < chr_count; i++)
90 {
91 _desc_str[1+i] = field[i];
92 }
93 }
94
95 // first byte is length (including header), second byte is string type
96 _desc_str[0] = (TUSB_DESC_STRING << 8 ) | (2*chr_count + 2);
97
98 return _desc_str;
99}
100
101
102
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:51
virtual const uint8_t * getUsbConfigurationDesc(uint8_t index)
Definition USBdevice.cpp:55
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:62
Thread(const std::string Name, uint16_t StackDepth, UBaseType_t Priority)
Definition cthread.cpp:56
USBdevice * usb_device
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
struct usb_string_desc usb_string_desc_t
static TU_ATTR_ALWAYS_INLINE void tud_task(void)
Definition usbd.h:68