在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

    文章

    1383

    瀏覽量

    40442
  • Linux
    +關注

    關注

    87

    文章

    11351

    瀏覽量

    210497
  • I2C總線
    +關注

    關注

    8

    文章

    406

    瀏覽量

    61195
  • I2C驅動
    +關注

    關注

    0

    文章

    9

    瀏覽量

    7105

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

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

收藏 人收藏

    評論

    相關推薦

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

    I2C核心維護了i2c_bus結構體,提供了I2C總線驅動和設備驅動的注冊、注銷方法,維護了I2C
    的頭像 發表于 09-04 09:35 ?1774次閱讀
    <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 ?3787次閱讀
    基于嵌入式<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 ?702次閱讀

    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 ?972次閱讀
    <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 ?1569次閱讀
    <b class='flag-5'>I2C</b>控制器<b class='flag-5'>驅動</b>介紹

    I2C子系統SW Architecture

    I2C SW Architecture 【driver 驅動層】由普通驅動工程師負責,【i2c 核心層】由 Linux 提供,【
    的頭像 發表于 07-22 16:01 ?1009次閱讀
    <b class='flag-5'>I2C</b>子系統SW Architecture
    主站蜘蛛池模板: 美女扒开尿口让男人捅 | 亚洲一区二区色 | 午夜影院免费入口 | 毛片新网址 | 国产青青草 | 国产乱子伦一区二区三区 | 国产精品久久永久免费 | 一级毛片子 | 综合五月天婷婷丁香 | 四虎电影免费观看网站 | 午夜精品在线免费观看 | 高清成年美女xx免费网站黄 | 免费观看一级特黄三大片视频 | 久久久久久久免费 | 日本吻胸抓胸激烈视频网站 | 日本黄色小视频 | 国产三a级日本三级日产三级 | 日日日干干干 | 国产手机免费视频 | 国模人体一区二区三区 | 九九精品久久久久久噜噜 | 免费观看a黄一级视频 | 4480yy私人午夜a级国产 | 奇米影视亚洲四色8888 | www.午夜色| 一级黄色毛片播放 | 婷婷丁香激情五月 | 91啪免费网站在线观看 | 久久青青成人亚洲精品 | 国产精品久久久久久吹潮 | 国产毛片哪里有 | 插菊综合网 | 亚洲国产成人久久午夜 | 久久精品亚洲精品国产色婷 | 狠狠鲁狠狠操 | 性夜影院爽黄a爽免费看网站 | 午夜黄页网站在线播放 | 综合网视频 | 欧美亚洲天堂 | 天天干天天色天天射 | 性在线视频 |