精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

Linux內核中I2C子系統的整體視圖

FPGA之家 ? 來源:FPGA之家 ? 作者:FPGA之家 ? 2020-12-31 10:40 ? 次閱讀

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

I2C/SMBUS基礎

I2C是一種芯片間通訊總線技術,最早由Philips設計制定。下面內容參考I2C 2.1 規格

半雙工通信方式,通信采用主/從結構

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

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

其內部電氣實現采用集電極開路(Open-collector)/漏極開路(open-drain)結構以實現線與功能,這是總線的實現基礎,多芯片通過查詢總線狀態實現介質仲裁以實現總線控制。

總線信號由兩線實現,串行時鐘線SCL(Serial Clock Line)/串行數據線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

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

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

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

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

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

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

http://smbus.org/

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

I2C 在Linux設備中的拓撲結構

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

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

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

嵌入式應用中,則可能為:

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

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

代碼實現

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

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

設備驅動則分散在./driver/下,這取決于具體的實現,種類繁多。

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

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

I2C子系統的主要目的是,對I2C總線以及設備利用面向對象編程思想實現統一建模,以高內聚-低耦合的軟件工程思想,實現一個分層體系結構,以便于內核統一管理I2C設備,從而可以更容易的在linux下實現I2C設備以及高可移植。

主要數據結構

其內部有幾個關鍵數據結構,來梳理一下:

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

i2c_driver,用于驅動掛載在I2C總線的從設備,也即從設備的設備驅動程序

i2c_adapter,用于抽象I2C的主設備

i2c_algorithm,抽象I2C總線操作接口

i2c_devinfo

該結構體主要用于板級I2C信息管理

i2c_msg

該結構體主要用于抽象I2C報文,其內容如下:

i2c_timings

主要用于抽象I2C電氣特性,對于支持設備樹的系統構建而言,主要通過以下內核接口函數,從設備樹解析電氣特性參數

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

該結構體主要用于抽象I2C 設備的ID屬性,通過內核接口函數i2c_get_device_id以獲取設備ID屬性。

總體框架

概述

Linux I2C編程接口支持總線交互的主端和從端。從高層級看由兩種驅動程序和兩種設備構成:

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

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

pci-I2C 適配器設備。如在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從設備及設備驅動:每個I2C總線段上將有一個由結構i2c_client表示的I2C設備。這些設備將被綁定到一個struct i2c_driver,遵循標準的Linux驅動程序模型。

架構

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

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

主端總線驅動職責:

適配器和算法驅動程序,見下面i2c_algorithm結構體詳細描述

管理I2C總線交互

從端設備驅動職責:

i2c_client結構體具有設備的I2C總線地址以及適配器的驅動程序指針

當用戶程序發出文件操作申請I2C事務時:

i2C_transfer (i2C-core.c) 調用 adap_algo_master_xfer,數據或消息以i2c_msg結構體傳入。

適配器對硬件I / O地址進行讀/寫操作,實現底層的I2C讀寫設備操作。

從應用程序直到底層的大致交互流程如下:

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

總結一下

I2C總線子系統在Linux內核中總線模型分為主/從兩端,主端主要有適配器以及適配器驅動負責管理總線,從端主要有從設備抽象以及設備驅動,實現具體的從設備應用。主端適配器以兩種形式存在于內核代碼中,分為PCI橋接適配器或者platform_device形式。從總體理解I2C子系統的驅動模型,以及相應主要數據結構之間的關系,將有助于開發調試驅動程序,快速定位問題。

責任編輯:xj

原文標題:Linux內核中I2C總線及設備長啥樣?

文章出處:【微信公眾號:FPGA之家】歡迎添加關注!文章轉載請注明出處。

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

    關注

    3

    文章

    1363

    瀏覽量

    40229
  • Linux
    +關注

    關注

    87

    文章

    11231

    瀏覽量

    208937
  • I2C
    I2C
    +關注

    關注

    28

    文章

    1481

    瀏覽量

    123319

原文標題:Linux內核中I2C總線及設備長啥樣?

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

收藏 人收藏

    評論

    相關推薦

    RISC V的I2C操作

    ?雙向IO,需設置為弱上拉。I2C對應的三態門的OE信號:需要賦值為I2C SDA/SCL的write信號;rtl的表述如下:主要原因在于:i2c的通信過程
    的頭像 發表于 11-01 11:06 ?130次閱讀

    I2C協議的基礎知識

    本文從I2C協議的概述開始,描述協議的歷史、不同速度模式、物理層和數據幀結構,最后介紹I2C混合電壓系統電平兼容性以及上拉電阻大小計算。
    的頭像 發表于 10-22 15:51 ?292次閱讀
    <b class='flag-5'>I2C</b>協議的基礎知識

    了解I2C總線

    電子發燒友網站提供《了解I2C總線.pdf》資料免費下載
    發表于 10-08 11:13 ?1次下載
    了解<b class='flag-5'>I2C</b>總線

    物聯網嵌入式軟件I2C總線設計詳解

    I2C(Inter-Integrated Circuit)通信總線,作為嵌入式系統設計的一個關鍵組成部分,其靈活性和高效率使其在高級應用備受青睞。本文旨在提供關于
    的頭像 發表于 09-29 16:21 ?270次閱讀
    物聯網嵌入式軟件<b class='flag-5'>中</b>的<b class='flag-5'>I2C</b>總線設計詳解

    I2C基本指南

    電子發燒友網站提供《I2C基本指南.pdf》資料免費下載
    發表于 09-10 09:40 ?0次下載
    <b class='flag-5'>I2C</b>基本指南

    如何在android i2c控制tas5548 ?

    我想在 android i2c控制 tas5548 因為以前沒有做過驅動編程 所以想要一個現成驅動源碼可供學習,哪怕只能實現控制聲音大小. 硬件平臺是rk3288 安卓系統是 android 4.4.2 / linux
    發表于 09-05 07:30

    CAN轉I2C橋接器

    電子發燒友網站提供《CAN轉I2C橋接器.pdf》資料免費下載
    發表于 08-28 11:10 ?0次下載
    CAN轉<b class='flag-5'>I2C</b>橋接器

    I2C轉UART子系統設計

    電子發燒友網站提供《I2C轉UART子系統設計.pdf》資料免費下載
    發表于 08-28 10:27 ?1次下載
    <b class='flag-5'>I2C</b>轉UART<b class='flag-5'>子系統</b>設計

    簡單認識I2C通信協議

    I2C(Inter-Integrated Circuit)通信協議是由飛利浦公司(現為恩智浦半導體)開發的一種簡單、雙向二線制同步串行總線協議。自1982年發布以來,I2C協議因其高效、靈活和易于實現的特點,在電子設備間的數據交換
    的頭像 發表于 07-25 18:06 ?1309次閱讀

    I2C總線協議的工作原理和尋址格式

    等特點,在嵌入式系統設計得到了廣泛應用。本文將詳細介紹I2C總線協議的工作原理和尋址格式,幫助讀者深入理解該協議。
    的頭像 發表于 05-27 15:47 ?1585次閱讀

    什么是I2C協議 I2C總線的控制邏輯

    在實際使用過程I2C比較容易出現的一個問題就是死鎖 ,死鎖在I2C主要表現為:I2C死鎖時表現為SCL為高,SDA一直為低。
    發表于 03-12 09:17 ?967次閱讀
    什么是<b class='flag-5'>I2C</b>協議 <b class='flag-5'>I2C</b>總線的控制邏輯

    i2c接口由哪幾根線組成 i2c接口可以接哪些器件

    I2C接口的線路可以適應不同的系統需求和器件規格,因此具體的線路配置可能會有所不同。但通常來說,時鐘線(SCL)和數據線(SDA)是I2C接口的核心線路。
    的頭像 發表于 03-05 16:55 ?3661次閱讀
    <b class='flag-5'>i2c</b>接口由哪幾根線組成 <b class='flag-5'>i2c</b>接口可以接哪些器件

    GD32 MCU硬件I2C不可靠不如軟件I2C?來看看紅楓派開發版的硬件I2C驅動如何做到穩得一批

    在一個評論,看到網友對硬件I2C的討論,硬件I2C Busy找不到原因、軟件I2C穩得一批。
    的頭像 發表于 02-23 09:37 ?2711次閱讀
    GD32 MCU硬件<b class='flag-5'>I2C</b>不可靠不如軟件<b class='flag-5'>I2C</b>?來看看紅楓派開發版的硬件<b class='flag-5'>I2C</b>驅動如何做到穩得一批

    嵌入式學習-ElfBoard ELF 1-gpio模擬i2c的方法

    一、驅動配置io模擬i2c驅動在內核的路徑:linux-4.1.15-elf1/drivers/i2c/busses/i2c-gpio.c
    發表于 02-22 15:17

    嵌入式開發I2C協議詳解

    I2C協議中最重要的一點是I2C地址。這個地址有7位和10位兩種形式。
    的頭像 發表于 12-05 09:16 ?1563次閱讀
    嵌入式開發<b class='flag-5'>中</b><b class='flag-5'>I2C</b>協議詳解