如果在核心中配置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.c
的static const struct of_device_id spi_imx_dt_ids;
中仿照
新增支援新的裝置:
這裡面的名字一定要與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))
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可見,ecspi使用的io 記憶體對映的空間是從02018000-0201bfff。如果我們使用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
#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 缺點 沒有指定的流控制,沒有應答機制確認是否...