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

本文介绍如何使用spidev设备驱动控制Zynq7000处理器上的SPI外设,包括修改设备树文件以挂载外设到SPI总线,以及在应用层通过驱动进行数据收发的具体步骤。

具体原理参考大侠文章:http://blog.youkuaiyun.com/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_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引脚短接,即可自收自发数据了


<think>好的,用户的问题是关于在Linux环境下配置ZynqSPI通过EMIO接口的教程或驱动开发。首先,我需要回顾一下之前提供的引用内容,特别是关于ZYNQ7000SPI配置和MIO/EMIO的区别。引用[1]提到了在ZYNQ7芯片IP中配置Quad SPI Flash、Ethernet、SPI0的EMIO以及UART1。而引用[2]解释了MIO和EMIO的区别,指出EMIO需要通过PL(可编程逻辑)部分扩展,需要硬件支持。 接下来,我需要考虑用户在Linux下配置SPI EMIO的具体步骤。通常,这涉及到硬件设计(Vivado中的引脚配置)、设备树修改、驱动加载以及用户空间测试。用户可能需要指导如何将SPI0配置为EMIO模式,并在设备树中添加相应的节点,同时确保驱动正确加载。 需要注意的是,用户可能已经了解MIO和EMIO的基本概念,但具体如何在Linux中实现配置可能存在疑问。可能的问题点包括如何在Vivado中正确分配EMIO引脚,设备树节点的编写格式,以及如何验证SPI是否正常工作。此外,用户可能需要了解如何调试驱动,比如通过dmesg查看内核日志,或者使用spidev工具进行测试。 还需要考虑用户是否有足够的硬件知识,比如Vivado的使用设备树的修改。如果用户不熟悉这些,可能需要更详细的步骤说明。同时,要提醒用户注意引脚分配的正确性,避免硬件连接错误导致SPI无法正常工作。 最后,根据用户的问题生成相关的问题,可能涉及性能优化、不同配置方法的比较,或者故障排除等方面。需要确保生成的问题对用户有实际帮助,并覆盖可能遇到的后续疑问。</think>### Zynq SPI EMIO Linux配置步骤详解 在Linux环境下配置ZynqSPI通过EMIO接口需要硬件配置与驱动开发协同工作,以下是具体步骤: 1. **Vivado硬件配置** - 在Block Design中双击ZYNQ7 Processing System IP - 在"Peripheral I/O Pins"界面定位SPI0/1控制器 - 将SPI控制器右侧的选项从"MIO"切换为"EMIO"[^1] - 完成设计后生成bitstream并导出硬件描述文件(XSA) 2. **设备树配置** ```dts &spi0 { status = "okay"; num-cs = <1>; is-decoded-cs = <0>; spidev@0 { compatible = "spidev"; spi-max-frequency = <50000000>; reg = <0>; }; }; ``` 需要特别注意添加EMIO引脚映射: ```dts &amba { gpio0: gpio@e000a000 { #gpio-cells = <2>; compatible = "xlnx,zynq-gpio-1.0"; gpio-controller; reg = <0xe000a000 0x1000>; }; }; ``` 3. **驱动加载验证** ```bash # 查看SPI控制器注册情况 dmesg | grep spi # 检查设备节点 ls /dev/spidev* # 使用spidev_test工具测试 ./spidev_test -D /dev/spidev32766.0 -v ``` **关键注意事项**: - EMIO配置的SPI控制器在Linux中会显示为SPI32766.x的特殊编号[^2] - 必须确保PL端完成EMIO到物理引脚的信号路由 - SPI时钟频率需与从设备匹配(通过`spi-max-frequency`参数设置)
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值