免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2478 | 回复: 6
打印 上一主题 下一主题

powerpc中,IIC驱动的device疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-08-01 14:11 |只看该作者 |倒序浏览
有哪位知道,在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");
          return  ret;
      }      
      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);

论坛徽章:
0
2 [报告]
发表于 2012-08-01 14:48 |只看该作者
是不是在注册adapt时增加的device??????????????

论坛徽章:
0
3 [报告]
发表于 2012-08-03 10:13 |只看该作者
各位版主,怎么没有回信啊,是不知道呢,还是没有看明白???

论坛徽章:
0
4 [报告]
发表于 2012-08-03 10:26 |只看该作者
记得USB设备都是先注册驱动,当总线发现有新的USB设备时,会读取USB设备中的ID,与每个USB驱动的中注册的ID比较,比对成功自动创建设备并与驱动及总线结构对象相关联。IIC会不会也是使用这种类似机制?

论坛徽章:
0
5 [报告]
发表于 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 的设备文件??求各位朋友指教????

论坛徽章:
0
6 [报告]
发表于 2012-08-03 17:22 |只看该作者
自己再顶一下

论坛徽章:
0
7 [报告]
发表于 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之前,设备对硬件状态必须是工作状态)。

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP