日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux下spi添加设备,Linux Kernl添加spidev的设备节点

發布時間:2023/12/2 linux 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux下spi添加设备,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 = ;

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的设备节点的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。