最近研究spi的bit bang,學自網路,不敢獨享,特做此文件。
此文件是關於spi的,讀者物件為對linux 驅動如spi作為platform有一定基礎的programer。
此文件基於linux2.6.32核心
spi bit bang是什麼?我把他理解成用gpio模擬spi口,跟普通微控制器沒什麼大的區別,下面我們將一步一步掀開bit bang的面紗.
一. spi介面時序詳細解
關於這部分,可以參考如下資料 ,
如下也摘抄於此,感謝博主 yuwenxin 分享如此好的一片文件
spi介面有四種不同的資料傳輸時序,取決於cpol和cphl這兩位的組合。圖1中表現了這四種時序,
時序與cpol、cphl的關係也可以從圖中看出。
注意:cpol是用來決定sck時鐘訊號空閒時的電平,cpol=0,空閒電平為低電平,cpol=1時,
空閒電平為高電平。cpha是用來決定取樣時刻的,cpha=0,在每個週期的第乙個時鐘沿取樣,
cpha=1,在每個週期的第二個時鐘沿取樣。
二, linux中的spi驅動模型
linux的spi模型中重要的有如下幾個結構體,位置include/linux/spi/spi.h
struct spi_device {}
struct spi_driver {}
struct spi_master {}
struct spi_transfer{}
在這幾個結構體中,我們只注意一下device結構體
struct spi_device
注意如上定義的 spi_cpha和spi_cpol
這個和一中的cpha,以及
cpol是對應的,
然後在次基礎上定義了mode?,到此,你是否能相像出spi介面的資料傳輸過程?
接著賣我嗎繼續研究
spi bitbang,也有乙個重要的結構體位置為inlcud/linux/spi/spi_bitbang.h
struct spi_bitbang
我們只對上面四個東西感興趣
struct work_struct work;
這個讓我們想入菲菲--bit bang是按照workqueue佇列的形式來工作的嗎?
worqueue這個是什麼?簡單地說,他就是乙個佇列,裡面的每乙個work節點代表著乙個需要排程的工作。
既然是worqueue,那麼我們可以猜想,spi是在每乙個work中實現bit bang的。
事實上確實如此,在/driver/spi/spi_bitbang.c#l267中,我們可以看到如下函式
static void bitbang_work(struct work_struct *work){},
在/driver/spi/spi_bitbang.c中,我們可以發現
int spi_bitbang_start(struct spi_bitbang *bitbang);
這個函式的主要工作是完成如下工作
workqueue的初始化init_work(&bitbang->work, bitbang_work);
類暫存器的賦值
資料傳送方法的初始化
bitbang->setup_transfer =spi_bitbang_setup_transfer;
注意這個函式(l=/driver/spi/spi_bitbang.c)
int spi_bitbang_setup_transfer(struct spi_device*spi, struct spi_transfer*t)
追蹤這個函式bitbang_txrx_xx,以為bitbang_txrx_16為例(l=ver/spi/spi_bitbang.c)
static unsigned bitbang_txrx_16(struct spi_device*spi,
u32 (
*txrx_word)
(struct spi_device*spi, unsigned nsecs, u32 word, u8 bits)
,unsigned ns,struct spi_transfer *t)
止於此,我們漸漸明朗:
spi_gpio_txrx_word_modex就是實現bitbang的基本,x對應上面定義的spi的哥哥模式
以spi_gpio_txrx_word_mode0為例研究這個函式
spi_gpio_txrx_word_mode0()呼叫了bitbang_txrx_be_cpha0 該函式位inlcude/linux/spi/spi_bitbang.h
static inline u32
bitbang_txrx_be_cpha0(struct spi_device *spi,unsigned nsecs, unsigned cpol,u32 word, u8 bits)
return word;}
注意其中的for迴圈,是不是微控制器下的串列埠模擬spi時序?
ThreadLocal實現原理與原始碼分析
threadlocal底層實現內部類 threadlocalmap 一 threadlocal的set方法原始碼分析 1 public void set t value thread t thread.currentthread threadlocalmap map getmap t if map ...
二分查詢演算法原理和實現
二分查詢是一種比較高效的搜尋演算法,是一種可以在有序陣列中搜尋到特定元素的演算法。例如,我們要在陣列中搜尋4 還是先找到陣列的中間位置,這次因為是偶數,我們就取1吧 這裡是按照自己取中間位置的演算法實際去取 4比1小,那麼要往右邊陣列搜尋,右邊陣列即為 那麼,陣列只有乙個元素,那麼中間位置肯定就是自...
ConcurrentHashMap原理分析
hashtable是乙個執行緒安全的類,它使用synchronized來鎖住整張hash表來實現執行緒安全,即每次鎖住整張表讓執行緒獨佔。concurrenthashmap允許多個修改操作併發進行,其關鍵在於使用了鎖分離技術。它使用了多個鎖來控制對hash表的不同部分進行的修改。concurrent...