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

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

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

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

如何實(shí)例化i2c設(shè)備?實(shí)例化i2c設(shè)備的4種方式

冬至子 ? 來源:嵌入式ABC ? 作者:小魚 ? 2023-10-17 11:18 ? 次閱讀

如何實(shí)例化i2c設(shè)備?4種方式如下:

  • 方法1:靜態(tài)聲明I2C設(shè)備
    • 通過devicetree聲明I2C設(shè)備
    • 在板級(jí)文件中聲明I2C設(shè)備
  • 方法2:顯式實(shí)例化設(shè)備
  • 方法3:對(duì)某些設(shè)備的I2C總線進(jìn)行探測(cè)
  • 方法4:從用戶空間實(shí)例化

在本篇中,主要看一下方法1,3和方法4。對(duì)于方法2,在下一篇的一個(gè)I2C ADC/DAC的misc設(shè)備驅(qū)動(dòng)實(shí)例中再加以詳述。

通過devicetree聲明I2C設(shè)備

/dts-v1/;
/plugin/;
/ {
       compatible = "brcm,bcm2835", "brcm,bcm2708", "brcm,bcm2709";




       fragment@0 {
          target = < &i2c1 >;
          __overlay__ {
                #address-cells = < 1 >;
                #size-cells = < 0 >;
                rtc@68 {
                        compatible = "maxim,ds3231";
                        reg = < 0x68 >;
                        #address-cells = < 2 >;
                        #size-cells = < 1 >;
                };      
          };
       };
    };

首先,寫一個(gè)dts。

編譯,并將生成的.dtbo到/boot/overlays

重啟后,查看/dev可以看到rtc

通過板級(jí)文件中聲明I2C設(shè)備

在架構(gòu)板級(jí)文件中添加i2c設(shè)備信息,并注冊(cè)到特定位置。看一個(gè)nxp imx開發(fā)板的電源芯片的實(shí)例,arch/arm/mach-imx/mach-mx35_3ds.c

static struct mc13xxx_platform_data mx35_3ds_mc13892_data = {
    .flags = MC13XXX_USE_RTC | MC13XXX_USE_TOUCHSCREEN,
    .regulators = {
        .num_regulators = ARRAY_SIZE(mx35_3ds_regulators),
        .regulators = mx35_3ds_regulators,
    },
};




#define GPIO_PMIC_INT IMX_GPIO_NR(2, 0)




static struct i2c_board_info mx35_3ds_i2c_mc13892 = {




    I2C_BOARD_INFO("mc13892", 0x08),
    .platform_data = &mx35_3ds_mc13892_data,
    /* irq number is run-time assigned */
};




static void __init imx35_3ds_init_mc13892(void)
{
    int ret = gpio_request_one(GPIO_PMIC_INT, GPIOF_DIR_IN, "pmic irq");




    if (ret) {
        pr_err("failed to get pmic irq: %dn", ret);
        return;
    }




    mx35_3ds_i2c_mc13892.irq = gpio_to_irq(GPIO_PMIC_INT);
    i2c_register_board_info(0, &mx35_3ds_i2c_mc13892, 1);
}

MC13892是面向i.MX51、i.MX37、i.MX3和i.MX27應(yīng)用處理器的PMIC。在板級(jí)文件中定義了一個(gè) i2c_board_info 結(jié)構(gòu)體,使用i2c_register_board_info函數(shù)將i2c設(shè)備信息添加到特定鏈表。

i2c_register_board_info在/drivers/i2c/i2c-boardinfo.c中:

/**
* i2c_register_board_info - statically declare I2C devices
* @busnum: identifies the bus to which these devices belong
* @info: vector of i2c device descriptors
* @len: how many descriptors in the vector; may be zero to reserve
*    the specified bus number.
*
* Systems using the Linux I2C driver stack can declare tables of board info
* while they initialize.  This should be done in board-specific init code
* near arch_initcall() time, or equivalent, before any I2C adapter driver is
* registered.  For example, mainboard init code could define several devices,
* as could the init code for each daughtercard in a board stack.
*
* The I2C devices will be created later, after the adapter for the relevant
* bus has been registered.  After that moment, standard driver model tools
* are used to bind "new style" I2C drivers to the devices.  The bus number
* for any device declared using this routine is not available for dynamic
* allocation.
*
* The board info passed can safely be __initdata, but be careful of embedded
* pointers (for platform_data, functions, etc) since that won't be copied.
* Device properties are deep-copied though.
*/
int i2c_register_board_info(int busnum, struct i2c_board_info const *info, unsigned len)

對(duì)某些設(shè)備的I2C總線進(jìn)行探測(cè)

有時(shí)沒有關(guān)于I2C設(shè)備的足夠信息,甚至無法調(diào)用i2c_new_scanned_device()。典型的例子是PC主板上的硬件監(jiān)控芯片。有幾十個(gè)模型,可能被分配在25個(gè)不同的地址。考慮到主板的龐大數(shù)量,幾乎不可能建立一個(gè)正在使用的硬件監(jiān)控芯片的詳盡列表。幸運(yùn)的是,大多數(shù)這些芯片都有制造商和設(shè)備ID寄存器,因此可以通過探測(cè)來識(shí)別它們。

在這種情況下,I2C設(shè)備既沒有顯式聲明也沒有實(shí)例化。相反,一旦這些設(shè)備的驅(qū)動(dòng)程序被加載,I2C -core就會(huì)探測(cè)它們,如果找到了,就會(huì)自動(dòng)實(shí)例化一個(gè)I2C設(shè)備。為了防止此機(jī)制的任何不當(dāng)行為,適用以下限制:

  • I2C設(shè)備驅(qū)動(dòng)程序必須實(shí)現(xiàn)detect()方法,該方法通過從任意寄存器讀取來識(shí)別受支持的設(shè)備。
  • 只有那些可能有支持設(shè)備并同意被探測(cè)的總線才會(huì)被探測(cè)。例如,這避免了探測(cè)電視適配器上的硬件監(jiān)控芯片。

detect何時(shí)調(diào)用?

i2c_driver注冊(cè)的時(shí)候,i2c_core會(huì)在所有已經(jīng)注冊(cè)的i2c_adapter上探測(cè)address_list中的所有地址,硬件探測(cè)成功之后后調(diào)用i2c_driver的detect成員,然后根據(jù)detect填充的info建立一個(gè)i2c_client。

例如,MAX1668溫度傳感器的驅(qū)動(dòng)實(shí)現(xiàn),/drivers/hwmon/max1668.c

static struct i2c_driver max1668_driver = {
    .class = I2C_CLASS_HWMON,
    .driver = {
          .name    = "max1668",
          },
    .probe = max1668_probe,
    .id_table = max1668_id,
    .detect    = max1668_detect,
    .address_list = max1668_addr_list,
};




module_i2c_driver(max1668_driver);

其中,detect函數(shù)

/* Return 0 if detection is successful, -ENODEV otherwise */
static int max1668_detect(struct i2c_client *client,
              struct i2c_board_info *info)
{
    struct i2c_adapter *adapter = client- >adapter;
    const char *type_name;
    int man_id, dev_id;




    if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
        return -ENODEV;




    /* Check for unsupported part */
    man_id = i2c_smbus_read_byte_data(client, MAX1668_REG_MAN_ID);
    if (man_id != MAN_ID_MAXIM)
        return -ENODEV;




    dev_id = i2c_smbus_read_byte_data(client, MAX1668_REG_DEV_ID);
    if (dev_id < 0)
        return -ENODEV;




    type_name = NULL;
    if (dev_id == DEV_ID_MAX1668)
        type_name = "max1668";
    else if (dev_id == DEV_ID_MAX1805)
        type_name = "max1805";
    else if (dev_id == DEV_ID_MAX1989)
        type_name = "max1989";




    if (!type_name)
        return -ENODEV;




    strlcpy(info- >type, type_name, I2C_NAME_SIZE);




    return 0;
}

樹莓派為例,i2c_add_adapter會(huì)在bcm2835_i2c_probe調(diào)用

static int bcm2835_i2c_probe(struct platform_device *pdev)

在i2c_register_adapter 中會(huì)調(diào)用,bus_for_each_drv 來來通知所有總線類型是i2c_bus_type的driver。

/* Notify drivers */
    mutex_lock(&core_lock);
    bus_for_each_drv(&i2c_bus_type, NULL, adap, __process_new_adapter);
    mutex_unlock(&core_lock);
static int __process_new_adapter(struct device_driver *d, void *data)
{
    return i2c_do_add_adapter(to_i2c_driver(d), data);
}

在i2c_do_add_adapter->i2c_detect->i2c_detect_address 中有一段關(guān)鍵code

err = driver- >detect(temp_client, &info);
    if (err) {
        /* -ENODEV is returned if the detection fails. We catch it
           here as this isn't an error. */
        return err == -ENODEV ? 0 : err;
    }

從用戶空間實(shí)例化

用戶空間通過兩個(gè)sysfs屬性文件來建立和刪除i2c_client:new_device和delete_device。

  • new_device有兩個(gè)參數(shù):i2c設(shè)備的名字(字符串)和地址(以0x開頭的16進(jìn)制數(shù))。
  • delete_device只有一個(gè)參數(shù):設(shè)備的地址。
pi@raspberrypi:/sys/class/i2c-adapter/i2c-1 $ ls
delete_device  device  i2c-dev  name  new_device  of_node  power  subsystem  uevent

添加rtc設(shè)備

pi@raspberrypi:/sys/class/i2c-adapter/i2c-1 $ echo ds3231 0x68 | sudo tee new_device 
ds3231 0x68

方法2:顯式實(shí)例化設(shè)備,在下一篇"在Linux系統(tǒng)里如何編寫一個(gè)PCF8591的驅(qū)動(dòng),完成ADC數(shù)據(jù)采集,DAC數(shù)據(jù)輸出"中再詳述。

PCF8591 是一個(gè)單片集成、單獨(dú)供電、低功耗、8-bit CMOS數(shù)據(jù)獲取器件。PCF8591 具有 4 個(gè)模擬輸入、1 個(gè)模擬輸出和 1個(gè)串行 I2C 總線接口。

PCF8591 的 3 個(gè)地址引腳 A0, A1 和 A2 可用于硬件地址編程,允許在同個(gè) I2C 總線上接入 8 個(gè) PCF8591 器件,而無需額外的硬件。在 PCF8591 器件上輸入輸出的地址、控制和數(shù)據(jù)信號(hào)都是通過雙線雙向 I2C 總線以串行的方式進(jìn)行傳輸。

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

    關(guān)注

    68

    文章

    19404

    瀏覽量

    230807
  • 驅(qū)動(dòng)器
    +關(guān)注

    關(guān)注

    53

    文章

    8271

    瀏覽量

    146857
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5363

    瀏覽量

    120952
  • I2C總線
    +關(guān)注

    關(guān)注

    8

    文章

    406

    瀏覽量

    61106
  • 電源芯片
    +關(guān)注

    關(guān)注

    43

    文章

    1100

    瀏覽量

    77203
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    I2C總線規(guī)范與I2C器件C51讀寫程序

    I2C總線規(guī)范與I2C器件C51讀寫程序:本文簡要介紹了I2C總線,并給出了I2C器件的C51讀
    發(fā)表于 08-22 17:51 ?93次下載

    I2C Guid I2C指南

    I2C Guid  I2C指南 The I2C bus is used in a wide rangeof applications because it is simpleand
    發(fā)表于 04-23 13:55 ?36次下載

    PIC單片機(jī)讀寫I2C實(shí)例源程序一

    PIC單片機(jī)讀寫I2C實(shí)例源程序一 ; this route is used I2C EESROM write and; read; addressing mode is indirectSTART BSF RB_
    發(fā)表于 01-16 11:47 ?2778次閱讀

    i2c

    單片機(jī)i2c總線操作;單片機(jī)i2c總線操作;單片機(jī)i2c總線操作;
    發(fā)表于 05-17 11:09 ?35次下載

    I2C總線原理及應(yīng)用實(shí)例

    I2C總線原理及應(yīng)用實(shí)例
    發(fā)表于 09-22 11:41 ?17次下載
    <b class='flag-5'>I2C</b>總線原理及應(yīng)用<b class='flag-5'>實(shí)例</b>

    樹莓派怎樣連接多個(gè)I2C設(shè)備

     簡單。 i2c是一輛公共汽車。總線的目的是與多個(gè)設(shè)備通信。將設(shè)備并行連接到同一i2c總線。您可以使用總線一。
    的頭像 發(fā)表于 11-13 09:27 ?1.9w次閱讀
    樹莓派怎樣連接多個(gè)<b class='flag-5'>I2C</b><b class='flag-5'>設(shè)備</b>

    干貨:I2C總線最全教程講解

    ? 裸機(jī)操作篇 本文以三星exynos4412為例講解I2C時(shí)序,并掛載在I2C控制器mpu6050陀螺儀的數(shù)據(jù)讀取實(shí)例。通過本篇文章,讀者可以理解I2C時(shí)序,以及如何基于三星
    的頭像 發(fā)表于 02-20 15:04 ?1.3w次閱讀
    干貨:<b class='flag-5'>I2C</b>總線最全教程講解

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

    文章目錄I2c協(xié)議和時(shí)序I2c介紹I2c硬件連接I2c總線的信號(hào)I2c總線寫時(shí)序I2c總線讀時(shí)序
    發(fā)表于 12-06 14:06 ?17次下載
    嵌入式內(nèi)核及驅(qū)動(dòng)開發(fā)-09IIC子系統(tǒng)框架使用(<b class='flag-5'>I2C</b>協(xié)議和時(shí)序,<b class='flag-5'>I2C</b>驅(qū)動(dòng)框架,<b class='flag-5'>I2C</b>從<b class='flag-5'>設(shè)備</b>驅(qū)動(dòng)開發(fā),MPU6050硬件連接

    硬件I2C與模擬I2C

    硬件I2C對(duì)應(yīng)芯片上的I2C外設(shè),有相應(yīng)I2C驅(qū)動(dòng)電路,其所使用的I2C管腳也是專用的,因而效率要遠(yuǎn)高于軟件模擬的I2C;一般也較為穩(wěn)定,但
    發(fā)表于 12-28 19:14 ?81次下載
    硬件<b class='flag-5'>I2C</b>與模擬<b class='flag-5'>I2C</b>

    Gowin I2C Master/Slave用戶指南

    Gowin I2C Master 和 Slave 用戶指南主要包括功能簡介、信號(hào)定義、工 作原理、實(shí)例等,旨在幫助用戶快速了解 Gowin I2C Master IP 和 Slav
    發(fā)表于 09-15 10:07 ?1次下載
    Gowin <b class='flag-5'>I2C</b> Master/Slave用戶指南

    I2C子系統(tǒng)SW Architecture

    通過 i2c-core 將 i2c 設(shè)備驅(qū)動(dòng)和 i2c 總線驅(qū)動(dòng)進(jìn)行了分離,從而使得 i2c 設(shè)備
    的頭像 發(fā)表于 07-22 16:01 ?985次閱讀
    <b class='flag-5'>I2C</b>子系統(tǒng)SW Architecture

    I2CI3C的區(qū)別有哪些

    I2CI3C 主要區(qū)別如下: I2C 雖然也是兩條線,但是很多時(shí)候傳感器需要一條額外的中斷線,來告訴主控?cái)?shù)據(jù)已經(jīng)準(zhǔn)備好。I3C 允許從設(shè)備
    的頭像 發(fā)表于 07-22 16:20 ?7257次閱讀
    <b class='flag-5'>I2C</b>和<b class='flag-5'>I3C</b>的區(qū)別有哪些

    什么是串口轉(zhuǎn)I2C?有什么特點(diǎn)?

    什么是串口轉(zhuǎn)I2C?有什么特點(diǎn)?? 串口轉(zhuǎn)I2C是一設(shè)備,用于將串行通信接口(通常稱為串口)轉(zhuǎn)換為I2C信號(hào)。
    的頭像 發(fā)表于 09-14 17:52 ?1371次閱讀

    i2c采樣是上升沿嗎?

    數(shù)據(jù)。在本文中,我們將詳細(xì)討論I2C采樣的工作原理,采樣時(shí)機(jī)以及如何進(jìn)行I2C采樣。 I2C采樣的原理 I2C采樣是基于I2C通訊協(xié)議的,該
    的頭像 發(fā)表于 09-19 17:16 ?2877次閱讀

    I2C總線應(yīng)用實(shí)例分析

    I2C總線使用兩條線進(jìn)行通信:數(shù)據(jù)線(SDA)和時(shí)鐘線(SCL)。這種雙線制設(shè)計(jì)使得I2C總線能夠在多個(gè)設(shè)備之間共享,而不需要為每個(gè)設(shè)備單獨(dú)布線。 應(yīng)用
    的頭像 發(fā)表于 01-17 15:09 ?163次閱讀
    主站蜘蛛池模板: 色多多深夜福利免费观看 | 午夜影院和视费x看 | 特级做A爰片毛片免费看108 | 小便japanesewctv| 成人中文字幕在线观看 | 一区二区乱子伦在线播放 | 囯产精品久久久久久久久免费蜜桃 | 午夜aaaa| a视频在线观看 | 亚洲男人片片在线观看 | 无码免费视频AAAAAA片草莓 | 少妇伦子伦精品无码 | 一日本道伊人久久综合影 | 女人18毛片 | 恋夜影院安卓免费列表uc | 一品道门在线视频高清完整版 | 午夜国产理论 | 媚药调教被撑到合不拢h | 手机国产视频福利 | 亚洲国产夜色在线观看 | 不戴套挺进人妻怀孕 | 老鸭窝毛片 | 欧美含羞草免费观看全部完 | 欧美亚洲综合另类无码 | 在线观看中文 | 国产1000部成人免费视频 | 色婷婷国产精品视频一区二区 | 亚洲视频999| 国产在线观看www | 免费观看国产视频 | 全身无赤裸裸美女网站 | 黄色软件色多多 | 国产伦精品一区二区三区免费观看 | 久久精品视在线观看85 | 老司机福利视频一区在线播放 | 久久综合九色综合国产 | 人妻熟女斩五十路0930 | 国产精品久久久久久久久久影院 | 亚洲高清国产拍精品5g | 伊人草| 九九免费高清在线观看视频 |