哈哈哈哈哈操欧洲电影,久草网在线,亚洲久久熟女熟妇视频,麻豆精品色,久久福利在线视频,日韩中文字幕的,淫乱毛视频一区,亚洲成人一二三,中文人妻日韩精品电影

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

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

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

Linux內(nèi)核中I2C子系統(tǒng)的整體視圖

FPGA之家 ? 來源:FPGA之家 ? 作者:FPGA之家 ? 2020-12-31 10:40 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本文通過閱讀內(nèi)核代碼,來梳理一下I2C子系統(tǒng)的整體視圖。在開發(fā)I2C設(shè)備驅(qū)動程序時,往往缺乏對于系統(tǒng)整體的認識,沒有一個清晰的思路。所以從高層級來分析一下I2C系統(tǒng)的設(shè)計思路,將有助于設(shè)計調(diào)試具體的驅(qū)動程序。

I2C/SMBUS基礎(chǔ)

I2C是一種芯片間通訊總線技術(shù),最早由Philips設(shè)計制定。下面內(nèi)容參考I2C 2.1 規(guī)格書

半雙工通信方式,通信采用主/從結(jié)構(gòu)

支持多主模式,下圖來源于I2C 2.1規(guī)格書

4da6518a-4ad5-11eb-8b86-12bb97331649.png

其內(nèi)部電氣實現(xiàn)采用集電極開路(Open-collector)/漏極開路(open-drain)結(jié)構(gòu)以實現(xiàn)線與功能,這是總線的實現(xiàn)基礎(chǔ),多芯片通過查詢總線狀態(tài)實現(xiàn)介質(zhì)仲裁以實現(xiàn)總線控制。

總線信號由兩線實現(xiàn),串行時鐘線SCL(Serial Clock Line)/串行數(shù)據(jù)線SDA(serial Data Line)。

具有三種通訊速率模式:

standard mode:0-100 kbps (bps: bit/s)

Fast mode:0-400 kbps

High-speed mode : 0-3.4Mbps

可支持混速模式

4df96b40-4ad5-11eb-8b86-12bb97331649.png

不同的速率在硬件設(shè)計時需要注意信號的完整性,I2C總線等效電容Cx,主要需要考慮PCB布線,以及上拉電阻選取。

支持7bit/10bit 兩種芯片地址模式

I2C總線電氣特性,這個非常重要,須嚴格遵守標準的電氣特性

4e17220c-4ad5-11eb-8b86-12bb97331649.png

4e5734a0-4ad5-11eb-8b86-12bb97331649.png

SMBUS(system management bus) 。大多數(shù)SMBus系統(tǒng)也符合I2C,電氣約束對于SMBus更為嚴格,并且它標準化了特定的協(xié)議消息和習慣用語。支持I2C的控制器也可以支持大多數(shù)SMBus操作,但是SMBus控制器并不支持I2C控制器將支持的所有協(xié)議選項。通過使用I2C原語或通過向不支持這些I2C操作的i2c_adapter設(shè)備發(fā)出SMBus命令,可以執(zhí)行各種SMBus協(xié)議操作。

http://smbus.org/

I2C bus(Inter-Integrated Circuit bus) https://www.i2c-bus.org/

I2C 在Linux設(shè)備中的拓撲結(jié)構(gòu)

在PC體系中,大體如下拓撲:

4e84bc54-4ad5-11eb-8b86-12bb97331649.png

PC體系中通過橋接芯片,擴展出PCI,在由PCI擴展出I2C適配器,進而得到I2C總線,或者橋接芯片直接擴展出SMBUS/I2C總線。

嵌入式應(yīng)用中,則可能為:

4ebbbc22-4ad5-11eb-8b86-12bb97331649.png

嵌入式應(yīng)用中,則可能更多的情況是處理器內(nèi)置了I2C/SMBUS總線控制器,直接可得到I2C/SMBUS總線。嵌入式系統(tǒng)中常常會設(shè)計很多傳感器掛載在I2C總線上,比如溫度檢測,壓力檢測等等,又或者諸如電容觸摸屏、電源管理IC等等。

代碼實現(xiàn)

I2C 的core實現(xiàn)位于./drivers/i2c/下,實現(xiàn)了I2C總線設(shè)備以及驅(qū)動(適配器)和設(shè)備驅(qū)動的注冊、注銷方法,I2C通信方法algorithm抽象,以及與具體硬件無關(guān)的代碼

I2C主控制器驅(qū)動位于 ./drivers/i2c/busses/,這里主要實現(xiàn)總線控制器,具體體現(xiàn)為i2c_adapter的實現(xiàn)。負責I2C適配器與從設(shè)備通信。I2C總線驅(qū)動由i2c_adapter和i2c_algorithm來抽象描述。

設(shè)備驅(qū)動則分散在./driver/下,這取決于具體的實現(xiàn),種類繁多。

i2c-dev,大多位于drivers/i2c/i2c-dev.c,這種方法只是封裝了主機(I2Cmaster,一般是SoC中內(nèi)置的I2C控制器)的I2C基本操作,并且向應(yīng)用層提供相應(yīng)的操作接口,應(yīng)用層代碼需要自己去實現(xiàn)對slave的控制和操作,所以這種I2C驅(qū)動相當于提供給應(yīng)用層可以訪問slave硬件設(shè)備的接口,本身并未對硬件做任何操作,應(yīng)用需要實現(xiàn)對硬件的操作。這種模式也稱為應(yīng)用驅(qū)動程序。

另一種I2C驅(qū)動是將所有的代碼都放在驅(qū)動層實現(xiàn),直接向應(yīng)用層提供最終結(jié)果。應(yīng)用層甚至不需要知道這里面有I2C存在,譬如電容式觸摸屏驅(qū)動,直接向應(yīng)用層提供/dev/input/event1的操作接口,應(yīng)用層編程的人根本不知道event1中涉及到了I2C。

I2C子系統(tǒng)的主要目的是,對I2C總線以及設(shè)備利用面向?qū)ο缶幊趟枷雽崿F(xiàn)統(tǒng)一建模,以高內(nèi)聚-低耦合的軟件工程思想,實現(xiàn)一個分層體系結(jié)構(gòu),以便于內(nèi)核統(tǒng)一管理I2C設(shè)備,從而可以更容易的在linux下實現(xiàn)I2C設(shè)備以及高可移植。

主要數(shù)據(jù)結(jié)構(gòu)

其內(nèi)部有幾個關(guān)鍵數(shù)據(jù)結(jié)構(gòu),來梳理一下:

i2c_client, 用于抽象掛載在I2C總線上的從設(shè)備

i2c_driver,用于驅(qū)動掛載在I2C總線的從設(shè)備,也即從設(shè)備的設(shè)備驅(qū)動程序

i2c_adapter,用于抽象I2C的主設(shè)備

i2c_algorithm,抽象I2C總線操作接口

i2c_devinfo

該結(jié)構(gòu)體主要用于板級I2C信息管理

i2c_msg

該結(jié)構(gòu)體主要用于抽象I2C報文,其內(nèi)容如下:

i2c_timings

主要用于抽象I2C電氣特性,對于支持設(shè)備樹的系統(tǒng)構(gòu)建而言,主要通過以下內(nèi)核接口函數(shù),從設(shè)備樹解析電氣特性參數(shù)。

voidi2c_parse_fw_timings(structdevice*dev,structi2c_timings*t,booluse_defaults) { intret; memset(t,0,sizeof(*t)); ret=device_property_read_u32(dev,"clock-frequency",&t->bus_freq_hz); if(ret&&use_defaults) t->bus_freq_hz=100000; ret=device_property_read_u32(dev,"i2c-scl-rising-time-ns",&t->scl_rise_ns); if(ret&&use_defaults){ if(t->bus_freq_hz<=?100000) ???t->scl_rise_ns=1000; elseif(t->bus_freq_hz<=?400000) ???t->scl_rise_ns=300; else t->scl_rise_ns=120; } ret=device_property_read_u32(dev,"i2c-scl-falling-time-ns",&t->scl_fall_ns); if(ret&&use_defaults){ if(t->bus_freq_hz<=?400000) ???t->scl_fall_ns=300; else t->scl_fall_ns=120; } device_property_read_u32(dev,"i2c-scl-internal-delay-ns",&t->scl_int_delay_ns); ret=device_property_read_u32(dev,"i2c-sda-falling-time-ns",&t->sda_fall_ns); if(ret&&use_defaults) t->sda_fall_ns=t->scl_fall_ns; device_property_read_u32(dev,"i2c-sda-hold-time-ns",&t->sda_hold_ns); } EXPORT_SYMBOL_GPL(i2c_parse_fw_timings);

i2c_device_identity

該結(jié)構(gòu)體主要用于抽象I2C 設(shè)備的ID屬性,通過內(nèi)核接口函數(shù)i2c_get_device_id以獲取設(shè)備ID屬性。

總體框架

概述

Linux I2C編程接口支持總線交互的主端和從端。從高層級看由兩種驅(qū)動程序和兩種設(shè)備構(gòu)成:

適配器設(shè)備與適配器設(shè)備驅(qū)動對:I2C 適配器驅(qū)動程序用于抽象控制器硬件;它綁定到一個物理設(shè)備(可能是一個PCI設(shè)備(PC體系多一些)或platform_device(嵌入式應(yīng)用居多)),并構(gòu)建i2c_adapter實體以呈現(xiàn)所管理的1個I2C總線段。

/*ALI1535deviceaddressregisterbits*/ #defineALI1535_RD_ADDR0x01/*Read/WriteBitinDevice*/ /*Addressfield*/ /*->Write=0*/ /*->Read=1*/ #defineALI1535_SMBIO_EN0x04/*SMBI/OSpaceenable*/ /*PCI設(shè)備驅(qū)動*/ staticstructpci_driverali1535_driver; staticunsignedlongali1535_smba; staticunsignedshortali1535_offset;

pci-I2C 適配器設(shè)備。如在i2c-ali1535.c中:

platform_device。比如:i2c-s3c2410,如下:

staticconststructplatform_device_ids3c24xx_driver_ids[]={ { .name="s3c2410-i2c", .driver_data=0, },{ .name="s3c2440-i2c", .driver_data=QUIRK_S3C2440, },{ .name="s3c2440-hdmiphy-i2c", .driver_data=QUIRK_S3C2440|QUIRK_HDMIPHY|QUIRK_NO_GPIO, },{}, }; MODULE_DEVICE_TABLE(platform,s3c24xx_driver_ids);

I2C從設(shè)備及設(shè)備驅(qū)動:每個I2C總線段上將有一個由結(jié)構(gòu)i2c_client表示的I2C設(shè)備。這些設(shè)備將被綁定到一個struct i2c_driver,遵循標準的Linux驅(qū)動程序模型。

架構(gòu)

圖片來源//www.kernel.org/doc/html/latest/i2c/slave-interface.html

5131bd1c-4ad5-11eb-8b86-12bb97331649.png

主端總線驅(qū)動職責:

適配器和算法驅(qū)動程序,見下面i2c_algorithm結(jié)構(gòu)體詳細描述

管理I2C總線交互

從端設(shè)備驅(qū)動職責:

i2c_client結(jié)構(gòu)體具有設(shè)備的I2C總線地址以及適配器的驅(qū)動程序指針

當用戶程序發(fā)出文件操作申請I2C事務(wù)時:

i2C_transfer (i2C-core.c) 調(diào)用 adap_algo_master_xfer,數(shù)據(jù)或消息以i2c_msg結(jié)構(gòu)體傳入。

適配器對硬件I / O地址進行讀/寫操作,實現(xiàn)底層的I2C讀寫設(shè)備操作。

從應(yīng)用程序直到底層的大致交互流程如下:

5152a658-4ad5-11eb-8b86-12bb97331649.png

總結(jié)一下

I2C總線子系統(tǒng)在Linux內(nèi)核中總線模型分為主/從兩端,主端主要有適配器以及適配器驅(qū)動負責管理總線,從端主要有從設(shè)備抽象以及設(shè)備驅(qū)動,實現(xiàn)具體的從設(shè)備應(yīng)用。主端適配器以兩種形式存在于內(nèi)核代碼中,分為PCI橋接適配器或者platform_device形式。從總體理解I2C子系統(tǒng)的驅(qū)動模型,以及相應(yīng)主要數(shù)據(jù)結(jié)構(gòu)之間的關(guān)系,將有助于開發(fā)調(diào)試驅(qū)動程序,快速定位問題。

責任編輯:xj

原文標題:Linux內(nèi)核中I2C總線及設(shè)備長啥樣?

文章出處:【微信公眾號:FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

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

    關(guān)注

    4

    文章

    1474

    瀏覽量

    43087
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11806

    瀏覽量

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

    關(guān)注

    28

    文章

    1562

    瀏覽量

    131679

原文標題:Linux內(nèi)核中I2C總線及設(shè)備長啥樣?

文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    RK3576平臺PCA9548 I2C開關(guān)設(shè)備樹配置與生效全解析

    嵌入式開發(fā),單路I2C總線往往無法滿足多外設(shè)的掛載需求,NXP的PCA9548(8通道I2C Switch)是解決該問題的常用方案,尤其在RK3576等嵌入式平臺的攝像頭、VCM等多I2C
    的頭像 發(fā)表于 02-28 11:18 ?1755次閱讀
    RK3576平臺PCA9548 <b class='flag-5'>I2C</b>開關(guān)設(shè)備樹配置與生效全解析

    瑞芯微(EASY EAI)RV1126B I2C使用

    1.I2C介紹IIC又簡寫成I2C,是一種串行通信總線,使用多主從架構(gòu)。最初設(shè)計目的為了讓主板、嵌入式系統(tǒng)或手機用來連接低速周邊設(shè)備。多用于小數(shù)據(jù)量的場合,有傳輸距離短,任意時刻只能有一個主機等特性
    的頭像 發(fā)表于 01-04 09:41 ?4578次閱讀
    瑞芯微(EASY EAI)RV1126B <b class='flag-5'>I2C</b>使用

    I2C 為什么只要兩根線就能搞定通信?

    到目前為止,我們已經(jīng)討論了SPI通信和UART通信的基礎(chǔ)知識,現(xiàn)在讓我們討論本系列的最后一個協(xié)議,即集成電路間協(xié)議(I2C)。如果您曾經(jīng)構(gòu)建過使用OLED顯示器、氣壓傳感器或陀螺儀/加速度計模塊
    的頭像 發(fā)表于 01-04 09:14 ?1990次閱讀
    <b class='flag-5'>I2C</b> 為什么只要兩根線就能搞定通信?

    基于FPGA的I2C控制模塊設(shè)計

    I2C_WRITE_WDATA.v模塊實現(xiàn)I2C寫時序,I2C_Controller (I2C控制器)例化了I2C_WRITE_WDATA.
    的頭像 發(fā)表于 12-26 09:48 ?5813次閱讀
    基于FPGA的<b class='flag-5'>I2C</b>控制模塊設(shè)計

    AS32X601的I2C模塊操作EEPROM詳解

    國科安芯推出的AS32X601系列MCU芯片內(nèi)置的I2C模塊提供了符合工業(yè)標準的兩線串行制接口,可用于MCU和外部I2C設(shè)備的通訊。I2C總線使用兩條串行線:串行數(shù)據(jù)線SDA和串行時鐘線SCL
    的頭像 發(fā)表于 12-21 21:39 ?1488次閱讀
    AS32X601的<b class='flag-5'>I2C</b>模塊操作EEPROM詳解

    HTR3355 I2C和SMBus IO擴展器產(chǎn)品詳解

    ? ? ? 在現(xiàn)代電子系統(tǒng)設(shè)計,IO端口資源不足是常見的設(shè)計瓶頸,而一款性能穩(wěn)定、適配性強的IO擴展器能夠有效突破這一限制。HTR3355作為一款集成I2C和SMBus雙接口的IO擴展器,憑借其寬
    的頭像 發(fā)表于 12-18 16:40 ?734次閱讀
    HTR3355 <b class='flag-5'>I2C</b>和SMBus IO擴展器產(chǎn)品詳解

    I2C死鎖的問題

    在實際使用過程,I2C比較容易出現(xiàn)的一個問題就是死鎖 ,死鎖在I2C主要表現(xiàn)為:I2C死鎖時表現(xiàn)為SCL為高,SDA一直為低。 在
    發(fā)表于 12-04 06:00

    I2C的缺點介紹

    在數(shù)據(jù)傳輸期間通過稱為時鐘拉伸的機制減慢主設(shè)備的時鐘信號。雖然時鐘拉伸可確保同步并防止數(shù)據(jù)丟失,但它可能會引入時序延遲,從而影響整體系統(tǒng)性能,尤其是在時間關(guān)鍵型應(yīng)用。正確處理時鐘拉伸并理解其對系統(tǒng)時序的影響對于可靠的
    發(fā)表于 11-27 06:10

    如何使用I2C的各個函數(shù)?

    在加入I2C驅(qū)動時,會有i2c_core.c這樣的C文件,里面的各個函數(shù)怎么用有沒有例子,非常感謝
    發(fā)表于 09-12 06:24

    深入剖析I2C協(xié)議

    I2C是由Philips開發(fā)的簡單的雙向兩線總線,在深入淺出理解SPI協(xié)議,我們區(qū)分了單工,半雙工,全雙工協(xié)議數(shù)據(jù)流向的區(qū)別,根據(jù)特征,I2C協(xié)議屬于半雙工協(xié)議(即同一時刻,數(shù)據(jù)單向流動)。此外
    的頭像 發(fā)表于 08-21 15:10 ?3851次閱讀
    深入剖析<b class='flag-5'>I2C</b>協(xié)議

    I2C總線通信,為什么要進行電氣隔離?

    I2C總線采用雙向二線制,支持多主機多從機通信,具備高可靠性、抗干擾能力強,廣泛應(yīng)用于嵌入式系統(tǒng)。
    的頭像 發(fā)表于 08-11 11:04 ?2642次閱讀
    <b class='flag-5'>I2C</b>總線通信,為什么要進行電氣隔離?

    linux系統(tǒng),通過I2C和CCG5通訊,有沒有和CCG5通過I2C進行固件升級?狀態(tài)配置的有沒有可以參考的源代碼?

    linux系統(tǒng),通過I2C和CCG5通訊,有沒有和CCG5通過I2C進行固件升級,狀態(tài)配置的 有沒有可以參考的源代碼? 固件升級是在
    發(fā)表于 07-17 06:59

    第十八章 I2C通信測試

    本章介紹了I2C協(xié)議,其物理層用SDA和SCL雙線,支持多設(shè)備:協(xié)議層含起始/停止信號、應(yīng)答機制等。還講解W55MH32的I2C外設(shè)及初始化,并進行了通信測試代碼的分析。
    的頭像 發(fā)表于 06-19 17:07 ?1439次閱讀
    第十八章 <b class='flag-5'>I2C</b>通信測試

    簡單了解I2C接口

    在電子電路的復雜世界里,各種電路模塊設(shè)備需要相互通信才能協(xié)同工作 ,I2C接口就像是電路模塊設(shè)備間的溝通橋梁,今天就帶大家深入了解它。
    的頭像 發(fā)表于 05-08 14:15 ?2776次閱讀
    簡單了解<b class='flag-5'>I2C</b>接口

    基于RT-Thread的I2C(軟件) 實踐 | 技術(shù)集結(jié)

    一、軟硬件介紹(一)I2C(軟件)I2C是一種廣泛應(yīng)用于嵌入式系統(tǒng)的短距離串行通信協(xié)議,支持多主多從設(shè)備模式,主機通過時鐘信號SCL和數(shù)據(jù)線SDA與從機進行數(shù)據(jù)交互。在RT-Thre
    的頭像 發(fā)表于 05-06 18:44 ?1192次閱讀
    基于RT-Thread的<b class='flag-5'>I2C</b>(軟件) 實踐 | 技術(shù)集結(jié)
    嵊泗县| 浦城县| 宁都县| 沙洋县| 邓州市| 温州市| 沿河| 腾冲县| 永新县| 抚宁县| 长寿区| 东台市| 武定县| 东丰县| 师宗县| 本溪市| 深圳市| 玉屏| 济阳县| 双柏县| 长子县| 微山县| 革吉县| 泰州市| 阳江市| 舟曲县| 东海县| 松潘县| 马边| 长乐市| 广元市| 临潭县| 嫩江县| 施秉县| 苗栗市| 惠安县| 桂阳县| 毕节市| 黔西县| 错那县| 绥德县|