【嵌入式linux】spi驱动加载后probe函数未执行的问题

news2024/11/26 10:50:17

【嵌入式linux】spi驱动加载后probe函数未执行的问题

  • 问题描述
  • 解决办法

问题描述

嵌入式linux平台下的spi分为设备总线驱动,一般半导体原厂已经实现好了spi设备总线的相关代码,开发者只需根据实际使用情况修改设备树以及编写驱动部分的代码即可。
迅为i.mx6ull开发板引出了一个spi4接口,其提供的设备树文件中spi4被用来驱动rc522和sx127x两个模块。

spi4 {
                compatible = "spi-gpio";
                pinctrl-names = "default";
                pinctrl-0 = <&pinctrl_spi4>;

                status = "okay";
                gpio-sck = <&gpio5 11 0>;
                gpio-mosi = <&gpio5 10 0>;
                gpio-miso = <&gpio3 7 0>;
                cs-gpios = <&gpio3 22 0>;
                num-chipselects = <1>;
                #address-cells = <1>;
                #size-cells = <0>;
				
                rc522: rc522@0 {
                        compatible = "rc522";
                        gpio-controller;
                        spi-tx-bus-width = <4>;
                        spi-rx-bus-width = <4>;
                        reset-rc522 = <&gpio3 5 0>;
                        reg = <0>;
                        spi-max-frequency = <4000000>;
                };
        };

为了快速上手嵌入式linux平台spi接口,我打算先编写一个简单的spi driver直接与官方提供的设备树中的rc522属性相匹配。这个简单驱动主要包括模块的出入口函数,以及spi设备的probe与remove函数,并在probe函数做一些初步的spi读写操作。

static int oled12864_driver_init(void)
{
	int ret;
	printk("oled12864_driver init!\n");
	
	ret = spi_register_driver(&oled12864_driver);
	if(ret < 0){
		printk("spi_register_driver fail\n");
		return ret;
	}
	return 0;
}

static void oled12864_driver_exit(void)
{
	spi_unregister_driver(&oled12864_driver);
	printk("oled12864_driver exit!");
}

module_init(oled12864_driver_init);
module_exit(oled12864_driver_exit);
MODULE_LICENSE("GPL");
int oled12864_probe(struct spi_device *spi)
{
	int m,n;
	printk("oled12864_driver matching spi deivce in the device-tree!\n");

	spi->mode = SPI_MODE_0;		/* 驱动匹配成功后,设置spi模式 */
	spi_setup(spi);
	oled_device = spi;
...
...
...
static struct spi_driver oled12864_driver = {

	.driver = {
		.owner = THIS_MODULE,
		.name = "oled12864_drv",
		.of_match_table = oled12864_of_id,
	},
	.probe = oled12864_probe,
	.remove = oled12864_remove,
	.id_table = oled12864_id

};

按照事先设想,通过insmod装载该驱动后,在probe函数中打印一些信息以表示驱动和spi设备匹配成功。然而,实际上该驱动模块执行完入口函数后模块便没有了反应。

解决办法

首先想到的是不是用引脚号冲突或者引脚复用冲突。检查了一变设备树发现spi4对应的gpio口并没有使用在其他地方,几个引脚复用也只在spi4这里用到了。

pinctrl_spi4: spi4grp {
                        fsl,pins = <
                                MX6ULL_PAD_BOOT_MODE0__GPIO5_IO10        0x70a1		/*MOSI*/
                                MX6ULL_PAD_BOOT_MODE1__GPIO5_IO11        0x70a1		/*SCK*/
								MX6UL_PAD_LCD_DATA17__GPIO3_IO22  		0x80000000	/*CS*/
								MX6UL_PAD_LCD_DATA02__GPIO3_IO07        0x70a1		/*MISO*/
								MX6UL_PAD_LCD_DATA00__GPIO3_IO05         0x17059	/* rc522 reset*/
                        >;
                };

检查开发板的/sys/bus/spi/devices目录,也没有发现异常。于是,考虑是不是已经有驱动占用了spi4接口。进入linux源码根目录,通过make menuconfig配置内核源码,果不其然,在Device drivers->SPI support下找到了未被剔除的RC522 Module Driver support选项。
在这里插入图片描述

取消该驱动选项,并保存配置文件,保存好后会在内核目录生成一个.config文件。
迅为官方提供的编译脚本create.sh内容如下

!/bin/bash

export ARCH=arm

#export CROSS_COMPILE=/usr/local/arm/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin/arm-none-linux-gnueabi-

export CROSS_COMPILE=arm-linux-gnueabihf-

#make mrproper  # means CLEAN

make topeet_defconfig

#if   [ "$1" = "nand" ]
#then
#	cp arch/arm/boot/dts/imx6ul-14x14-evk_nand.dts arch/arm/boot/dts/imx6ul-14x14-evk.dts
#else
#	cp arch/arm/boot/dts/imx6ul-14x14-evk_emmc.dts arch/arm/boot/dts/imx6ul-14x14-evk.dts
#fi

make uImage LOADADDR=0x10008000 -j8

make modules

make topeet_emmc_4_3.dtb
make topeet_emmc_5_0.dtb
make topeet_emmc_7_0.dtb
make topeet_emmc_1024x600.dtb
make topeet_emmc_9_7.dtb
make topeet_emmc_10_1.dtb
make topeet_emmc_hdmi.dtb

make topeet_nand_4_3.dtb
make topeet_nand_5_0.dtb
make topeet_nand_7_0.dtb
make topeet_nand_1024x600.dtb
make topeet_nand_9_7.dtb
make topeet_nand_10_1.dtb
make topeet_nand_hdmi.dtb

cd ./arch/arm/boot/dts/
./create_dtb imx6ul_topeet_nand.dtb topeet_nand_4_3.dtb topeet_nand_7_0.dtb topeet_nand_10_1.dtb topeet_nand_1024x600.dtb topeet_nand_5_0.dtb topeet_nand_9_7.dtb topeet_nand_hdmi.dtb

其中make topeet_defconfig命令就是以topeet_defconfig的配置编译内核源码,其文件路径为./arch/arm/configs/topeet_defconfig。我们需要将更新后的配置文件.config作为新的topeet_defconfig文件。

cp -r .config arch/arm/configs/topeet_defconfig

然后用脚本./create.sh编译内核以及设备树,通过tftp启动更新后的linux内核,insmod装载spi驱动。可以看到,spi设备的probe函数成功执行。
在这里插入图片描述

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

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

相关文章

Android进阶 四大组件的工作过程(四):ContentProvider的工作过程

Android进阶 四大组件的工作工程&#xff08;四&#xff09;&#xff1a;ContentProvider的工作过程 导语 本篇是介绍四大组件的最后一篇文章&#xff0c;前三篇文章里我们已经介绍了Activity&#xff0c;Service以及Broadcast的工作流程&#xff0c;那么这篇文章我们就来介绍…

【数据结构与算法分析】一文搞定插入排序、交换排序、简单选择排序、合并排序的代码实现并给出详细讲解

文章目录 排序相关的基本概念排序算法及其实现插入排序直接插入排序折半插入排序希尔排序 交换排序冒泡排序快速排序 合并排序归并排序简单选择排序 算法比较 排序相关的基本概念 排序&#xff1a;将数组中所有元素按照某一顺序(从小到大或从大到小)重新排列的过程。排序算法的…

DJ2-5 内容分发网络 CDN

目录 单一的大规模数据中心 内容分发网络 CDN 单一的大规模数据中心 存在三个问题&#xff1a; ① 如果客户远离数据中心&#xff0c;服务器到客户的分组将跨越许多通信链路并很可能通过许多 ISP&#xff0c;给用户带来恼人的时延。 ② 流行的视频很可能经过相同的通信链路…

[C++11] 智能指针

长路漫漫&#xff0c;唯剑作伴。 目录 长路漫漫&#xff0c;唯剑作伴。 为什么需要智能指针 RAII 使用RAII思想管理内存 重载 * 和-> 总结一下智能指针的原理&#xff1a; C的智能指针和拷贝问题 auto_ptr (C98) ​编辑 auto_ptr的实现原理…

EmGUCV中类函数 FastFeatureDetector使用详解

FastFeatureDetector Class 释义&#xff1a;FAST&#xff08;加速检测特&#xff09;关键点检测器&#xff0c;源自 E. Rosten ("Machine learning for high-speed corner detection, 2006). 继承关系&#xff1a;Emgu.CV.Features2D.FastFeatureDetector 派生&#xff…

记录好项目D5

记录好项目 你好呀&#xff0c;这里是我专门记录一下从某些地方收集起来的项目&#xff0c;对项目修改&#xff0c;进行添砖加瓦&#xff0c;变成自己的闪亮项目。修修补补也可以成为毕设哦 本次的项目是 商品信息管理系统 技术栈&#xff1a;SpringBoot Mybatis Thymelea…

MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性

\ &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭…

细谈容器化技术实现原理--以Docker为例

目录 一、Docker解决了什么 二、容器的发展过程 三、容器基础 3.1. 容器实现的原理&#xff1a; ⚠️原理详解&#xff1a; 3.1.1. Namespace 3.1.2. Cgroups 3.1.3. chroot 四、Volume 4.1. Docker是如何做到把一个宿主机上的目录或者文件&#xff0c;挂载到容器里面…

4. 数组更新检测

4.1 v-for更新监测 当v-for遍历的目标结构改变, Vue触发v-for的更新 情况1: 数组翻转 情况2: 数组截取 情况3: 更新值 口诀: 数组变更方法, 就会导致v-for更新, 页面更新 数组非变更方法, 返回新数组, 就不会导致v-for更新, 可采用覆盖数组或this.$set() 这些方法会触发数组改…

基于深度学习的高精度鸽子检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度鸽子检测识别系统可用于日常生活中或野外来检测与定位鸽子目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的鸽子目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测模型…

XSS注入——反射性XSS

xss注入的攻击步骤&#xff1a; 1.查找可能存在的注入点&#xff08;搜索框&#xff0c;留言板&#xff0c;注册&#xff09; 2.观察输出显示位置&#xff1a; html&#xff1a; 尖括号外部&#xff0c; 尖括号内部: 引号内部》闭合&#xff0…

Django | 基于pycharm的django配置52张全流程截图,红星给你一步一步的男妈妈式教学

演示版本&#xff1a;【windows系统】python3.10pycharm2023.1.2django4.2.2 &#xff08;本教程全程在虚拟机中演示&#xff0c;读者无需配置虚拟机&#xff0c;直接按教程安装即可&#xff09; 目录 1.搞到必要的安装包 2.事先准备 3.安装chrome浏览器&#xff08;也可以…

国产MCU-CW32F030开发学习--按键检测

国产MCU-CW32F030开发学习–按键检测 bsp_key 按键驱动程序用于扫描独立按键&#xff0c;具有软件滤波机制&#xff0c;采用 FIFO 机制保存键值。可以检测 如下事件&#xff1a; 按键按下。 按键弹起。 长按键。 长按时自动连发。 我们将按键驱动分为两个部分来介绍&#xff…

C语言学习笔记:顺序结构

✨博文作者&#xff1a;烟雨孤舟 &#x1f496; 喜欢的可以 点赞 收藏 关注哦~~ ✍️ 作者简介: 一个热爱大数据的学习者 ✍️ 笔记简介&#xff1a;作为大数据爱好者&#xff0c;以下是个人总结的学习笔记&#xff0c;如有错误&#xff0c;请多多指教&#xff01; 目录 程序与…

《面试1v1》Spring基础

&#x1f345; 作者简介&#xff1a;王哥&#xff0c;CSDN2022博客总榜Top100&#x1f3c6;、博客专家&#x1f4aa; &#x1f345; 技术交流&#xff1a;定期更新Java硬核干货&#xff0c;不定期送书活动 &#x1f345; 王哥多年工作总结&#xff1a;Java学习路线总结&#xf…

浅谈微前端

本文呢是我梳理的一个扫盲文&#xff0c;由于最近团队准备使用微前端对项目进行改造&#xff0c;所以我呢就先浅了解一下&#xff1a; 微前端到底是什么&#xff1f; 为什么要使用微前端&#xff1f; 都有哪些微前端方案&#xff1f; 微前端有什么不好的地方吗&#xff1f; 通过…

48 最佳实践-性能最佳实践-Guest-Idle-Haltpoll

文章目录 48 最佳实践-性能最佳实践-Guest-Idle-Haltpoll48.1 概述48.2 操作指导 48 最佳实践-性能最佳实践-Guest-Idle-Haltpoll 48.1 概述 为了保证公平性及降低功耗&#xff0c;当虚拟机vCPU空闲时&#xff0c;虚拟机将执行WFx/HLT指令退出到宿主机中&#xff0c;并触发上…

计算机视觉 - 基于黄金模板比较技术的缺陷检测

一、黄金模板比较概述 基于黄金模板比对的检测是一种常见的视觉应用。当进行缺陷检查而其他缺陷检测方法是不可行的时候,使用金模板比较。另外当物体的表面或物体的形状非常复杂时,此技术特别有用。 虽然说黄金模板比较的技术的思路很简单,但是真正落地实施确不是一件十分容…

广告数仓:数仓搭建(二)

系列文章目录 广告数仓&#xff1a;采集通道创建 广告数仓&#xff1a;数仓搭建 广告数仓&#xff1a;数仓搭建(二) 文章目录 系列文章目录前言DWD层创建1.建表广告事件事实表 2.数据装载初步解析日志解析IP和UA标注无效流量编写脚本 总结 前言 这次我们完成数仓剩下的内容 D…

Web服务器群集:Web基础与HTTP协议

目录 一、理论 1.Web基础 2.HTTP协议 二、实验 1.浏览本地HTML页面 三、总结 一、理论 1.Web基础 &#xff08;1&#xff09;域名和DNS ① 域名 网络是基于TCP/IP 协议进行通信和连接的&#xff0c;每一台主机都有一个唯一的标识&#xff08;固定的IP地 址&#xff0…