jackyard 发表于 2012-08-01 14:11

powerpc中,IIC驱动的device疑问

有哪位知道,在powerpc平台下,与linux的IIC驱动相对应的device设备是在哪里增加的?我找了好久怎么也没有找到相关的代码,比如如下的一个driver:
tatic struct i2c_driver at24c_driver = {
        .driver = {
            .name   = "at24c",
        },       
        .probe                = at24c_probe,
        .remove                = at24c_remove,
        .id_table        = at24c_id,//包括了支持的device
};

static int __init at24c_init(void)
{
      int ret;

      /*register at24c char dev*/
      ret= register_chrdev(eeprom_major,EEPROM_NAME,&eeprom_fops);
      if(ret<0){
          pr_err("eeprom register chrdev failed\n");
          returnret;
      }      
      eeprom_major = eeprom_major>0?eeprom_major:ret;

      pr_info("eeprom major number is: %d\n",eeprom_major );
      return i2c_add_driver(&at24c_driver);//在这里注册了driver.可是在代码中老是没有找到在哪里增加device ???
}
module_init(at24c_init);

jackyard 发表于 2012-08-01 14:48

是不是在注册adapt时增加的device??????????????

jackyard 发表于 2012-08-03 10:13

各位版主,怎么没有回信啊,是不知道呢,还是没有看明白???

jzwxh77 发表于 2012-08-03 10:26

记得USB设备都是先注册驱动,当总线发现有新的USB设备时,会读取USB设备中的ID,与每个USB驱动的中注册的ID比较,比对成功自动创建设备并与驱动及总线结构对象相关联。IIC会不会也是使用这种类似机制?

jackyard 发表于 2012-08-03 14:44

谢谢你的热心回复,我看了在注册adatp时,有如下的代码:
static int i2c_register_adapter(struct i2c_adapter *adap)
{
        int res = 0, dummy;

        /* Can't register until after driver model init */
        if (unlikely(WARN_ON(!i2c_bus_type.p))) {
                res = -EAGAIN;
                goto out_list;
        }

        rt_mutex_init(&adap->bus_lock);

        /* Set default timeout to 1 second if not already set */
        if (adap->timeout == 0)
                adap->timeout = HZ;

        dev_set_name(&adap->dev, "i2c-%d", adap->nr);
        adap->dev.bus = &i2c_bus_type;
        adap->dev.type = &i2c_adapter_type;
        res = device_register(&adap->dev);
        if (res)
                goto out_list;

        dev_dbg(&adap->dev, "adapter [%s] registered\n", adap->name);

#ifdef CONFIG_I2C_COMPAT
        res = class_compat_create_link(i2c_adapter_compat_class, &adap->dev,
                                     adap->dev.parent);
        if (res)
                dev_warn(&adap->dev,
                       "Failed to create compatibility class link\n");
#endif

        /* create pre-declared device nodes */
        if (adap->nr < __i2c_first_dynamic_bus_num)
                i2c_scan_static_board_info(adap);

        /* Notify drivers */
        mutex_lock(&core_lock);
        dummy = bus_for_each_drv(&i2c_bus_type, NULL, adap,
                               __process_new_adapter);
        mutex_unlock(&core_lock);

        return 0;

out_list:
        mutex_lock(&core_lock);
        idr_remove(&i2c_adapter_idr, adap->nr);
        mutex_unlock(&core_lock);
        return res;
}
其中i2c_scan_static_board_info(adap)源码如下:
static void i2c_scan_static_board_info(struct i2c_adapter *adapter)
{
        struct i2c_devinfo        *devinfo;

        down_read(&__i2c_board_lock);
        list_for_each_entry(devinfo, &__i2c_board_list, list) {
                if (devinfo->busnum == adapter->nr
                                && !i2c_new_device(adapter,
                                                &devinfo->board_info))
                        dev_err(&adapter->dev,
                                "Can't create device at 0x%02x\n",
                                devinfo->board_info.addr);
        }
        up_read(&__i2c_board_lock);
}
好像是在这注册device的。但device的ID是在哪里提交给内核的呢?我这个是powerpc芯片,是不是从DTS文件中读取的?
还有一个问题是,我如何让一个驱动支持多个device?一般是在id_table中指定的,可我怎么样创建每一个对应的device 的设备文件??求各位朋友指教????

jackyard 发表于 2012-08-03 17:22

自己再顶一下

George_lz 发表于 2012-08-15 13:39

回复 1# jackyard

I2C 设备的添加主要有两种方式。
1. 静态创建
2. 动态detect

1. 静态创建是需要driver 根据设备所在的adapter和device的信息去创建i2c_client。
   看你所注册的i2c_driver里的成员函数看,是采用的这种方式。
   在这种方式下,将device attach到所注册的driver上去,则是在i2c_driver 的driver_register里面。大多数总线在注册的时候,都会将总线的autoprobe打开,这样,在总线上注册driver时,就会去匹配相应的设备,如果存在,则将device添加到相应的driver上去,即到你driver的probe函数里面去了

2. 动态detect
    动态detect需要不许要在i2c_add_driver之前去创建相应对设备,但相对应的driver必须提供,driver上设备address 列表,和相应detect函数。即除了常见的那几个函数外,还必须包含如下几个
        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;

   使用这种方式,在driver注册的时候,可以允许设备不创建。在i2c_add_driver的时候,I2C core会去根据你提供的device address list 在所有的adapter上去探测一次(探测的过程很简单,就是在总线上发送一个address, 看总线上是否有设备响应,因此,在写driver时,i2c_add_driver之前,设备对硬件状态必须是工作状态)。

   
页: [1]
查看完整版本: powerpc中,IIC驱动的device疑问