2、结构体

1、总线类型

struct bus_type {

const char                *name;

const char                *dev_name;

struct device                *dev_root;

const struct attribute_group **bus_groups;

const struct attribute_group **dev_groups;

const struct attribute_group **drv_groups;

int (*match)(struct device *dev, struct device_driver *drv);

int (*uevent)(struct device *dev, struct kobj_uevent_env *env);

int (*probe)(struct device *dev);

void (*sync_state)(struct device *dev);

void (*remove)(struct device *dev);

void (*shutdown)(struct device *dev);

int (*online)(struct device *dev);

int (*offline)(struct device *dev);

int (*suspend)(struct device *dev, pm_message_t state);

int (*resume)(struct device *dev);

int (*num_vf)(struct device *dev);

int (*dma_configure)(struct device *dev);

const struct dev_pm_ops *pm;

const struct iommu_ops *iommu_ops;

struct subsys_private *p;

struct lock_class_key lock_key;

bool need_parent_lock;

};

总线函数注册

struct bus_type i2c_bus_type = {

.name                = "i2c",

.match                = i2c_device_match,

.probe                = i2c_device_probe,

.remove                = i2c_device_remove,

.shutdown        = i2c_device_shutdown,

};

EXPORT_SYMBOL_GPL(i2c_bus_type);

2、i2c-adapter

i2c_adapter对应于物理上的一个适配器, 而i2c_algorithm对应一套通信方法。 一个I2C适配器需要

i2c_algorithm提供的通信函数来控制适配器产生特定的访问周期。 缺少i2c_algorithm的i2c_adapter什么也做

不了, 因此i2c_adapter中包含所使用的i2c_algorithm的指针。

 userspace_clients 连接在该adapter上的多个i2c client链表

struct i2c_adapter {

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        */

const struct i2c_lock_operations *lock_ops;

struct rt_mutex bus_lock;

struct rt_mutex mux_lock;

int timeout;                        /* in jiffies */

int retries;

struct device dev;                /* the adapter device */

unsigned long locked_flags;        /* owned by the I2C core */

int nr;     /* number show which controller(adapter) */

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;

};

3、i2c_algorithm

i2c_algorithm中的关键函数master_xfer() 用于产生I2C访问周期需要的信号, 以i2c_msg(即I2C消

息) 为单位。

struct i2c_algorithm {

/*

 * 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 (*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

};

4、i2c_msg

struct i2c_msg {

__u16 addr;

__u16 flags;

#define I2C_M_RD                0x0001        /* guaranteed to be 0x0001! */

#define I2C_M_TEN                0x0010        /* use only if I2C_FUNC_10BIT_ADDR */

#define I2C_M_DMA_SAFE                0x0200        /* use only in kernel space */

#define I2C_M_RECV_LEN                0x0400        /* use only if I2C_FUNC_SMBUS_READ_BLOCK_DATA */

#define I2C_M_NO_RD_ACK                0x0800        /* use only if I2C_FUNC_PROTOCOL_MANGLING */

#define I2C_M_IGNORE_NAK        0x1000        /* use only if I2C_FUNC_PROTOCOL_MANGLING */

#define I2C_M_REV_DIR_ADDR        0x2000        /* use only if I2C_FUNC_PROTOCOL_MANGLING */

#define I2C_M_NOSTART                0x4000        /* use only if I2C_FUNC_NOSTART */

#define I2C_M_STOP                0x8000        /* use only if I2C_FUNC_PROTOCOL_MANGLING */

__u16 len;

__u8 *buf;

};

5、i2c-client

i2c_client对应于真实的物理设备, 每个I2C设备都需要一个i2c_client来描述。

struct i2c_client {

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

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

char name[I2C_NAME_SIZE];

struct i2c_adapter *adapter;        /* the adapter we sit on (controller)        */

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        */

};

6、i2c-driver

struct i2c_device_id形式的id_table是该驱动所支持的I2C设备的ID表。

i2c_driver与i2c_client的关系是一对多, 一个i2c_driver可以支持多个同类型的i2c_client。

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);

/* New driver model interface to aid the seamless removal of the

 * current probe()'s, more commonly unused than used second parameter.

 */

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

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

void (*shutdown)(struct i2c_client *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").

 * For the SMBus Host Notify protocol, the data corresponds to the

 * 16-bit payload data reported by the slave device acting as master.

 */

void (*alert)(struct i2c_client *client, enum i2c_alert_protocol protocol,

      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 *client, struct i2c_board_info *info);

const unsigned short *address_list;

struct list_head clients;

u32 flags;

};

关系结构图

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值