SPI 是 Serial Peripheral Interface 的縮寫,它是一種串列式的 IO 介面,時脈約 1~ 70MHz,詳細資料可見 [1]。 DaVinci DM6446 上配備了一個 SPI 控制器,支援二個 chip select,時脈可達 33MHz。
Linux SPI 子系統將驅動程式分為三種類型:
- SPI bus driver:
主要目的為提供 API 給下層的 master driver 及上層的 protocol driver (稍後會提)來註冊,並傳送封包至下層的 driver。 - SPI master driver:
主要工作為初始化控制器,並負責對暫存器寫入以及中斷處理。 - SPI protocol driver:
主要為發送 SPI 訊息封包至所選擇的裝置。
在子系統中,訊息封包的格式定義在 spi.h 的 spi_message 結構中。protocol driver 要傳送資料,只需填上 spi_message 結構相對應的欄位,並呼叫 spi_sync 以起始傳送。或者也可直接呼叫 spi_read/spi_write,參數則填入你的 buffer pointer 以及長度即可。
一般在嵌入式系統中,SPI 周邊多是直接固定在板子上,且硬體並無特別的方式可供偵測,因此我們需要在平台初始化時預先定義系統包含那些 SPI 周邊,而子系統也定義一個結構 spi_board_info 提供給開發者填入相對應的資訊,例如:
struct spi_board_info devices[] = {
{
.modalias = "mydevice",
.max_speed_hz = 6000000,
.bus_num = 0,
.chip_select = 1,
.mode = SPI_MODE_1,
},
{
......
},
};
接著呼叫 spi_register_board_info 來註冊這些裝置。需要注意的是,modalias 欄位的值必須與 protocol driver 註冊的名字相同;bus driver 會以該值作為比對的依據。若需在執行時期註冊新的裝置,則可呼叫 spi_new_device 來加入。
關於 master driver 的部分留待下一篇來討論。
相關連結:
[1] Serial Peripheral Interface Bus
[2] TMS320DM644x DMSoC Serial Peripheral Interface (SPI) User's Guide
2 則留言:
借轉,如有冒犯,請告知,我會立刻刪除
Hi kezeodsnx,
歡迎轉載,文章皆以 CC 授權
張貼留言