Linux Kernl新增spidev的裝置節點

2021-07-31 05:55:47 字數 3936 閱讀 9964

如果在核心中配置spidev,會在/dev目錄下產生裝置節點,通過此節點可以操作掛載在該spi匯流排上的裝置。使用者空間通過該節點可以訪問核心空間。

在i.mx6,kernel 4.1.15上配置spidev的支援。

根據spi的連線原理圖配置對應的imx6qp-***.dts,如:

&ecspi1 ;

};pinctrl_ecspi1: ecspi1grp ;

pinctrl_ecspi1_cs: ecspi1cs ;

drivers/spi/spi-imx.cstatic const struct of_device_id spi_imx_dt_ids;中仿照

新增支援新的裝置:

這裡面的名字一定要與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))

irq = platform_get_irq(pdev, 0);

if (irq < 0)

ret = devm_request_irq(&pdev->dev, irq, spi_imx_isr, 0,

dev_name(&pdev->dev), spi_imx);

if (ret)

當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

cpu316:

1358

4191274

1059

gic29

edge twd17:

0000

gpc55

level i.mx

timer

tick22:

226000

gpc26

level

2020000.serial24:

33000

gpc35

level

2018000.ecspi

這些資訊不用我們去配置,在官方bsp包中的dts已配置好,我們只需要include對應的dts並且在那基礎上做自己的修改。上述配置資訊就在 imx6q.dtsi 檔案中

ecspi1: ecspi@02018000 ;
這個檔案中很多裝置都是disabled的,如果我們需要使用,不必再這裡設定okay,因為通常情況下客戶會自己新增乙個imx6qp-***.dts的檔案,然後再#include "imx6q.dtsi",在imx6qp-***.dts新增自己所需要的裝置之後會設定status = "okay",此時會將imx6q.dtsi中關於status的資訊覆蓋同名引數並且合併其他的資訊。如imx6qp-***.dts的配置一樣。

上述配置spidev裝置之後,就要配置新增spidev驅動。在arch/arm/configs/***_defconfig中新增config_spi_spidev=y那麼就會編譯drivers/spi/spidev.c檔案,該檔案的內容是註冊乙個spidev驅動。該驅動是乙個字元裝置驅動。

如果裝置與驅動匹配,那麼就會執行spidev_probe()的內容。在spidev_probe()函式中會呼叫device_create()成功後在 /dev 目錄下就會生成 spidev 相關的裝置節點。

雖然可以生成 /dev/spideva.b 的裝置節點,但是kernel msg列印如下錯誤:

之所以出現上述警告資訊,是因為在/driver/spi/spidev.c中的spidev_probe()函式中做如下的檢測:

個人覺得此處沒必要做這樣的檢查。雖說spidev是虛擬出來的乙個裝置,但是它確實是乙個裝置,既然是裝置,就應該在裝置樹上體現出來。

因為認為 spidev 裝置是linux實現的虛擬裝置而不是真正的關於硬體描述的裝置,不應該放到dt裡面。解決上述問題可以參照如下文章:

SPI通訊協議(SPI匯流排)學習

spi是序列外設介面 seria 種同步序列接 術,是一種高速的,全雙工,同步的通訊匯流排。2 spi優點 支援全雙工通訊 通訊簡單 資料傳輸速率塊 3 缺點 沒有指定的流控制,沒有應答機制確認是否接收到資料,所以跟iic匯流排協議比較在數 據 可靠性上有一定的缺陷。4 特點 1 高速 同步 全雙工...

SPI通訊協議(SPI匯流排)學習

spi是序列外設介面 seria 2 spi優點 支援全雙工通訊 通訊簡單 資料傳輸速率塊 3 缺點 沒有指定的流控制,沒有應答機制確認是否接收到資料,所以跟iic匯流排協議比較在資料 可靠性上有一定的缺陷。4 特點 1 高速 同步 全雙工 非差分 匯流排式 2 主從機通訊模式 5 協議通訊時序詳解...

SPI通訊協議(SPI匯流排)學習

1 什麼是spi?spi是序列外設介面 serial peripheral inte ce 的縮寫。是 motorola 公司推出的一 種同步序列接 術,是一種高速的,全雙工,同步的通訊匯流排。2 spi優點 支援全雙工通訊 通訊簡單 資料傳輸速率塊 3 缺點 沒有指定的流控制,沒有應答機制確認是否...