Skip to content

Commit c237d18

Browse files
authored
Merge pull request #2599 from Rbb666/rtthread
[osal]Add rt-thread script support.
2 parents 313d966 + d664cbf commit c237d18

File tree

5 files changed

+452
-0
lines changed

5 files changed

+452
-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+
./tusb_rt_thread_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/tusb_config.h

+147
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
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+
27+
#ifndef _TUSB_CONFIG_H_
28+
#define _TUSB_CONFIG_H_
29+
30+
#ifdef __RTTHREAD__
31+
#include <rtconfig.h>
32+
33+
#ifdef __cplusplus
34+
extern "C" {
35+
#endif
36+
37+
//--------------------------------------------------------------------
38+
// COMMON CONFIGURATION
39+
//--------------------------------------------------------------------
40+
41+
#if defined(SOC_SERIES_STM32F0)
42+
#define CFG_TUSB_MCU OPT_MCU_STM32F0
43+
#elif defined(SOC_SERIES_STM32F1)
44+
#define CFG_TUSB_MCU OPT_MCU_STM32F1
45+
#elif defined(SOC_SERIES_STM32F2)
46+
#define CFG_TUSB_MCU OPT_MCU_STM32F2
47+
#elif defined(SOC_SERIES_STM32F3)
48+
#define CFG_TUSB_MCU OPT_MCU_STM32F3
49+
#elif defined(SOC_SERIES_STM32F4)
50+
#define CFG_TUSB_MCU OPT_MCU_STM32F4
51+
#elif defined(SOC_SERIES_STM32F7)
52+
#define CFG_TUSB_MCU OPT_MCU_STM32F7
53+
#elif defined(SOC_SERIES_STM32H7)
54+
#define CFG_TUSB_MCU OPT_MCU_STM32H7
55+
#elif defined(SOC_SERIES_STM32L0)
56+
#define CFG_TUSB_MCU OPT_MCU_STM32L0
57+
#elif defined(SOC_SERIES_STM32L1)
58+
#define CFG_TUSB_MCU OPT_MCU_STM32L1
59+
#elif defined(SOC_SERIES_STM32L4)
60+
#define CFG_TUSB_MCU OPT_MCU_STM32L4
61+
#elif defined(SOC_NRF52840)
62+
#define CFG_TUSB_MCU OPT_MCU_NRF5X
63+
#elif defined(SOC_HPM6000)
64+
#define CFG_TUSB_MCU OPT_MCU_HPM
65+
#elif defined(SOC_RP2040)
66+
#define CFG_TUSB_MCU OPT_MCU_RP2040
67+
#elif defined(SOC_FAMILY_RENESAS)
68+
#define CFG_TUSB_MCU OPT_MCU_RAXXX
69+
#else
70+
#error "Not support for current MCU"
71+
#endif
72+
73+
#define CFG_TUSB_OS OPT_OS_RTTHREAD
74+
75+
//--------------------------------------------------------------------
76+
// DEBUG CONFIGURATION
77+
//--------------------------------------------------------------------
78+
#ifdef CFG_TUSB_DEBUG
79+
#define CFG_TUSB_DEBUG_PRINTF rt_kprintf
80+
#endif /* CFG_TUSB_DEBUG */
81+
82+
#ifndef BOARD_DEVICE_RHPORT_NUM
83+
#define BOARD_DEVICE_RHPORT_NUM PKG_TINYUSB_RHPORT_NUM
84+
#endif
85+
86+
#ifndef BOARD_DEVICE_RHPORT_SPEED
87+
#define BOARD_DEVICE_RHPORT_SPEED PKG_TINYUSB_DEVICE_PORT_SPEED
88+
#endif
89+
90+
#if BOARD_DEVICE_RHPORT_NUM == 0
91+
#define CFG_TUSB_RHPORT0_MODE (OPT_MODE_DEVICE | BOARD_DEVICE_RHPORT_SPEED)
92+
#elif BOARD_DEVICE_RHPORT_NUM == 1
93+
#define CFG_TUSB_RHPORT1_MODE (OPT_MODE_DEVICE | BOARD_DEVICE_RHPORT_SPEED)
94+
#else
95+
#error "Incorrect RHPort configuration"
96+
#endif
97+
98+
/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.
99+
* Tinyusb use follows macros to declare transferring memory so that they can be put
100+
* into those specific section.
101+
* e.g
102+
* - CFG_TUSB_MEM SECTION : __attribute__ (( section(".usb_ram") ))
103+
* - CFG_TUSB_MEM_ALIGN : __attribute__ ((aligned(4)))
104+
*/
105+
#ifndef CFG_TUSB_MEM_SECTION
106+
#define CFG_TUSB_MEM_SECTION rt_section(PKG_TINYUSB_MEM_SECTION)
107+
#endif
108+
109+
#ifndef CFG_TUSB_MEM_ALIGN
110+
#define CFG_TUSB_MEM_ALIGN rt_align(PKG_TINYUSB_MEM_ALIGN)
111+
#endif
112+
113+
//--------------------------------------------------------------------
114+
// DEVICE CONFIGURATION
115+
//--------------------------------------------------------------------
116+
117+
#ifndef CFG_TUD_ENDPOINT0_SIZE
118+
#define CFG_TUD_ENDPOINT0_SIZE PKG_TINYUSB_EDPT0_SIZE
119+
#endif
120+
121+
// CDC FIFO size of TX and RX
122+
#define CFG_TUD_CDC_RX_BUFSIZE PKG_TINYUSB_DEVICE_CDC_RX_BUFSIZE
123+
#define CFG_TUD_CDC_TX_BUFSIZE PKG_TINYUSB_DEVICE_CDC_TX_BUFSIZE
124+
125+
#define CFG_TUD_MSC_EP_BUFSIZE PKG_TINYUSB_DEVICE_MSC_EP_BUFSIZE
126+
127+
#define CFG_TUD_HID_EP_BUFSIZE PKG_TINYUSB_DEVICE_HID_EP_BUFSIZE
128+
129+
#ifndef PKG_TINYUSB_DEVICE_CDC_STRING
130+
#define PKG_TINYUSB_DEVICE_CDC_STRING ""
131+
#endif
132+
133+
#ifndef PKG_TINYUSB_DEVICE_MSC_STRING
134+
#define PKG_TINYUSB_DEVICE_MSC_STRING ""
135+
#endif
136+
137+
#ifndef PKG_TINYUSB_DEVICE_HID_STRING
138+
#define PKG_TINYUSB_DEVICE_HID_STRING ""
139+
#endif
140+
141+
142+
#ifdef __cplusplus
143+
}
144+
#endif
145+
#endif /*__RTTHREAD__*/
146+
147+
#endif /* _TUSB_CONFIG_H_ */

0 commit comments

Comments
 (0)