1. 程式人生 > >【轉】PowerPC + Linux2.6.25平臺…

【轉】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;