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 安裝或...