您尚未登录。

楼主 #1 2020-09-19 18:16:25

david
会员
注册时间: 2018-03-05
已发帖子: 379
积分: 310.5

F1C100S RTT+USB CDC Device调试记录

最近要用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)

离线

楼主 #2 2020-09-19 18:16:52

david
会员
注册时间: 2018-03-05
已发帖子: 379
积分: 310.5

Re: F1C100S RTT+USB CDC Device调试记录

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)

离线

楼主 #3 2020-09-19 18:17:41

david
会员
注册时间: 2018-03-05
已发帖子: 379
积分: 310.5

Re: F1C100S RTT+USB CDC Device调试记录

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)

离线

楼主 #4 2020-09-20 00:06:43

david
会员
注册时间: 2018-03-05
已发帖子: 379
积分: 310.5

Re: F1C100S RTT+USB CDC Device调试记录

把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)

离线

楼主 #5 2020-09-20 00:17:20

david
会员
注册时间: 2018-03-05
已发帖子: 379
积分: 310.5

Re: F1C100S RTT+USB CDC Device调试记录

大量数据回传的时候还是偶尔丢包,

QQ%E5%9B%BE%E7%89%8720200919171253.png

这个为什么被cancel了,看着好像是host的问题。

打开double buffer, 传输速率可以到17MByte/s

离线

楼主 #7 2020-09-20 08:20:54

david
会员
注册时间: 2018-03-05
已发帖子: 379
积分: 310.5

Re: F1C100S RTT+USB CDC Device调试记录

LinjieGuo 说:

坑网现在对这一届学生要求比较高

活到老学到老 虚心使人进步

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn