【轉】PowerPC + Linux2.6.25平臺…
Sailor_forever
sailing_9806#163.com
(本原創文章發表於Sailor_forever
的個人blog,未經本人許可,不得用於商業用途。任何個人、媒體、其他網站不得私自抄襲;網路媒體轉載請註明出處,增加原文連結,否則屬於侵權行為。如
有任何問題,請留言或者發郵件給sailing_9806#163.com)
【摘要】本文以PowerPC+Linux
2.6.25
平臺為例,詳細分析了SPI匯流排的驅動架構。首先介紹了SPI的總體架構,從使用者的角度將其分為三個層面,不同的開發者只需要關注相應的層面即可。然後分析了主要資料結構及其之間的相互關係,接著分析了不同層的具體實現,最後以一款SPI介面的時鐘晶片為例講述瞭如何在使用者空間訪問SPI驅動。對於ARM
+
Linux平臺,只有平臺依賴層即匯流排控制器驅動有差異。
【關鍵字】PowerPC, SPI, Master, Slave, spidev
目錄
1
SPI概述
3
2
SPI總體架構
3
2.1
硬體抽象層
3
2.2
平臺依賴層
3
2.3
使用者介面層
3
3
主要的資料結構
4
3.1
Spi_master
4
3.2
SPI_driver
5
3.3
Spi_device
6
4
平臺依賴層-匯流排控制器驅動
7
4.1 platform
device
8
4.2 platform
driver
11
4.3 SPI
Master
14
5
硬體抽象層-SPI
core 14
5.1
匯流排初始化
14
5.2
Master註冊
15
5.3
驅動註冊
19
5.4
資料傳輸
19
6
使用者介面層-SPI裝置驅動
21
6.1
統一的裝置模型
21
6.1.1
關鍵資料結構
21
6.1.2
初始化
22
6.1.3
Open及release
24
6.1.4
資料收發
25
6.2
特定的裝置驅動
36
6.2.1
關鍵資料結構
37
6.2.2
初始化
38
6.2.3
資料收發
42
7
驅動訪問示例
42
7.1.1
寫操作
43
7.1.2
讀操作
43
8
參考鳴謝
44
1
SPI概述
SPI的通訊原理很簡單,它以主從方式工作,這種模式通常有一個主裝置和一個或多個從裝置,需要至少4根線,事實上3根也可以(單向傳輸時或者硬體複用兩根資料線),也是所有基於SPI的裝置共有的,它們是MISO、MOSI、SCK、CS。
(1)MOSI – 主裝置資料輸出,從裝置資料輸入
(2)MISO– 主裝置資料輸入,從裝置資料輸出
(3)SCK – 時鐘訊號,由主裝置產生
(4)CS – 從裝置使能訊號,由主裝置控制
其中CS是控制晶片是否被選中的,也就是說只有片選訊號為預先規定的使能訊號時(高電位或低電位),對此晶片的操作才有效,這就允許在同一總線上連線多個SPI裝置成為可能。接下來就負責通訊的3根線了,通訊是通過資料交換完成的。SPI是序列通訊協議,也就是說資料是一位一位從MSB或者LSB開始傳輸的,這就是SCK時鐘線存在的原因,由SCK提供時鐘脈衝,MISO、MOSI則基於此脈衝完成資料傳輸。
SPI支援4-32bits的序列資料傳輸,支援MSB和LSB,每次資料傳輸時當從裝置的大小端發生變化時需要重新設定SPI
Master的大小端。
2
SPI總體架構
在2.6的Linux核心中,SPI的驅動架構分為如下三個層次:硬體抽象層、平臺依賴層和使用者介面層
2.1 硬體抽象層
SPI-bitbang.c和SPI.c為其主體框架程式碼,提供了核心資料結構的定義、SPI控制器驅動和裝置驅動的註冊、登出管理等API。其為硬體平臺無關層,向下遮蔽了物理匯流排控制器的差異,定義了統一的訪問策略和介面;其向上提供了統一的介面,以便SPI裝置驅動通過匯流排控制器進行資料收發。
2.2 平臺依賴層
SPI匯流排Master就是一條SPI匯流排的控制器(所謂控制是相對於本CPU來說的),在物理上連線若干SPI從裝置。在Linux驅動中,每種處理器平臺有自己的控制器驅動,屬於平臺移植相關層。PowerPC平臺來說,其是spi_mpc83xx.c。其按照核心層定義的介面實現了spi_master
2.3 使用者介面層
裝置驅動層為使用者介面層,其為使用者提供了通過SPI匯流排訪問具體裝置的介面。
3 主要的資料結構
3.1 Spi_master
spi_master是對某一條SPI匯流排的抽象,是特定匯流排的相關屬性的集合。
struct spi_master {
struct device dev;
s16 bus_num;
u16 num_chipselect;