最近要用F1C100S做个USB的项目,Linux虽然是标准选项,但是想先试下RTT,毕竟项目不复杂,用RTT简洁很多,启动速度也快。于是整合了若干大神在F1C100S做的开创成果,包括:
裸奔USB第一人: https://whycan.com/t_1810.html
基于Keil的开发框架: https://whycan.com/t_5205.html
RTT相关: https://whycan.com/t_4942.html https://whycan.com/t_3958.html
Linux参考: https://whycan.com/t_3087.html
目标是在RTT上获得高效稳定的CDC Device方案。
这代码用Keil的MDK编译很不顺,用裸奔的gcc编译RTT也有些问题,用RTT开发环境自带的gcc就好,注意修改Keil项目的工具设置。用Keil的好处是可以直接下到DRAM里,并且可以设置断点,查看内存,但是变量显示好像gcc跟Keil衔接还有问题,变量显示的不对。
Dump了寄存器,看看有啥不对的,
------ USB PHY Clock -------
USBPHY_CLK_REG:0x00000003
BUS_CLK_GATE0_REG:0x01304000
BUS_CLK_RST_REG:0x01304000
------ USB PHY Reg -------
USBC_REG_ISCR:0x5303fc00
USBC_REG_PHYCTL:0x00000000 这些是没实现么 数据都是0
USBC_REG_PHYBIST:0x00000000
USBC_REG_PHYTUNE:0x00000000
USBC_REG_CSR:0x00000000
------ USB Core Reg -------
USBC_REG_FADDR:0x0b
USBC_REG_PCTL:0x70 这个基本意思是开启高速USB使能,并且已经联机在高速USB
USBC_REG_INTTx:0x0000 中断这些还要再研究
USBC_REG_INTRx:0x0000
USBC_REG_INTTxE:0x0007
USBC_REG_INTRxE:0x0002
USBC_REG_INTUSB:0x0308
USBC_REG_INTUSBE:0x0027
USBC_REG_FRNUM:0x065d
USBC_REG_VEND0:0x00
USBC_REG_EPIND:0x0001
USBC_REG_TXMAXP:0x0200
USBC_REG_RXMAXP:0x0200
USBC_REG_TXFIFOSZ:0x07 这是说有1KByte的FIFO但是还没设置成double buffer
USBC_REG_RXFIFOSZ:0x07
USBC_REG_TXFIFOAD:0x0080 FIFO的内存地址,0x80*8 = 0x400, 就是1K了,BTW,谁知道System Config那个模块是怎么用的,到处没资料
USBC_REG_RXFIFOAD:0x0000
USBC_REG_DEVCTL:0x99 工作在Device模式,VBUS有效
USBC_REG_CONFIGDATA:0xde 内核配置情况:包合并,小头机,高速ISO,动态FIFO,软件连接
------ USB Misc -------
USBC_REG_PMU_IRQ:0x0043031a
最近编辑记录 david (2020-09-19 19:14:46)
离线
Bug & Fix:
高速USB居然没打开,连主机后只跑到12M。加入 USBC_REG_set_bit_b(USBC_BP_POWER_D_HIGH_SPEED_EN, USBC_REG_PCTL(USBC0_BASE)); 目前暂时放在void USBC_PhyConfig(void)里,不过那个好像是USB Core的选项。
CDC串口指令后要等配置信息,原来的代码只检查一次,所以没有printf的延时,就会因为等不到配置信息而没有相应,导致串口打不开。在static void class_setup_request(USB_DeviceRequest* req_data)里做如下修改,
while(Timeout--)
{
len = USBC_ReadLenFromFifo(USBC_EP_TYPE_EP0);
if(len == 7)
{
usbprint("set_line_coding:readlen:%d\n",len);
unsigned char tmp[7];
usb_device_read_data_ep_pack(0,tmp,7);
set_line_codingstatic_ext(tmp);
usb_device_read_data_status_ep0(1);
usb_device_set_ep0_state(EP0_IDLE);
port_line_coding_flag = 0;
break;
}
}
if (!Timeout)
{
rt_kprintf("timeout, len %d\n", len);
}
最近编辑记录 david (2020-09-19 18:29:21)
离线
Performance Tuning
usb.h里加入适合RTT的头文件:
#ifdef USB_USE_RTT
# include "rtthread.h"
# define usbprint(...) rt_kprintf(__VA_ARGS__)
//# define usbprint(...) // do not print at all
#else
# include <printf.h>
# define usbprint printf
#endif
微微凉的代码里用了好多printf,连中断里都有,应该是为了调试方便,不过会影响性能。根据需要选择usbprint的宏定义。TODO:应该加debug level选项,有些信息还是要dump的。
将USB的Class和SubClass都改为0x02,这样可以自动使用win10内置的驱动,不需要手工配置。
#define USB_CDC_CLASS 0x02 // for using Win10 default driver
#define USB_CDC_SUBCLASS 0x02
static USB_DeviceDescriptor cdc_devDesc =
{
sizeof(USB_DeviceDescriptor),
DEVICE_DESCRIPTOR, //1
#if DWC_FORCE_SPEED_FULL
0x0111, // Version 1.11
#else
0x0200, // Version 2.0
#endif
USB_CDC_CLASS, // bDeviceClass
USB_CDC_SUBCLASS, // bDeviceSubClass
0x00,
64, /* Ep0 FIFO size */
USB_CDC_VID, // VID
USB_CDC_PID, // PID
USB_FUNCTION_RELEASE_NO,
0x01, //iManufacturer;
0x02, //iProduct;
0x00,
0x01
};
static USB_DeviceDescriptor cdc_devFullSpeedDesc =
{
sizeof(USB_DeviceDescriptor),
DEVICE_DESCRIPTOR, //1
0x0111, //Version 1.11
USB_CDC_CLASS,
USB_CDC_SUBCLASS,
0x00,
64, /* Ep0 FIFO size */
USB_CDC_VID,
USB_CDC_PID,
USB_FUNCTION_RELEASE_NO+1,
0x01, //iManufacturer;
0x02, //iProduct;
0x00,
0x01
};
最近编辑记录 david (2020-09-19 18:32:30)
离线
把USB core 从0xA0到0x3FF的地址空间扫了一遍,发现有些寄存器有内容,可能是DMA的,具体内容不详,
0x00C0 0x33DE
0x00C2 0x000B
0x00C4 0x0FFF
0x00C6 0x0FFF
0x00C8 0x00FF
0x00D0 0x0FFF
0x00D2 0x0FFF
0x00D4 0x0FFF
0x00D6 0x0FFF
0x00D8 0x000F
0x00E0 0x01FF
0x00E2 0x0F1F
0x00E4 0x0F00
扫描代码
for(i= 0xa0; i<0x3ff; i+=2)
{
dt = USBC_Readw(USBC0_BASE + i);
if (dt != 0)
{
rt_kprintf("0x%04X 0x%04X\n", i, dt);
}
else
{
USBC_Writew(0xfff, USBC0_BASE + i);
dt = USBC_Readw(USBC0_BASE + i);
if (dt != 0)
{
rt_kprintf("0x%04X 0x%04X\n", i, dt);
}
}
}
扫完之后USB就不好用了,要重新断电,肯定是有改动的。
最近编辑记录 david (2020-09-20 00:10:34)
离线
大量数据回传的时候还是偶尔丢包,
这个为什么被cancel了,看着好像是host的问题。
打开double buffer, 传输速率可以到17MByte/s
离线
坑网现在对这一届学生要求比较高
活到老学到老 虚心使人进步
离线