imx6 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 = <&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.cstatic 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.cspi_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      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
   
   
  • 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()函数中做如下的检测:
1

个人觉得此处没必要做这样的检查。虽说spidev是虚拟出来的一个设备,但是它确实是一个设备,既然是设备,就应该在设备树上体现出来。
因为认为 spidev 设备是Linux实现的虚拟设备而不是真正的关于硬件描述的设备,不应该放到DT里面。解决上述问题可以参照如下文章:
http://yurovsky.github.io/2016/10/07/spidev-linux-devices/

3

4

5

6

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
IMX6ULL是一款高性能、低功耗的嵌入式系统芯片,它可以运行Linux操作系统。下面是IMX6ULL Linux编译的步骤: 1. 安装必要的软件包 在编译IMX6ULL Linux之前,需要安装一些必要的软件包,包括gcc、make、git、uboot等。可以使用以下命令在Linux系统上安装这些软件包: ``` sudo apt-get install gcc make git uboot-tools ``` 2. 获取源代码 可以从官方网站或者Github上获取IMX6ULL的Linux源代码。以下是从Github上获取源代码的命令: ``` git clone https://github.com/Freescale/fsl-arm-yocto-bsp.git ``` 3. 配置编译环境 进入源代码目录,执行以下命令配置编译环境: ``` source setup-environment build ``` 该命令会在当前目录下创建一个名为build的目录,并在该目录中配置编译环境。 4. 编译Linux内核 在build目录中,执行以下命令编译Linux内核: ``` bitbake linux-imx ``` 该命令会启动编译器并开始编译内核。编译完成后,可以在build目录下的tmp/deploy/images/imx6ull目录中找到生成的内核文件。 5. 编译rootfs 执行以下命令编译rootfs: ``` bitbake core-image-minimal ``` 该命令会编译一个最小的rootfs,并在build目录下的tmp/deploy/images/imx6ull目录中生成rootfs镜像文件。 6. 烧录镜像文件 将生成的内核文件和rootfs镜像文件烧录到IMX6ULL开发板的存储设备中,即可完成IMX6ULL Linux系统的编译和烧录。 以上就是IMX6ULL Linux编译的基本步骤,具体的编译过程可能会因为不同的开发板、不同的Linux版本等因素而有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值