歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Linux下讀寫芯片的I2C寄存器

Linux下讀寫芯片的I2C寄存器

日期:2017/3/1 10:40:16   编辑:Linux編程
要想在Linux下讀寫芯片的I2C寄存器,一般需要在Linux編寫一份該芯片的I2C驅動,關於Linux下如何編寫I2C驅動,前一篇文章《手把手教你寫Linux I2C設備驅動》(見 http://www.linuxidc.com/Linux/2012-01/51289.htm )已經做了初步的介紹,並且留下了兩個疑問尚未解決,第一個是如何對Linux提供的I2C操作函數進行進一步封裝,實現對芯片寄存器的讀寫;另一個是如何在用戶空間調用該I2C驅動代碼。本文將討論前一個問題。

首先,我們要了解Linux系統提供的I2C操作函數怎麼使用,上篇文章已經提到過,對I2C設備的讀寫,Linux系統提供了多種接口,這些接口可以在內核的 i2c.h 中找到,這裡我主要介紹下面這組讀寫接口:

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

第一個參數是 i2c_client 對象指針,第二個參數是要傳輸的數據buffer指針,第三個參數為buffer的大小。

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

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

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

650) this.width=650;" border=0>

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

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

其實挺簡單的,沒有什麼復雜的代碼。下面再看看讀時序。

650) this.width=650;" border=0>

由上圖可以,讀時序需要做的操作是,先向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. return 0;
  16. }

到此為止,Linux下具體如何封裝讀寫芯片寄存器的方法已經介紹完畢,其實並不復雜。

Copyright © Linux教程網 All Rights Reserved