0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

I2C設(shè)備驅(qū)動(dòng)的兩個(gè)數(shù)據(jù)結(jié)構(gòu)

麥辣雞腿堡 ? 來(lái)源:嵌入式Linux系統(tǒng)開(kāi)發(fā) ? 作者:嵌入式Linux系統(tǒng)開(kāi) ? 2023-07-22 15:49 ? 次閱讀

設(shè)備驅(qū)動(dòng)

I2C 設(shè)備驅(qū)動(dòng)重點(diǎn)關(guān)注兩個(gè)數(shù)據(jù)結(jié)構(gòu):i2c_client 和 i2c_driver。i2c_client 就是描述設(shè)備信息的,i2c_driver 描述驅(qū)動(dòng)內(nèi)容。

一個(gè)設(shè)備對(duì)應(yīng)一個(gè) i2c_client,每檢測(cè)到一個(gè) I2C 設(shè)備就會(huì)給這個(gè) I2C 設(shè)備分配一個(gè) i2c_client。

i2c_driver 中包含 probe 函數(shù)和 device_driver 結(jié)構(gòu)體。如果使用設(shè)備樹(shù)的話(huà),需要設(shè)置 device_driver 的 of_match_table 成員變量,也就是驅(qū)動(dòng)的兼容(compatible)屬性。

當(dāng) I2C 設(shè)備和驅(qū)動(dòng)匹配以后,probe 函數(shù)就會(huì)執(zhí)行。

因此,對(duì)于 Linux 來(lái)講,不區(qū)分 I2C 控制器和 I2C 從機(jī)設(shè)備,用的都是同一套東西,即【總線(xiàn)、設(shè)備、驅(qū)動(dòng)】框架,都有 probe 函數(shù)。

設(shè)備樹(shù)

圖片

注意,I2C 設(shè)備在設(shè)備樹(shù)中必須掛到對(duì)應(yīng)的總線(xiàn)下,如圖是在 &i2c0 下。

驅(qū)動(dòng)

圖片

圖片

當(dāng)驅(qū)動(dòng)和設(shè)備匹配時(shí),probe 函數(shù)開(kāi)始執(zhí)行,重要的地方博主都寫(xiě)了注釋

static int goodix_i2c_probe(struct i2c_client *client,
 const struct i2c_device_id *dev_id)
{
 struct goodix_ts_device *ts_device = NULL;
 struct goodix_ts_board_data *ts_bdata = NULL;
 int r = 0;

  //檢查 I2C 控制器支持是否支持標(biāo)準(zhǔn) I2C 協(xié)議
 r = i2c_check_functionality(client- >adapter,I2C_FUNC_I2C);

 /* 板級(jí)信息分配內(nèi)存 */
 ts_bdata = devm_kzalloc(&client- >dev,sizeof(struct goodix_ts_board_data), GFP_KERNEL);
 ts_device = devm_kzalloc(&client- >dev,sizeof(struct goodix_ts_device), GFP_KERNEL);

  //填充結(jié)構(gòu)體元素
 /* use pinctrl in core.c */
 ts_bdata- >pinctrl_dev = client- >adapter- >dev.parent;

 ts_device- >name = "GT9886 TouchDevcie";
 ts_device- >dev = &client- >dev;
 ts_device- >board_data = ts_bdata;
 ts_device- >hw_ops = &hw_i2c_ops;
 touch_filter_bdata = ts_bdata;

 /* ts core device */
 goodix_pdev = kzalloc(sizeof(struct platform_device), GFP_KERNEL); 
  
  //填充結(jié)構(gòu)體元素
 goodix_pdev- >name = GOODIX_CORE_DRIVER_NAME;
 goodix_pdev- >id = 0;
 goodix_pdev- >num_resources = 0;
 goodix_pdev- >dev.platform_data = ts_device;
 goodix_pdev- >dev.release = goodix_pdev_release;

 r = platform_device_register(goodix_pdev);

 /* register platform driver*/
 r = goodix_ts_core_init();

  ......
}

I2C 從機(jī)設(shè)備驅(qū)動(dòng)中的 probe 函數(shù)和器件強(qiáng)相關(guān),各家撰寫(xiě)方式不一樣。

在 I2C 設(shè)備驅(qū)動(dòng)中,除了 init、exit、probe、remove 函數(shù)外,還要實(shí)現(xiàn) read、write 函數(shù)才行。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 驅(qū)動(dòng)
    +關(guān)注

    關(guān)注

    12

    文章

    1790

    瀏覽量

    84911
  • I2C
    I2C
    +關(guān)注

    關(guān)注

    28

    文章

    1452

    瀏覽量

    122261
  • 數(shù)據(jù)結(jié)構(gòu)

    關(guān)注

    3

    文章

    568

    瀏覽量

    40030
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Linux內(nèi)核中描述I2C的四個(gè)核心結(jié)構(gòu)

    I2C核心維護(hù)了i2c_bus結(jié)構(gòu)體,提供了I2C總線(xiàn)驅(qū)動(dòng)設(shè)備
    的頭像 發(fā)表于 09-04 09:35 ?1029次閱讀
    Linux內(nèi)核中描述<b class='flag-5'>I2C</b>的四個(gè)核心<b class='flag-5'>結(jié)構(gòu)</b>體

    為什么I2C總線(xiàn)忙于兩個(gè)設(shè)備?

    晚上好,我正試圖通過(guò)PS2C作為主機(jī)來(lái)獲得兩個(gè)MPU-9250的工作。連接到總線(xiàn)只有一個(gè)MPU-9250一切工作完美!使用兩個(gè)設(shè)備不能工作,并且I2
    發(fā)表于 11-14 11:31

    什么是基于嵌入式Linux的I2C設(shè)備驅(qū)動(dòng)程序?

    由于I2C總線(xiàn)的通用性,Linux作為一款優(yōu)秀的嵌入式操作系統(tǒng),也必須要對(duì)其要有很好的支持。在Linux內(nèi)核源碼中對(duì)I2C總線(xiàn)的驅(qū)動(dòng)是基于總線(xiàn)設(shè)備驅(qū)
    發(fā)表于 09-02 08:04

    I2C總線(xiàn)驅(qū)動(dòng)設(shè)備驅(qū)動(dòng)

    為400kbit/s常見(jiàn)iic設(shè)備eeprom觸摸芯片溫濕度傳感器mpu6050(姿態(tài)傳感器)…框架圖I2C核心提供I2C總線(xiàn)驅(qū)動(dòng)設(shè)備
    發(fā)表于 12-13 06:18

    I2C設(shè)備驅(qū)動(dòng)的相關(guān)資料下載

    文章目錄1、簡(jiǎn)介2I2C總線(xiàn)、設(shè)備驅(qū)動(dòng)結(jié)構(gòu)體定義2.1 結(jié)構(gòu)體定義--
    發(fā)表于 02-10 06:39

    基于嵌入式Linux下的I2C設(shè)備驅(qū)動(dòng)的總體思路與框架設(shè)計(jì)

    由于I2C總線(xiàn)的通用性,Linux作為一款優(yōu)秀的嵌入式操作系統(tǒng),也必須要對(duì)其要有很好的支持。在Linux內(nèi)核源碼中對(duì)I2C總線(xiàn)的驅(qū)動(dòng)是基于總線(xiàn)設(shè)備
    發(fā)表于 08-20 09:04 ?3672次閱讀
    基于嵌入式Linux下的<b class='flag-5'>I2C</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>的總體思路與框架設(shè)計(jì)

    Linux的I2C驅(qū)動(dòng)架構(gòu)

    意義上的讀寫(xiě)函數(shù)一樣,這兩個(gè)函數(shù)對(duì)i2c_client指針指定的設(shè)備,讀寫(xiě)int個(gè)char。返回值為讀寫(xiě)的字節(jié)數(shù)。對(duì)于我們現(xiàn)有的SLIC的驅(qū) 動(dòng),只要將最后要往總線(xiàn)上進(jìn)行讀寫(xiě)的數(shù)據(jù)引出
    發(fā)表于 04-02 14:38 ?626次閱讀

    STM32 I2C硬件的結(jié)構(gòu)

    我們可以看見(jiàn)STM32的硬件I2C兩個(gè)數(shù)據(jù)有關(guān)的寄存器“數(shù)據(jù)寄存器(Data register)”(DR)和“數(shù)據(jù)移位寄存器(Data
    的頭像 發(fā)表于 04-30 15:00 ?7043次閱讀
    STM32 <b class='flag-5'>I2C</b>硬件的<b class='flag-5'>結(jié)構(gòu)</b>

    Linux驅(qū)動(dòng)I2C設(shè)備驅(qū)動(dòng)(基于Freescale i.MX6ULL平臺(tái)了解I2C驅(qū)動(dòng)框架,順便寫(xiě)個(gè)簡(jiǎn)陋的MPU6050驅(qū)動(dòng)

    文章目錄1、簡(jiǎn)介2、I2C總線(xiàn)、設(shè)備驅(qū)動(dòng)結(jié)構(gòu)體定義2.1 結(jié)構(gòu)體定義--
    發(fā)表于 12-06 13:51 ?8次下載
    Linux<b class='flag-5'>驅(qū)動(dòng)</b>:<b class='flag-5'>I2C</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>(基于Freescale <b class='flag-5'>i</b>.MX6ULL平臺(tái)了解<b class='flag-5'>I2C</b>的<b class='flag-5'>驅(qū)動(dòng)</b>框架,順便寫(xiě)個(gè)簡(jiǎn)陋的MPU6050<b class='flag-5'>驅(qū)動(dòng)</b>)

    嵌入式內(nèi)核及驅(qū)動(dòng)開(kāi)發(fā)-09IIC子系統(tǒng)框架使用(I2C協(xié)議和時(shí)序,I2C驅(qū)動(dòng)框架,I2C設(shè)備驅(qū)動(dòng)開(kāi)發(fā),MPU6050硬件連接

    設(shè)備adapter i2c 控制器對(duì)象數(shù)據(jù)包對(duì)象讀寫(xiě)數(shù)據(jù)設(shè)備樹(shù)中添加MPU6050信息內(nèi)核選配添加設(shè)備
    發(fā)表于 12-06 14:06 ?17次下載
    嵌入式內(nèi)核及<b class='flag-5'>驅(qū)動(dòng)</b>開(kāi)發(fā)-09IIC子系統(tǒng)框架使用(<b class='flag-5'>I2C</b>協(xié)議和時(shí)序,<b class='flag-5'>I2C</b><b class='flag-5'>驅(qū)動(dòng)</b>框架,<b class='flag-5'>I2C</b>從<b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>開(kāi)發(fā),MPU6050硬件連接

    兩個(gè)PS I2C控制器的回環(huán)測(cè)試

    I2C 總線(xiàn)的根信號(hào)線(xiàn) SCL 和 SDA 需要上拉才能正常工作,當(dāng)板卡上沒(méi)有合適的硬件設(shè)置或者沒(méi)有合適的 I2Cslave 設(shè)備,我們就無(wú)法進(jìn)行
    的頭像 發(fā)表于 04-13 08:35 ?2225次閱讀

    Linux I2C驅(qū)動(dòng)入門(mén)知識(shí)科普

    I2C 總線(xiàn)驅(qū)動(dòng)I2C總線(xiàn)驅(qū)動(dòng)就是SOC的 I2C控制器驅(qū)動(dòng),也叫做
    的頭像 發(fā)表于 12-29 13:59 ?1528次閱讀

    I2C控制器驅(qū)動(dòng)介紹

    控制器驅(qū)動(dòng) I2C 總線(xiàn)驅(qū)動(dòng)重點(diǎn)是 I2C 適配器驅(qū)動(dòng),這里要用到兩個(gè)重要的
    的頭像 發(fā)表于 07-22 15:38 ?1246次閱讀
    <b class='flag-5'>I2C</b>控制器<b class='flag-5'>驅(qū)動(dòng)</b>介紹

    I2C子系統(tǒng)SW Architecture

    適配器(控制器)驅(qū)動(dòng),這里用到兩個(gè)重要的數(shù)據(jù)結(jié)構(gòu)i2c_adapter 和 i2c_algorithm。其中,Linux 內(nèi)核將 SOC
    的頭像 發(fā)表于 07-22 16:01 ?796次閱讀
    <b class='flag-5'>I2C</b>子系統(tǒng)SW Architecture

    I2C子系統(tǒng)幾個(gè)主要的結(jié)構(gòu)

    I2C Data Structure 我們要搞懂一個(gè) Linux 子系統(tǒng),必須研究它的數(shù)據(jù)結(jié)構(gòu),搞懂每個(gè)結(jié)構(gòu)體存儲(chǔ)了什么東西,才能梳理清楚該子系統(tǒng)的架構(gòu)。 I2C 子系統(tǒng)有幾個(gè)主要的
    的頭像 發(fā)表于 07-22 16:04 ?682次閱讀
    <b class='flag-5'>I2C</b>子系統(tǒng)幾個(gè)主要的<b class='flag-5'>結(jié)構(gòu)</b>體