1. 程式人生 > >Linux下SPI從裝置驅動的編寫

Linux下SPI從裝置驅動的編寫

 SPI(Serial Peripheral Interface) 是一個同步的四線制序列線,用於連線微控制器和感測器、儲存器及外圍裝置。三條訊號線持有時鐘訊號(SCLK,經常在10MHz左右)和並行資料線帶有主出,從進(MOSI)”或是主進,從出(MISO)”訊號。資料交換的時候有四種時鐘模式,模式0和模式3是最經常使用的。每個時鐘週期將會傳遞資料進和出。如果沒有資料傳遞的話,時鐘將不會迴圈

SPI驅動分為兩類:

控制器驅動:它們通常內嵌於片上系統處理器,通常既支援主裝置,又支援從裝置。這些驅動涉及硬體暫存器,可能使用DMA。或它們使用GPIO引腳成為PIO bitbangers。這部分通常會由特定的開發板提供商提供,不用自己寫。

協議驅動:它們通過控制器驅動,以SPI連線的方式在主從裝置之間傳遞資訊。這部分涉及具體的SPI從裝置,通常需要自己編寫。

那麼特定的目標板如何讓Linux 操控SPI裝置?下面以AT91SAM9260系列CAN裝置驅動為例,Linux核心版本為2.6.19。本文不涉及控制器驅動分析。

board_info提供足夠的資訊使得系統正常工作而不需要晶片驅動載入

這樣在Linux初始化時候就可以載入SPI CAN驅動。

下面來看MCP2515 CAN驅動的結構,協議驅動有點類似平臺裝置驅動,本文只列出框架,不涉及具體實現程式碼,/driver/CAN/MCP2515.c中:

  

一旦進入probe(),驅動使用"struct spi_message"SPI裝置要求I/O。當remove()返回時,驅動保證將不會提交任何這種資訊。一個spi_message是協議操作序列,以一個原子序列執行。SPI驅動控制包括:1)當雙向讀寫開始,是根據spi_transfer要求序列是怎樣安排的。2)隨意設定傳遞後的短延時,使用spi_transfer.delay_usecs設定。3)在一次傳遞和任何延時之後,無論片選是否活躍,使用spi_transfer.cs_change標誌,暗示下條資訊是否進入這個同樣的裝置,使用原子組中最後一次傳輸上的spi_transfer.cs_change標誌位,可能節省晶片選擇取消操作的成本。