Chinaunix首页 | 论坛 | 博客
  • 博客访问: 120035
  • 博文数量: 24
  • 博客积分: 616
  • 博客等级: 中士
  • 技术积分: 375
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-01 10:54
文章分类
文章存档

2012年(24)

我的朋友

分类: LINUX

2012-07-13 15:32:01

一.        IIC设备程序分类:

IIC核心、IIC总线驱动、IIC设备驱动

二.        重要结构体介绍:

1.     i2c_driver:

 /**

 * struct i2c_driver - represent an I2C device driver

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

 * @attach_adapter: Callback for bus addition (for legacy drivers)

 * @detach_adapter: Callback for bus removal (for legacy drivers)

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

 * @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_data: The I2C addresses to probe, ignore or force (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_data 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 {

      unsigned int class;

      /* Notifies the driver that a new bus has appeared or is about to be

       * removed. You should avoid using this if you can, it will probably

       * be removed in a near future.

       */

      int (*attach_adapter)(struct i2c_adapter *);

      int (*detach_adapter)(struct i2c_adapter *);

 

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

 

      /* 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 *, int kind, struct i2c_board_info *);

      const struct i2c_client_address_data *address_data;

      struct list_head clients;

};

 

 

 

 

 

 

2.     i2c_client:

   /**

 * 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

 * @driver: device's driver, hence pointer to access routines

 * @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 {

      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 i2c_driver *driver;      /* and our access routines    */

      struct device dev;      /* the device structure          */

      int irq;            /* irq issued by device          */

      struct list_head detected;

};

 

三.         重要函数的应用:

1.     分配内存:

   void * kmalloc (size_t size, int flags);

2.      privata_data的使用:

作用其实就是存储程序所私有的数据。

private_data = (unsigned int)(自定义结构变量指针);

 pointer = (自定义结构类型 *)private_data;


 pointer->...

四.Mach-mini2440.c中添加的程序

详见Mini2440i2c驱动(2)

 

 

 

 Mini2440之i2c驱动(2).pdf   

阅读(1190) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~