Skip to content

Commit 35447b7

Browse files
authored
Merge pull request hathach#3295 from hathach/dwc2_ep0
dcd/dwc2: fix EP0 multi-packet transfer logic
2 parents d46f71b + 4b92d32 commit 35447b7

File tree

8 files changed

+397
-223
lines changed

8 files changed

+397
-223
lines changed

examples/device/dfu/src/main.c

Lines changed: 42 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
*
2424
*/
2525

26-
/*
26+
/*
2727
* After device is enumerated in dfu mode run the following commands
2828
*
2929
* To transfer firmware from host to device (best to test with text file)
@@ -48,43 +48,35 @@
4848
//--------------------------------------------------------------------+
4949
// MACRO CONSTANT TYPEDEF PROTYPES
5050
//--------------------------------------------------------------------+
51-
const char* upload_image[2]=
52-
{
53-
"Hello world from TinyUSB DFU! - Partition 0",
54-
"Hello world from TinyUSB DFU! - Partition 1"
55-
};
51+
const char *upload_image[2] = {"Hello world from TinyUSB DFU! - Partition 0",
52+
"Hello world from TinyUSB DFU! - Partition 1"};
5653

5754
/* Blink pattern
5855
* - 250 ms : device not mounted
5956
* - 1000 ms : device mounted
6057
* - 2500 ms : device is suspended
6158
*/
62-
enum {
59+
enum {
6360
BLINK_NOT_MOUNTED = 250,
64-
BLINK_MOUNTED = 1000,
65-
BLINK_SUSPENDED = 2500,
61+
BLINK_MOUNTED = 1000,
62+
BLINK_SUSPENDED = 2500,
6663
};
6764

6865
static uint32_t blink_interval_ms = BLINK_NOT_MOUNTED;
6966

7067
void led_blinking_task(void);
7168

7269
/*------------- MAIN -------------*/
73-
int main(void)
74-
{
70+
int main(void) {
7571
board_init();
7672

7773
// init device stack on configured roothub port
78-
tusb_rhport_init_t dev_init = {
79-
.role = TUSB_ROLE_DEVICE,
80-
.speed = TUSB_SPEED_AUTO
81-
};
74+
tusb_rhport_init_t dev_init = {.role = TUSB_ROLE_DEVICE, .speed = TUSB_SPEED_AUTO};
8275
tusb_init(BOARD_TUD_RHPORT, &dev_init);
8376

8477
board_init_after_tusb();
8578

86-
while (1)
87-
{
79+
while (1) {
8880
tud_task(); // tinyusb device task
8981
led_blinking_task();
9082
}
@@ -95,29 +87,25 @@ int main(void)
9587
//--------------------------------------------------------------------+
9688

9789
// Invoked when device is mounted
98-
void tud_mount_cb(void)
99-
{
90+
void tud_mount_cb(void) {
10091
blink_interval_ms = BLINK_MOUNTED;
10192
}
10293

10394
// Invoked when device is unmounted
104-
void tud_umount_cb(void)
105-
{
95+
void tud_umount_cb(void) {
10696
blink_interval_ms = BLINK_NOT_MOUNTED;
10797
}
10898

10999
// Invoked when usb bus is suspended
110100
// remote_wakeup_en : if host allow us to perform remote wakeup
111101
// Within 7ms, device must draw an average of current less than 2.5 mA from bus
112-
void tud_suspend_cb(bool remote_wakeup_en)
113-
{
114-
(void) remote_wakeup_en;
102+
void tud_suspend_cb(bool remote_wakeup_en) {
103+
(void)remote_wakeup_en;
115104
blink_interval_ms = BLINK_SUSPENDED;
116105
}
117106

118107
// Invoked when usb bus is resumed
119-
void tud_resume_cb(void)
120-
{
108+
void tud_resume_cb(void) {
121109
blink_interval_ms = tud_mounted() ? BLINK_MOUNTED : BLINK_NOT_MOUNTED;
122110
}
123111

@@ -129,19 +117,17 @@ void tud_resume_cb(void)
129117
// Invoked right before tud_dfu_download_cb() (state=DFU_DNBUSY) or tud_dfu_manifest_cb() (state=DFU_MANIFEST)
130118
// Application return timeout in milliseconds (bwPollTimeout) for the next download/manifest operation.
131119
// During this period, USB host won't try to communicate with us.
132-
uint32_t tud_dfu_get_timeout_cb(uint8_t alt, uint8_t state)
133-
{
134-
if ( state == DFU_DNBUSY )
135-
{
120+
uint32_t tud_dfu_get_timeout_cb(uint8_t alt, uint8_t state) {
121+
if (state == DFU_DNBUSY) {
136122
// For this example
137123
// - Atl0 Flash is fast : 1 ms
138124
// - Alt1 EEPROM is slow: 100 ms
139125
return (alt == 0) ? 1 : 100;
140-
}
141-
else if (state == DFU_MANIFEST)
142-
{
126+
} else if (state == DFU_MANIFEST) {
143127
// since we don't buffer entire image and do any flashing in manifest stage
144128
return 0;
129+
} else {
130+
// nothing to do
145131
}
146132

147133
return 0;
@@ -150,15 +136,13 @@ uint32_t tud_dfu_get_timeout_cb(uint8_t alt, uint8_t state)
150136
// Invoked when received DFU_DNLOAD (wLength>0) following by DFU_GETSTATUS (state=DFU_DNBUSY) requests
151137
// This callback could be returned before flashing op is complete (async).
152138
// Once finished flashing, application must call tud_dfu_finish_flashing()
153-
void tud_dfu_download_cb(uint8_t alt, uint16_t block_num, uint8_t const* data, uint16_t length)
154-
{
155-
(void) alt;
156-
(void) block_num;
139+
void tud_dfu_download_cb(uint8_t alt, uint16_t block_num, const uint8_t *data, uint16_t length) {
140+
(void)alt;
141+
(void)block_num;
157142

158143
//printf("\r\nReceived Alt %u BlockNum %u of length %u\r\n", alt, wBlockNum, length);
159144

160-
for(uint16_t i=0; i<length; i++)
161-
{
145+
for (uint16_t i = 0; i < length; i++) {
162146
printf("%c", data[i]);
163147
}
164148

@@ -169,9 +153,8 @@ void tud_dfu_download_cb(uint8_t alt, uint16_t block_num, uint8_t const* data, u
169153
// Invoked when download process is complete, received DFU_DNLOAD (wLength=0) following by DFU_GETSTATUS (state=Manifest)
170154
// Application can do checksum, or actual flashing if buffered entire image previously.
171155
// Once finished flashing, application must call tud_dfu_finish_flashing()
172-
void tud_dfu_manifest_cb(uint8_t alt)
173-
{
174-
(void) alt;
156+
void tud_dfu_manifest_cb(uint8_t alt) {
157+
(void)alt;
175158
printf("Download completed, enter manifestation\r\n");
176159

177160
// flashing op for manifest is complete without error
@@ -182,41 +165,43 @@ void tud_dfu_manifest_cb(uint8_t alt)
182165
// Invoked when received DFU_UPLOAD request
183166
// Application must populate data with up to length bytes and
184167
// Return the number of written bytes
185-
uint16_t tud_dfu_upload_cb(uint8_t alt, uint16_t block_num, uint8_t* data, uint16_t length)
186-
{
187-
(void) block_num;
188-
(void) length;
168+
uint16_t tud_dfu_upload_cb(uint8_t alt, uint16_t block_num, uint8_t *data, uint16_t length) {
169+
(void)block_num;
170+
(void)length;
189171

190-
uint16_t const xfer_len = (uint16_t) strlen(upload_image[alt]);
172+
if (block_num != 0u) {
173+
return 0; // for this example we only support single block upload
174+
}
175+
176+
const uint16_t xfer_len = tu_min16((uint16_t)strlen(upload_image[alt]), length);
191177
memcpy(data, upload_image[alt], xfer_len);
192178

193179
return xfer_len;
194180
}
195181

196182
// Invoked when the Host has terminated a download or upload transfer
197-
void tud_dfu_abort_cb(uint8_t alt)
198-
{
199-
(void) alt;
183+
void tud_dfu_abort_cb(uint8_t alt) {
184+
(void)alt;
200185
printf("Host aborted transfer\r\n");
201186
}
202187

203188
// Invoked when a DFU_DETACH request is received
204-
void tud_dfu_detach_cb(void)
205-
{
189+
void tud_dfu_detach_cb(void) {
206190
printf("Host detach, we should probably reboot\r\n");
207191
}
208192

209193
//--------------------------------------------------------------------+
210194
// BLINKING TASK + Indicator pulse
211195
//--------------------------------------------------------------------+
212196

213-
void led_blinking_task(void)
214-
{
215-
static uint32_t start_ms = 0;
216-
static bool led_state = false;
197+
void led_blinking_task(void) {
198+
static uint32_t start_ms = 0;
199+
static bool led_state = false;
217200

218201
// Blink every interval ms
219-
if ( board_millis() - start_ms < blink_interval_ms) return; // not enough time
202+
if (board_millis() - start_ms < blink_interval_ms) {
203+
return; // not enough time
204+
}
220205
start_ms += blink_interval_ms;
221206

222207
board_led_write(led_state);

0 commit comments

Comments
 (0)