1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
41
42
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
102
103
107
108
112
113
119
123
124
127
128
129
130
131
132
133
134
137
138
141
142
143
144
145
146
147
148
149
152
153
154
155
156
157
158
159
160
161
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
/* ... */
#ifndef BOARD_API_H_
#define BOARD_API_H_
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
#include <inttypes.h>
#include <stdbool.h>
#include <string.h>
#include "tusb.h"
5 includes
#if CFG_TUSB_OS == OPT_OS_FREERTOS
#if TUP_MCU_ESPRESSIF
#include "freertos/FreeRTOS.h"
#include "freertos/semphr.h"
#include "freertos/queue.h"
#include "freertos/task.h"
#include "freertos/timers.h"
5 includes#else/* ... */
#include "FreeRTOS.h"
#include "semphr.h"
#include "queue.h"
#include "task.h"
#include "timers.h"
/* ... */#endif/* ... */
#endif
#ifndef CFG_BOARD_UART_BAUDRATE
#define CFG_BOARD_UART_BAUDRATE 115200
#endif
void board_init(void);
void board_init_after_tusb(void) TU_ATTR_WEAK;
void board_reset_to_bootloader(void) TU_ATTR_WEAK;
void board_led_write(bool state);
uint32_t board_button_read(void);
TU_ATTR_WEAK size_t board_get_unique_id(uint8_t id[], size_t max_len);
int board_uart_read(uint8_t *buf, int len);
int board_uart_write(void const *buf, int len);
#if CFG_TUSB_OS == OPT_OS_NONE
uint32_t board_millis(void);
/* ... */
#elif CFG_TUSB_OS == OPT_OS_FREERTOS
static inline uint32_t board_millis(void) {
return ( ( ((uint64_t) xTaskGetTickCount()) * 1000) / configTICK_RATE_HZ );
}board_millis (void) { ... }
/* ... */
#elif CFG_TUSB_OS == OPT_OS_MYNEWT
static inline uint32_t board_millis(void) {
return os_time_ticks_to_ms32( os_time_get() );
}board_millis (void) { ... }
/* ... */
#elif CFG_TUSB_OS == OPT_OS_PICO
#include "pico/time.h"
static inline uint32_t board_millis(void) {
return to_ms_since_boot(get_absolute_time());
}{ ... }
/* ... */#elif CFG_TUSB_OS == OPT_OS_RTTHREAD
static inline uint32_t board_millis(void) {
return (((uint64_t)rt_tick_get()) * 1000 / RT_TICK_PER_SECOND);
}board_millis (void) { ... }
/* ... */
#elif CFG_TUSB_OS == OPT_OS_CUSTOM
uint32_t board_millis(void);
/* ... */
#else
#error "board_millis() is not implemented for this OS"
#endif
static inline void board_led_on(void) {
board_led_write(true);
}{ ... }
static inline void board_led_off(void) {
board_led_write(false);
}{ ... }
static inline size_t board_usb_get_serial(uint16_t desc_str1[], size_t max_chars) {
uint8_t uid[16] TU_ATTR_ALIGNED(4);
size_t uid_len;
if ( board_get_unique_id ) {
uid_len = board_get_unique_id(uid, sizeof(uid));
}if (board_get_unique_id) { ... }else {
uint32_t* uid32 = (uint32_t*) (uintptr_t) uid;
uid32[0] = 0x67452301;
uid32[1] = 0xEFCDAB89;
uid_len = 8;
}
if ( uid_len > max_chars / 2 ) uid_len = max_chars / 2;
for ( size_t i = 0; i < uid_len; i++ ) {
for ( size_t j = 0; j < 2; j++ ) {
const char nibble_to_hex[16] = {
'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
...};
uint8_t const nibble = (uid[i] >> (j * 4)) & 0xf;
desc_str1[i * 2 + (1 - j)] = nibble_to_hex[nibble];
}for (size_t j = 0; j < 2; j++) { ... }
}for (size_t i = 0; i < uid_len; i++) { ... }
return 2 * uid_len;
}{ ... }
static inline void board_delay(uint32_t ms) {
uint32_t start_ms = board_millis();
while ( board_millis() - start_ms < ms ) {
#if CFG_TUD_ENABLED
tud_task();
#endif
#if CFG_TUH_ENABLED
tuh_task();
#endif
}while (board_millis() - start_ms < ms) { ... }
}{ ... }
int board_getchar(void);
#ifdef __cplusplus
}extern "C" { ... }
#endif
/* ... */
#endif