linux下spi添加设备,Linux Kernl添加spidev的设备节点

一、spidev介绍

如果在内核中配置spidev,会在/dev目录下产生设备节点,通过此节点可以操作挂载在该SPI总线上的设备。用户空间通过该节点可以访问内核空间。

二、配置spidev设备步骤

在i.MX6,Kernel 4.1.15上配置spidev的支持。

1、配置dts支持spi

根据spi的连接原理图配置对应的imx6qp-xxx.dts,如:

&ecspi1 {

compatible = "fsl,imx6q-ecspi"; // 匹配spi-imx驱动

fsl,spi-num-chipselects = <1>;

cs-gpios = ;

pinctrl-names = "default";

pinctrl-0 = ;

status = "okay";

spidev@0x00 { // 必须添加spidev的设备节点

compatible = "spidev";

spi-max-frequency = <20000000>;

reg = <0>;

};

};

pinctrl_ecspi1: ecspi1grp {

fsl,pins = <

MX6QDL_PAD_EIM_D17__ECSPI1_MISO 0x100b1

MX6QDL_PAD_EIM_D18__ECSPI1_MOSI 0x100b1

MX6QDL_PAD_EIM_D16__ECSPI1_SCLK 0x100b1

>;

};

pinctrl_ecspi1_cs: ecspi1cs {

fsl,pins = <

MX6QDL_PAD_EIM_D19__GPIO3_IO19 0x80000000

>;

};

2、配置 imx6q-ecspi 的支持

在drivers/spi/spi-imx.c的static const struct of_device_id spi_imx_dt_ids[];中仿照

{ .compatible = "fsl,imx6ul-ecspi", .data = &imx6ul_ecspi_devtype_data, }

添加支持新的设备:

{ .compatible = "fsl,imx6q-ecspi", .data = &imx6q_ecspi_devtype_data, }

这里面的名字一定要与dts中的compatible字段保持一致。如果platform设备与驱动匹配上了,那么就会执行drivers/spi/spi-imx.c的spi_imx_probe()函数,在probe()函数中会通过of接口获取dts中的配置,比如cs-gpios、num-chipselects 等信息。并且还会通过platform_get_resource()和

devm_ioremap_resource()获取io_base以及映射io_base到内存空间去,以及获取irq等信息。如下:

res = platform_get_resource(pdev, IORESOURCE_MEM, 0);

spi_imx->base = devm_ioremap_resource(&pdev->dev, res);

if (IS_ERR(spi_imx->base)) {

ret = PTR_ERR(spi_imx->base);

goto out_master_put;

}

irq = platform_get_irq(pdev, 0);

if (irq < 0) { ret = irq; goto out_master_put; } ret = devm_request_irq(&pdev->dev, irq, spi_imx_isr, 0,

dev_name(&pdev->dev), spi_imx);

if (ret) {

dev_err(&pdev->dev, "can't get irq%d: %d\n", irq, ret);

goto out_master_put;

}

当probe()成功后,驱动正确加载,在板子上输入#cat /proc/iomem命令可以看到当前io mem的情况,如下:

uid=0 gid=1007@Android:/ #cat /proc/iomem

00110000-00111fff : /soc/dma-apbh@00110000

00130000-00133fff : galcore register region

00134000-00137fff : galcore register region

00905000-0093ffff : 905000.sram

00940000-0095ffff : 940000.sram

00960000-0097ffff : 960000.sram

02018000-0201bfff : /soc/aips-bus@02000000/spba-bus@02000000/ecspi@02018000

02020000-02023fff : /soc/aips-bus@02000000/spba-bus@02000000/serial@02020000

0209c000-0209ffff : /soc/aips-bus@02000000/gpio@0209c000

020a0000-020a3fff : /soc/aips-bus@02000000/gpio@020a0000

可见,ecspi使用的io 内存映射的空间是从02018000-0201bfff。如果我们使用#cat /proc/interupts的命令可以查看注册中断的情况,如:

uid=0 gid=1007@Android:/ #cat /proc/interrupts

CPU0 CPU1 CPU2 CPU3

16: 1358 419 1274 1059 GIC 29 Edge twd

17: 0 0 0 0 GPC 55 Level i.MX Timer Tick

22: 226 0 0 0 GPC 26 Level 2020000.serial

24: 33 0 0 0 GPC 35 Level 2018000.ecspi

这些信息不用我们去配置,在官方BSP包中的dts已配置好,我们只需要include对应的dts并且在那基础上做自己的修改。上述配置信息就在 imx6q.dtsi 文件中

ecspi1: ecspi@02018000 {

#address-cells = <1>;

#size-cells = <0>;

compatible = "fsl,imx6q-ecspi", "fsl,imx51-ecspi";

reg = <0x02018000 0x4000>;

interrupts = <0 35 IRQ_TYPE_LEVEL_HIGH>;

clocks = ,

;

clock-names = "ipg", "per";

dmas = , ;

dma-names = "rx", "tx";

status = "disabled";

};

这个文件中很多设备都是disabled的,如果我们需要使用,不必再这里设置okay,因为通常情况下客户会自己添加一个imx6qp-xxx.dts的文件,然后再#include "imx6q.dtsi",在imx6qp-xxx.dts添加自己所需要的设备之后会设置status = "okay",此时会将imx6q.dtsi中关于status的信息覆盖同名参数并且合并其他的信息。如imx6qp-xxx.dts的配置一样。

3、spidev驱动

上述配置spidev设备之后,就要配置添加spidev驱动。在 arch/arm/configs/xxx_defconfig中添加CONFIG_SPI_SPIDEV=y那么就会编译drivers/spi/spidev.c文件,该文件的内容是注册一个spidev驱动。该驱动是一个字符设备驱动。

如果设备与驱动匹配,那么就会执行spidev_probe()的内容。在spidev_probe()函数中会调用device_create()成功后在 /dev 目录下就会生成 spidev 相关的设备节点。

4、错误信息

虽然可以生成 /dev/spidevA.B 的设备节点,但是kernel msg打印如下错误:

spidev spi4.0: buggy DT: spidev listed directly in DT

0818b9ca8b590ca3270a3433284dd417.png

之所以出现上述警告信息,是因为在 /driver/spi/spidev.c中的spidev_probe()函数中做如下的检测:

0818b9ca8b590ca3270a3433284dd417.png

个人觉得此处没必要做这样的检查。虽说spidev是虚拟出来的一个设备,但是它确实是一个设备,既然是设备,就应该在设备树上体现出来。

因为认为 spidev 设备是Linux实现的虚拟设备而不是真正的关于硬件描述的设备,不应该放到DT里面。解决上述问题可以参照如下文章:

http://yurovsky.github.io/2016/10/07/spidev-linux-devices/

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

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

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

相关文章

Android studio Jin开发生成so文件的具体步骤

粉丝提问&#xff1a; 博主解答&#xff1a; 帖子链接&#xff1a;https://blog.csdn.net/wangsfine/article/details/51445199

linux中改变文件大小,Linux 改变文件大小的方法

函数原型&#xff1a;#include int ftruncate(int fd, off_t length); //改变文件大小为length指定大小;返回值 执行成功则返回0&#xff0c;失败返回-1。函数ftruncate会将参数fd指定的文件大小改为参数length指定的大小。参数fd为已打开的文件描述词&#xff0c;而且必须是以…

apktool重新打包,error:No resource identifier found for attribute ‘compileSdkVersionCodename‘ in package

报错日志:AndroidManifes.xml :1 error:No resource identifier found for attribute compileSdkVersionCodename in package ‘android’ 粉丝提问: 报错图: 博主解答:

终端-进入云服务器

解决办法: 1.先进入管理员模式: 2.下一步&#xff0c;链接服务器。 3.已经连接上服务器&#xff1a; 4.找到云服务器的项目路径: 在这里&#xff1a; 我们可以在cd空格/ 按Tab寻找下个文件夹&#xff0c;也可以输入ls查看文件夹。转载于…

Android studio 清除缓存数据的步骤

导读:在eclipse的当中进行运行Android的运用的程序的时候,就会产生内存缓存的信息,而eclipse是可以直接点击停止运行程序,然后点击清除缓存,就可以解决了这个问题,而Android studio却不能直接点击停止运行的,而只能通过其它的方式来清除Android studio中的缓存。 可以看…

linux 函数 文件校验,Linux中的文件效验命令

在网络传输、设备之间转存、复制大文件等时&#xff0c;可能会出现传输前后数据不一致的情况。这种情况在网络这种相对更不稳定的环境中&#xff0c;容易出现。那么校验文件的完整性&#xff0c;也是势在必行的。md5sum命令用于生成和校验文件的md5值&#xff0c;MD5全称报文摘…

设置按钮5秒后可以点击下一步||5秒后自动关闭网页

场景:业务需要在点击拍摄的时候提示一个用户须知页面,5秒后可以点击下一步。这属于一个js计时器的功能。这里用jQuery实现一下 效果图: html <div style="text-align: center;"><input type="button" value="下一步" id="next…

Codeforces Round #344 (Div. 2) B. Print Check

题意&#xff1a; 给你一个n*m一开始全是0的矩阵&#xff0c;然后又q次询问 每次询问给你三个字母 op,a,b 将第a行变成b 将第a列变成b 然后让你输出Q次询问后&#xff0c;这个矩阵长什么模样 思路&#xff1a;每个格子记录两个状态&#xff0c;区分横竖。 1 #include<cstdio…

JSP + Struts + Hibernate + Spring+MySQL+Myeclipse实现固定资产管理系统

导读:随着计算机信息技术的发展以及对资产、设备的管理科学化、合理化的高要求,利用计算机实现设备及资产的信息化管理已经显得非常重要。固定资产管理系统是一个单位不可缺少的部分。但一直以来人们使用传统的人工方式管理固定资产的信息,这种管理方式存在着许多缺点,这对…

T4模板之菜菜鸟篇

一、废话 T4(Text Template Transformation Toolkit)是微软官方在VisualStudio 2008中开始使用的代码生成引擎。在 Visual Studio 中&#xff0c;“T4 文本模板”是由一些文本块和控制逻辑组成的混合模板&#xff0c;它可以生成文本文件。 在 Visual C# 或 Visual Basic 中&…

MyEclipse+JavaEE+jsp+sqlsever实现产品售后服务系统

导读:我国信息产业、企业售后服务发展迅速,电商的发展超出了所有人都想象,与此同时也带来了诸多的问题。飞速发展的交易额,带来了大量的GDP增长,然而光鲜的背后是每天无数客服手忙脚乱的为顾客服务。由于顾客对自身生活质量要求越来越高,售后管理业必须随着人们生活水平的…

前端工程师必须知道的用javaScript刷新当前页面的3种方法

业务场景:APP列表页右上角有一个立即刷新按钮,点击立即刷新需要刷新当前页面。下面简单实现几个DEMO 效果图 目录 方法1:reload() 方法 方法2:replace() 方法

【BZOJ1002】[FJOI2007]轮状病毒 递推+高精度

Description 给定n(N<100)&#xff0c;编程计算有多少个不同的n轮状病毒。 Input 第一行有1个正整数n。 Output 将编程计算出的不同的n轮状病毒数输出 Sample Input 3Sample Output 16HINT Source Solution&#xff1a;推导不会&#xff0c;看不懂&#xff0c;知道了公式f[i…

新年将至, 程序员如何以代码送出新春祝福

导读:农历新年将至,祝福的话汇成千言万语都寄托在贺卡之中,也许今年你受到了很多的挫折,又或者是顺顺利利度过了一年。但不管怎么样,不管是哭与笑,人生的年轮都已经转过了一圈。我们唯有继续向前走,不要回头,未来的自己取决于现在的自己。有时候一句不经意的问候,一句…

身份证/异地身份证在北京办理的解决办法

今年4月18号身份证就到期啦,赶紧抽个时间去补办一个,这种事情一般只能选在工作日,你工作别人也工作的时间段。这个是初中时期弄得身份证,都10年啦,这次在北京补办一下,老家是安徽的。又逢今年在京过年,我太难了。 需要什么材料? 一般来说需要户口本,居住证,还有快要…

jsf集成spring_JSF 2,PrimeFaces 3,Spring 3和Hibernate 4集成项目

jsf集成spring本文展示了如何集成JSF2&#xff0c;PrimeFaces3&#xff0c;Spring3和Hibernate4技术。 它为Java开发人员提供了一个通用的项目模板。 另外&#xff0c;如果Spring不用于业务和数据访问层&#xff0c;则可以提供JSF – PrimeFaces和Hibernate集成项目。 二手技…

linux rc4,Linux kernel 4.8-rc4发布下载,正式版越来越近

距离第三个候选版发布一周时间&#xff0c;Linus Torvalds于今天宣布了Linux Kernel 4.8-rc4&#xff0c;喜欢尝鲜的用户可以下载体验了。Linus Torvalds在邮件中称&#xff0c;Linux kernel 4.8-rc4是目前为止更新幅度最小的一个RC版本了&#xff0c;这也意味着随着正式版距离…

程序员表白,不光需要“技术”,更需要勇气!

回忆起我们的点点滴滴&#xff0c;我们也有美好回忆。程序员应该如何表白呢 &#xff1f;很大一部分是不够自信&#xff0c;怕穷&#xff0c;怕拒绝&#xff0c;其实更多的你可能需要的是一份勇气&#xff0c;爱&#xff0c;要大声说出来&#xff01;恰逢官方正文&#xff0c;在…

android 批量查找view,Android Recyclerview实现多选,单选,全选,反选,批量删除的功能

效果图如下:recyclerview 实现多选,单选,全选,反选,批量删除的步骤1.在recyclerview布局中添加上底部的全选和反选按钮,删除按钮,和计算数量等控件2.这里选中的控件没有用checkbox来做,用的是imageview,选中和不选中其实是两张图片3.默认是不显示选中的控件的,点击编辑的时候显…

盘点和程序员相关的那些事,让你不再被割韭菜,薅羊毛!

如今的我们处在一个信息爆炸的时代&#xff0c;光埋头苦恼的闭门造车已经不能满足我们程序员的日常开销啦&#xff0c;因此需要密切关注和自己相关的那些事&#xff01; 目录 1.成功绝非偶然 2.你们公司几号发工资就代表你公司所处的级别 3.各大公司HR对学历的评价&#xff1…