Skip to content

Commit d85a8de

Browse files
committed
[add]Add rtthread script support to better integrate into rtthread projects.
1 parent 50738f2 commit d85a8de

File tree

5 files changed

+449
-0
lines changed

5 files changed

+449
-0
lines changed

SConscript

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# RT-Thread building script for bridge
2+
3+
import os
4+
from building import *
5+
6+
objs = []
7+
cwd = GetCurrentDir()
8+
9+
objs = objs + SConscript(cwd + '/lib/rt-thread/SConscript')
10+
11+
Return('objs')

lib/rt-thread/SConscript

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import rtconfig
2+
from building import *
3+
4+
cwd = GetCurrentDir()
5+
src = Split("""
6+
../../src/tusb.c
7+
../../src/common/tusb_fifo.c
8+
../../src/device/usbd.c
9+
../../src/device/usbd_control.c
10+
./tinyusb_port.c
11+
""")
12+
path = [cwd, cwd + "/../../src"]
13+
14+
# BSP
15+
if GetDepend(["SOC_FAMILY_STM32"]):
16+
src += ["../../src/portable/synopsys/dwc2/dcd_dwc2.c",
17+
"../../src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c"]
18+
19+
if GetDepend(["SOC_NRF52840"]):
20+
src += ["../../src/portable/nordic/nrf5x/dcd_nrf5x.c"]
21+
22+
if GetDepend(["SOC_FAMILY_RENESAS"]):
23+
src += ["../../src/portable/renesas/rusb2/dcd_rusb2.c",
24+
"../../src/portable/renesas/rusb2/rusb2_common.c"]
25+
26+
# Device class
27+
if GetDepend(["PKG_TINYUSB_DEVICE_CDC"]):
28+
src += ["../../src/class/cdc/cdc_device.c"]
29+
30+
if GetDepend(["PKG_TINYUSB_DEVICE_MSC"]):
31+
src += ["../../src/class/msc/msc_device.c", "port/msc_device_port.c"]
32+
33+
LOCAL_CFLAGS = ''
34+
35+
if rtconfig.PLATFORM == 'gcc' or rtconfig.PLATFORM == 'armclang': # GCC or Keil AC6
36+
LOCAL_CFLAGS += ' -std=c99'
37+
elif rtconfig.PLATFORM == 'armcc': # Keil AC5
38+
LOCAL_CFLAGS += ' --c99 --gnu'
39+
40+
group = DefineGroup('TinyUSB', src, depend = ['PKG_USING_TINYUSB'], CPPPATH = path, LOCAL_CFLAGS = LOCAL_CFLAGS)
41+
42+
Return('group')

lib/rt-thread/port/msc_device_port.c

+171
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
/*
2+
* The MIT License (MIT)
3+
*
4+
* Copyright (c) 2019 Ha Thach (tinyusb.org)
5+
*
6+
* Permission is hereby granted, free of charge, to any person obtaining a copy
7+
* of this software and associated documentation files (the "Software"), to deal
8+
* in the Software without restriction, including without limitation the rights
9+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10+
* copies of the Software, and to permit persons to whom the Software is
11+
* furnished to do so, subject to the following conditions:
12+
*
13+
* The above copyright notice and this permission notice shall be included in
14+
* all copies or substantial portions of the Software.
15+
*
16+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22+
* THE SOFTWARE.
23+
*
24+
* This file is part of the TinyUSB stack.
25+
*/
26+
#ifdef __RTTHREAD__
27+
#include <tusb.h>
28+
#include <stdint.h>
29+
30+
#include <board.h>
31+
#include <rtdevice.h>
32+
33+
static bool ejected = false;
34+
static rt_device_t flash_device;
35+
static struct rt_device_blk_geometry blk_geom;
36+
37+
#ifdef __CC_ARM
38+
uint16_t __builtin_bswap16(uint16_t x)
39+
{
40+
return (x << 8) | (x >> 8);
41+
}
42+
#endif
43+
44+
void tud_msc_inquiry_cb(uint8_t lun, uint8_t vendor_id[8], uint8_t product_id[16], uint8_t product_rev[4])
45+
{
46+
(void) lun;
47+
48+
const char vid[] = PKG_TINYUSB_DEVICE_MSC_VID;
49+
const char pid[] = PKG_TINYUSB_DEVICE_MSC_PID;
50+
const char rev[] = PKG_TINYUSB_DEVICE_MSC_REV;
51+
52+
memcpy(vendor_id, vid, strlen(vid));
53+
memcpy(product_id, pid, strlen(pid));
54+
memcpy(product_rev, rev, strlen(rev));
55+
}
56+
57+
bool tud_msc_test_unit_ready_cb(uint8_t lun)
58+
{
59+
(void) lun;
60+
61+
if (ejected)
62+
{
63+
tud_msc_set_sense(lun, SCSI_SENSE_NOT_READY, 0x3a, 0x00);
64+
return false;
65+
}
66+
67+
if (flash_device == NULL)
68+
{
69+
flash_device = rt_device_find(PKG_TINYUSB_DEVICE_MSC_NAME);
70+
}
71+
if (flash_device != NULL)
72+
{
73+
static uint8_t open_flg = 0;
74+
if (!open_flg)
75+
{
76+
open_flg = 1;
77+
rt_device_open(flash_device, 0);
78+
}
79+
80+
rt_device_control(flash_device, RT_DEVICE_CTRL_BLK_GETGEOME, &blk_geom);
81+
return true;
82+
}
83+
84+
return false;
85+
}
86+
87+
void tud_msc_capacity_cb(uint8_t lun, uint32_t *block_count, uint16_t *block_size)
88+
{
89+
(void) lun;
90+
91+
*block_count = blk_geom.sector_count;
92+
*block_size = blk_geom.bytes_per_sector;
93+
}
94+
95+
bool tud_msc_start_stop_cb(uint8_t lun, uint8_t power_condition, bool start, bool load_eject)
96+
{
97+
(void) lun;
98+
(void) power_condition;
99+
100+
if (load_eject)
101+
{
102+
if (start)
103+
{
104+
ejected = false;
105+
} else {
106+
// unload disk storage
107+
ejected = true;
108+
}
109+
}
110+
111+
return true;
112+
}
113+
114+
int32_t tud_msc_read10_cb(uint8_t lun, uint32_t lba, uint32_t offset, void *buffer, uint32_t bufsize)
115+
{
116+
(void) lun;
117+
(void) offset;
118+
(void) bufsize;
119+
120+
return (int32_t) rt_device_read(flash_device, (rt_off_t) lba, buffer, 1) * blk_geom.bytes_per_sector;
121+
}
122+
123+
int32_t tud_msc_write10_cb(uint8_t lun, uint32_t lba, uint32_t offset, uint8_t *buffer, uint32_t bufsize)
124+
{
125+
(void) lun;
126+
(void) offset;
127+
(void) bufsize;
128+
129+
return (int32_t) rt_device_write(flash_device, (rt_off_t) lba, buffer, 1) * blk_geom.bytes_per_sector;
130+
}
131+
132+
int32_t tud_msc_scsi_cb(uint8_t lun, uint8_t const scsi_cmd[16], void *buffer, uint16_t bufsize)
133+
{
134+
void const *response = NULL;
135+
uint16_t resplen = 0;
136+
137+
// most scsi handled is input
138+
bool in_xfer = true;
139+
140+
switch (scsi_cmd[0])
141+
{
142+
case SCSI_CMD_PREVENT_ALLOW_MEDIUM_REMOVAL:
143+
// Host is about to read/write etc ... better not to disconnect disk
144+
resplen = 0;
145+
break;
146+
147+
default:
148+
// Set Sense = Invalid Command Operation
149+
tud_msc_set_sense(lun, SCSI_SENSE_ILLEGAL_REQUEST, 0x20, 0x00);
150+
151+
// negative means error -> tinyusb could stall and/or response with failed status
152+
resplen = -1;
153+
break;
154+
}
155+
156+
// return resplen must not larger than bufsize
157+
if (resplen > bufsize) resplen = bufsize;
158+
159+
if (response && (resplen > 0))
160+
{
161+
if (in_xfer)
162+
{
163+
memcpy(buffer, response, resplen);
164+
} else {
165+
// SCSI output
166+
}
167+
}
168+
169+
return resplen;
170+
}
171+
#endif /*__RTTHREAD__*/

lib/rt-thread/tinyusb_port.c

+78
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
/*
2+
* The MIT License (MIT)
3+
*
4+
* Copyright (c) 2019 Ha Thach (tinyusb.org)
5+
*
6+
* Permission is hereby granted, free of charge, to any person obtaining a copy
7+
* of this software and associated documentation files (the "Software"), to deal
8+
* in the Software without restriction, including without limitation the rights
9+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10+
* copies of the Software, and to permit persons to whom the Software is
11+
* furnished to do so, subject to the following conditions:
12+
*
13+
* The above copyright notice and this permission notice shall be included in
14+
* all copies or substantial portions of the Software.
15+
*
16+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22+
* THE SOFTWARE.
23+
*
24+
* This file is part of the TinyUSB stack.
25+
*/
26+
#ifdef __RTTHREAD__
27+
#include <rtthread.h>
28+
29+
#define DBG_TAG "TinyUSB"
30+
#define DBG_LVL DBG_INFO
31+
#include <rtdbg.h>
32+
#include <tusb.h>
33+
34+
#ifndef RT_USING_HEAP
35+
/* if there is not enable heap, we should use static thread and stack. */
36+
static rt_uint8_t tusb_stack[PKG_TINYUSB_STACK_SIZE];
37+
static struct rt_thread tusb_thread;
38+
#endif /* RT_USING_HEAP */
39+
40+
static void tusb_thread_entry(void *parameter)
41+
{
42+
(void) parameter;
43+
while (1)
44+
{
45+
tud_task();
46+
}
47+
}
48+
49+
static int init_tinyusb(void)
50+
{
51+
rt_thread_t tid;
52+
53+
tusb_init();
54+
55+
#ifdef RT_USING_HEAP
56+
tid = rt_thread_create("tusb", tusb_thread_entry, RT_NULL,
57+
PKG_TINYUSB_STACK_SIZE,
58+
PKG_TINYUSB_THREAD_PRIORITY, 10);
59+
if (tid == RT_NULL)
60+
#else
61+
rt_err_t result;
62+
63+
tid = &tusb_thread;
64+
result = rt_thread_init(tid, "tusb", tusb_thread_entry, RT_NULL,
65+
tusb_stack, sizeof(tusb_stack), 4, 10);
66+
if (result != RT_EOK)
67+
#endif /* RT_USING_HEAP */
68+
{
69+
LOG_E("Fail to create TinyUSB thread");
70+
return -1;
71+
}
72+
73+
rt_thread_startup(tid);
74+
75+
return 0;
76+
}
77+
//INIT_APP_EXPORT(init_tinyusb);
78+
#endif /*__RTTHREAD__*/

0 commit comments

Comments
 (0)