Hi
@zoenggit found this discussion issue in TinyUSB. Where user @robots created repo for Allwinner T113 chip. Is ARM core but peripherals looks absolutely the same as D1H RISC-V.
Is repo is bare metal experiments with T113 and FreeRTOS also contains Doom. So author decide to deactivate USB EHCI and use only OHCI. Also for USB descriptors used memory section with direct mapping.
I try to do the same:
- Deactivate EHCI:
rt-thread/bsp/allwinner/d1s_d1h/packages/TinyUSB/rt-thread/bsp/sunxi_D1/drv_tinyusb.c
volatile uint32_t *portsc = (uint32_t * ) (EHCI1_BASE + 0x054); //E_PORTSC
*portsc |= BV(13);
- Add few places to clear/invalidate caches, in rt-thread/bsp/allwinner/d1s_d1h/packages/TinyUSB/src/portable/ohci/ohci.c:
static void gtd_init(ohci_gtd_t* p_td, uint8_t* data_ptr, uint16_t total_bytes)
{
...
rt_hw_cpu_dcache_clean_and_invalidate_local(data_ptr, total_bytes);
}
- Define DMA memory section:
rt-thread/bsp/allwinner/d1s_d1h/link.lds
MEMORY
{
SRAM : ORIGIN = 0x40300000, LENGTH = 4M
DMA : ORIGIN = 0x40700000, LENGTH = 16M
HEAP : ORIGIN = 0x41700000, LENGTH = 16M
}
SECTIONS
{
.usb :
{
. = ALIGN(4);
} > DMA
Init MMU with different sections in rt-thread/bsp/allwinner/d1s_d1h/board/board.c:
struct mem_desc platform_mem_desc[] = {
{KERNEL_VADDR_START, 0x40700000 - 1, (rt_size_t)ARCH_MAP_FAILED, NORMAL_MEM}, //KERNEL
{0x1000, 0x3ffff000 - 1, (rt_size_t)ARCH_MAP_FAILED, DEVICE_MEM}, //IO
{0x40700000, 0x40700000 + 0x1000000 - 1, (rt_size_t)ARCH_MAP_FAILED, DEVICE_MEM}, //DMA
{0x41700000, 0x40700000 + 0x4000000 - 1, (rt_size_t)ARCH_MAP_FAILED, NORMAL_MEM}, //HEAP + HW PAGE
};
rt-thread/bsp/allwinner/d1s_d1h/packages/TinyUSB/src/portable/ohci/ohci.c
CFG_TUSB_MEM_SECTION TU_ATTR_ALIGNED(256) static ohci_data_t ohci_data;
Run board.
Looks like USB device start to do something new, but all data transfers did not produce any results, all of it STALLED or FAULT:
[0:0] Open EP0 with Size = 8
Get 8 byte of Device Descriptor
[0:0] Get Descriptor: 80 06 00 01 00 00 08 00
on EP 00 with 8 bytes
on EP 80 with 8 bytes
[0:0] Control STALLED, xferred_bytes = 8
[0:0] Get Descriptor: 80 06 00 03 D0 03 08 00
on EP 00 with 8 bytes
on EP 80 with 8 bytes
[0:0] Control STALLED, xferred_bytes = 8
[0:0] Get Descriptor: 80 06 00 02 18 08 08 00
on EP 00 with 8 bytes
on EP 80 with 8 bytes
[0:0] Control STALLED, xferred_bytes = 8
[0:0] Get Descriptor: 80 06 00 02 58 0C 08 00
on EP 00 with 8 bytes
on EP 00 with 4294964828 bytes
Set Address = 1
[0:0] Set Address: 00 05 01 00 00 00 00 00
on EP 00 with 0 bytes
[0:0] Control STALLED, xferred_bytes = 0
[0:0] Set Address: 00 05 01 02 00 00 00 00
on EP 00 with 0 bytes
on EP 00 with 2088 bytes
[0:0] Get Descriptor: 80 06 00 01 00 00 12 00
on EP 00 with 8 bytes
[0:1] Control FAILED, xferred_bytes = 8
So did not lead to success with USB again.
Need to dive deeper into EHCI/OHCI, maybe some one can advice please ?