色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux I2C驅動入門知識科普

jf_BxU6dNQb ? 來源:混說Linux ? 2022-12-29 13:59 ? 次閱讀

Linux內核將 I2C 驅動分為兩部分:

I2C 總線驅動, I2C總線驅動就是SOC的 I2C控制器驅動,也叫做 I2C適配器驅動。

I2C 設備驅動, I2C設備驅動就是針對具體的 I2C設備而編寫的驅動。

I2C框架下的幾個重要成員

1. I2C總線

I2C總線結構體在driversi2ci2c-core.c中定義如下:

structbus_typei2c_bus_type={
.name="i2c",
.match=i2c_device_match,
.probe=i2c_device_probe,
.remove=i2c_device_remove,
.shutdown=i2c_device_shutdown,
};

I2C總線對應著/bus下的一條總線,這個i2c總線結構體管理著i2c設備與I2C驅動的匹配,刪除等操作,I2C總線會調用i2c_device_match函數看I2C設備和I2C驅動是否匹配,如果匹配就調用i2c_device_probe函數,進而調用I2C驅動的probe函數。

形如:

464fcfe2-8732-11ed-bfe3-dac502259ad0.png

i2c_device_match會管理I2C設備和I2C總線匹配規則,這將和如何編寫I2C驅動程序息息相關。

2. I2C驅動

i2c_driver 類似 platform_driver,是我們編寫 I2C 設備驅動重點要處理的內容, i2c_driver 結構體定義在 include/linux/i2c.h 文件中,內容如下:

structi2c_driver{
unsignedintclass;

/*Notifiesthedriverthatanewbushasappeared.Youshouldavoid
*usingthis,itwillberemovedinanearfuture.
*/
int(*attach_adapter)(structi2c_adapter*)__deprecated;

/*Standarddrivermodelinterfaces*/
int(*probe)(structi2c_client*,conststructi2c_device_id*);
int(*remove)(structi2c_client*);


/*drivermodelinterfacesthatdon'trelatetoenumeration*/
void(*shutdown)(structi2c_client*);

/*Alertcallback,forexamplefortheSMBusalertprotocol.
*Theformatandmeaningofthedatavaluedependsontheprotocol.
*FortheSMBusalertprotocol,thereisasinglebitofdatapassed
*asthealertresponse'slowbit("eventflag").
*/
void(*alert)(structi2c_client*,unsignedintdata);

/*aioctllikecommandthatcanbeusedtoperformspecificfunctions
*withthedevice.
*/
int(*command)(structi2c_client*client,unsignedintcmd,void*arg);

structdevice_driverdriver;
conststructi2c_device_id*id_table;

/*Devicedetectioncallbackforautomaticdevicecreation*/
int(*detect)(structi2c_client*,structi2c_board_info*);
constunsignedshort*address_list;
structlist_headclients;
};

重點成員如下:

int(*probe)(structi2c_client*,conststructi2c_device_id*)

當 I2C設備和驅動匹配成功以后 probe函數就會執行。

structdevice_driverdriverdevice_driver

驅動結構體,如果使用設備樹的話,需要設置device_driver的of_match_table成員變量,也就是驅動的兼容(compatible)屬性。

conststructi2c_device_id*id_table

id_table 是傳統的、未使用設備樹的設備匹配 ID表

3. I2C設備

I2C設備結構體i2c_client 結構體定義在 include/linux/i2c.h 文件中,內容如下:

structi2c_client{
unsignedshortflags;/*div.,seebelow*/
unsignedshortaddr;/*chipaddress-NOTE:7bit*/
/*addressesarestoredinthe_LOWER_7bits*/
charname[I2C_NAME_SIZE];
structi2c_adapter*adapter;/*theadapterwesiton*/
structdevicedev;/*thedevicestructure*/
intirq;/*irqissuedbydevice*/
structlist_headdetected;
#ifIS_ENABLED(CONFIG_I2C_SLAVE)
i2c_slave_cb_tslave_cb;/*callbackforslavemode*/
#endif
};

重點成員如下:

flags:標志

addr芯片地址,7 位,存在低 7 位

flagsname[I2C_NAME_SIZE]:名字

adapter:對應的 I2C 適配器

dev:設備結構體

irq:中斷

一個設備對應一個 i2c_client,每檢測到一個 I2C 設備就會給這個 I2C 設備分配一個i2c_client。

4. I2C適配器

經過上面的介紹,知道有I2C驅動和I2C設備,我們需要通過I2C驅動去和I2C設備通訊,這其中就需要一個I2C設配器,I2C設配器對應的就是SOC上的I2C控制器。

Linux 內核將 SOC 的 I2C 適配器(控制器)抽象成 i2c_adapter, i2c_adapter 結構體定義在 include/linux/i2c.h 文件中,結構體內容如下:

/*
*i2c_adapteristhestructureusedtoidentifyaphysicali2cbusalong
*withtheaccessalgorithmsnecessarytoaccessit.
*/
structi2c_adapter{
structmodule*owner;
unsignedintclass;/*classestoallowprobingfor*/
conststructi2c_algorithm*algo;/*thealgorithmtoaccessthebus*//*總線訪問算法*/
void*algo_data;

/*datafieldsthatarevalidforalldevices*/
structrt_mutexbus_lock;

inttimeout;/*injiffies*/
intretries;
structdevicedev;/*theadapterdevice*/

intnr;
charname[48];
structcompletiondev_released;

structmutexuserspace_clients_lock;
structlist_headuserspace_clients;

structi2c_bus_recovery_info*bus_recovery_info;
conststructi2c_adapter_quirks*quirks;
};

重點成員如下:

conststructi2c_algorithm*algo

I2C 適配器與 IIC 設備進行通信的方法。

i2c_algorithm 結構體定義在 include/linux/i2c.h 文件中,內容如下:

structi2c_algorithm{
/*Ifanadapteralgorithmcan'tdoI2C-levelaccess,setmaster_xfer
toNULL.IfanadapteralgorithmcandoSMBusaccess,set
smbus_xfer.IfsettoNULL,theSMBusprotocolissimulated
usingcommonI2Cmessages*/
/*master_xfershouldreturnthenumberofmessagessuccessfully
processed,oranegativevalueonerror*/
int(*master_xfer)(structi2c_adapter*adap,structi2c_msg*msgs,
intnum);
int(*smbus_xfer)(structi2c_adapter*adap,u16addr,
unsignedshortflags,charread_write,
u8command,intsize,unioni2c_smbus_data*data);

/*Todeterminewhattheadaptersupports*/
u32(*functionality)(structi2c_adapter*);

#ifIS_ENABLED(CONFIG_I2C_SLAVE)
int(*reg_slave)(structi2c_client*client);
int(*unreg_slave)(structi2c_client*client);
#endif
};

重點成員如下:

master_xfer:I2C 適配器的傳輸函數,可以通過此函數來完成與 IIC 設備之間的通信。

smbus_xfer:SMBUS 總線的傳輸函數

I2C 適配器驅動的主要工作就是初始化 i2c_adapter 結構體變量,然后設置 i2c_algorithm中的master_xfer函數。完成以后通過 i2c_add_numbered_adapter或 i2c_add_adapter這兩個函數向系統注冊設置好的 i2c_adapter。

這兩個函數的區別在于 i2c_add_adapter 使用動態的總線號,而 i2c_add_numbered_adapter使用靜態總線號。

5. 小結

I2C驅動有4個重要的東西:I2C總線、I2C驅動、I2C設備、I2C設備器。

I2C總線:維護著兩個鏈表(I2C驅動、I2C設備),管理I2C設備和I2C驅動的匹配和刪除等。

I2C驅動:對應的就是I2C設備的驅動程序。

I2C設備:是具體硬件設備的一個抽象。

I2C適配器:用于I2C驅動和I2C設備間的通用,是SOC上I2C控制器的一個抽象。

Linux I2C總線的運行機制:

注冊I2C驅動

將I2C驅動添加到I2C總線的驅動鏈表中

遍歷I2C總線上的設備鏈表,根據i2c_device_match函數進行匹配,如果匹配調用i2c_device_probe函數

i2c_device_probe函數會調用I2C驅動的probe函數

I2C驅動簡單編寫流程

一般 SOC 的 I2C總線驅動都是由半導體廠商編寫的,這個不需要用戶去編寫。因此 I2C 總線驅動對于 SOC使用者來說是被屏蔽掉的,我們只要專注于 I2C 設備驅動即可。除非你是在半導體公司上班,工作內容就是寫 I2C 適配器驅動。

i2c_driver類似platform_driver,是我們編寫I2C設備驅動重點要處理的內容,i2c_driver在上面已經介紹了其結構體的具體內容。

對于我們 I2C 設備驅動編寫人來說,重點工作就是構建i2c_driver,構建完成以后需要向Linux內核注冊這個i2c_driver。

那么如何注冊呢?

使用下面的這個函數:

inti2c_register_driver(structmodule*owner,structi2c_driver*driver)
函數參數和返回值含義如下:

owner:一般為 THIS_MODULE。

driver:要注冊的 i2c_driver。

返回值:0,成功;負值,失敗。

另外 i2c_add_driver 也常常用于注冊 i2c_driver, i2c_add_driver 是一個宏,定義如下:

#definei2c_add_driver(driver)
i2c_register_driver(THIS_MODULE,driver)

i2c_add_driver 就是對 i2c_register_driver 做了一個簡單的封裝,只有一個參數,就是要注冊的 i2c_driver。

設備驅動的時候需要將前面注冊的 i2c_driver 從 Linux 內核中注銷掉,需要用到i2c_del_driver 函數,此函數原型如下:

voidi2c_del_driver(structi2c_driver*driver);
函數參數和返回值含義如下:

driver:要注銷的 i2c_driver。

返回值:無。

例程框架:

/*i2c驅動的probe函數*/
staticintxxx_probe(structi2c_client*client,
{
/*函數具體程序*/
return0;
}

/*i2c驅動的remove函數*/
staticintxxx_remove(structi2c_client*client)
{
/*函數具體程序*/
return0;
}

/*傳統匹配方式ID列表*/
staticconststructi2c_device_idxxx_id[]={
{"xxx",0},
{}
};

/*設備樹匹配列表*/
staticconststructof_device_idxxx_of_match[]={
{.compatible="xxx"},
{/*Sentinel*/}
};

/*i2c驅動結構體*/
staticstructi2c_driverxxx_driver={
.probe=xxx_probe,
.remove=xxx_remove,
.driver={
.owner=THIS_MODULE,
.name="xxx",
.of_match_table=xxx_of_match,
},
.id_table=xxx_id,
};

/*驅動入口函數*/
staticint__initxxx_init(void)
{
intret=0;
ret=i2c_add_driver(&xxx_driver);
returnret;
}

/*驅動出口函數*/
staticvoid__exitxxx_exit(void)
{
i2c_del_driver(&xxx_driver);
}

module_init(xxx_init);
module_exit(xxx_exit);

當I2C設備和I2C驅動匹配成功以后probe函數就會執行,這些和platform驅動一樣,probe函數里面基本就是標準的字符設備驅動那一套了。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 內核
    +關注

    關注

    3

    文章

    1372

    瀏覽量

    40276
  • Linux
    +關注

    關注

    87

    文章

    11292

    瀏覽量

    209328
  • I2C總線
    +關注

    關注

    8

    文章

    390

    瀏覽量

    60916
  • I2C驅動
    +關注

    關注

    0

    文章

    9

    瀏覽量

    7046

原文標題:Linux I2C 驅動入門,建議收藏!!!

文章出處:【微信號:混說Linux,微信公眾號:混說Linux】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Linux內核中描述I2C的四個核心結構體

    I2C核心維護了i2c_bus結構體,提供了I2C總線驅動和設備驅動的注冊、注銷方法,維護了I2C
    的頭像 發表于 09-04 09:35 ?1472次閱讀
    <b class='flag-5'>Linux</b>內核中描述<b class='flag-5'>I2C</b>的四個核心結構體

    基于I2C總線的EEPROM驅動程序

     I2C總線是由Philips公司開發的用于器件之間連接的2線式雙向同步串行總線。Linux內核中針對I2C總線的特性,其設備驅動
    發表于 12-07 13:58 ?55次下載

    PSoC 1 I2C 入門-AN50987

    PSoC 1 I2C 入門-AN50987
    發表于 10-10 16:22 ?8次下載
    PSoC 1 <b class='flag-5'>I2C</b> <b class='flag-5'>入門</b>-AN50987

    Linux設備驅動開發詳解》第15章、LinuxI2C核心、總線與設備驅動

    Linux設備驅動開發詳解》第15章、LinuxI2C核心、總線與設備驅動
    發表于 10-27 11:19 ?8次下載
    《<b class='flag-5'>Linux</b>設備<b class='flag-5'>驅動</b>開發詳解》第15章、<b class='flag-5'>Linux</b>的<b class='flag-5'>I2C</b>核心、總線與設備<b class='flag-5'>驅動</b>

    基于嵌入式Linux下的I2C設備驅動的總體思路與框架設計

    由于I2C總線的通用性,Linux作為一款優秀的嵌入式操作系統,也必須要對其要有很好的支持。在Linux內核源碼中對I2C總線的驅動是基于
    發表于 08-20 09:04 ?3741次閱讀
    基于嵌入式<b class='flag-5'>Linux</b>下的<b class='flag-5'>I2C</b>設備<b class='flag-5'>驅動</b>的總體思路與框架設計

    LinuxI2C驅動架構

    1.???? LinuxI2C驅動架構LinuxI2C總線的驅動分為兩個部分
    發表于 04-02 14:38 ?676次閱讀

    Linux驅動中的I2C驅動架構詳細分析

    其實I2C接口非常的簡單,即使用51單片機的gpio來模擬I2C,編寫一個e2prom或者其他I2C接口的驅動程序,也不是什么難事,幾百行代
    發表于 08-01 17:35 ?3次下載
    <b class='flag-5'>Linux</b><b class='flag-5'>驅動</b>中的<b class='flag-5'>I2C</b><b class='flag-5'>驅動</b>架構詳細分析

    如何在Linux下使用SAMA5D2 I2C

    本應用筆記介紹在 Linux 下使用 SAMA5D2 I2C入門信息。
    發表于 03-30 15:45 ?2次下載
    如何在<b class='flag-5'>Linux</b>下使用SAMA5D<b class='flag-5'>2</b> <b class='flag-5'>I2C</b>

    Linux驅動I2C設備驅動(基于Freescale i.MX6ULL平臺了解I2C驅動框架,順便寫個簡陋的MPU6050驅動

    文章目錄1、簡介2I2C總線、設備和驅動的結構體定義2.1 結構體定義--I2C總線2.2 結構體定義--I2C設備2.3 結構體定義--
    發表于 12-06 13:51 ?8次下載
    <b class='flag-5'>Linux</b><b class='flag-5'>驅動</b>:<b class='flag-5'>I2C</b>設備<b class='flag-5'>驅動</b>(基于Freescale <b class='flag-5'>i</b>.MX6ULL平臺了解<b class='flag-5'>I2C</b>的<b class='flag-5'>驅動</b>框架,順便寫個簡陋的MPU6050<b class='flag-5'>驅動</b>)

    linux移植MPU6050的I2C驅動

    有MPU6050的例程,測試后很好用,如下圖(夢幻聯動一下:樹莓派PICO+freeRTOS)因為pico上有現成的能用的例程,所以改一改之后直接移植到linux上首先介紹一下linux下的I2C框架①、
    發表于 12-06 14:21 ?10次下載
    <b class='flag-5'>linux</b>移植MPU6050的<b class='flag-5'>I2C</b><b class='flag-5'>驅動</b>

    Linux應用開發【第十二章】I2C編程應用開發

    12.2.2 簡述I2Clinux驅動 1) I2C核心層: 2) I2C總線
    的頭像 發表于 12-10 19:28 ?903次閱讀
    <b class='flag-5'>Linux</b>應用開發【第十二章】<b class='flag-5'>I2C</b>編程應用開發

    硬件I2C與模擬I2C

    硬件I2C對應芯片上的I2C外設,有相應I2C驅動電路,其所使用的I2C管腳也是專用的,因而效率要遠高于軟件模擬的
    發表于 12-28 19:14 ?81次下載
    硬件<b class='flag-5'>I2C</b>與模擬<b class='flag-5'>I2C</b>

    MSP MCU I2C入門指南

    MSP MCU I2C入門指南
    發表于 11-02 08:16 ?1次下載
    MSP MCU <b class='flag-5'>I2C</b><b class='flag-5'>入門</b>指南

    I2C控制器驅動介紹

    控制器驅動 I2C 總線驅動重點是 I2C 適配器驅動,這里要用到兩個重要的數據結構:i2c_a
    的頭像 發表于 07-22 15:38 ?1480次閱讀
    <b class='flag-5'>I2C</b>控制器<b class='flag-5'>驅動</b>介紹

    I2C子系統SW Architecture

    I2C SW Architecture 【driver 驅動層】由普通驅動工程師負責,【i2c 核心層】由 Linux 提供,【
    的頭像 發表于 07-22 16:01 ?945次閱讀
    <b class='flag-5'>I2C</b>子系統SW Architecture
    主站蜘蛛池模板: 天天射天天爱天天干| 岛国片免费看| 男女久久久国产一区二区三区| 伊人精品久久久大香线蕉99| 近亲乱中文字幕| 一区二区三区无码被窝影院| 九色91精品国产网站| 在线 国产 欧美 亚洲 天堂| 久久热免费视频| 中国少妇内射XXXX狠干| 蜜臀AV色欲A片无码一区| 99re6热这里在线精品视频| 嗯啊好爽视频| 超碰在线视频地址| 偷上邻居熟睡少妇| 国内精品久久影视免费| 亚洲中文字幕无码一去台湾| 可以看的黄页的网站| 99国产在线视频| 日产精品久久久久久久蜜殿| 成人免费在线观看| 微福利92合集| 婚后被调教当众高潮H喷水 | 好想被狂躁A片免费久99| 亚洲免费综合色视频| 久久九九少妇免费看A片| 60老妇性xxxxhd| 日本国产成人精品无码区在线网站| 国产产一区二区三区久久毛片国语 | bbbbbxxxxx肥胖| 色偷拍自怕亚洲在线| 国产在线视频分类精品| 樱桃熟了A级毛片| 欧美肥胖女人bbwbbw视频| 高hh乱亲女真实| 亚洲高清有码中文字| 老少配xxxxx欧美| 成人免费观看在线视频| 亚洲高清毛片一区二区| 麻豆出品国产AV在线观看| 拔萝卜视频免费看高清|