嵌入式linux之iMX6ULL驱动开发 | 通用spi驱动之spidev使用总结

因为兴趣,业余时间把玩下手边的imax6ul开发板。Linux内核集成了spidev驱动,提供了SPI设备的用户空间API。支持用于半双工通信的read和write访问接口以及用于全双工通信和I/O配置的ioctl接口。使用时,只需将SPI从设备的compatible属性值添加到spidev区动的spidev dt ids[]数组中,即可将该SPI从设备创建为spidev设备。如果不想编写单独的spi设备驱动,那么使用linux内核提供的通用spidev设备驱动就够了,它提供统一的字符设备操作,那么只需要在应用层读写和控制即可。

spidev驱动简介

spidev是一个Linux内核驱动,用于与SPI(串行外设接口)设备进行通信。SPI是一种全双工、同步的串行通信协议,常用于连接微控制器和外部设备。spidev驱动允许用户空间程序通过Linux的设备文件接口与SPI设备进行通信。用户可以通过打开和读写设备文件来发送和接收SPI数据。spidev驱动提供了一组控制IO口和SPI参数的ioctl命令。

同时Linux内核也集成了SPI测试工具spidev test,用于在用户态对spidev动功能进行测试和验证。

spidev设备驱动源码位置在:linux-imx-4.1.15\drivers\spi\spidev.c

驱动框架框图:

除了使用spidev驱动外,当然也可以自己编写SPI驱动。

使用现有的spidev驱动可以简化开发过程,因为它提供了一组用户空间接口,可以直接在应用程序中使用标准的文件操作函数(如open、read、write和ioctl)来操作SPI设备。这种方式适用于大多数应用场景,特别是对于简单的SPI设备操作,可以快速实现功能。

如果使用自己编写的SPI驱动也可以,也不算麻烦,需要在内核中实现SPI子系统,包括SPI控制器驱动和SPI设备驱动,最后根据需要实现个如字符型设备驱动操作接口,供上层应用使用即可。

应用层使用步骤

用户应用层使用spidev驱动的步骤如下:

1. 打开SPI设备文件:用户可以通过打开/dev/spidevX.Y文件来访问SPI设备,其中X是SPI控制器的编号,Y是SPI设备的编号。

2. 配置SPI参数:用户可以使用ioctl命令SPI_IOC_WR_MODE、SPI_IOC_WR_BITS_PER_WORD和SPI_IOC_WR_MAX_SPEED_HZ来设置SPI模式、数据位数和时钟速度等参数。

3. 发送和接收数据:用户可以使用read和write系统调用来发送和接收SPI数据。写入的数据将被传输到SPI设备,而从设备读取的数据将被存储在用户提供的缓冲区中。

4. 关闭SPI设备文件:当不再需要与SPI设备通信时,用户应该关闭SPI设备文件。

总结起来,spidev驱动提供了一种简单而灵活的方式来与SPI设备进行通信,使得用户可以轻松地在Linux系统上开发和控制SPI设备。

内核配置

使能spidev用户态驱动

在生成的config文件中可以看到以下配置生效了。我的是在imx6ul开发板的imx_v7_defconfig的linux内核配置文件中。

CONFIG_SPI=y
CONFIG_SPI_GPIO=y
CONFIG_SPI_IMX=y
CONFIG_SPI_SPIDEV=y

编写设备树

&ecspi3 {
        fsl,spi-num-chipselects = <2>;/*cs管脚数配置*/
        cs-gpios = <0>,<&gpio1 20 GPIO_ACTIVE_LOW>;/*cs管脚配置*/
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_ecspi3>;
        status = "okay";/* status属性值为"okay" 表示该节点使能*/

	spidev: icm20608@0 {
	compatible = "alientek,icm20608";
        spi-max-frequency = <8000000>;
        reg = <0>;/*spi设备是没有设备地址的, 这里是指使用spi控制器的cs-gpios里的第几个片选io */
    };

	oled: oledsh1106@1 {
	compatible = "yang,oledsh1106";/*重要,会匹配spidev.c中指定的compatible*/
	spi-cpol;/*配置spi信号模式*/
	spi-cpha;
	spi-max-frequency = < 8000000 >;/* 指定spi设备的最大工作时钟 */
    reg = <1>;
    };
};

以上需要注意的是:如果该spi接口下挂载有多个从设备,需要设置fsl,spi-num-chipselects = <2>;默认该值为1。还有需要注意的地方是,cs-gpios 片选信号需要配置对应的个数。以上的为配置了两路片选GPIO管脚,第一个默认的,第二个是指定的。如果仅有一个从设备,可以配置cs-gpio就行了。注意cs-gpio和cs-gpios的区别,带s的标识可以有多个。

如果忽略cs管脚数配置,则会出现以下错误:

需要设置fsl,spi-num-chipselects = <2>; 

注意上面的compatible 属性,在新版linux内核,可以写任意的字符串,最好不再写”spidev”,老版的是要写成”spidev”。给出的理由是: spidev should never be referenced in DT without a specific compatible string, it is a Linux implementation thing rather than a description of the hardware。

此外还有一些额外配置,以下为自定义属性,用于指定工作时序方式及其它功能设置等。如CPOL需要设1, 则只需在spi设备节点里加上"spi-cpol"属性即可; CPOL设0,则不写"spi-cpol"属性即可 。

buswidth = <8>; /* 传输以8位为单位 */
mode = <0>; /* 使用第几种工作时序(CPOL, CPHA) */
/*但在现用的内核源码里发现, spi设备的工作时序并不是用mode属性值来指定的*/
/* 如CPOL需要设1, 则只需在spi设备节点里加上"spi-cpol"属性即可; CPOL设0,则不写"spi-cpol"属性即可 */
/* CPHA设1时,则在设备节点里加上"spi-cpha"属性即可 */ 

pinctrl的配置

pinctrl_ecspi3: ecspi3grp {
                fsl,pins = <
                        MX6UL_PAD_UART2_RTS_B__ECSPI3_MISO        0x100b1  /* MISO*/
                        MX6UL_PAD_UART2_CTS_B__ECSPI3_MOSI        0x100b1  /* MOSI*/
                        MX6UL_PAD_UART2_RX_DATA__ECSPI3_SCLK      0x100b1  /* CLK*/
                        MX6UL_PAD_UART2_TX_DATA__GPIO1_IO20       0x100b0  /* CS*/
                    >;
            };

编译内核和设备树

#加载环境
source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi
#编译内核
make zImage -j16
#编译指定的设备树
make imx6ull-14x14-nand-4.3-480x272-c.dtb

修改spidev驱动

默认的spidev.c中,是没有匹配你添加的设备的,因此需要修改spidev.c代码,增加compatible匹配。

/* The main reason to have this class is to make mdev/udev create the
 * /dev/spidevB.C character device nodes exposing our userspace API.
 * It also simplifies memory management.
 */

static struct class *spidev_class;

//#ifdef CONFIG_OF
static const struct of_device_id spidev_dt_ids[] = {
	{ .compatible = "rohm,dh2228fv" },
  { .compatible = "yang,oledsh1106" },
	{},
};
MODULE_DEVICE_TABLE(of, spidev_dt_ids);
//#endif

内核编译成功后,更新内核和设备树文件。启动设备后,在/sys/class/spidev下可以确认spidev枚举出了多少个spi设备。

设备树查看

查看设备树是否有新添加的节点:

更新设备树到板子上后查看下是否有生成spi设备节点:

开源测试工具

spidev驱动有现成的测试工具。其中一个常用的测试工具是spi_test,它是spidev驱动自带的测试工具,可以用于测试和调试SPI设备。spi_test可以通过命令行参数设置SPI设备的各种参数,如设备文件、传输速率、字节顺序等。使用spi_test可以发送和接收SPI数据,以验证spidev驱动的功能和性能。

在源码linux-imx-4.1.15-2.1.0-v2.7\Documentation\spi路径下,有两个测试工具的源码文件,spidev_fdx.c和spidev_test.c文件。可以直接交叉编译为可执行文件使用。这些工具都基于spidev通用设备驱动以及对应的ioctl命令实现,可以方便的用来对spi的通用型驱动来进行测试。

编译方法

#加载环境
source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi
#编译
$(CC) spidev_fdx.c -o spidev_fdx
$(CC) spidev_test.c -o spidev_test

回环测试

首先,将spi接口的MISO和MOSI接口短接。

其次,编译测试代码:

Documentation/spi/spidev_test.c

如,在/dev/spidev2.0上发送"string_to_send"字符串,显示发送和接收的数据:

 ./spidev_test -D /dev/spidev2.0 -v -p string_to_send

如果要发送32位/16位的数据,则需要先生成二进制文件,如生成32字节的随机数据:

dd if=/dev/urandom of=test_data bs=16 count=2

用hexdump来查看这个二进制文件:

hexdump -v test_data -C

00000000 74 6a 59 3e 1e 81 73 fb 5a 3f 94 c7 d8 20 ca e9 |tjY>..s.Z?... ..|

00000010 24 2e a5 68 75 ab f7 12 af e6 c1 3d e2 d8 9a ba |$..hu......=....|

00000020

发送:

./spidev_test -D /dev/spidev2.0 -b 32 -v -i test_data

  

最后,输出结果与输入相同即为正确。

结语

在这样一个速食的时代,坚持做自己,慢下来,潜心琢磨,心怀敬畏,领悟知识,才能向下扎到根,向上捅破天,背着世界往前行!

其他资源

spidev的使用(SPI用户态API)_习惯就好zz的博客-CSDN博客

基于Linux使用spidev驱动OLED - 嵌入式技术 - 电子发烧友网

0.96寸OLED屏移植到搭载mx6ull的linux系统_AURORA1997的博客-CSDN博客

嵌入式Linux驱动开发——解决/sys/bus/spi/devices下没有对应的spi设备文件_spi-max-frequency_门牙会稍息的博客-CSDN博客

嵌入式Linux驱动开发——解决/sys/bus/spi/devices下没有对应的spi设备文件_spi-max-frequency_门牙会稍息的博客-CSDN博客 spidev0.0的正确打开方式_在内核开启spidev0_blog_xu的博客-CSDN博客

编写SPI设备驱动程序_spi程序怎么编程_Hilbert(*^*)的博客-CSDN博客

154 spidev:SPI“万能”驱动_你板子冒烟了的博客-CSDN博客

i.MX6ULL驱动开发 | 14 - 基于 Linux SPI 驱动框架读取ICM-20608传感器_MCUlover666的技术博客_51CTO博客

设备树学习之(九)SPI设备注册过程_spi_lsb_first_kunkliu的博客-CSDN博客

https://www.cnblogs.com/lknlfy/p/3265019.html

设备树中的spi设备以及内核对spi节点的处理流程_linux下spi->irq_弋阳yoga的博客-CSDN博客

嵌入式Linux的两种SPI驱动方式_linux spidev_iot-lorawan的博客-CSDN博客

  • 9
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: imx6ull核心板是一款基于NXP公司的i.MX6ULL系列处理器的嵌入式开发板。它具有稳定可靠、性能强劲的特点,适用于物联网、工业控制、智能家居等领域的应用。 首先,imx6ull核心板包括了处理器模块和扩展模块两部分。处理器模块采用了NXP i.MX6ULL处理器,具备高性能、低功耗的特点。扩展模块则提供了丰富的外设接口,包括USB、以太网、串口等,方便用户进行各种外部设备的连接和扩展。 其次,imx6ull核心板提供了全面的软件支持。基于Linux操作系统的软件开发环境已经预装在核心板中,用户可以直接进行应用程序的开发。此外,核心板还提供了完整的开发工具链和驱动程序,方便用户进行底层驱动开发和调试。 另外,imx6ull核心板还提供了丰富的文档和资料支持。用户可以通过官方网站下载到详细的产品规格书、用户手册和应用案例等资料,帮助用户快速了解和上手该核心板。此外,还可以通过在线技术支持和开发者社区解答问题、交流经验。 总之,imx6ull核心板是一款功能强大、易于开发嵌入式开发板。它提供了稳定可靠的硬件和全面的软件支持,适用于各种应用场景。无论是学习嵌入式开发,还是进行项目开发imx6ull核心板都是一个理想的选择。 ### 回答2: imx6ull核心板是一款基于NXP公司的i.MX6ULL处理器的开发板。i.MX6ULL是一款低功耗、高性能的ARM Cortex-A7处理器,适用于物联网、智能家居、工业控制等领域。imx6ull核心板集成了该处理器以及丰富的外设,提供了更便捷的开发环境和更灵活的应用扩展能力。 imx6ull核心板提供了详细的技术文档和用户手册,其中包括硬件设计指南、原理图、PCB布局指导以及电源管理等资料,可以帮助开发者理解和设计基于imx6ull核心板的硬件系统。 在软件方面,imx6ull核心板支持Linux系统和Android系统,提供了相关的内核、驱动和应用程序,开发者可以根据需要选择适合的操作系统进行开发。此外,imx6ull核心板还支持Qt和Qt Quick等跨平台开发框架,开发者可以通过这些工具进行应用程序的开发和界面设计。 imx6ull核心板的外设丰富,包括多个UART、SPI、I2C、GPIO等接口,以及USB、以太网等通信接口。此外,imx6ull核心板还提供了丰富的扩展接口如MIPI CSI和DSI接口、LCD接口等,可以满足不同应用的需求。 总之,imx6ull核心板提供了丰富的技术资料和灵活的应用扩展能力,是一款适用于各种物联网、智能家居和工业控制等领域的开发板。无论是硬件设计还是软件开发开发者都可以借助imx6ull核心板高效地进行开发,并快速实现自己的项目。 ### 回答3: imx6ull核心板是一款基于i.MX 6ULL处理器的嵌入式系统核心板。它具有多个丰富的接口和功能,适用于各种物联网和嵌入式应用领域。 首先,imx6ull核心板采用了NXP (原Freescale) 公司的i.MX 6ULL处理器,该处理器拥有Cortex-A7内核,主频为528 MHz。这种处理器具有低功耗和高性能的特点,可在各种资源有限的嵌入式应用中使用。 其次,imx6ull核心板提供了丰富的接口和功能,包括USB、以太网、UART、CAN、SPI、I2C等。这些接口能够满足不同外设的连接需求,例如摄像头、显示屏、传感器等。另外,核心板还提供支持多种存储介质的接口,包括SD卡和NAND闪存。 此外,imx6ull核心板支持多种操作系统,包括Linux和Android等。开发者可以根据自己的需求选择适合的操作系统,进行应用程序的开发和部署。同时,核心板也提供了丰富的软件开发工具和开发文档,为开发者提供便利。 最后,imx6ull核心板具有较小的尺寸和低功耗的特点,适用于各种紧凑型和长时间运行的嵌入式系统设计。它可以广泛应用于物联网、工控、智能家居等领域。 总之,imx6ull核心板是一款功能强大且易于开发嵌入式系统核心板,具有丰富的接口和功能,适用于各种物联网和嵌入式应用领域。它的相关资料包括处理器的规格书、接口定义、原理图等,在开发过程中可以提供必要的技术支持和参考。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

特立独行的猫a

您的鼓励是我的创作动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值