當前位置:首頁 » 操作系統 » linuxi2c驅動

linuxi2c驅動

發布時間: 2024-03-29 18:09:56

1. 用linux 調用內核中的統一I2C驅動 i2c總是 busy,求大神支招,謝謝! 程序很短

最近我也遇到這個問題了,糾結了一天,在網友的支持下解決了,這個天嵌的版本中,i2c和他的攝像頭驅動(OV9650驅動)相沖突,你在編譯內核之前,將攝像頭的驅動全部去掉,這樣子重新編譯之後,i2c就可以正常測試使用了。

2. i2clinux椹卞姩i2clinux

linux涓鐨勭綉鍗¢┍鍔ㄥ嚱鏁皃robe鐨勫叿浣撲綔鐢錛

probe鍦ㄨ懼囬┍鍔ㄨ娉ㄥ唽鍒板唴鏍鎬腑鐨勬椂鍊欙紝琚鎬葷嚎鍨嬮┍鍔ㄨ皟鐢ㄣ傛葷嚎椹卞姩綾諱技浜庣敤杞璁鏂規硶鎺㈡祴鎬葷嚎涓婄殑鎵鏈夎懼囷紝灝嗚懼囩殑璇嗗埆鍨嬩俊鎮鍜屽叧閿鏁版嵁緇撴瀯(pciids,usbids,i2cidsandetc.)浼犻掔粰probe鍑芥暟錛宲robe灝變細璇嗗埆鏄鍚︽槸鑷宸辮礋璐i┍鍔ㄧ殑璁懼囷紝騫惰礋璐e畬鎴愯ヨ懼囩殑鍒濆嬪寲鎿嶄綔銆

linux涓璱2c鎬葷嚎涓浠庢満鍦板潃鎬庝箞璁劇疆錛

鏈夊崟綰,鍙岀嚎鍜屼笁綰跨瓑.

I2C鑲瀹氭槸2綰跨殑(涓嶇畻鍦扮嚎).

I2C鍗忚紜瀹炲緢縐戝,姣3/4綰跨殑SPI瑕佸ソ,褰撶劧綰垮氶氳閫熺巼鐩稿瑰氨蹇浜.

I2C鐨勫師鍒欐槸:

鍦⊿CL=1(楂樼數騫)鏃,SDA鍗冧竾鍒蹇芥偁!!!

鍚﹀垯,SDA涓嬭煩鍒"鍒ょ綒"涓"璧峰嬩俊鍙稴",SDA涓婅煩鍒"鍒ょ綒"涓"鍋滄淇″彿P".

鍦⊿CL=0(浣庣數騫)鏃,SDA闅忎究蹇芥偁!!!(鍙鍒蹇芥偁榪囩伀鍒癝CL璺抽珮)

姣忎釜瀛楄妭鍚庡簲璇ョ敱瀵規柟鍥為佷竴涓搴旂瓟淇″彿ACK鍋氫負瀵規柟鍦ㄧ嚎鐨勬爣蹇.

闈炲簲絳斾俊鍙蜂竴鑸鍦ㄦ墍鏈夊瓧鑺傜殑鏈鍚庝竴涓瀛楄妭鍚.涓鑸瑕佺敱鍙屾柟鍗忚絳懼畾.

3. linux內核中i2c匯流排驅動對所有的i2c設備是否是通用的

i2C匯流排的驅動程序一般針對不同的CPU是不一樣的,所以都位於arch目錄下對應的cpu架構的common文件夾下。
對同一種架構的來看,I2C驅動僅實現底層的通信。故其是通用的。

4. 如何在linux下實現一個I2C與SPI的從機驅動

最簡情況下:
I2C:SDA數據線、SCL時鍾線。
SPI:DI輸入線、DO輸出線、CS片選先、CLK時鍾線。
可能不能寫到一個驅動中。

但是好在一般很少用到這么簡單的情況,廠家會對其擴展和改進。

比如 W25Q128FB/W25R128FV 系列快閃記憶體,支持 SPI、Dual SPI、Quad SPI 和 QPI。就拿 Quad SPI 來說,有 6 個引腳:

Quad SPI:D0-D3 輸入輸出線、CS片選先、CLK時鍾線。

其中 輸入為一位串列輸入 D0,輸出為四位串列輸出 D0-D3。(四位仍少於一個位元組,可姑且稱為串列)

Winbond華邦 這么做是為了加快快閃記憶體讀取速度(四位串列相比一位串列提高了四倍)。

因此關鍵在於 要進行怎樣的 IO。至於是否將二者寫到一個驅動看來並不重要。

5. 如何在Linux中讓I2C驅動支持Sub Address的兩種方法

【目的】
AS3527有一個模擬部分,稱作AFE,其與數字部分通過i2c通信,此處AFE部分有很多寄存器供外界操作訪問,如果想要訪問這些寄存器,就要用到Sub Address,所以,要實現讓i2c 驅動支持Sub Address的模式。
i2C本身的架構中,沒有支持sub address,所以,我們只能想辦法,讓其I2C支持(方法1)或者用smbus的架構(方法2).
【方法】
方法1:
在i2c的message中傳遞一個2個位元組的buffer,分別存放Sub Address和data
比如,對於讀操作,就可以這么實現:
int afe_read_reg(int addr, u8 *pdata)
{
u8 msgbuf[2];
struct i2c_msg msg =
{
.addr = save_client->addr | ( << 8),
.flags = I2C_M_RD ,
.len = 2,
.buf = msgbuf,
};
msgbuf[0] = addr; //存放Sub Address,此處的Addr是寄存器地址,也就是Sub Address
msgbuf[1] = 0; //初始化
if (i2c_transfer(save_client->adapter, &msg, 1) < 0) {
dev_warn(&save_client->dev,
"can't read from afe /n");
return -ENOMEM;
}
*pdata = msgbuf[1];
return 0;
}
方法2:
使用SMBUS的框架,其支持Sub Address
在i2c讀操作中,直接調用SMBUS架構中的函數i2c_smbus_read_byte_data:
int afe_read_reg(int addr, u8 *pdata)
{
int ret;
ret = i2c_smbus_read_byte_data(save_client, addr);
if (ret < 0)
return ret;
else {
*pdata = (u8)ret;
return 0;
}
}
然後函數調用順序是
i2c_smbus_read_byte_data -> i2c_smbus_xfer ->
adapter->algo->smbus_xfer 或 i2c_smbus_xfer_emulated
(1)此處如果你自己的I2C驅動中沒有實現
adapter->algo->smbus_xfer
那麼就會去調用i2c_smbus_xfer_emulated,其會把I2C的讀一個位元組的操作,
分成2個message,然後
i2c_smbus_xfer_emulated -> i2c_transfer -> adap->algo->master_xfer(adap,msgs,num)
去調用底層自己的i2c傳輸的函數master_xfer去實現兩個message的傳輸。
此處要注意的是,如果你的i2C的控制器和i2c設備,支持將此I2C的讀一個位元組操作分兩個message傳輸,
那麼此處此方法也是可以的。
而你的底層的master_xfer函數,只要負責將對應的message發送出去也就可以實現對應的功能了。
否則,就像我此處遇到的,我這里的AFE的i2c控制器,不支持讀操作分成兩次message,只支持一個I2C message的傳輸,
所以,只能是在底層特殊處理,將2個message自己整理成一個message,或者是用下面的辦法。
(2)自己實現了adapter->algo->smbus_xfer
自己仿照i2c_smbus_xfer_emulated,在具體實現的時候,對於讀和寫都只是發送一個message,然後讓底層代碼
adap->algo->master_xfer去處理這個message,實現對應的讀和寫。
【注意】
1.以上,不論是1還是2,都是在實現了自己I2C驅動底層message傳輸的基本函數之後,才可以工作的。
而對於這個基本函數,即adap->algo->master_xfer,
都是要在實現的時候,注意上層傳遞過來的buffer的第一個位元組是sub address,第二個位元組才是要用於寫入或讀取的buffer。
2.對於方法2(2),在模擬i2c_smbus_xfer_emulated實現自己的xfer函數的時候,
不能直接調用i2c_transfer,因為i2c_transfer裡面,去獲得adapter->bus_lock,而i2c_smbus_xfer中,調用adapter->algo->smbus_xfer之前,已經進行了對於adapter->bus_lock鎖定,而因此會形成死鎖的的,辦法是不要再去獲得鎖,而直接調用adapter->algo->master_xfer即可。

6. linux 怎麼載入i2c驅動

假設手上有一塊從淘寶上買來的開發板,我要在開發板的I2C匯流排上增加一個從設備(如at24c08),那麼我要怎樣寫這個「I2C設備驅動」,讓

應用程序可以訪問at24c08呢?

先來看一個最簡單的i2c設備驅動:
static struct i2c_board_info at24cxx_info = { //所支持的i2c設備的列表
I2C_BOARD_INFO("at24c08", 0x50), //一項代表一個支持的設備,它的名字叫做「at24c08」,器件地址是0x50
};
static struct i2c_client *at24cxx_client;
static int at24cxx_dev_init(void)
{
struct i2c_adapter *i2c_adap; //分配一個適配器的指針
i2c_adap = i2c_get_adapter(0); //調用core層的函數,獲得一個i2c匯流排。這里我們已經知道新增的器件掛接在編號為0的i2c匯流排上
at24cxx_client = i2c_new_device(i2c_adap, &at24cxx_info); // 把i2c適配器和新增的I2C器件關聯起來,這個用了i2c匯流排0,地址是0x50。這就組成了一個客戶端
at24cxx_client i2c_put_adapter(i2c_adap);
return 0;
}
static void at24cxx_dev_exit(void)
{
i2c_unregister_device(at24cxx_client);
}
mole_init(at24cxx_dev_init);
mole_exit(at24cxx_dev_exit);

熱點內容
idalinux 發布:2024-04-27 13:23:41 瀏覽:28
浙江稅務登陸密碼是多少 發布:2024-04-27 13:22:55 瀏覽:494
動感單車哪個配置好 發布:2024-04-27 13:09:49 瀏覽:832
vb開文件夾 發布:2024-04-27 13:09:46 瀏覽:779
美團商家新增的技術伺服器是什麼 發布:2024-04-27 12:12:35 瀏覽:343
得到腳本 發布:2024-04-27 12:06:25 瀏覽:936
三星手機鎖屏忘記密碼了怎麼辦 發布:2024-04-27 12:05:41 瀏覽:519
python基礎語言 發布:2024-04-27 11:54:40 瀏覽:84
ioshttp伺服器搭建 發布:2024-04-27 11:40:26 瀏覽:913
忘記密碼如何強制刷機vivo 發布:2024-04-27 11:28:40 瀏覽:385