现在已经创建了基于全志V3S的 SPI-NOR Flash 的 image 的编译和烧录。项目中需要用到多种接口,包括 I2C,UART 和 SPI等,但是 V3S 最多只能提供3个 UART 口,1个 I2C 口和1个 SPI 总线,如果需要接入多个不同种类的设备的话,接口数量是不够的。我这里采用的解决方案是采用 USB 扩展提供这些接口,通过 USB 扩展,获得多个 USB 口,然后使用 USB-UART/I2C/SPI 转换芯片获得这些接口。因此,如何扩展 USB 接口就是现在需要解决的问题。
以下操作实测可用。
u-boot配置
为了使将来在应用中使用 USB 扩展的功能,需要在 u-boot 中做一些配置,直接上图吧。
然后,编辑 sun8i-v3s-licheepi-zero.dts,将 &usb_otg 的 dr_mode 设置为 "host",如下图
注意图中的第90行原文是 otg,这里要改为 host。然后使用
cd .../v3s/u-boot
makd ARCH=arm menuconfig
进入到 u-boot 的配置项中。在此之前,使用
make LicheePi_Zero_800x480LCD_defconfig
进行了其它默认配置,有关 dts 的修改请参考这个合集的第1篇,这里只关注对 USB 的支持配置。
通过 Device Didrivers-->USB Support 进入到配置页面。
请注意以下的选中项:
- 选中 [*] EHCI HCD (USB 2.0) support,当前几乎没有不支持 USB 2.0 的EHCI了
- 选中 [*] Support for generic EHCI USB controller,获得兼容性
- 选中 [*] OHCI HCD (USB 1.1) support 和其 下属属性 Support for generic OHCI USB controller
- 选中 [*] Enable sunxi OTG / DRC USB Controller
- 选中 [*] USB Mass Storage USB support,用于支持 U盘读写
- 是否选中 USB Gadget Support,看您乐意,如果需要将 V3S 的存储虚拟成一个U盘的话,可以选中它,然后进行它的相关配置。这里我没选中。
使用
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16
编译 u-boot,生成 u-boot-sunxi-with-spl.bin,用于将来制作 flashimg.bin。
配置 kernel
进入到 Linux kernel 的源代码目录,使用 make ARCH=arm menuconfig 进行配置,进入到 Deivce Drivers---> USB support,选中以下配置(截图很长,这里就不占用屏幕空间了)
- <*> Support for Host-side USB,请注意要直接编译到内核,<*>而不是<M>
- [*] USB announce new devices,这样可以通过 Console 口看到新设备接入和拔除时的信息
- [*] Enable USB persist by default
- [*] OTG support
- <M> USB 2.0 OTG FSM implementation,这里作为 module 编译,这是因为在我的应用环境中没有用到 OTG,如果需要 OTG,则需要配置成 <*>
- <*> EHCI HCD (USB 2.0) support
- [*] Improved Transaction Translator scheduling
- <*> Generic EHCI driver for a platform device
- <*> OHCI HCD (USB 1.1) support
- <*> Generic OHCI driver for a platform device
- <*> USB Mass Storage support,这是挺关键的一步
- <*> Allwinner (sunxi)
- <*> USB Serial Converter support,配置 USB-TTL 转换芯片的支持
在 USB Serial Converter 选项中,我选中了
- <*> USB Winchiphead CH341 Single Port Serial Driver
- <*> USB CP210x family of UART Bridge Controllers
因为这两种芯片组最常用了。
编辑 kernel 中的 .../arch/arm/boot/dts/sun8i-v3s-licheepi-zero.dts,在 &usb_otg 一段中将 dr_mode 改为 "host",如下图
设置好以后,就可以使用 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- 编译出 zImage。
原有的 dtb 和 rootfs 不需要修改,可以使用新编译出来的 u-boot-sunxi-with-spl.bin 和 zImage 制作 flashimg.bin,然后烧写到核心板中。
启动后,我做了如下测试,验证编译结果的正确性。
通过 USB 接口连接 U盘(Massive Storage)
我手头有一个非常古老的U盘,但是还好用,在上位机中进行了分区和格式化,格式化采用 FAT32,这个在4.13.16中是支持的。核心板上电前,没有插入U盘,等待核心板启动完毕,再从USB口插入U盘,得到如下的显示。
从上图可以看出,usb 1-1 无法识别这个 U盘,但是usb2-1正确地连接了,品牌和型号都没有对应,只是采用了 “Generic STORAGE DEVICE” 这个驱动,也能正确驱动起来。显示的容量是7.78 GB,和实际标称容量(8GB)是相符的。
紧接着运行 lsusb,可以看到其 ID是相符的 (0x05e3/0x0727)。接着验证一下读写是否正确,如下图:
可以看到其显示的内容是正确的。这里我事先配置了 U盘插入后的运行脚本,因此它就被自动挂载到了 /mnt/sda1 目录下了。关于如何在检测到U盘插入后自动挂载U盘,我将在后续的文章中说明。
通过 USB 连接 USB HUB
下图是我插入一个 10 端口的 USB HUB 后的显示,这个 USB HUB实际上是 3个 USB HUB 的串联组成的,从图中可以看出这三个芯片都被正确地识别了。
通过 USB 连接 USB-TTL 转换板
干脆,既然识别出了 USB HUB,那就直接在这个 USB HUB上接上一个CH340芯片组的 USB-TTL转换板子看?哈哈,真的可以接上的啦!
之后又将 USB HUB 拔掉,单独插上 USB-TTL 转换模块,也是可以正常识别的,在/dev中多了一个 ttyUSB0接口。只不过我使用的是 CH340 芯片的,识别成了 CH341 芯片。后来又用这个接口进行了双向传输测试,测试是OK的,最大可支持的波特率是 115200,高于这个波特率的通信似乎还是有毛病,这可能是 V3s 的局限吧。
总结
经过这些天的填坑,做成了基于 V3s 的 USB 扩展功能,可以接U盘,可以接USB HUB,可以接 USB-TTL(基于CH340芯片) 转换模块。主要的操作是通过 make menuconfig 配置 u-boot 和 linux kernel,修改 u-boot 和 kernel 对应的 dts 文件,最终的操作还是比较简便的,毕竟 u-boot 和linux-4.13.16中已经集成了较多的常用芯片组,可以直接使用。
但是基于 linux-4.13.16 的参考资料还是比较少的,我这里整理出来,供大家参考,不足之处,欢迎指正。
通过上面的验证,需要用到的童鞋可以设计出基于 V3s 的USB扩展坞了,对扩展 V3s 的端口将是非常有用的方案。