1. 程式人生 > >手把手教你寫Linux I2C裝置驅動2

手把手教你寫Linux I2C裝置驅動2

轉載文章,原文地址 http://ticktick.blog.51cto.com/823160/760020/

要想在Linux下讀寫晶片的I2C暫存器,一般需要在Linux編寫一份該晶片的I2C驅動,關於Linux下如何編寫I2C驅動,前一篇文章《手把手教你寫Linux I2C裝置驅動》已經做了初步的介紹,並且留下了兩個疑問尚未解決,第一個是如何對Linux提供的I2C操作函式進行進一步封裝,實現對晶片暫存器的讀寫;另一個是如何在使用者空間呼叫該I2C驅動程式碼。本文將討論前一個問題。

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

  1. externint i2c_master_send(struct i2c_client *,constchar* ,int);    
  2. externint i2c_master_recv(struct i2c_client *,char* ,int); 

    第一個引數是 i2c_client 物件指標,第二個引數是要傳輸的資料buffer指標,第三個引數為buffer的大小。

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

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

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

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

  1. staticint 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;  

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

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

  1. staticint 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;  

    到此為止,Linux下具體如何封裝讀寫晶片暫存器的方法已經介紹完畢,其實並不複雜,希望對初學者有所幫助,文中有什麼講述不正確的地方,歡迎留言或者來信[email protected]交流。

相關推薦

手把手Linux I2C裝置驅動2

轉載文章,原文地址 http://ticktick.blog.51cto.com/823160/760020/ 要想在Linux下讀寫晶片的I2C暫存器,一般需要在Linux編寫一份該晶片的I2C驅動,關於Linux下如何編寫I2C驅動,前一篇文章《手把手教你寫Lin

手把手Linux裝置驅動---定時器(一)(基於友善之臂4412開發板)

這個專題我們來說下Linux中的定時器。在Linux核心中,有這樣的一個定時器,叫做核心定時器,核心定時器用於控制某個函式,也就是定時器將要處理的函式在未來的某個特定的時間內執行。核心定時器註冊的處理函

Linux裝置驅動程式:一個簡短的教程

摘自:http://blog.chinaunix.net/uid-20799298-id-99675.html 原文為 Writing device driver in Linux:A brief tutorial. 該文重點給出了三個例項來講解Linux驅

Linux i2c子系統(一) _動手一個i2c裝置驅動

i2c匯流排是一種十分常見的板級匯流排,本文以linux3.14.0為參考, 討論Linux中的i2c驅動模型並利用這個模型寫一個mpu6050的驅動, 最後在應用層將mpu6050中的原始資料讀取出來 i2c子系統框架 下圖就是我理解的i2c驅動框架示意圖, 類似中斷子系

小程序初體驗:手把手出第一個小程序(一)

輸入框 個人 創建 公測 快速 nsh 成功 too 調用 本文筆者將根據quick start中的範例代碼,帶大家簡單地剖析一下小程序的運行方式,並介紹小程序開發中一些通用的特性,帶著大家一步步寫出自己的小程序。 適用對象:前端初學者,對小程序開發感興趣者 tip

大神手把手一個頁面模板引擎,只需20行Javascript代碼!

[1] 表達 最終 strong ice ali 開頭 syntax years 只用20行Javascript代碼就寫出一個頁面模板引擎的大神是AbsurdJS的作者,下面是他分享的全文,轉需。 不知道你有木有聽說過一個基於Javascript的Web頁面預處理器,叫做A

Swing:LookAndFeel 教程第一篇——手把手出自己的 LookAndFeel

畢業 lean 能開 AC alc 我不 cli private 基礎 本文是 LookAndFeel 系列教程的第一篇。 是我在對 Swing 學習摸索中的一些微

Linux環境搭建 | 手把手安裝Linux虛擬機

界面 rup 對話 rtu 發行版 所在 兼容性 運維 編輯 前言 作為一名Linux工程師,不管是運維、應用、驅動方向,在工作中肯定會需要Linux環境。想要獲得Linux環境,一個辦法就是將電腦系統直接換成Linux系統,但我們平常用慣了Windows系統,直接切換為L

CSAPP Lab:Attack Lab——手把手病毒(大誤

png -o spa 字符 寄存器 產生 方法 函數返回 發現 這個實驗要求在5個有不同安全漏洞的代碼上進行攻擊,攻擊分為兩部分: Part 1:Code Injection Attacks(緩沖區溢出攻擊) Part 2:Return-Oriented Programmi

手把手DI_1_DI框架有什麼?

DI框架有什麼? 在上一節:手把手教你寫DI_0_DI是什麼? 我們已經理解DI是什麼 接下來我們就徒手擼一擼,玩個支援建構函式注入的DI出來 首先我們回顧一下 建構函式注入 的程式碼形式, 大概長這模樣: class MovieLister { private IMovieFinder f

手把手DI_1_DI框架有什麽?

這樣的 desc inject var .net 框架 抽象 幹什麽 depend DI框架有什麽? 在上一節:手把手教你寫DI_0_DI是什麽? 我們已經理解DI是什麽 接下來我們就徒手擼一擼,玩個支持構造函數註入的DI出來 首先我們回顧一下 構造函數註入 的代碼形式,

手把手DI_2_小白徒手擼建構函式注入

小白徒手擼建構函式注入 在上一節:手把手教你寫DI_1_DI框架有什麼? 我們已經知道我們要擼哪些東西了 那麼我們開始動工吧,這裡呢,我們找小白同學來表演下 小白同學 :我們先定義一下我們的廣告招聘紙有什麼: public abstract class ServiceDefintion // 小白

手把手DI_0_DI是什麼?

DI是什麼? Dependency Injection 常常簡稱為:DI。 它是實現控制反轉(Inversion of Control – IoC)的一個模式。 fowler 大大大神 “幾十年”前的經典文章 https://www.martinfowler.com/articles/i

文案圈內的拿破崙:新媒體推廣運營文案創作的黃金法則,黎想手把手出黃金文案

正式交大家進行黃金文案創作前,先由藝形藝意工作室創始人黎想給大家分享一下移動網際網路的熱潮: 2017年移動網際網路的熱潮是知識付費; 2018年移動網際網路的熱潮是新媒體推廣(自媒體)創作; 2019年移動網際網路的熱潮必定是小程式 2018年在新媒體

手把手Linux環境下安裝Python3

在上一篇文章《手把手教你啟用Win10的Linux子系統(超詳細)》我們已經學瞭如何在Win10環境下裝Linux子系統了,那麼這一篇文章我們將學習如何在該Linux系統下安裝Python3。 首先是按Win+R鍵調出cmd命令視窗,然後輸入輸入bash指令進

手把手網路爬蟲(2):迷你爬蟲架構

語言&環境 有需要Python學習資料的小夥伴嗎?小編整理【一套Python資料、原始碼和PDF】,感興趣者可以加學習群:548377875或者加小編微信:【mmp9972】反正閒著也是閒著呢,不如學點東西啦~~ 語言:帶足彈藥,繼續用Python開路! t

微信小程式——手把手一個微信小程式

前言   微信小程式年前的跳一跳確實是火了一把,然後呢一直沒有時間去實踐專案,一直想搞但是工作上不需要所以,嗯嗯嗯嗯嗯emmmmm..... 需求   小程式語音識別,全景圖片觀看,登入授權,獲取個人基本資訊 一:基礎框架 跟著官方文件一步一步來,新建一個小程式專案就好 然後呢,畢竟預設的只是基本骨架

手把手一個手勢密碼解鎖View(GesturePasswordView)

相信大家在很多的app肯定看到過手勢密碼解鎖View,但是大家有沒有想過怎麼實現這樣一個View,哈,接下來,小編手把手教大家教寫一個GesturePasswordView。 先看一張效果圖 要實現這樣一個效果,首先需要在螢幕上繪製一個3x3九宮圖,如下圖 具體思路:

手把手DI_3_小白徒手支援 `Singleton` 和 `Scoped` 生命週期

手把手教你寫DI_3_小白徒手支援 Singleton 和 Scoped 生命週期 渾身繃帶的小白同學:我們繼續開展我們的工作,大家都知道 Singleton是什麼,就是全域性只有一個唄,我們就先從它開始,這個多簡單,我們找個字典放這些物件就ok啦 public class ServiceProvider

Linux I2C裝置驅動編寫(一)

在Linux驅動中I2C系統中主要包含以下幾個成員: I2C adapter 即I2C介面卡 I2C driver 某個I2C裝置的裝置驅動,可以以driver理解。 I2C client 某個I2C裝置的裝置宣告,可以以device理解。 I2C adapter 是