免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Linux下讀寫芯片的I2C寄存器
Linux下讀寫芯片的I2C寄存器

    要想在Linux下讀寫芯片的I2C寄存器,一般需要在Linux編寫一份該芯片的I2C驅(qū)動,關(guān)于Linux下如何編寫I2C驅(qū)動,前一篇文章《手把手教你寫Linux I2C設(shè)備驅(qū)動》已經(jīng)做了初步的介紹,并且留下了兩個疑問尚未解決,第一個是如何對Linux提供的I2C操作函數(shù)進行進一步封裝,實現(xiàn)對芯片寄存器的讀寫;另一個是如何在用戶空間調(diào)用該I2C驅(qū)動代碼。本文將討論前一個問題。

    首先,我們要了解Linux系統(tǒng)提供的I2C操作函數(shù)怎么使用,上篇文章已經(jīng)提到過,對I2C設(shè)備的讀寫,Linux系統(tǒng)提供了多種接口,這些接口可以在內(nèi)核的 i2c.h 中找到,這里我主要介紹下面這組讀寫接口:

  1. extern int i2c_master_send(struct i2c_client *,const char* ,int);    
  2.    
  3. extern int i2c_master_recv(struct i2c_client *,char* ,int); 

    第一個參數(shù)是 i2c_client 對象指針,第二個參數(shù)是要傳輸?shù)臄?shù)據(jù)buffer指針,第三個參數(shù)為buffer的大小。

    接口函數(shù)已經(jīng)有了,下面我們要解決的問題就是以何種形式/規(guī)則去使用這些接口才能正確地讀寫芯片的相關(guān)寄存器。

    首先,我們需要查詢芯片手冊,找到芯片手冊中,關(guān)于寄存器的I2C讀寫時序,其實,大多數(shù)芯片的I2C寄存器的讀寫時序都是一樣的,下面我還是以手頭的TVP5158芯片為例。

    首先分析寫操作,該芯片的手冊中給出的I2C寄存器寫時序圖如下:

    從上圖可以看出,真正需要執(zhí)行寫操作的有兩處,Step4 和 Step6 ,Step4首先寫入寄存器的偏移地址,而Step6則是寫入到該寄存器的值。由此已經(jīng)很清楚了,對于寫I2C寄存器,我們需要做的就是給 i2c_master_send 函數(shù)傳入兩個字節(jié)的數(shù)據(jù)即可,第一個字節(jié)為寄存器的地址,第二個字節(jié)為要寫入寄存器的數(shù)據(jù)。示例如下:

  1. static int tvp5158_i2c_write( struct i2c_client* client,uint8_t reg,uint8_t data)  
  2. {  
  3.     unsigned char buffer[2];  
  4.       
  5.     buffer[0] = reg;  
  6.     buffer[1] = data;  
  7.       
  8.     if( 2!= i2c_master_send(client,buffer,2) ) {  
  9.         printk( KERN_ERR " tvp5158_i2c_write fail! \n" );  
  10.         return -1;  
  11.     }      
  12.     return 0;  

    其實挺簡單的,沒有什么復(fù)雜的代碼。下面再看看讀時序。

     由上圖可以,讀時序需要做的操作是,先向I2C總線上寫入需要讀的寄存器地址,然后讀I2C總線上的值。代碼寫起來也不難,示例如下:

  1. static int tvp5158_i2c_read( struct i2c_client* client,uint8_t reg,uint8_t *data)  
  2. {  
  3.     // write reg addr     
  4.     if( 1!= i2c_master_send(client,&reg,1) ) {  
  5.         printk( KERN_ERR " tvp5158_i2c_read fail! \n" );  
  6.         return -1;  
  7.     }      
  8.     // wait  
  9.     msleep(10);  
  10.     // read  
  11.     if( 1!= i2c_master_recv(client,data,1) ) {  
  12.         printk( KERN_ERR " tvp5158_i2c_read fail! \n" );  
  13.         return -1;  
  14.     }      
  15.       
  16.     return 0;  

    到此為止,Linux下具體如何封裝讀寫芯片寄存器的方法已經(jīng)介紹完畢,其實并不復(fù)雜,希望對初學(xué)者有所幫助,文中有什么講述不正確的地方,歡迎留言或者來信lujun.hust@gmail.com交流。

本文出自 “對影成三人” 博客,請務(wù)必保留此出處http://ticktick.blog.51cto.com/823160/760965

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
分析Linux kernel exception
怎樣寫 Linux LCD 驅(qū)動程序
實踐 | 基于Linux的AP3216三合一整合型光感測器實驗分享
S3C2410的Linux下DMA驅(qū)動程序開發(fā) &SEP4020 DMA驅(qū)動編寫心得及使用流程
基于MTD的NAND驅(qū)動開發(fā)(一)
單片機和嵌入式系統(tǒng)linux的區(qū)別
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服