修改 vivado 工程,启用 PS-SPI
重新生成 BOOT.bin
因为修改了 vivado 工程,所以需要使用新的 bitstream 文件重新生成 BOOT.bin
修改 device-tree
首先参考创建设备树文件使用 SDK 重新生成设备树文件,可以看到在 pcw.dtsi 文件中多了
&spi0 {,这个是 SDK 自动生成的设备树;修改 pcw.dtsi 文件中的
&spi0 {:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26&spi0 {
is-decoded-cs = <0>;
num-cs = <3>;
status = "okay";
spidev@0 {
compatible = "spidev";
reg = <0>; /*chipselect 0*/
spi-max-frequency = <50000000>;
spi-cpol;
spi-cpha;
};
spidev@1 {
compatible = "spidev";
reg = <1>; /*chipselect 1*/
spi-max-frequency = <50000000>;
spi-cpol;
spi-cpha;
};
spidev@2 {
compatible = "spidev";
reg = <2>; /*chipselect 2*/
spi-max-frequency = <50000000>;
spi-cpol;
spi-cpha;
};
};其中
reg = <*>;为片选信号,可以控制SPIO_SS*引脚;is-decoded-cs = <0>;为不使用编码器,所以现在 zynq 的 SPI-Mater 最多只能接 3 个 slaver,需要更多的 slaver 可以使用 3-8编码器;!!!
spi-cpol; spi-cpha;这两行一定要加!修改 top.dts 中的
aliases:1
2
3
4
5
6
7aliases {
ethernet0 = &gem0;
i2c0 = &i2c0;
serial0 = &uart0;
spi0 = &qspi;
spi1 = &spi0;
};添加了
spi1 = &spi0;重新编译设备树:
1
dtc -I dts -O dtb -o devicetree.dtb zynq-pynqz2.dts
配置内核
参考 Xlinx
wiki: SPI Zynq driver 需要启用
CONFIG_SPI_CADENCE,这个选项在
xilinx_zynq_defconfig 文件中是默认启用的:
参考 Xlinx
wiki: Linux SPI Driver 需要启用
CONFIG_SPI_XILINX,这个选项在
xilinx_zynq_defconfig 文件中也是默认启用的:
但是这样配置怎么也找不到 spidev 设备,后来在 forums.xilinx 上看到的一个回答:
需要启用 CONFIG_SPI_SPIDEV ,在 Device Drivers ->
SPI Support -> User mode SPI device driver support
最后重新编译内核:
1 | make xilinx_zynq_defconfig |
使用新的 dtb, uImage, BOOT.bin 启动后,就可以在 /dev/ 下面看到 SPI 设备了:
1 | xilinx@pynq:~$ ls /dev/spi* |
用户程序测试
linux-xlnx 中提供了 spi test 程序,自己写可以参考,路径在 linux-xlnx/tools/spi/spidev_test.c,编译命令如下:
1 | arm-linux-gnueabihf-gcc -O2 spidev_test.c -o spidev_test |
将生成的 spidev_test 拷贝到 ZYNQ 中,运行
./spidev_test,可以看到 SPI 接口上产生了正确的波形: