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);
是不是在注册adapt时增加的device?????????????? 各位版主,怎么没有回信啊,是不知道呢,还是没有看明白??? 记得USB设备都是先注册驱动,当总线发现有新的USB设备时,会读取USB设备中的ID,与每个USB驱动的中注册的ID比较,比对成功自动创建设备并与驱动及总线结构对象相关联。IIC会不会也是使用这种类似机制? 谢谢你的热心回复,我看了在注册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 的设备文件??求各位朋友指教???? 自己再顶一下 回复 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]