mirror of
https://github.com/hathach/tinyusb.git
synced 2025-04-18 02:42:37 +00:00
add rp2040 to host example build
This commit is contained in:
parent
0c05a02e67
commit
f6b48c07fc
0
examples/host/cdc_msc_hid/.only.MCU_RP2040
Normal file
0
examples/host/cdc_msc_hid/.only.MCU_RP2040
Normal file
46
examples/host/cdc_msc_hid/CMakeLists.txt
Normal file
46
examples/host/cdc_msc_hid/CMakeLists.txt
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
# use directory name for project id
|
||||||
|
get_filename_component(PROJECT ${CMAKE_CURRENT_SOURCE_DIR} NAME)
|
||||||
|
set(PROJECT ${BOARD}-${PROJECT})
|
||||||
|
|
||||||
|
# TOP is absolute path to root directory of TinyUSB git repo
|
||||||
|
set(TOP "../../..")
|
||||||
|
get_filename_component(TOP "${TOP}" REALPATH)
|
||||||
|
|
||||||
|
# Check for -DFAMILY=
|
||||||
|
if(FAMILY STREQUAL "esp32s2")
|
||||||
|
cmake_minimum_required(VERSION 3.5)
|
||||||
|
include(${TOP}/hw/bsp/${FAMILY}/family.cmake)
|
||||||
|
project(${PROJECT})
|
||||||
|
|
||||||
|
elseif(FAMILY STREQUAL "rp2040")
|
||||||
|
cmake_minimum_required(VERSION 3.12)
|
||||||
|
set(PICO_SDK_PATH ${TOP}/hw/mcu/raspberrypi/pico-sdk)
|
||||||
|
include(${PICO_SDK_PATH}/pico_sdk_init.cmake)
|
||||||
|
project(${PROJECT})
|
||||||
|
pico_sdk_init()
|
||||||
|
add_executable(${PROJECT})
|
||||||
|
|
||||||
|
include(${TOP}/hw/bsp/${FAMILY}/family.cmake)
|
||||||
|
|
||||||
|
# Example source
|
||||||
|
target_sources(${PROJECT} PUBLIC
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/src/main.c
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/src/msc_app.c
|
||||||
|
)
|
||||||
|
|
||||||
|
# Example include
|
||||||
|
target_include_directories(${PROJECT} PUBLIC
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/src
|
||||||
|
)
|
||||||
|
|
||||||
|
# Example defines
|
||||||
|
target_compile_definitions(${PROJECT} PUBLIC
|
||||||
|
CFG_TUSB_OS=OPT_OS_PICO
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(${PROJECT} pico_stdlib pico_fix_rp2040_usb_device_enumeration)
|
||||||
|
pico_add_extra_outputs(${PROJECT})
|
||||||
|
|
||||||
|
else()
|
||||||
|
message(FATAL_ERROR "Invalid FAMILY specified")
|
||||||
|
endif()
|
@ -13,8 +13,15 @@ set(SRC_TINYUSB
|
|||||||
${TOP}/src/class/net/net_device.c
|
${TOP}/src/class/net/net_device.c
|
||||||
${TOP}/src/class/usbtmc/usbtmc_device.c
|
${TOP}/src/class/usbtmc/usbtmc_device.c
|
||||||
${TOP}/src/class/vendor/vendor_device.c
|
${TOP}/src/class/vendor/vendor_device.c
|
||||||
${TOP}/src/portable/raspberrypi/${FAMILY}/dcd_rp2040.c
|
${TOP}/src/host/hub.c
|
||||||
|
${TOP}/src/host/usbh.c
|
||||||
|
${TOP}/src/host/usbh_control.c
|
||||||
|
${TOP}/src/class/cdc/cdc_host.c
|
||||||
|
${TOP}/src/class/hid/hid_host.c
|
||||||
|
${TOP}/src/class/msc/msc_host.c
|
||||||
${TOP}/src/portable/raspberrypi/${FAMILY}/rp2040_usb.c
|
${TOP}/src/portable/raspberrypi/${FAMILY}/rp2040_usb.c
|
||||||
|
${TOP}/src/portable/raspberrypi/${FAMILY}/dcd_rp2040.c
|
||||||
|
${TOP}/src/portable/raspberrypi/${FAMILY}/hcd_rp2040.c
|
||||||
)
|
)
|
||||||
|
|
||||||
target_sources(${PROJECT} PUBLIC
|
target_sources(${PROJECT} PUBLIC
|
||||||
|
@ -157,6 +157,7 @@ tusb_speed_t tuh_device_get_speed (uint8_t const dev_addr)
|
|||||||
return (tusb_speed_t) _usbh_devices[dev_addr].speed;
|
return (tusb_speed_t) _usbh_devices[dev_addr].speed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if CFG_TUSB_OS == OPT_OS_NONE
|
||||||
void osal_task_delay(uint32_t msec)
|
void osal_task_delay(uint32_t msec)
|
||||||
{
|
{
|
||||||
(void) msec;
|
(void) msec;
|
||||||
@ -164,6 +165,7 @@ void osal_task_delay(uint32_t msec)
|
|||||||
const uint32_t start = hcd_frame_number(TUH_OPT_RHPORT);
|
const uint32_t start = hcd_frame_number(TUH_OPT_RHPORT);
|
||||||
while ( ( hcd_frame_number(TUH_OPT_RHPORT) - start ) < msec ) {}
|
while ( ( hcd_frame_number(TUH_OPT_RHPORT) - start ) < msec ) {}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
// CLASS-USBD API (don't require to verify parameters)
|
// CLASS-USBD API (don't require to verify parameters)
|
||||||
|
@ -66,7 +66,6 @@ typedef void (*osal_task_func_t)( void * );
|
|||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
// OSAL Porting API
|
// OSAL Porting API
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
//static inline void osal_task_delay(uint32_t msec);
|
|
||||||
|
|
||||||
//------------- Semaphore -------------//
|
//------------- Semaphore -------------//
|
||||||
static inline osal_semaphore_t osal_semaphore_create(osal_semaphore_def_t* semdef);
|
static inline osal_semaphore_t osal_semaphore_create(osal_semaphore_def_t* semdef);
|
||||||
|
@ -34,14 +34,7 @@
|
|||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
// TASK API
|
// TASK API
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
//static inline void osal_task_delay(uint32_t msec)
|
|
||||||
//{
|
|
||||||
// (void) msec;
|
|
||||||
// // TODO only used by Host stack, will implement using SOF
|
|
||||||
//
|
|
||||||
//// uint32_t start = tusb_hal_millis();
|
|
||||||
//// while ( ( tusb_hal_millis() - start ) < msec ) {}
|
|
||||||
//}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
// Binary Semaphore API
|
// Binary Semaphore API
|
||||||
|
@ -39,12 +39,10 @@
|
|||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
// TASK API
|
// TASK API
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
#ifndef RP2040_USB_HOST_MODE
|
|
||||||
static inline void osal_task_delay(uint32_t msec)
|
static inline void osal_task_delay(uint32_t msec)
|
||||||
{
|
{
|
||||||
sleep_ms(msec);
|
sleep_ms(msec);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
// Binary Semaphore API
|
// Binary Semaphore API
|
||||||
|
@ -43,7 +43,7 @@ static inline void _hw_endpoint_lock_update(struct hw_endpoint *ep, int delta) {
|
|||||||
// sense to have worker and IRQ on same core, however I think using critsec is about equivalent.
|
// sense to have worker and IRQ on same core, however I think using critsec is about equivalent.
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef RP2040_USB_HOST_MODE
|
#if TUSB_OPT_HOST_ENABLED
|
||||||
static inline void _hw_endpoint_update_last_buf(struct hw_endpoint *ep)
|
static inline void _hw_endpoint_update_last_buf(struct hw_endpoint *ep)
|
||||||
{
|
{
|
||||||
ep->last_buf = ep->len + ep->transfer_size == ep->total_len;
|
ep->last_buf = ep->len + ep->transfer_size == ep->total_len;
|
||||||
@ -69,7 +69,7 @@ void hw_endpoint_reset_transfer(struct hw_endpoint *ep)
|
|||||||
{
|
{
|
||||||
ep->stalled = false;
|
ep->stalled = false;
|
||||||
ep->active = false;
|
ep->active = false;
|
||||||
#ifdef RP2040_USB_HOST_MODE
|
#if TUSB_OPT_HOST_ENABLED
|
||||||
ep->sent_setup = false;
|
ep->sent_setup = false;
|
||||||
#endif
|
#endif
|
||||||
ep->total_len = 0;
|
ep->total_len = 0;
|
||||||
@ -92,7 +92,7 @@ void _hw_endpoint_buffer_control_update32(struct hw_endpoint *ep, uint32_t and_m
|
|||||||
*ep->buffer_control = value & ~USB_BUF_CTRL_AVAIL;
|
*ep->buffer_control = value & ~USB_BUF_CTRL_AVAIL;
|
||||||
// 12 cycle delay.. (should be good for 48*12Mhz = 576Mhz)
|
// 12 cycle delay.. (should be good for 48*12Mhz = 576Mhz)
|
||||||
// Don't need delay in host mode as host is in charge
|
// Don't need delay in host mode as host is in charge
|
||||||
#ifndef RP2040_USB_HOST_MODE
|
#if !TUSB_OPT_HOST_ENABLED
|
||||||
__asm volatile (
|
__asm volatile (
|
||||||
"b 1f\n"
|
"b 1f\n"
|
||||||
"1: b 1f\n"
|
"1: b 1f\n"
|
||||||
@ -125,7 +125,7 @@ void _hw_endpoint_start_next_buffer(struct hw_endpoint *ep)
|
|||||||
val |= ep->next_pid ? USB_BUF_CTRL_DATA1_PID : USB_BUF_CTRL_DATA0_PID;
|
val |= ep->next_pid ? USB_BUF_CTRL_DATA1_PID : USB_BUF_CTRL_DATA0_PID;
|
||||||
ep->next_pid ^= 1u;
|
ep->next_pid ^= 1u;
|
||||||
|
|
||||||
#ifdef RP2040_USB_HOST_MODE
|
#if TUSB_OPT_HOST_ENABLED
|
||||||
// Is this the last buffer? Only really matters for host mode. Will trigger
|
// Is this the last buffer? Only really matters for host mode. Will trigger
|
||||||
// the trans complete irq but also stop it polling. We only really care about
|
// the trans complete irq but also stop it polling. We only really care about
|
||||||
// trans complete for setup packets being sent
|
// trans complete for setup packets being sent
|
||||||
@ -161,7 +161,7 @@ void _hw_endpoint_xfer_start(struct hw_endpoint *ep, uint8_t *buffer, uint16_t t
|
|||||||
ep->transfer_size = tu_min16(total_len, ep->wMaxPacketSize);
|
ep->transfer_size = tu_min16(total_len, ep->wMaxPacketSize);
|
||||||
ep->active = true;
|
ep->active = true;
|
||||||
ep->user_buf = buffer;
|
ep->user_buf = buffer;
|
||||||
#ifdef RP2040_USB_HOST_MODE
|
#if TUSB_OPT_HOST_ENABLED
|
||||||
// Recalculate if this is the last buffer
|
// Recalculate if this is the last buffer
|
||||||
_hw_endpoint_update_last_buf(ep);
|
_hw_endpoint_update_last_buf(ep);
|
||||||
ep->buf_sel = 0;
|
ep->buf_sel = 0;
|
||||||
@ -181,7 +181,7 @@ void _hw_endpoint_xfer_sync(struct hw_endpoint *ep)
|
|||||||
uint32_t buf_ctrl = _hw_endpoint_buffer_control_get_value32(ep);
|
uint32_t buf_ctrl = _hw_endpoint_buffer_control_get_value32(ep);
|
||||||
uint16_t transferred_bytes = buf_ctrl & USB_BUF_CTRL_LEN_MASK;
|
uint16_t transferred_bytes = buf_ctrl & USB_BUF_CTRL_LEN_MASK;
|
||||||
|
|
||||||
#ifdef RP2040_USB_HOST_MODE
|
#if TUSB_OPT_HOST_ENABLED
|
||||||
// tag::host_buf_sel_fix[]
|
// tag::host_buf_sel_fix[]
|
||||||
if (ep->buf_sel == 1)
|
if (ep->buf_sel == 1)
|
||||||
{
|
{
|
||||||
@ -239,7 +239,7 @@ bool _hw_endpoint_xfer_continue(struct hw_endpoint *ep)
|
|||||||
// Now we have synced our state with the hardware. Is there more data to transfer?
|
// Now we have synced our state with the hardware. Is there more data to transfer?
|
||||||
uint16_t remaining_bytes = ep->total_len - ep->len;
|
uint16_t remaining_bytes = ep->total_len - ep->len;
|
||||||
ep->transfer_size = tu_min16(remaining_bytes, ep->wMaxPacketSize);
|
ep->transfer_size = tu_min16(remaining_bytes, ep->wMaxPacketSize);
|
||||||
#ifdef RP2040_USB_HOST_MODE
|
#if TUSB_OPT_HOST_ENABLED
|
||||||
_hw_endpoint_update_last_buf(ep);
|
_hw_endpoint_update_last_buf(ep);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -79,7 +79,7 @@ struct hw_endpoint
|
|||||||
// Interrupt, bulk, etc
|
// Interrupt, bulk, etc
|
||||||
uint8_t transfer_type;
|
uint8_t transfer_type;
|
||||||
|
|
||||||
#ifdef RP2040_USB_HOST_MODE
|
#if TUSB_OPT_HOST_ENABLED
|
||||||
// Only needed for host mode
|
// Only needed for host mode
|
||||||
bool last_buf;
|
bool last_buf;
|
||||||
// HOST BUG. Host will incorrect write status to top half of buffer
|
// HOST BUG. Host will incorrect write status to top half of buffer
|
||||||
|
Loading…
x
Reference in New Issue
Block a user