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

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

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

3天內不再提示

I2C子系統幾個主要的結構體

麥辣雞腿堡 ? 來源:嵌入式Linux系統開發 ? 作者:嵌入式Linux系統開 ? 2023-07-22 16:04 ? 次閱讀

I2C Data Structure

我們要搞懂一個 Linux 子系統,必須研究它的數據結構,搞懂每個結構體存儲了什么東西,才能梳理清楚該子系統的架構。

I2C 子系統有幾個主要的結構體:

I2C 控制器:i2c_adapter、i2c_algorithm、mtk_i2c

I2C 設備驅動:i2c_client、i2c_driver

I2C 傳輸:i2c_msg

i2c_adapter:i2c-core 層描述一個 I2C 控制器,假如一個芯片有 8 路 I2C bus,則有 8 個 i2c_adapter。請詳細看博主對 code 的注釋說明。

struct i2c_adapter {
 struct module *owner;
 unsigned int class; /* 該 I2C bus 支持哪些類型的從設備 */
 const struct i2c_algorithm *algo; /* the algorithm to access the bus */
 void *algo_data;

 /* data fields that are valid for all devices */
 const struct i2c_lock_operations *lock_ops;
 struct rt_mutex bus_lock;
 struct rt_mutex mux_lock;

 int timeout;/* 超過該時間無法重發 */
 int retries;/* I2C發送失敗重試次數 */
 struct device dev;  /* the adapter device */
 unsigned long locked_flags; /* owned by the I2C core */
#define I2C_ALF_IS_SUSPENDED  0
#define I2C_ALF_SUSPEND_REPORTED 1

 int nr;/*I2C bus id*/
 char name[48];
 struct completion dev_released;

 struct mutex userspace_clients_lock;
 struct list_head userspace_clients;

 struct i2c_bus_recovery_info *bus_recovery_info;
 const struct i2c_adapter_quirks *quirks;

 struct irq_domain *host_notify_domain;
 struct regulator *bus_regulator;
};

i2c_algorithm:I2C 傳輸函數合集,其中 master_xfer 是真正的傳輸函數 ,芯片原廠寫 I2C 控制器驅動時必須實現。functionality 函數會返回該 I2C 控制器支持什么通信協議,也需要實現,其他的函數即便 Linux 規定了,芯片原廠也可以不實現,因為不常用。

struct i2c_algorithm {
 int (*master_xfer)(struct i2c_adapter *adap, struct i2c_msg *msgs,int num);
 int (*master_xfer_atomic)(struct i2c_adapter *adap,struct i2c_msg *msgs, int num);
 int (*smbus_xfer)(struct i2c_adapter *adap, u16 addr,unsigned short flags, char read_write,u8 command, int size, union i2c_smbus_data *data);
 int (*smbus_xfer_atomic)(struct i2c_adapter *adap, u16 addr,unsigned short flags, char read_write,u8 command, int size, union i2c_smbus_data *data);

 /* To determine what the adapter supports */
 u32 (*functionality)(struct i2c_adapter *adap);

#if IS_ENABLED(CONFIG_I2C_SLAVE)
 int (*reg_slave)(struct i2c_client *client);
 int (*unreg_slave)(struct i2c_client *client);
#endif
};

MTK 只實現了其中兩個圖片

圖片

i2c_client:描述設備信息

struct i2c_client {
 unsigned short flags;/* I2C 傳輸標志位如下*/
#define I2C_CLIENT_PEC  0x04 /* Use Packet Error Checking */
#define I2C_CLIENT_TEN  0x10 /* we have a ten bit chip address */
/* Must equal I2C_M_TEN below */
#define I2C_CLIENT_SLAVE 0x20 /* we are the slave */
#define I2C_CLIENT_HOST_NOTIFY 0x40 /* We want to use I2C host notify */
#define I2C_CLIENT_WAKE  0x80 /* for board_info; true iff can wake */
#define I2C_CLIENT_SCCB  0x9000 /* Use Omnivision SCCB protocol */
     /* Must match I2C_M_STOP|IGNORE_NAK */

 unsigned short addr;  /* chip address - NOTE: 7bit */
     /* addresses are stored in the */
     /* _LOWER_ 7 bits  */
 char name[I2C_NAME_SIZE];
 struct i2c_adapter *adapter;/* 所處的那一路 I2C bus */
 struct device dev;  /* the device structure  */
 int init_irq;   /* irq set at initialization */
 int irq;   /* irq issued by device  */
 struct list_head detected;
#if IS_ENABLED(CONFIG_I2C_SLAVE)
 i2c_slave_cb_t slave_cb; /* callback for slave mode */
#endif
 void *devres_group_id;  /* ID of probe devres group */
};

i2c_driver:普通驅動工程師寫驅動時,必須實現其中的 probe 函數和 remove 函數,其余的函數一般用不到。

struct i2c_driver {
 unsigned int class;

 /* Standard driver model interfaces */
 int (*probe)(struct i2c_client *client, const struct i2c_device_id *id);
 int (*remove)(struct i2c_client *client);

 int (*probe_new)(struct i2c_client *client);
 void (*shutdown)(struct i2c_client *client);
 void (*alert)(struct i2c_client *client, enum i2c_alert_protocol protocol,unsigned int data);
 int (*command)(struct i2c_client *client, unsigned int cmd, void *arg);

 struct device_driver driver;
 const struct i2c_device_id *id_table;

 int (*detect)(struct i2c_client *client, struct i2c_board_info *info);
 const unsigned short *address_list;
 struct list_head clients;
};

mtk_i2c:MTK 平臺用該結構體表示 I2C 控制器,定義在/kernel-5.10/drivers/i2c/busses/i2c-mt65xx.c

struct mtk_i2c {
 struct i2c_adapter adap; /* i2c host adapter */
 struct device *dev;
 struct completion msg_complete;

 /* set in i2c probe */
 void __iomem *base;  /* i2c base addr */
 void __iomem *pdmabase;  /* dma base address*/
 struct clk *clk_main;  /* main clock for i2c bus */
 struct clk *clk_dma;  /* DMA clock for i2c via DMA */
 struct clk *clk_pmic;  /* PMIC clock for i2c from PMIC */
 bool have_pmic;   /* can use i2c pins from PMIC */
 bool use_push_pull;  /* IO config push-pull mode */

 u16 irq_stat;   /* interrupt status */
 unsigned int clk_src_div;
 unsigned int speed_hz;  /* The speed in transfer */
 enum mtk_trans_op op;
 u16 timing_reg;
 u16 high_speed_reg;
 unsigned char auto_restart;
 bool ignore_restart_irq;
 const struct mtk_i2c_compatible *dev_comp;
};

i2c_msg:I2C 讀寫時,必須填充 i2c_msg。

標志位:寫為 0 ,讀為 I2C_M_RD,其他的 flag 大家可以參考。

I2C 單筆傳輸最大 64KB,len 的長度博主在注釋中有說明。

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

    關注

    28

    文章

    1481

    瀏覽量

    123317
  • 結構體
    +關注

    關注

    1

    文章

    130

    瀏覽量

    10835
  • 系統
    +關注

    關注

    1

    文章

    1008

    瀏覽量

    21318
收藏 人收藏

    評論

    相關推薦

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

    I2C核心維護了i2c_bus結構,提供了I2C總線驅動和設備驅動的注冊、注銷方法,維護了I2C
    的頭像 發表于 09-04 09:35 ?1261次閱讀
    Linux內核中描述<b class='flag-5'>I2C</b>的四個核心<b class='flag-5'>結構</b><b class='flag-5'>體</b>

    linux I2C子系統的相關資料分享

    文章目錄linux I2C子系統框架在設備樹中添加從設備信息,mpu5060I2C driver 程序的編寫mpu6050 I2C程序具體實現linux
    發表于 02-10 06:06

    i2c總線ppt(I2C總線器件應用)

    I2C總線器件應用第一節 I2C總線器件應用概述I2C總線工作原理I2C總線系統結構
    發表于 08-13 17:34 ?0次下載

    I2C總線應用中的幾個問題

    I2C總線應用中的幾個問題:i2c上拉電阻阻值的確定,PCB布局布線與抗干擾設計,軟件模擬I2C時序,I2C 應用中上拉電阻電源問題。
    發表于 09-13 14:27 ?51次下載
    <b class='flag-5'>I2C</b>總線應用中的<b class='flag-5'>幾個</b>問題

    探討I2C總線應用中的幾個問題

    I2C應用中的幾個問題,I2C上拉電阻的確定,抗干擾設計
    發表于 02-25 14:48 ?4次下載

    I2C總線的結構介紹

    內容摘要:介紹了I2C總線的結構、工作原理、數據傳輸方式,討論了基于I2C總線的多機通信軟硬件設計,實現了程控交換多機通信調度指揮系統
    發表于 02-29 15:44 ?6次下載

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

    本文通過閱讀內核代碼,來梳理一下I2C子系統的整體視圖。在開發I2C設備驅動程序時,往往缺乏對于系統整體的認識,沒有一個清晰的思路。所以從高層級來分析一下
    的頭像 發表于 12-31 10:40 ?2154次閱讀
    Linux內核中<b class='flag-5'>I2C</b><b class='flag-5'>子系統</b>的整體視圖

    linux I2C子系統(及相關程序設計MPU6050)

    文章目錄linux I2C子系統框架在設備樹中添加從設備信息,mpu5060I2C driver 程序的編寫mpu6050 I2C程序具體實現linux
    發表于 12-06 13:36 ?9次下載
    linux <b class='flag-5'>I2C</b><b class='flag-5'>子系統</b>(及相關程序設計MPU6050)

    Linux驅動:I2C設備驅動(基于Freescale i.MX6ULL平臺了解I2C的驅動框架,順便寫個簡陋的MPU6050驅動)

    文章目錄1、簡介2I2C總線、設備和驅動的結構定義2.1 結構定義--
    發表于 12-06 13:51 ?8次下載
    Linux驅動:<b class='flag-5'>I2C</b>設備驅動(基于Freescale <b class='flag-5'>i</b>.MX6ULL平臺了解<b class='flag-5'>I2C</b>的驅動框架,順便寫個簡陋的MPU6050驅動)

    嵌入式內核及驅動開發-09IIC子系統框架使用(I2C協議和時序,I2C驅動框架,I2C從設備驅動開發,MPU6050硬件連接

    文章目錄I2c協議和時序I2c介紹I2c硬件連接I2c總線的信號I2c總線寫時序I2c總線讀時序
    發表于 12-06 14:06 ?17次下載
    嵌入式內核及驅動開發-09IIC<b class='flag-5'>子系統</b>框架使用(<b class='flag-5'>I2C</b>協議和時序,<b class='flag-5'>I2C</b>驅動框架,<b class='flag-5'>I2C</b>從設備驅動開發,MPU6050硬件連接

    硬件I2C與模擬I2C

    硬件I2C對應芯片上的I2C外設,有相應I2C驅動電路,其所使用的I2C管腳也是專用的,因而效率要遠高于軟件模擬的I2C;一般也較為穩定,但
    發表于 12-28 19:14 ?81次下載
    硬件<b class='flag-5'>I2C</b>與模擬<b class='flag-5'>I2C</b>

    I2C子系統debug的常見問題

    常見問題 1、同一條 i2c bus 上所有的外設的 i2c addr 要不同 1)相同 address 注冊時沖突 [ 2.059184 ][xxx]i2c i2c- 1 :Fail
    的頭像 發表于 07-22 14:52 ?905次閱讀

    I2C控制器驅動介紹

    適配器與 I2C 設備進行通信的方法。 I2C 總線驅動,或者說 I2C 適配器驅動的主要工作就是初始化 i2c_adapter
    的頭像 發表于 07-22 15:38 ?1420次閱讀
    <b class='flag-5'>I2C</b>控制器驅動介紹

    I2C子系統SW Architecture

    I2C SW Architecture 【driver 驅動層】由普通驅動工程師負責,【i2c 核心層】由 Linux 提供,【i2c 核心層】以下由芯片原廠負責。 I2C
    的頭像 發表于 07-22 16:01 ?912次閱讀
    <b class='flag-5'>I2C</b><b class='flag-5'>子系統</b>SW Architecture

    I2C轉UART子系統設計

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