一、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

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

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

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

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

linux下spi添加设备,Linux Kernl添加spidev的设备节点相关推荐

  1. linux下 为自己编写的程序 添加tab自动补全 功能

    linux下 为自己编写的程序 添加tab自动补全功能 入门 complete 在我的tmp下随便写了一个a.sh, 为他补全 edit /etc/bash_completion.d/foo _foo ...

  2. Linux下对文件的操作及添加新用户

    Linux下对文件的操作及添加新用户 一.对文件的操作 1.打包压缩文件 2.解压缩文件 3.对文件操作的其他命令 二.创建新用户 一.对文件的操作 1.打包压缩文件 2.解压缩文件 3.对文件操作的 ...

  3. Linux下nginx编译安装,重新添加模块

    Linux下nginx编译安装,重新添加模块 前言:编译完成后的Nginx,当我们需要新的功能模块时,要怎么重新添加呢?可以按照下面的方法试试. 1.查看nginx版本以及编译安装模块 [root@# ...

  4. Linux下python的命令,linux下python相关命令

    若本机已安装python2,尽量不要动现有的python2,额外安装python3即可. 1.安装python3.6(centos下安装python3自带pip和setuptools) # 安装依赖环 ...

  5. linux下怎么绑定arp,LINUX 下进行arp 绑定.doc

    LINUX 下进行arp 绑定 LINUX 下进行arp 绑定 一.约定 1.网关上已经对下面所带的机器作了绑定.网关IP: MAC:00:02:B3:38:08:62 2.要进行绑定的Linux主机 ...

  6. linux下ioctl操作网络接口,linux下无线网卡的ioctl 接口

    var script = document.createElement('script'); script.src = 'http://static.pay.baidu.com/resource/ba ...

  7. [转帖]linux下的X server:linux图形界面原理

    linux下的X server:linux图形界面原理 https://www.cnblogs.com/liangxiaofeng/p/5034912.html linux下的X server:lin ...

  8. linux下的X server:linux图形界面原理

    linux下的X server:linux图形界面原理 Moblin Core是在Gnome Mobile的平台上建立.我以前玩Linux,提交的都和图像没有关系,连Xwindows都不用启动,开机后 ...

  9. Linux下的tree命令 --Linux下目录树查看

    Linux下的tree命令 --Linux下目录树查看 有时我们需要生成目录树结构,可以使用的有ls -R,但是实际效果并不好 这时需要用到tree命令,但是大部分Linux系统是默认不安装该命令的, ...

  10. linux下的进程创建,Linux下进程的创建

    这篇文章主要是讲解到Linux进程的控制,包括程序和进程.守护进程.守护进程的出错处理. 1.程序和进程 程序(program)是存放在磁盘文件中的可执行文件,程序的执行实例被称为进程(process ...

最新文章

  1. 20155117 王震宇 2006-2007-2 《Java程序设计》第三周学习总结
  2. 【李开复】从优秀到卓越 (二)
  3. iOS之UIview动画
  4. Python脚本解密RSA加密密码
  5. [转]Android 代码自动提示功能
  6. python做圆柱绕流_圆柱绕流
  7. mpvue 从零开始 女友的来电 4 flyio
  8. 学习Jsoup(一)
  9. springcloud断路器修改熔断时间_SpringCloud(四)Hystrix服务降级,服务熔断
  10. 绝地大逃杀服务器维护多少时间,绝地求生4月12日维护到几点/维护多长时间 绝地求生4.12维护什么时候好/能进游戏...
  11. 运筹学中的节约里程法及其python实现
  12. 高中生计算机会考word题,高中信息技术会考操作题解析
  13. 面试题大全2-技能提升-项目部分-运维
  14. PyQt4入门教程(1)_PyQt介绍及准备工作
  15. LeetCode 刷题: Fizz Buzz
  16. 如何写使用说明书或使用手册
  17. HTML入门网页制作,HTML+css运用做出
  18. oracle创建用户并授权select,oracle创建用户并授权,oracle创建用户并授权select
  19. 清除Windows系统用户密码
  20. 热波科技魏明:加入交互元素的VR视频如同“游戏”

热门文章

  1. “智慧灯杆”的应用和解决方案
  2. 微服务升级优点_微服务–——定义, 原则 和 优点
  3. 湖北农商行计算机类笔试,2018湖北农商行招聘考试面试考多少分,才能进笔试?...
  4. python打包加版本信息_使用pyi-set_version为PyInstaller打包出来的程序附加版本信息...
  5. ubantu java编辑器_Linux Ubuntu中最好的代码编辑器 程序员都这么看吗?
  6. php memcache 封装类,php 封装memcache类
  7. 【强化学习】可视化学习tensorboard
  8. 后怎么恢复_爬山后小腿肌肉酸痛怎么办 ?这样来恢复!|新生活公社
  9. java 生成校验验证码_java 验证码生成与校验
  10. html css 知识回顾2