在之前 ZYNQ 移植 Linux 的基础上,下一步就是要移植驱动了,但是每次都把 SD 卡拔下来把驱动拷进去再重新开机太麻烦了,ZYNQ 上有两个 USB 外设,可以配成 Host、Peripheral、OTG 三种模式,因此我们可以将 USB 配置成 Host 模式,这样 ZYNQ 上的 Linux 系统就可以读取 USB 接口上的 U盘了。
Reference:
https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842272/Zynq+Linux+USB+Device+Driver#ZynqLinuxUSBDeviceDriver-PeripheralMode
https://blog.csdn.net/u010580016/article/details/104188236?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-8&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-8
https://stackoverflow.com/questions/57823438/how-to-configure-petalinux-device-tree-with-usb-correctly
这里现在只写了 Host 模式的配置,其他模式的配置可以参考 ZYNQ学习之路8.USB总线学习(一) 和 xilinx-wiki。
配置内核
按照 xilinx-wiki 中的步骤,需要对内核进行如下配置:
1 | Device Drivers |
不过这些在 xilinx_zynq_defconfig 这个文件里好像都配置好了,不过还是按照步骤来一遍:
在 编译内核 这一步,先运行:
1 | make menuconfig |
使用这种类似图像界面配置:
然后 <Load>
配置文件:
配置文件的路径是
arch/arm/configs/xilinx_zynq_defconfig,按照上面的要求进行配置,最后
<Save>
,然后 <Exit>
然后重新编译内核:
1 | make xilinx_zynq_defconfig |
修改设备树
之前的在这里被坑了一下,xilinx-wiki 写的不太明白,像我这种菜鸡没看懂怎么去修改设备树,后来在 stackoverflow 上找到了一篇文章解决了问题。
在前一篇的 创建设备树文件 步骤中,会生成 system-top.dts, pcw.dtsi, pl.dtsi 三个文件,需要修改 system-top.dts, pcw.dtsi 这两个文件:
修改 pcw.dtsi :
1 | /* |
然后修改 system-top.dts :
1 | /* |
可以看到,在 pcw.dtsi 中修改了 usb0 这一项,设置了
dr_mode
为 host
,设置了 usb-phy
为 usb_phy0
,然后在 system-top.dts 对
usb_phy0
进行了定义,这个与 xilinx-wiki
中略有不同,其实是在 zynq-7000.dtsi 文件中对 usb0
有定义,而 pcw.dtsi 中对 usb0
的是一个覆盖定义(表述不是很准确,等我后面再去查一下 dts 的语法)。
然后重新编译设备树:
1 | dtc -I dts -O dtb -o devicetree.dtb zynq-pynqz2.dts |
最后
最后将内核 uImage 和 设备树 devicetree.dtb 拷贝到 SD 卡重新启动 ZYNQ,在将 U盘插入 USB 口后,可以看到 /dev/ 下多了 sda 设备,将其挂载,便可读写 U盘的文件了:
1 | mount /dev/sda1 /mnt |
通过访问 /mnt 文件夹就可以访问 U盘的文件了。
主要问题总结
- 不熟悉设备树编写的规则,卡了好久;