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

来源:互联网 发布:淘宝卖家版下载 编辑:程序博客网 时间:2024/05/16 05:34

具体原理参考大侠文章:http://blog.csdn.net/jackyard/article/details/41515037

如果要通过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.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 -c kernel 配置去掉Device tree autoconfig,因为选了后添加的内容编译时会自动清除
│ │          Auto Config Settings  ---> 
│ │               [ ] kernel autoconfig │ │               [ ] Device tree autoconfig


其中 “spidev”名字对应spidev.c文件中的驱动名,Linux系统启动时会自动找到对应的驱动模块并加载。

#ifdef CONFIG_OFstatic 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引脚短接,即可自收自发数据了


0 0