Linux内核的I2C子系统(一)

一、I2C总线概览

(1)三根通信线:SCLSDAGND

(2)同步、串行、电平、低速、近距离

(3)总线式结构,支持多个设备挂接在同一条总线上

(4)主从式结构,通信双方必须一个为主(master)一个为从(slave),每个从设备在总线中有唯一的地址(slave address),主设备通过从地址找到自己要通信的从设备(本质是广播)

(5)I2C主要的用途就是主SoC和外围设备之间的通信。常见的各种物联网传感器芯片(如gsensor、温度、湿度、光强度、烟雾浓度、压力等)均使用的是I2C接口和主SoC进行连接。

二、I2C子系统4个关键的结构体

struct i2c_adapter { //I2C适配器

    struct module *owner;

    unsigned int class;       /* classes to allow probing for */

    const struct i2c_algorithm *algo; /* the algorithm to access the bus */

    void *algo_data;

 

    /* data fields that are valid for all devices   */

    struct rt_mutex bus_lock;

 

    int timeout;            /* in jiffies */

    int retries;                                                                                     

    struct device dev;      /* the adapter device */

 

    int nr; 

    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;

};

 

struct i2c_algorithm {      //I2C算法                                                                         

    /* If an adapter algorithm can't do I2C-level access, set master_xfer

       to NULL. If an adapter algorithm can do SMBus access, set

       smbus_xfer. If set to NULL, the SMBus protocol is simulated

       using common I2C messages */

    /* master_xfer should return the number of messages successfully

       processed, or a negative value on error */

    int (*master_xfer)(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);

 

    /* To determine what the adapter supports */

    u32 (*functionality) (struct i2c_adapter *);

 

#if IS_ENABLED(CONFIG_I2C_SLAVE)

    int (*reg_slave)(struct i2c_client *client);

    int (*unreg_slave)(struct i2c_client *client);

#endif

};

 

/**

 * struct i2c_client - represent an I2C slave device

 * @flags: I2C_CLIENT_TEN indicates the device uses a ten bit chip address;

 *  I2C_CLIENT_PEC indicates it uses SMBus Packet Error Checking

 * @addr: Address used on the I2C bus connected to the parent adapter.

 * @name: Indicates the type of the device, usually a chip name that's

 *  generic enough to hide second-sourcing and compatible revisions.

 * @adapter: manages the bus segment hosting this I2C device

 * @dev: Driver model device node for the slave.

 * @irq: indicates the IRQ generated by this device (if any)

 * @detected: member of an i2c_driver.clients list or i2c-core's

 *  userspace_devices list

 *

 * An i2c_client identifies a single device (i.e. chip) connected to an

 * i2c bus. The behaviour exposed to Linux is defined by the driver

 * managing the device.

 */

struct i2c_client {       //I2C(从机)设备信息                                                                           

    unsigned short flags;       /* div., see below      */

    unsigned short addr;        /* chip address - NOTE: 7bit    */

                    /* addresses are stored in the  */

                    /* _LOWER_ 7 bits       */

    char name[I2C_NAME_SIZE];

    struct i2c_adapter *adapter;    /* the adapter we sit on    */

    struct device dev;      /* the device structure     */

    int irq;            /* irq issued by device     */

    struct list_head detected;

};

 

/**

 * struct i2c_driver - represent an I2C device driver

 * @class: What kind of i2c device we instantiate (for detect)

 * @attach_adapter: Callback for bus addition (deprecated)

 * @probe: Callback for device binding

 * @remove: Callback for device unbinding

 * @shutdown: Callback for device shutdown

 * @suspend: Callback for device suspend

 * @resume: Callback for device resume

 * @alert: Alert callback, for example for the SMBus alert protocol

 * @command: Callback for bus-wide signaling (optional)

 * @driver: Device driver model driver

 * @id_table: List of I2C devices supported by this driver

 * @detect: Callback for device detection

 * @address_list: The I2C addresses to probe (for detect)

 * @clients: List of detected clients we created (for i2c-core use only)

 *

 * The driver.owner field should be set to the module owner of this driver.

 * The driver.name field should be set to the name of this driver.

 *

 * For automatic device detection, both @detect and @address_list must

 * be defined. @class should also be set, otherwise only devices forced

 * with module parameters will be created. The detect function must

 * fill at least the name field of the i2c_board_info structure it is

 * handed upon successful detection, and possibly also the flags field.

 *

 * If @detect is missing, the driver will still work fine for enumerated

 * devices. Detected devices simply won't be supported. This is expected

 * for the many I2C/SMBus devices which can't be detected reliably, and

 * the ones which can always be enumerated in practice.

 *

 * The i2c_client structure which is handed to the @detect callback is

 * not a real i2c_client. It is initialized just enough so that you can

 * call i2c_smbus_read_byte_data and friends on it. Don't do anything

 * else with it. In particular, calling dev_dbg and friends on it is

 * not allowed.

 */

 

struct i2c_driver { //I2C(从机)设备驱动

    unsigned int class;

 

    /* Notifies the driver that a new bus has appeared. You should avoid

     * using this, it will be removed in a near future.

     */

    int (*attach_adapter)(struct i2c_adapter *) __deprecated;

 

    /* Standard driver model interfaces */

    int (*probe)(struct i2c_client *, const struct i2c_device_id *);

    int (*remove)(struct i2c_client *);

 

    /* driver model interfaces that don't relate to enumeration  */

    void (*shutdown)(struct i2c_client *);

    int (*suspend)(struct i2c_client *, pm_message_t mesg);

    int (*resume)(struct i2c_client *);

 

    /* Alert callback, for example for the SMBus alert protocol.

     * The format and meaning of the data value depends on the protocol.

     * For the SMBus alert protocol, there is a single bit of data passed

     * as the alert response's low bit ("event flag").

     */

    void (*alert)(struct i2c_client *, unsigned int data);

 

    /* a ioctl like command that can be used to perform specific functions

     * with the device.

     */

    int (*command)(struct i2c_client *client, unsigned int cmd, void *arg);

 

    struct device_driver driver;

    const struct i2c_device_id *id_table;

 

    /* Device detection callback for automatic device creation */

    int (*detect)(struct i2c_client *, struct i2c_board_info *);

    const unsigned short *address_list;

    struct list_head clients;

};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值