一. 驅動註冊流程
1. static int nuc970_spi1_probe(struct platform_device *pdev)
2. err = spi_bitbang_start(&hw->bitbang);
3. init_work(&bitbang->work, bitbang_work);
//初始化工作佇列
4. init_list_head(&bitbang->queue);
//初始化鍊錶
5. master->transfer = spi_bitbang_transfer;
//繫結spi傳輸函式
(這裡只是初始化,真正呼叫該函式是在應用程式部分,第二部分會講到,只需記住這個關鍵的函式)
5.1 將應用層spi傳輸的資料加入到鍊錶中,同時將資料提交給佇列bitbang->work
list_add_tail(&m->queue, &bitbang->queue);
//m->queue加入到第4點的bitbang->queue鍊錶中
queue_work(bitbang->workqueue, &bitbang->work);
//提交給bitbang->workqueue佇列,這使將呼叫第3點的bitbang_work函式
二. 應用程式呼叫流程
1. spidev.c (spi裝置層,對應應用程式開啟的open\read\write...api)
1. 該檔案的內部讀、寫函式最終都會呼叫核心層spi.c的api向底層驅動互動資料
1. spi.c(spi核心層)
1. int spi_write_then_read(struct spi_device *spi, const void *txbuf, unsigned n_tx, void *rxbuf, unsigned n_rx)
2. status = spi_sync(spi, &message);
3. __spi_sync(spi, message, 0);
4. status = spi_async_locked(spi, message);
5. __spi_async(spi, message);
6. master->transfer(spi, message);
//這個傳輸函式是個關鍵函式,將呼叫第一.5,這樣就將應用與驅動掛起勾了
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 SPI驅動筆記
spi匯流排由miso 序列資料輸入 mosi 序列資料輸出 sck 序列移位時鐘 cs 使能訊號 4個訊號線組成 linux下spi驅動開發 首先明確spi驅動層次,如下圖 我們以上面的這個圖為思路 spi bus spi匯流排對應的匯流排型別為spi bus type,在核心的drivers s...
嵌入式Linux SPI驅動
1.1 spi主機驅動 linux使用spi master結構體表示spi主機驅動,定義在 drivers linux spi spi.h transfer 資料傳輸函式 transfer one message spi傳送護具函式,傳送乙個spi message資料 1.2 spi裝置驅動 lin...