LINUX SPI驅動筆記

2021-06-08 18:44:36 字數 1593 閱讀 7059

spi匯流排由miso(序列資料輸入)、mosi(序列資料輸出)、sck(序列移位時鐘)、cs(使能訊號)4個訊號線組成

linux下spi驅動開發

首先明確spi驅動層次,如下圖:

我們以上面的這個圖為思路

spi bus

spi匯流排對應的匯流排型別為spi_bus_type,在核心的drivers/spi/spi.c中定義

struct bus_type spi_bus_type = ;

對應的匹配規則是(高版本中的匹配規則會稍有變化,引入了id_table,可以匹配多個spi裝置名稱):

static int spi_match_device(struct device *dev, struct device_driver *drv)

spi_device

講到spi_device的構建與註冊了。

spi_device對應的含義是掛接在spi匯流排上的乙個裝置,所以描述它的時候應該明確它自身的裝置特性、傳輸要求、及掛接在哪個匯流排上。

static struct spi_board_info s3c_spi_devs __initdata = ,

};static struct s3c64xx_spi_csinfo smdk_spi0_csi = ,

};static void smdk_m25p10_cs_set_level(int high)    //spi控制器會用這個方法設定cs

spi_register_board_info(s3c_spi_devs, array_size(s3c_spi_devs));//註冊spi_board_info。這個**會把spi_board_info註冊要鍊錶board_list上。

事實上spi_master的註冊會在spi_register_board_info之後,spi_master註冊的過程中會呼叫scan_boardinfo掃瞄board_list,找到掛接在它上面的spi裝置,然後建立並註冊spi_device。

spi_driver

本文先以linux核心中的/driver/mtd/devices/m25p80.c驅動為參考。

static struct spi_driver m25p80_driver = ,

.probe = m25p_probe,//

當我們利用板級資訊新增乙個裝置的時候,該driver如果匹配到這個裝置,那麼就會自動為其建立裝置節點,封裝spidev_data

資訊,並且掛到全域性裝置鍊錶device_list

.remove = __devexit_p(m25p_remove),

*/};

spi_register_driver(&m25p80_driver);//spi driver的註冊

在有匹配的spi device時,會呼叫m25p_probe

驅動筆記(3)

併發 多個執行單元同時被執行 竟態 併發的執行單元對共享資源 硬體資源或全域性變數等 的共享訪問 通過semaphore機制和spin lock機制實現 獲取訊號量不成功 該阻塞或者睡眠 1.定義訊號量 struct semaphore sem 2.初始化訊號量 void sema init str...

linux spi驅動分析

關於spi的學習,我覺得最好的方法還是看linux的源 主要是driver spi spi.c h spidev.c h spi dev的示例可以看看at25.c,spi匯流排的示例可以看omap uwire或者spi s3c24xx.c和spi s3c24xx gpio.c。在看這些 之前,需要對...

linux裝置驅動筆記

雖然並不做linux有關的東西,但是記錄下點點滴滴,以備不時之需 驅動程式的編譯 make 驅動程式按模組安裝 inmod ko 執行這個命令之前首先要獲得root許可權,否則會報錯,1 operation not permmitt 檢視模組安裝情況 lsmod 解除安裝相關模組 rmmod 安裝或...