如果在内核中配置spidev,会在/dev目录下产生设备节点,通过此节点可以操作挂载在该SPI总线上的设备。用户空间通过该节点可以访问内核空间。
配置spidev设备步骤
在i.MX6,Kernel 4.1.15上配置spidev的支持。
配置dts支持spi
根据spi的连接原理图配置对应的imx6qp-xxx.dts
,如:
1 | &ecspi1 { |
配置 imx6q-ecspi 的支持
在drivers/spi/spi-imx.c
的static const struct of_device_id spi_imx_dt_ids[];
中仿照
1 | { .compatible = "fsl,imx6ul-ecspi", .data = &imx6ul_ecspi_devtype_data, } |
添加支持新的设备:
1 | { .compatible = "fsl,imx6q-ecspi", .data = &imx6q_ecspi_devtype_data, } |
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等信息。如下:1 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
当probe()成功后,驱动正确加载,在板子上输入#cat /proc/iomem
命令可以看到当前io mem的情况,如下:
1 | uid=0 gid=1007@Android:/ #cat /proc/iomem |
可见,ecspi使用的io 内存映射的空间是从02018000-0201bfff。如果我们使用#cat /proc/interupts
的命令可以查看注册中断的情况,如:
1 | uid=0 gid=1007@Android:/ #cat /proc/interrupts |
这些信息不用我们去配置,在官方BSP包中的dts已配置好,我们只需要include对应的dts并且在那基础上做自己的修改。上述配置信息就在 imx6q.dtsi 文件中
1 | ecspi1: ecspi@02018000 { |
这个文件中很多设备都是disabled的,如果我们需要使用,不必再这里设置okay,因为通常情况下客户会自己添加一个imx6qp-xxx.dts的文件,然后再#include "imx6q.dtsi"
,在imx6qp-xxx.dts添加自己所需要的设备之后会设置status = "okay"
,此时会将imx6q.dtsi中关于status的信息覆盖同名参数并且合并其他的信息。如imx6qp-xxx.dts的配置一样。
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 相关的设备节点。