Linux下SPI设备驱动实验:创建SPI节点及SPI设备子节点

news2025/2/6 10:03:46

一. 简介

SPI 驱动框架和 I2C 很类似,都分为主机控制器驱动和设备驱动。主机控制器驱动一般由半导体厂商写好,我们来编写SPI设备驱动代码。
前一篇文章分析了 IMX6U系列芯片的 SPI中片选信号的处理,文章如下:
I.MX6ULL SPI 主机控制器驱动:软件片选处理(片选信号)-CSDN博客
接下来我们就来学习如何在 Linux 下编写 SPI 设备驱动。本实验的最终目的就是驱动 I.MX6U
ALPHA 开发板上的 ICM-20608 这个 SPI 接口的六轴传感器,可以在应用程序中读取 ICM-20608
的原始传感器数据。

这里主要学习创建SPI节点及ICM20608设备(SPI从设备)子节点。

二.  ICM20608设备的硬件原理图

ICM20608设备的硬件原理图如下所示:

通过硬件原理图可以看出,ICM20608设备(SPI设备)的SPI使用的是(IMX6ULL的)SPI3接口,的四个IO对应如下:

SPI3_CS  ->  UART2_TXD   //片选信号
SPI3_SCLK  -> UART2_RXD  //时钟信号
SPI3_MISO  -> UART2_RTS  //主收从发
SPI3_MOSI  -> UART2_CTS  //主发从收

三. 创建SPI节点及SPI设备子节点

这里学习支持设备树的情况下,通过设备节点信息来描述SPI设备信息,方法就是在设备树文件中创建SPI节点及SPI设备节点,IO的pinctrl节点。

1. 创建IO的pinctrl节点

打开ubuntu系统,通过 vscode软件打开 Linux内核源码(NXP官方提供。在 imx6ull-14x14-evk.dts设备树文件中添加 SPI的 pinctrl节点信息。

注意:这里开发板使用的 Nand_Flash版的ALPHA开发板,所对应的设备树文件为 imx6ull-alientek-nand.dts,设备树根节点不在这个文件中,所以要找到 imx6ull-alientek-nand.dts调用的上层设备树文件imx6ull-14x14-evk.dts。调用关系如下:

imx6ull-alientek-nand.dts 
    -> imx6ull-14x14-evk-gpmi-weim.dts 
        -> imx6ull-14x14-evk.dts

打开 imx6ull-14x14-evk.dts设备树文件,在 "&iomuxc"节点下添加 SPI的 pinctrl节点:

/*WeiWuXian //2024/04/15*/
        pinctrl_ecspi3: icm20608{
            fsl,pins = <
            MX6UL_PAD_UART2_TX_DATA__GPIO1_IO20  0x10b0 /* CS */
            MX6UL_PAD_UART2_RX_DATA__ECSPI3_SCLK 0x10b0 /* SCLK */
            MX6UL_PAD_UART2_CTS_B__ECSPI3_MOSI   0x10b0 /* MOSI */
            MX6UL_PAD_UART2_RTS_B__ECSPI3_MISO   0x10b0 /* MISO */
            >;
        };   

UART2_TX_DATA 这个 IO ICM20608 的片选信号,这里我们并没有将其复用为 ECSPI3

SS0 信号,而是将其复用为了普通的 GPIO 。这里选择软件片选使用,NXP的针对 IMX6U系列的SPI 主机控制器驱动中,有实现SPI的软件片选!!

注意:这里添加好 IO以后,需要在设备树文件中检查这四个IO是否有其他设备在使用,复用的话,这里配置就不能使用了。如果有其他设备使用到,则需要删除掉。

在imx6ull-14x14-evk.dts设备树文件中 分别搜索 UART2_TX,UART2_RX,UART2_CTS,以及UART2_RTS,有其他设备使用则需要屏蔽掉,如下设备有使用到则屏蔽掉:

		pinctrl_uart2: uart2grp {
			fsl,pins = <
			/*	MX6UL_PAD_UART2_TX_DATA__UART2_DCE_TX	0x1b0b1
				MX6UL_PAD_UART2_RX_DATA__UART2_DCE_RX	0x1b0b1  */
				MX6UL_PAD_UART3_RX_DATA__UART2_DCE_RTS	0x1b0b1
				MX6UL_PAD_UART3_TX_DATA__UART2_DCE_CTS	0x1b0b1
			>;
		};

		pinctrl_uart2dte: uart2dtegrp {
			fsl,pins = <
			/*	MX6UL_PAD_UART2_TX_DATA__UART2_DTE_RX	0x1b0b1
				MX6UL_PAD_UART2_RX_DATA__UART2_DTE_TX	0x1b0b1  */
				MX6UL_PAD_UART3_RX_DATA__UART2_DTE_CTS	0x1b0b1
				MX6UL_PAD_UART3_TX_DATA__UART2_DTE_RTS	0x1b0b1
			>;
		};
..........................
		pinctrl_flexcan2: flexcan2grp{
			fsl,pins = <
			/*	MX6UL_PAD_UART2_RTS_B__FLEXCAN2_RX	0x1b020
				MX6UL_PAD_UART2_CTS_B__FLEXCAN2_TX	0x1b020  */
			>;
		};

2. 创建SPI节点及SPI设备子节点

 关于所创建的SPI节点可以查看 SPI节点的绑定文档,在Linux内核源码如下目录下:

/linux-imx-rel_imx_4.1.15_2.1.0_ga\Documentation\devicetree\bindings\spi\fsl-imx-cspi.txt

也就是 fsl-imx-spi.txt 绑定文档 ,该文档说明了SPI节点如何创建,包括SPI节点必须写的属性或可选的属性,也会有SPI节点的举例。

我们也可以参考 imx6qdl-sabresd.dtsi 这个设备树头文件中关于 SPI节点的内容,在此文件里面找到如下所示内容:

&ecspi1 {
	fsl,spi-num-chipselects = <1>;
	cs-gpios = <&gpio4 9 0>;
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_ecspi1>;
	status = "okay";
 
	flash: m25p80@0 {
		#address-cells = <1>;
		#size-cells = <1>;
		compatible = "st,m25p32";
		spi-max-frequency = <20000000>;
		reg = <0>;
	};
};

imx6ull-14x14-evk .dts 文件中并没有 ecspi3 节点,这是因为 NXP 官方的 6ULL EVK 开发板上没有连接 SPI 设备。

在 imx6ull-14x14-evk.dts设备树文件的最后,添加 SPI节点及SPI设备子节点:

&ecspi3 {
	fsl,spi-num-chipselects = <1>; /*片选数量*/
	cs-gpios = <&gpio1 20 0>;  /*设置为软件片选*/
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_ecspi3>;
	status = "okay";  

	icm20608: icm20608@0 {
		compatible = "alientek,icm20608"; /*设备与驱动匹配(设备树匹配方法)*/
		spi-max-frequency = <8000000>; /*SPI从设备icm20608最大支持频率*/
		reg = <0>;  /*SPI通道*/
	};
};

这里也需要检查  gpio1 20是否有其他设备使用,即在 imx6ull-14x14-evk.dts设备树文件中进行搜索 "gpio1 20"字符串是否在其他设备中使用到,如果有就必须删除或屏蔽掉。

& ecspi3: 意思是向 ecspi3节点追加内容,根设备树文件 imx6ull.dtsi中其实已经存在 ecspi3节点(NXP官方写的),这里是在NXP官方提供的 ecspi3节点信息基础上追加(或更改)信息。

2 行,设置当前片选数量为 1 ,因为就只接了一个 ICM20608

3 行,一定要使用  “cs-gpios” 属性来描述片选引脚,SPI 主机驱动就会控制片选引脚,SPI主机控制器驱动实现了SPI的软件片选功能, 后面我们在编写SPI设备驱动时,软件上不用手动设置片选电平的高低。

5 行,设置 IO 要使用的 pinctrl 子节点,也就是我们在示例代码 62.5.1.1 中新建的pinctrl_ecspi3

6 行, imx6ull.dtsi 文件中默认将 ecspi3 节点状态 (status) 设置为“ disable ”,这里我们要将其改为 “ okay ” 。

8~12 行,icm20608 设备子节点,因为 icm20608 连接在 ECSPI3 的第 0 个通道上,因此,@后面为 0

9 行设置节点属性兼容值为“alientek,icm20608”。

10 行设置 SPI 最大时钟频 率为 8MHz,这是 ICM20608 SPI 接口所能支持的最大的时钟频率。

11 行,icm20608 连接在通道 0 上,因此 reg 0

编译设备树文件

imx6ull-alientek-emmc.dts 文件修改完成以后,重新编译设备树文件
ubuntu终端进入 上面的Linux内核源码的根目录下,输入如下命令编译设备树:
make dtbs

这里可以正常编译通过。会生成新的设备树文件 imx6ull-alientek-nand.dtb。

接下来开发板上电后加载运行新的设备树文件,测试SPI节点及icm20608设备子节点是否创建好。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1598701.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

排序算法。

冒泡排序: 基本&#xff1a; private static void sort(int[] a){for (int i 0; i < a.length-1; i) {for (int j 0; j < a.length-i-1; j) {if (a[j]>a[j1]){swap(a,j,j1);}}}} private static void swap(int[] a,int i,int j){int tempa[i];a[i]a[j];a[j]temp;} …

Solaris系统参数未配置导致rac节点重启异常

Solaris系统参数未配置导致rac节点重启异常&#xff0c;检查alert日志发现很多参数异常告警&#xff1a; 配置Solaris内核参数 在两个节点上配置同样的Solaris内核参数。 为grid用户和oracle用户创建projects&#xff0c;配置共享内存参数&#xff1a; # /usr/sbin/ndd /dev/t…

适当睡眠有助于缓解抑郁

适当睡眠&#x1f634;&#x1f62a;&#x1f971;&#x1f4a4;&#x1f6cc;&#x1f3fc;有助于缓解抑郁&#x1f917; 睡眠与抑郁之间存在密切的关系。一方面&#xff0c;良好的睡眠可以促进身体和大脑的恢复与修复&#xff0c;有助于缓解抑郁症状并提高生活质量。另一方面…

9个高质量的Python学习网站:

我这边整理出来了9个高质量的Python学习网站,分享给大家,用起来&#xff01; Python 官方文档&#xff1a; Python 的官方文档包含了详细的教程、参考和库文档&#xff0c;是学习 Python 编程语言的权威指南之一 https://docs.python.org/zh-cn/3/ Real Python&#xff1a;…

IO——标准IO

1.1概念 标准IO&#xff1a;是在C库中定义的一组专门用于输入输出的函数。 1.2特点 &#xff08;1&#xff09;通过缓冲机制减少系统调用&#xff0c;提高效率 &#xff08;2&#xff09;围绕流操作&#xff0c;用FILE*描述 &#xff08;3&#xff09;标准IO默认打开三个流&a…

HTML常见标签的使用

文章目录 1. **文档结构标签**2. **文本内容标签**3. **图像标签**4. **链接标签**5. **列表标签**6. **表格标签**7. **表单标签**8. **其他常用标签**9. **注释标签** 案例展示 网页结构层主要通过HTML&#xff08;HyperText Markup Language&#xff09;标签来构建&#xff…

它山之石可以攻玉,大师摄影作品鉴赏

一、资料描述 本套大师摄影作品&#xff0c;大小685.08M&#xff0c;共有19个文件。 二、资料目录 Bill.Brandt.(比尔布兰德).rar Bourk White(伯克怀特).rar Bresson(布列松).rar Edward Weston(爱德华韦斯顿).rar Herb Ritts(赫伯瑞茨).rar Richard Avedon(阿威顿).r…

超像素分割在AI去衣技术中的应用与探讨

随着人工智能技术的飞速发展&#xff0c;图像处理领域不断涌现出新的方法和应用。其中&#xff0c;超像素分割作为一种重要的图像预处理技术&#xff0c;在AI去衣这一特定应用中发挥着至关重要的作用。本文将深入探讨超像素分割在AI去衣技术中的应用&#xff0c;并尝试从专业的…

基于SpringBoot+Vue的在线教育系统(源码+文档+包运行)

一.系统概述 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了在线教育系统的开发全过程。通过分析在线教育系统管理的不足&#xff0c;创建了一个计算机管理在线教育系统的方案。文章介绍了在线教育系统的系统分析部…

人工智能ai帮助我们做什么?

最近有去使用人工智能画图&#xff0c;做文案&#xff0c;写代码&#xff0c;优化代码&#xff0c;确实很好用。 人工智能可以为我们做什么 1&#xff0c;自动化任务&#xff1a;人工智能可以自动执行重复性任务&#xff0c;从而节省时间和精力。 2&#xff0c;数据分析&…

自然语言处理——情绪检测数据集

一、重要性及意义 情绪检测的重要性和意义体现在多个方面&#xff0c;不仅对于个人日常生活有深远影响&#xff0c;也在多个行业和领域中扮演着关键角色。以下是情绪检测的重要性和意义的具体体现&#xff1a; 提高人机交互体验&#xff1a; 在人工智能和机器学习驱动的系统中…

高效求解最长回文子序列:动态规划方法与C语言实现

高效求解最长回文子序列&#xff1a;动态规划方法与C语言实现 问题描述解决方案伪代码C代码示例算法分析进一步讨论 在计算机科学中&#xff0c;回文是一种有趣的字符串&#xff0c;它在正序和逆序下是相同的。例如&#xff0c;“civic”、"racecar"和"aibohpho…

JAVA基础面试题(第九篇)中! 集合与数据结构

JAVA集合和数据结构也是面试常考的点&#xff0c;内容也是比较多。 在看之前希望各位如果方便可以点赞收藏&#xff0c;给我点个关注&#xff0c;创作不易&#xff01; JAVA集合 11. HashMap 中 key 的存储索引是怎么计算的&#xff1f; 首先根据key的值计算出hashcode的值…

【安装部署】Apache SeaTunnel 和 Web快速安装详解

版本说明 由于作者目前接触当前最新版本为2.3.4 但是官方提供的web版本未1.0.0&#xff0c;不兼容2.3.4&#xff0c;因此这里仍然使用2.3.3版本。 可以自定义兼容处理&#xff0c;官方提供了文档&#xff1a;https://mp.weixin.qq.com/s/Al1VmBoOKu2P02sBOTB6DQ 因为大部分用…

棱镜七彩上榜《中国网络安全行业全景图》软件成分分析领域

近日&#xff0c;安全牛第十一版《中国网络安全行业全景图》&#xff08;以下简称“全景图”&#xff09;正式发布。棱镜七彩凭借专业技术实力和创新能力上榜全景图软件供应链安全-软件成分分析领域。 据悉&#xff0c;本次第十一版全景图优先展现当前热门网络安全领域中具有较…

飞企互联FE业务协作平台 ProxyServletUti 任意文件读取漏洞复现

0x01 产品简介 飞企互联-FE企业运营管理平台是一个基于云计算、智能化、大数据、物联网、移动互联网等技术支撑的云工作台。这个平台可以连接人、链接端、联通内外,支持企业B2B、C2B与O2O等核心需求,为不同行业客户的互联网+转型提供支持。其特色在于提供云端工作环境,整合…

GLIB: The Main Event Loop

主事件循环机制&#xff08;MEL&#xff1a;the Main Event Loop)在GLib和GTK应用中管理可用的事件源。事件源的类型包括&#xff1a;文件描述符&#xff08;管道、套接字和常规文件&#xff09;和定时器超时。 guint g_source_attach (GSource* source, GMainContext* contex…

java的深入探究JVM之内存结构

前言 Java作为一种平台无关性的语言&#xff0c;其主要依靠于Java虚拟机——JVM&#xff0c;我们写好的代码会被编译成class文件&#xff0c;再由JVM进行加载、解析、执行&#xff0c;而JVM有统一的规范&#xff0c;所以我们不需要像C那样需要程序员自己关注平台&#xff0c;大…

软件开发安全设计方案

2.1.应用系统架构安全设计要求 2.2.应用系统软件功能安全设计要求 2.3.应用系统存储安全设计要求 2.4.应用系统通讯安全设计要求 2.5.应用系统数据库安全设计要求 2.6.应用系统数据安全设计要求 软件开发全资料获取&#xff1a;软件开发全套资料_软件开发资料-CSDN博客https://…

server_id 引发的 MySQL 级联复制同步异常

MySQL 级联复制的坑&#xff0c;我帮你们踩了。 作者&#xff1a;蒋士峰&#xff0c;爱可生 DBA 团队成员&#xff0c;熟悉 MySQL&#xff0c;Oracle 等数据库。每天的积累&#xff0c;时间久了&#xff0c;会带来不一样的收货。 爱可生开源社区出品&#xff0c;原创内容未经授…