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;而且必须是以…

Ubuntu下使用SVN

Ubuntu下使用SVN SVN作为日常开发中不可缺少的工具&#xff0c;今天终于开始在Ubuntu下使用了。 1、首先需要安装SVN。Ubuntu下的SVN安装十分简单&#xff0c;sudo apt-get install subversion&#xff0c;然后根据提示一步一步&#xff0c;就完成了SVN的安装&#xff1b; 2、检…

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’ 粉丝提问: 报错图: 博主解答:

linux弹性网卡,将弹性网卡附加到 ECS 实例上之后如何配置弹性网卡

本文在介绍将弹性网卡附加到 ECS 实例上之后如何配置弹性网卡的基础上&#xff0c;重点探讨了其具体步骤&#xff0c;本文内容很紧凑&#xff0c;希望大家耐心学习。配置 ECS 实例的弹性网卡如果您的实例使用以下几种镜像&#xff0c;您不需要手工配置弹性网卡(ENI)&#xff1a…

vaadin_嵌入式码头,Vaadin和焊接

vaadin当我开发Web应用程序时&#xff0c;我希望能够从Eclipse快速启动它们&#xff0c;而不必依赖各种重量级的tomcat或glassfish插件。 因此&#xff0c;我经常要做的就是创建一个可以直接从Eclipse直接运行的基于Java的简单Jetty启动器。 该启动器会在几秒钟内启动&#xff…

终端-进入云服务器

解决办法: 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全称报文摘…

为Java应用程序编写数据驱动的测试

JUnit是一个功能非常强大的测试框架&#xff0c;它不仅为其用户提供了编写快速简便的测试的功能&#xff0c;而且还为用户提供了扩展它并使其按其期望的方式工作的机会。 在JUnit之上构建了许多框架&#xff0c;这些框架为目标受众提供了各种易用的功能。 EasyTest是这样一种框…

为《31天成为IT服务达人》征求正式名字

写书时。没细想书的名字&#xff0c;仅仅是在想出本能够让同行或未来同行高速入门的书&#xff0c;如今想来还是应正式给他取个名&#xff0c;请朋友们帮忙哟 转载于:https://www.cnblogs.com/bhlsheji/p/5241848.html

设置按钮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…

linux数据包注释,关于 linux中TCP数据包(SKB)序列号的小笔记

关于 SKB序列号的小笔记为了修改TCP协议&#xff0c;现在遇到了要改动tcp分组的序列号&#xff0c;但是只是在tcp_sendmsg函数中找到了SKB的end_seq 一直没有找到seq不清楚在那里初始化了&#xff0c;就跟踪了分配SKB的函数 sk_stream_alloc_skb()还是没有找到&#xff0c;最…

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

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

java高效复制文件并移动_Java 7:复制和移动文件和目录

java高效复制文件并移动这篇文章是我对Java 7 java.nio.file软件包的系列文章的继续&#xff0c;这次涵盖了文件的复制和移动以及完整的目录树。 如果您曾经对Java缺少copy和move方法感到沮丧&#xff0c;那么请继续阅读&#xff0c;以免麻烦。 涵盖范围中包括非常有用的Files.…

MyEclipse+Tomcat+Java+MySQL实现企业员工信息管理系统

导读:随着信息技术的日益发展已深入到社会的各个角落,各个大的企业,都充分意识到传统的手工管理模式已经逐渐不能适应时代的发展,为了更好的发展,纷纷开发适合自己的管理系统。不管大企业。各种员工信息的小企业也是如此,企业的管理层也深深意识到这一点,以前管理大多为…

T4模板之菜菜鸟篇

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

linux动态库ppt,LINUX系统中动态链接库创建与使用补充_区块链白皮书代写|市场计划书项目PPT设计_Tbleg...

区块链白皮书代写大家都知道&#xff0c;在WINDOWS系统中有很多动态链接库(以.DLL为后缀文件&#xff0c;DLL即Dynamic Link Library)。这种动态链接库&#xff0c;和静态函数库不同&#xff0c;它里面函数并不是执行程序本身一部分&#xff0c;而是根据执行程序需要按需装入&a…

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

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