https://blog.csdn.net/wxxgoodjob/article/details/76572346 一、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 0x100b1MX6QDL_PAD_EIM_D18__ECSPI1_MOSI 0x100b1MX6QDL_PAD_EIM_D16__ECSPI1_SCLK 0x100b1>;};pinctrl_ecspi1_cs: ecspi1cs {fsl,pins = <MX6QDL_PAD_EIM_D19__GPIO3_IO19 0x80000000>;}; 2、配置 imx6q-ecspi 的支持在 { .compatible = "fsl,imx6ul-ecspi", .data = &imx6ul_ecspi_devtype_data, } 添加支持新的设备: { .compatible = "fsl,imx6q-ecspi", .data = &imx6q_ecspi_devtype_data, } 这里面的名字一定要与dts中的compatible字段保持一致。如果platform设备与驱动匹配上了,那么就会执行 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()成功后,驱动正确加载,在板子上输入
可见,ecspi使用的io 内存映射的空间是从02018000-0201bfff。如果我们使用 uid=0 gid=1007@Android:/ #cat /proc/interruptsCPU0 CPU1 CPU2 CPU316: 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 这些信息不用我们去配置,在官方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";}; 这个文件中很多设备都是disabled的,如果我们需要使用,不必再这里设置okay,因为通常情况下客户会自己添加一个imx6qp-xxx.dts的文件,然后再 3、spidev驱动上述配置spidev设备之后,就要配置添加spidev驱动。在 4、错误信息虽然可以生成 /dev/spidevA.B 的设备节点,但是kernel msg打印如下错误:
之所以出现上述警告信息,是因为在 个人觉得此处没必要做这样的检查。虽说spidev是虚拟出来的一个设备,但是它确实是一个设备,既然是设备,就应该在设备树上体现出来。 |
|