linuxspi驅動
A. 請問linux驅動怎麼調用底層的驅動啊 比如說已有SPI匯流排驅動,現要為一個SPI設備寫驅動,怎麼調用底層驅動
spi匯流排驅動在linux中是採用了分層設計和分隔設計的思想,spi控制器的驅動和核心層的通用api內核已經寫完了,你只要寫外設驅動就好,具體你可以去看一下你的spi_s3c24xx.c這個驅動是基於platfoem寫的,裡面含有如何調用核心api。
B. 如何在linux下實現一個I2C與SPI的從機驅動
最簡情況下:
I2C:SDA數據線、SCL時鍾線。
SPI:DI輸入線、DO輸出線、CS片選先、CLK時鍾線。
可能不能寫到一個驅動中。
但是好在一般很少用到這么簡單的情況,廠家會對其擴展和改進。
比如 W25Q128FB/W25R128FV 系列快閃記憶體,支持 SPI、Dual SPI、Quad SPI 和 QPI。就拿 Quad SPI 來說,有 6 個引腳:
Quad SPI:D0-D3 輸入輸出線、CS片選先、CLK時鍾線。
其中 輸入為一位串列輸入 D0,輸出為四位串列輸出 D0-D3。(四位仍少於一個位元組,可姑且稱為串列)
Winbond華邦 這么做是為了加快快閃記憶體讀取速度(四位串列相比一位串列提高了四倍)。
因此關鍵在於 要進行怎樣的 IO。至於是否將二者寫到一個驅動看來並不重要。
C. linux spi設備驅動中probe函數何時被調用
最近看到linux的設備驅動模型,關於Kobject、Kset等還不是很清淅。看到了struct device_driver這個結構時,想到一個問題:它的初始化函數到底在哪裡調用呢?以前搞PCI驅動時用pci驅動注冊函數就可以調用它,搞s3c2410驅動時只要在mach-smdk2410.c中的struct platform_device *smdk2410_devices {}中加入設備也會調用。但從來就沒有想過具體的驅動注冊並調用probe的過程。
於是打開SourceInsight追蹤了一下:
從driver_register看起:
復制代碼
int driver_register(struct device_driver * drv)
{
klist_init(&drv->klist_devices, klist_devices_get, klist_devices_put);
init_completion(&drv->unloaded);
return bus_add_driver(drv);
}
復制代碼
klist_init與init_completion沒去管它,可能是2.6的這個設備模型要做的一些工作。直覺告訴我要去bus_add_driver。
bus_add_driver中:
都是些Kobject 與 klist 、attr等。還是與設備模型有關的。但是其中有一句:
driver_attach(drv);
單聽名字就很像:
void driver_attach(struct device_driver * drv)
{
bus_for_each_dev(drv->bus, NULL, drv, __driver_attach);
}
這個熟悉,遍歷匯流排上的設備並設用__driver_attach。
在__driver_attach中又主要是這樣:
driver_probe_device(drv, dev);
跑到driver_probe_device中去看看:
有一段很重要:
if (drv->bus->match && !drv->bus->match(dev, drv))
D. Linux自帶的SPI驅動,默認情況下是以什麼方式讀取數據的
一位一位來傳輸數據的。如果只是要在linux上開發應用,可以不去理會具體的SPI驅動細節。
可以在linux中寫個簡單的程序,只完成讀spi並在屏幕輸出的功能,不要涉及編寫驅動的部分。