红联Linux门户
Linux帮助

在Zynq 7000平台上使用Linux spidev.c驱动,调试spi设备

发布时间:2017-01-08 09:20:17来源:linux网站作者:yihui8
如果要通过SPI控制外部器件,还需要添加SPI的设备驱动以实现SPI的对外控制逻辑。
在Linux内核的driver/spi目录下有许多外设的设备驱动可以参考,这篇博客主要介绍如何使用其中的spidev,c这个设备驱动来实现对外设的控制。
spidev是一个通用的SPI外设驱动,它提供了spi字符驱动的注册,并向上层应用程序提供了I/O控制接口,当我们仅需要利用SPI接口向外设发送和接收简单的控制序列时,可直接使用该驱动,下面介绍具体的使用方法。
 
采用xilinx针对Zynq 7000处理器提供的spi-cadence.c驱动实现了芯片上SPI总线驱动的注册,接下来需要修改设备树文件以时我们的外设挂接在SPI总线下。
在petalinux工程的../subsystems/Linux/configs/device-tree目录下找到zynq相关的设备树文件,目录所包含的文件如下图所示。
在Zynq 7000平台上使用Linux spidev.c驱动,调试spi设备
 
打开其中的zynq-7000.dtsi文件,找到其中的spi0节点(具体使用spi0还是spi1根据硬件工程的配置情况),并在该节点下添加如下内容:
spi@e0006000 {  
compatible = "xlnx,zynq-spi-r1p6";  
reg = <0xe0006000 0x1000>;  
status = "okay";  
interrupt-parent = <0x3>;  
interrupts = <0x0 0x1a 0x4>;  
clocks = <0x1 0x19 0x1 0x22>;  
clock-names = "ref_clk", "pclk";  
#address-cells = <0x1>;  
#size-cells = <0x0>;  
is-decoded-cs = <0x0>;  
num-cs = <0x4>;  
device@0 {  
compatible = "rohm,dh2228fv";  
reg = <0x1>;  
spi-max-frequency = <0xf4240>;  
#address-cells = <0x1>;  
#size-cells = <0x1>;  
};  
};
 
注意,更改设备树,要petalinux-config配置去掉Device tree autoconfig,因为选了后添加的内容编译时会自动清除
│ │          Auto Config Settings  --->   
│ │               [ ] Device tree autoconfig
 
其中 “spidev”名字对应spidev.c文件中的驱动名,Linux系统启动时会自动找到对应的驱动模块并加载。
#ifdef CONFIG_OF  
static const struct of_device_id spidev_dt_ids[] = {  
{ .compatible = "rohm,dh2228fv" },  
{ .compatible = "lineartechnology,ltc2488" },  
{},  
};  
MODULE_DEVICE_TABLE(of, spidev_dt_ids);  
#endif
 
reg<0>对应SPI下的第几个设备,由于Zynq PS端的SPI控制器每个可以外接控制3个从设备,所以reg的值可以设为0、1或2.
Vivado硬件工程中对SPI的接口spi0_csn_0_o进行了例化并引出接口,所以本工程使用的是SPI使能第0个端口。
同时,spidev.c该驱动不支持片选功能,因此若在spi0下挂接了多个从设备,切硬件工程中spi0_csn_0片选接口引出了多个,则spiddev驱动在注册时,会在/dev目录下注册多个设备,分别对应每个片选接口连接的从设备。
 
设备树文件修改保存后,利用petalinux-config -c kernel指令,在devices driver/spi support目录下,选中user mode SPI device driver support,然后重新编译内核并启动系统,即可在/dev目录下看到注册的一个SPI字符设备,一般命名为SPI x.x。
在应用层编写程序通过该驱动控制外设,可参考/opt/petalinux-v2015.4-final/components/linux-kernel/xlnx-4.0/Documentation/spi目录下的spi_test.c程序。
使用该程序,将SPI的MOSI和MISO引脚短接,即可自收自发数据了。
 
具体原理:
在Zynq 7000平台上使用Linux spidev.c驱动,调试spi设备
 
本文永久更新地址:http://www.linuxdiyf.com/linux/27611.html