天天看點

i2c驅動一、

一、

修改裝置樹,并且在子產品入口函數裡面注冊i2c驅動,也就是注冊struct i2c_driver類型的結構體,在裡面實作Probe,remove,of_match_table(裝置樹比對),id_table(傳統比對),.driver即可。這裡有個問題就是,必須of_match_table和id_table都要實作,即使id_table是空的也可以,但是必須實作(不明白)。

在裝置樹下面添加節點,一定要添加到i2c節點之下,這樣注冊的struct i2c_driver類型的結構體,才能成功的比對到節點。(經過實驗,不放到i2c節點之下不行)

二、

當probe函數比對到之後,參數裡面有一個client,這個client裡面包含了裝置樹的節點中的reg參數,預設這個reg參數為client的addr,也就是裝置位址,裝置樹裡的compatible會進行比對,然後client裡的i2c_transfer(client->adapter, &msg, 1);用到,是以要在probe函數裡面将client設定為結構體的私有變量,以便其它函數通路。

三、

在對AP321c進行讀取資料之前,要對配置寄存器進行配置,一般配置為0x03.要注意使能三項功能之後,讀取三項資料要間隔112.5ms以上。提取ap3216c的資料時要注意,資料都超過了八位,注意對資料的存儲變量進行改變,需要16位的unsigend short類型。

四、在讀取資料時,利用i2c_transfer(client->adapter, &msg, 1);函數進行發送指令,其中msg是發送的資訊,需要具體實作,1是具體發送的幾條資訊。

msg裡面需要實作四項,1:從機位址__u16 addr;2:__u16 flags;标志也就是發送的是讀資料指令還是寫資料指令3:__u16 len;發送這個資料長度4:__u8 *buf;發送的消息資料。總而言之,2c_transfer(client->adapter, &msg, 1);就是用來與裝置通信的,隻要實作msg即可。

i2c大緻協定:

分為讀時序和寫時序

1.讀:發送兩條消息,第一條是發送要讀取的寄存器位址(資料那一項),以及裝置位址還有,資料長度,和寫标志。第二條發送寫入寄存器的資料,裝置位址,讀标志和資料長度。

2.寫:寫發送一條資訊,将寄存器位址和資料資訊合并到一起,都作為資料項,然後有裝置位址以及兩個加到一起的長度,還有寫标志,這樣就可以對裝置寄存器進行寫入

總結

:linux驅動的i2c對裝置寄存器的讀寫要比裸機曆程簡單,很多時序都在核心裡寫好了,而且i2c控制器的配置也不用操心,隻要寫怎麼對裝置操作就可以了。i2c的裝置資訊要寫在i2c的大節點下,可以被比對到,才可以進行對i2c的控制。發送資訊要比裸機曆程簡單,隻需要填充msg資訊結構體就可以了,還有就是i2c_driver結構體要把有裝置樹的比對和沒裝置樹的清單都寫上,哪怕傳統比對清單裡面沒有項也可以,否則不行(親測)。另外,也要關注client,cilent兩處要用到,一是如果裝置節點reg裡面有裝置位址,則client可以可以擷取到,存在client->addr裡面。二就是發送資料時第一個參數要用到client->adpater.,是以在probe時要記得儲存client,(probe函數第一個參數就是client),最好是存為私有資料。

繼續閱讀