imx6 Linux Kernl添加spidev的设备节点
来源:互联网 发布:广数螺纹编程格式 编辑:程序博客网 时间:2024/06/01 10:15
一、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 = <&gpio3 19 0>; pinctrl-names = "default"; pinctrl-0 = <&pinctrl_ecspi1 &pinctrl_ecspi1_cs>; 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 >; };
- 1
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, }
- 1
添加支持新的设备:
{ .compatible = "fsl,imx6q-ecspi", .data = &imx6q_ecspi_devtype_data, }
- 1
这里面的名字一定要与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;}
- 1
当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 twd17: 0 0 0 0 GPC 55 Level i.MX Timer Tick22: 226 0 0 0 GPC 26 Level 2020000.serial24: 33 0 0 0 GPC 35 Level 2018000.ecspi
- 1
这些信息不用我们去配置,在官方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 = <&clks IMX6Q_CLK_ECSPI5>, <&clks IMX6Q_CLK_ECSPI5>; clock-names = "ipg", "per"; dmas = <&sdma 11 7 1>, <&sdma 12 7 2>; dma-names = "rx", "tx"; status = "disabled";};
- 1
这个文件中很多设备都是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/
- imx6 Linux Kernl添加spidev的设备节点
- Linux Kernl添加spidev的设备节点
- Linux设备驱动--添加设备节点
- linux 2.6.x spi驱动,spidev,使用从设备
- linux驱动自动添加设备节点
- 关于2.6 的 spi驱动,spidev,使用从设备.
- 关于2.6 的 spi驱动,spidev,使用从设备.
- linux设备节点的理解
- 在Zynq 7000平台上使用Linux spidev.c驱动,调试spi设备
- spidev
- Linux加载DTS设备节点的过程
- linux字符设备驱动之设备节点的自动创建
- Linux设备节点
- linux设备节点
- linux设备节点
- Linux设备节点
- linux设备节点
- linux中的设备节点
- [微信小程序]鼠标事件
- Js中非构造函数的继承(深拷贝浅拷贝)
- 介绍 redis-Bit-Map 的相关命令和常用场景
- Codeforces835D-Palindromic characteristics(DP)
- MongoDB 聚合操作
- imx6 Linux Kernl添加spidev的设备节点
- maven 配置windows环境变量
- 【HDU 6060 RXD and dividing】+ DFS
- 分清数学库与浮点运算
- Multiple dex files define Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat$Ac
- 【51Nod】1085
- 奥威数据可视化平台Power-BI -RFM分析找出活跃客户
- 事务策略
- ansible 管理索引