关于这个,其实早些时候已经做好了想发出来的,但是一直想优化一下,但是最近有点忙,所以抽不出时间修改。
今天看到xb00t群里面【大意先生】,也就是本站的达克罗德大神。想到之前他有说到需要裸机的驱动,所以现在就先发出来填坑了。
关于移植过程可以参考全志F1C100S usb裸机驱动移植1
感谢达克罗德提供的F1C100S裸机编译工程F1C100S裸奔framebuffer+PWM+GPIO驱动
离线
占位
离线
太荣幸了,感谢楼主分享!
离线
屌爆了
离线
我在nano上加载bin文件,插电脑上没反应。请问有什么需要注意的地方吗?
离线
感谢LZ分享
我尝试用了一下 发现用JLink加载编译出来的firmware.bin进DRAM 确实是在PC设备管理器会提示未知usb设备(设备描述符请求失败) 但此时的串口打印功能无法正常使用
然后我从Makefile发现可以下载进spiflash 于是我就试了一下 发现串口打印功能可以正常使用 但是在PC设备管理器没有任何提示 从打印来看 程序没有进入USB中断 还要请教LZ有什么需要注意的地方
离线
我在nano上加载bin文件,插电脑上没反应。请问有什么需要注意的地方吗?
请问是怎么加载呢。这个工程是基于裸机的那个工程加入了printf 和 中断管理。
我测试时候是利用sunxi-fel烧录RAM里面跑的,用的以下命令
sunxi-fel spl firmware.bin
sunxi-fel -p write 0x80000000 firmware.bin
sunxi-fel exec 0x80000000;
离线
感谢LZ分享
我尝试用了一下 发现用JLink加载编译出来的firmware.bin进DRAM 确实是在PC设备管理器会提示未知usb设备(设备描述符请求失败) 但此时的串口打印功能无法正常使用
然后我从Makefile发现可以下载进spiflash 于是我就试了一下 发现串口打印功能可以正常使用 但是在PC设备管理器没有任何提示 从打印来看 程序没有进入USB中断 还要请教LZ有什么需要注意的地方
发现未知设备可能是没有进入中断,可以试着直接用sys_uart_putc函数打印一些测试信息看看有没有进入中断。烧录到flash运行应该和RAM是差不多的,但是我没有测试过烧录到flash跑。晚上测试一下
需要注意的是usb_device_init函数的参数不能是0
离线
樊星 说:我在nano上加载bin文件,插电脑上没反应。请问有什么需要注意的地方吗?
请问是怎么加载呢。这个工程是基于裸机的那个工程加入了printf 和 中断管理。
我测试时候是利用sunxi-fel烧录RAM里面跑的,用的以下命令
sunxi-fel spl firmware.bin
sunxi-fel -p write 0x80000000 firmware.bin
sunxi-fel exec 0x80000000;
按照LZ的步骤 实测能PC正常识别USB设备 并能在串口助手上打开和收发数据
离线
总结几个问题 用没改动过的程序
1. 用JLink加载编译出来的firmware.bin进DRAM
先初始化DRAM 再用(https://whycan.cn/t_1858.html)链接3L的方法 现象是 PC设备管理器会提示未知usb设备(设备描述符请求失败)
sys_uart_putc等串口打印函数无法打印出任何信息
2. sunxi-fel下载进spiflash
在PC设备管理器没有任何提示 串口打印功能可以正常使用 估计没进入中断
离线
樊星 说:我在nano上加载bin文件,插电脑上没反应。请问有什么需要注意的地方吗?
请问是怎么加载呢。这个工程是基于裸机的那个工程加入了printf 和 中断管理。
我测试时候是利用sunxi-fel烧录RAM里面跑的,用的以下命令
sunxi-fel spl firmware.bin
sunxi-fel -p write 0x80000000 firmware.bin
sunxi-fel exec 0x80000000;
我是加载到flash跑的。没试过加到人RAM里。另我看到在咱们论坛令一个帖子里,chong大神基于Linux4.19出过一个补丁。好像是也是解决的类似问题。就是在RAM里能运行在flash里不能运行。我能力弱,还没看懂那个补丁,说是有clk设置不对。晕哥应该知道。
离线
微凉VeiLiang 说:樊星 说:我在nano上加载bin文件,插电脑上没反应。请问有什么需要注意的地方吗?
请问是怎么加载呢。这个工程是基于裸机的那个工程加入了printf 和 中断管理。
我测试时候是利用sunxi-fel烧录RAM里面跑的,用的以下命令
sunxi-fel spl firmware.bin
sunxi-fel -p write 0x80000000 firmware.bin
sunxi-fel exec 0x80000000;我是加载到flash跑的。没试过加到人RAM里。另我看到在咱们论坛令一个帖子里,chong大神基于Linux4.19出过一个补丁。好像是也是解决的类似问题。就是在RAM里能运行在flash里不能运行。我能力弱,还没看懂那个补丁,说是有clk设置不对。晕哥应该知道。
那个帖子后面那个补丁可以在 FLASH里面跑了, 可以关注一下.
离线
总结几个问题 用没改动过的程序
1. 用JLink加载编译出来的firmware.bin进DRAM
先初始化DRAM 再用(https://whycan.cn/t_1858.html)链接3L的方法 现象是 PC设备管理器会提示未知usb设备(设备描述符请求失败)
sys_uart_putc等串口打印函数无法打印出任何信息
2. sunxi-fel下载进spiflash
在PC设备管理器没有任何提示 串口打印功能可以正常使用 估计没进入中断
测试了一下,的确烧录到flash后启动只打印没有发现usb设备。看来应该不是中断的原因,因为电脑usb没有发现设备,估计是时钟的原因,或者上下拉d+内部的代码问题。
离线
樊星 说:微凉VeiLiang 说:请问是怎么加载呢。这个工程是基于裸机的那个工程加入了printf 和 中断管理。
我测试时候是利用sunxi-fel烧录RAM里面跑的,用的以下命令
sunxi-fel spl firmware.bin
sunxi-fel -p write 0x80000000 firmware.bin
sunxi-fel exec 0x80000000;我是加载到flash跑的。没试过加到人RAM里。另我看到在咱们论坛令一个帖子里,chong大神基于Linux4.19出过一个补丁。好像是也是解决的类似问题。就是在RAM里能运行在flash里不能运行。我能力弱,还没看懂那个补丁,说是有clk设置不对。晕哥应该知道。
那个帖子后面那个补丁可以在 FLASH里面跑了, 可以关注一下.
对比了一下提供的补丁,里面是修改了USB PHY的时钟位,以前错误的是bit8(应该不是F1c100s的),后面变成bit1(根据手册上看bit1是对的)。然后这个工程我当时写了一个usb_phy_open_clock();函数,里面USBPHY_CLK_GAT_BIT定义的是1没错。所以可能还有其它地方是sunxi帮忙初始化了的,这个后面再仔细翻一翻Linux的代码。
离线
晕哥 说:樊星 说:我是加载到flash跑的。没试过加到人RAM里。另我看到在咱们论坛令一个帖子里,chong大神基于Linux4.19出过一个补丁。好像是也是解决的类似问题。就是在RAM里能运行在flash里不能运行。我能力弱,还没看懂那个补丁,说是有clk设置不对。晕哥应该知道。
那个帖子后面那个补丁可以在 FLASH里面跑了, 可以关注一下.
对比了一下提供的补丁,里面是修改了USB PHY的时钟位,以前错误的是bit8(应该不是F1c100s的),后面变成bit1(根据手册上看bit1是对的)。然后这个工程我当时写了一个usb_phy_open_clock();函数,里面USBPHY_CLK_GAT_BIT定义的是1没错。所以可能还有其它地方是sunxi帮忙初始化了的,这个后面再仔细翻一翻Linux的代码。
对比了一下RAM运行和flash运行时 读了USB PHY的时钟位 RAM运行的是0x3 flash运行的是0x2 也就是说brom除了D1要置高外 D0也要置高 但改了后还是在flash不能运行
我还发现 flash运行在初始化时USBC系列的寄存器 除了ISCR外都写不进去 比如VEND0 PCTL 写操作完一读 都是0 估计是哪个时钟没配好
离线
微凉VeiLiang 说:晕哥 说:那个帖子后面那个补丁可以在 FLASH里面跑了, 可以关注一下.
对比了一下提供的补丁,里面是修改了USB PHY的时钟位,以前错误的是bit8(应该不是F1c100s的),后面变成bit1(根据手册上看bit1是对的)。然后这个工程我当时写了一个usb_phy_open_clock();函数,里面USBPHY_CLK_GAT_BIT定义的是1没错。所以可能还有其它地方是sunxi帮忙初始化了的,这个后面再仔细翻一翻Linux的代码。
对比了一下RAM运行和flash运行时 读了USB PHY的时钟位 RAM运行的是0x3 flash运行的是0x2 也就是说brom除了D1要置高外 D0也要置高 但改了后还是在flash不能运行
我还发现 flash运行在初始化时USBC系列的寄存器 除了ISCR外都写不进去 比如VEND0 PCTL 写操作完一读 都是0 估计是哪个时钟没配好
嗯,应该是还差某个时钟,有的芯片内部时钟开关和其他外设有关联的,关了一个就关全部了,不知道全志这个会不会也有这样的坑
离线
https://whycan.cn/files/members/3/2018-11-15_135953.png
我咨询了 @chong 大神,然后对比了 https://whycan.cn/t_1672.html 两个补丁
usb_phy0_clk 这个寄存器 8bit改成了1bit 试一试.
是bit1,地址和偏移应该也是对的,在usb_phy_open_clock函数里面
离线
初始化完成后读寄存器
左边是ram运行 右边是flash运行
这个红色的位就很皮了 感觉和它有关 查了600的手册 发现这个位并没有定义 在程序上手动置低又不行 置不低
最近编辑记录 逸俊晨晖 (2018-11-15 15:16:35)
离线
https://whycan.cn/files/members/1105/7.png
初始化完成后读寄存器
左边是ram运行 右边是flash运行
这个红色的位就很皮了 感觉和它有关 查了600的手册 发现这个位并没有定义 在程序上手动置低又不行 置不低
看错了 是spi0的 不影响
离线
哪里有介绍芯片usb寄存器的文档?600里面没有,找了个a20里面只有host。
离线
哪里有介绍芯片usb寄存器的文档?600里面没有,找了个a20里面只有host。
只有MUSB的官方寄存器文档,全志的好像没有见过
离线
樊星 说:哪里有介绍芯片usb寄存器的文档?600里面没有,找了个a20里面只有host。
只有MUSB的官方寄存器文档,全志的好像没有见过
非常感谢。
离线
我试了一下 有报错
离线
我试了一下 有报错
编译不通过么?具体是报什么错误呢
离线
usbd_stop_work
ERR: cannot get irq 26, err 1
sunxi_udc_enable called
CONFIG_USB_GADGET_DUALSPEED: USBC_TS_MODE_HS
usbd_start_work
sunxi_usb_device_enable end
从flash启动进不了中断
离线
usbd_stop_work
ERR: cannot get irq 26, err 1
sunxi_udc_enable called
CONFIG_USB_GADGET_DUALSPEED: USBC_TS_MODE_HS
usbd_start_work
sunxi_usb_device_enable end从flash启动进不了中断
嗯,这个是的,上面有讨论过这个问题。在楼下问题找到了,欢迎下载工程测试一下
离线
问题终于找到了,是差Bus Reset寄存器的usb位没有置一。
在usb_phy.c中增加了两个函数
void USBC_PhyConfig(void);
void USBC_ConfigFIFO_Base(void);
在usb_dev.c里面bsp初始化开启时钟后调用
下面是整个更新后的工程
F1C100S_USB_Driver_V1_1.zip
最近编辑记录 微凉VeiLiang (2018-11-26 01:29:51)
离线
辛苦了!搞这么晚。最近没时间,有时间打算搞个USB Bootloader,就不用老按着短路spi 时钟的按钮来用sunxitools了
离线
辛苦了!搞这么晚。最近没时间,有时间打算搞个USB Bootloader,就不用老按着短路spi 时钟的按钮来用sunxitools了
可以的,就用荔枝派上面那个按键,上电发现按下就跳sunxi-fel。我现在都是用笔头短触6脚和7脚来进入的
离线
小王子&木头人 说:usbd_stop_work
ERR: cannot get irq 26, err 1
sunxi_udc_enable called
CONFIG_USB_GADGET_DUALSPEED: USBC_TS_MODE_HS
usbd_start_work
sunxi_usb_device_enable end从flash启动进不了中断
嗯,这个是的,上面有讨论过这个问题。在楼下问题找到了,欢迎下载工程测试一下
可以用了 感谢大神
离线
感谢各位大神,感谢楼主, 一样要试一试usb裸奔的味道
离线
感谢楼主!已经快乐地开始用CDC了。
离线
请问CDC方式连到电脑上,为什么一次最多只能发送8个字节。发9个就全收不到,连IRQ都没有。并且后续什么都收不到了,需要断开连接,重连后正常。
楼主有没有遇到这个现象?
我是用Mac系统,系统识别出usbmodem,用串口通信发送数据。
离线
问题终于找到了,是差Bus Reset寄存器的usb位没有置一。
在usb_phy.c中增加了两个函数
void USBC_PhyConfig(void);
void USBC_ConfigFIFO_Base(void);
在usb_dev.c里面bsp初始化开启时钟后调用
下面是整个更新后的工程
F1C100S_USB_Driver_V1_1.zip
感谢大神,谢谢分享
离线
问一下,在windows上编译程序,是用这个交叉工具链吗?
https://developer.arm.com/open-source/gnu-toolchain/gnu-a/downloads
链接里面有gcc-arm-8.2-2018.11-i686-mingw32-arm-eabi.tar.xz
解压出来都是exe的。
标注是arm-eabi,网上查了查,这个工具链只能编译裸机程序是吧
离线
问一下,在windows上编译程序,是用这个交叉工具链吗?
https://developer.arm.com/open-source/gnu-toolchain/gnu-a/downloads
链接里面有gcc-arm-8.2-2018.11-i686-mingw32-arm-eabi.tar.xz
解压出来都是exe的。
标注是arm-eabi,网上查了查,这个工具链只能编译裸机程序是吧
试一试, 应该没问题的。
离线
请问CDC方式连到电脑上,为什么一次最多只能发送8个字节。发9个就全收不到,连IRQ都没有。并且后续什么都收不到了,需要断开连接,重连后正常。
楼主有没有遇到这个现象?
我是用Mac系统,系统识别出usbmodem,用串口通信发送数据。
你好,我用Windows的电脑测试了一下,的确是会发送数据超过8个字节有问题。抓了一下包,发现是设备没有收到数据。从这个现象上看,一般是硬件端点的maxpack设置不对。不过我对了一下寄存器,maxpack值512是没有问题的。
然后后面仔细看了一下,发现漏配置了端点1的fifo大小和地址。重新在usb_config_ep_in和usb_config_ep_out函数里面加入USBC_ConfigFifo函数就可以了。工程后面整理下再重新上传,可以按照上面说的先修改
离线
楼主修复8字节不能传的问题了吗
离线
楼主修复8字节不能传的问题了吗
我自己改的能用了。调用USBC_ConfigFifo时还有些要注意的,关键修改在usb_dev.c的这段。
每次调用USBC_ConfigFifo,传入的offset/size应当是不同的。FIFO所占内存不能重叠,所以这一次调用的offset参数应当是上一次的offset+size。
static u32 fifo_offset = 0; // global
void usb_config_ep_in(int epidx,int maxpack,int type)
{
u32 old_ep_idx = 0;
if(epidx)
{
usbprint("config int ep %d:%d , %d",epidx,maxpack,type);
/* Save index */
old_ep_idx = USBC_GetActiveEp();
USBC_SelectActiveEp(epidx);
u32 fifo_size = maxpack * 2; // double buffer
USBC_Dev_ConfigEp(type,USBC_EP_TYPE_TX,1,maxpack);
USBC_ConfigFifo(USBC_EP_TYPE_TX, 1, fifo_size, fifo_offset);
fifo_offset += fifo_size;
USBC_INT_EnableEp( USBC_EP_TYPE_TX, epidx);
USBC_SelectActiveEp(old_ep_idx);
ep_max_len[epidx] = maxpack;
}
}
void usb_config_ep_out(int epidx,int maxpack,int type)
{
u32 old_ep_idx = 0;
if(epidx)
{
usbprint("config out ep %d:%d , %d",epidx,maxpack,type);
/* Save index */
old_ep_idx = USBC_GetActiveEp();
USBC_SelectActiveEp(epidx);
u32 fifo_size = maxpack * 2; // double buffer
USBC_Dev_ConfigEp(type,USBC_EP_TYPE_RX,1,maxpack);
USBC_ConfigFifo(USBC_EP_TYPE_RX, 1, fifo_size, fifo_offset);
fifo_offset += fifo_size;
USBC_INT_EnableEp( USBC_EP_TYPE_RX, epidx);
USBC_SelectActiveEp(old_ep_idx);
ep_max_len[epidx] = maxpack;
}
}
离线
在调试USB CDC中发现一处小bug。
CDC的规范要求,如果一次发送的数据长度是packet length的整数倍,则最后还需要发一个空的packet,表示结束。
涉及到2个文件的代码修改,如下:
int usb_cdc_send_data(unsigned char *buf,int len)
{
int ret = usb_device_write_data(1, buf, len);
if (ret != 0) {
return ret;
}
// 长度整除packet_length时多发一个空packet,CDC协议要求的
if (len % DATA_PACKET_SIZE == 0) {
ret = usb_device_write_data(1, buf, 0);
}
return ret;
}
int usb_device_write_data(int ep,unsigned char * databuf,int len)
{
int length = len;
int write_len = 0;
volatile int Timeout = 10000000;
int pack_len = ep_max_len[ep];
int data_pos = 0;
if(usb_connect)
{
usbprint("usb_device_write_data len:%d",len);
void * fifo = USBC_SelectFIFO(ep);
USBC_SelectActiveEp(ep);
do {
while((USBC_Dev_IsWriteDataReady(USBC_EP_TYPE_TX))&&(--Timeout)); //等待清除写标志
write_len = length > pack_len ? pack_len : length;
USBC_WritePacket(fifo, write_len, databuf + data_pos);
USBC_Dev_WriteDataStatus(USBC_EP_TYPE_TX,1);
data_pos += write_len;
length -= write_len;
if(Timeout == 0)
{
usbprint("usb_device_write_data Time out!");
return -1;
}
Timeout = 10000000;
} while (length > 0); // do..while 允许发0长度的packet
return 0;
}
else
{
usbprint("usb_device_write_data faild! usb not connect!!");
return -1;
}
}
离线
感谢楼上朋友填坑
离线
又完善一步,坑网有你们,越来越精彩
离线
mark
离线
帅
离线
感谢填坑
离线
感谢填坑 usb比较有难度 一般的很难搞定 能搞定的都是高手
离线
usb比较有难度 一般的很难搞定 能搞定的都是高手
离线
谢谢分享
离线
谢谢分享
离线
有人有常规的USB HOST吗?
离线
感谢楼上的填坑, 终于从FLASH中启动能正常使用USB CDC类了, 在使用过程中发现 只要将USB的调试打印信息屏蔽, 然后USB就不正常了。最后发现是在usb_cdc.c文件中有只要将usbprint("set_line_coding\n")与usbprint("get_line_coding\n")这两行注释屏蔽USB就不正常。猜想可能是由于屏蔽那两行打印信息导致后面不能正常操作某些寄存器。 哎USB太复杂了, 只能倚靠前辈的力量。
离线
DATA_PACKET_SIZE 是64 还是12?
离线
感谢楼主分享,希望能有很大的帮助,早日向楼主看齐。
离线
看着不错,有时间试试。
离线
感谢楼主,请问有EasyUSB V3s 版本可以分享吗
离线
感谢楼主分享,希望能有很大的帮助!
离线
感谢楼主分享,希望尽快突破USB HOST
离线
感谢大佬,刚好遇到USB不能识别的问题,来学习下
离线
感谢楼主分享,希望尽快突破USB HOST
host已经ok了的
离线
host已经ok了的
可否指导一下
离线
感谢楼上的填坑, 终于从FLASH中启动能正常使用USB CDC类了, 在使用过程中发现 只要将USB的调试打印信息屏蔽, 然后USB就不正常了。最后发现是在usb_cdc.c文件中有只要将usbprint("set_line_coding\n")与usbprint("get_line_coding\n")这两行注释屏蔽USB就不正常。猜想可能是由于屏蔽那两行打印信息导致后面不能正常操作某些寄存器。 哎USB太复杂了, 只能倚靠前辈的力量。
usb_cdc.c 这样改,
static void class_setup_request(USB_DeviceRequest* req_data)
{
unsigned char bRequest = req_data->bRequest;
int Timeout = USB_TIMEOUT_COUNT;
int len;
//u32 des_length,data_tmp[26],data_flag;
if(bRequest == 0x20)//set_line_coding
{
//set_line_coding(handle, req_data);
//usb_device_read_data_status_ep0(0);
usbprint("set_line_coding\n");
port_line_coding_flag = 1;
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);
}
//GD_USB_Set_CSR0L(0x88);
}
在线
现在发现大量回传数据,就是IN,会丢包。初步定为是USBC_WritePacket()被做好同步,哪位大神肯只招?
在线
目前简单测试,IN传输64k每块的时候,可以到13MByte,而且还有优化的余地。还是高速的爽。
在线
目前小改一下的,
u32 USBC_WritePacket(void *fifo, u32 cnt, void *buff)
{
u32 len = 0;
u32 i32 = 0;
u32 i8 = 0;
u8 *buf8 = 0;
u32 *buf32 = 0;
volatile int Timeout = 10000000;
while((USBC_Dev_IsWriteDataReady(USBC_EP_TYPE_TX))&&(--Timeout)); // wait for last write to clear
if (!Timeout)
{
rt_kprintf("*");
return 0;
}
//--<1>-- adjust data
buf32 = buff;
len = cnt;
i32 = len >> 2;
i8 = len & 0x03;
//--<2>-- deal with 4byte part
while (i32--)
{
USBC_Writel(*buf32++, fifo);
}
//--<3>-- deal with no 4byte part
buf8 = (u8 *)buf32;
while (i8--) {
USBC_Writeb(*buf8++, fifo);
}
return len;
}
在线
是usb主机驱动吗?
离线
离线
是usb主机驱动吗?
这个是usb设备的驱动
离线
有没有模拟U盘的例子
目前没有,有空再移植分享下。mass storage 好像就几个命令。然后read10 write10对接好底层的存储设备就好了
离线
能模拟成USB 摄相头 UVC 吗?
离线
能模拟成USB 摄相头 UVC 吗?
淘宝小淘气的工程有uvc,我没有在f1c100s上调过
离线
视觉℡ 说:有没有模拟U盘的例子
目前没有,有空再移植分享下。mass storage 好像就几个命令。然后read10 write10对接好底层的存储设备就好了
刚完成了一个
最近编辑记录 windoufu (2021-05-06 12:09:24)
离线
@微凉VeiLiang
你好,参考你的例程,移植了USB MSC,但是我的USB报文有问题,能识别到USB,但是不能识别MSC设备,这个一般会是什么问题,我MSC部分参考的是 圈圈USB的资料
离线
大神,有没有keil开发环境下的代码呢
离线
楼主,是否有C100S作为usb host功能来接U盘/HID之类设备的代码。
离线
微凉大神放出来过 坛子里找
在线
离线
usb 大容量存储设备的例子有吗?大哥
离线
樊星 说:哪里有介绍芯片usb寄存器的文档?600里面没有,找了个a20里面只有host。
只有MUSB的官方寄存器文档,全志的好像没有见过
MUSB的官方寄存器文档 在哪里可以下 ?
离线
usb主机的驱动,楼主还有没有研究了
离线
什么时候出个虚拟u盘的
离线
E:\Burn>.\Tools\sunxi-fel.exe spl rtthread.bin
SPL: eGON header is not found
E:\Burn>.\Tools\sunxi-fel.exe -p write 0x80000000 rtthread.bin
100% [================================================] 146 kB, 192.7 kB/s
E:\Burn>.\Tools\sunxi-fel.exe exec 0x80000000
好像不太行
离线
host模式通过otg 插入u盘可以被识别么?
离线