当前位置: 技术问答>linux和unix
100分请教高手I2C驱动的小问题
来源: 互联网 发布时间:2016-12-25
本文导语: I2C设备驱动的probe函数传进去的参数如下: static int i2c1_driver_probe( struct i2c_client *client, const struct i2c_device_id *id) 我想得到: struct platform_device s3c_device_i2c1;这一个对像; 请问应该怎么办? 1.为什么I2C设备驱...
I2C设备驱动的probe函数传进去的参数如下:
static int i2c1_driver_probe( struct i2c_client *client, const struct i2c_device_id *id)
我想得到:
struct platform_device s3c_device_i2c1;这一个对像;
请问应该怎么办?
1.为什么I2C设备驱动probe带的不是:platform_device参数而是:struct i2c_client *client ?
2.两者有什么联系?从struct i2c_client *client怎样才能得到:struct platform_device s3c_device_i2c1?
static int i2c1_driver_probe( struct i2c_client *client, const struct i2c_device_id *id)
我想得到:
struct platform_device s3c_device_i2c1;这一个对像;
请问应该怎么办?
1.为什么I2C设备驱动probe带的不是:platform_device参数而是:struct i2c_client *client ?
2.两者有什么联系?从struct i2c_client *client怎样才能得到:struct platform_device s3c_device_i2c1?
|
上面说的可能有点乱了,呵呵,主要是probe被调用的条件是:
1,设备被注册至系统内
2,驱动的名字有设备的名字一致
3,调用了驱动注册函数。
1,设备被注册至系统内
2,驱动的名字有设备的名字一致
3,调用了驱动注册函数。
|
1,对于第一个问题它应该只是采用了类似的思想,调用的probe函数可以自己处理。
比如,static int s3c24xx_i2c_probe(struct platform_device *pdev)
static int eeprom_i2c_probe_adapter(struct i2c_adapter *adap)
这个要看自己如何实现了。
2,第二个问题与上一问题基本一样,若采用第一个定义实现,可以转换成第二个,驱动注册使用platform_driver_register;若采用第二个实现,根本无需转换回去。
比如,static int s3c24xx_i2c_probe(struct platform_device *pdev)
static int eeprom_i2c_probe_adapter(struct i2c_adapter *adap)
这个要看自己如何实现了。
2,第二个问题与上一问题基本一样,若采用第一个定义实现,可以转换成第二个,驱动注册使用platform_driver_register;若采用第二个实现,根本无需转换回去。
|
在board-xxx.c里面注册你的platform_device。I2C设备是i2c_board_info。
在probe中
struct platform_device *data;
pdata=(struct platform_device*)client->dev.platform_data;
要知道怎么实现的需要读代码,可以从下面代码看起
struct i2c_client *
i2c_new_device(struct i2c_adapter *adap, struct i2c_board_info const *info)
{
struct i2c_client *client;
int status;
client = kzalloc(sizeof *client, GFP_KERNEL);
if (!client)
return NULL;
client->adapter = adap;
client->dev.platform_data = info->platform_data;
if (info->archdata)
client->dev.archdata = *info->archdata;
client->flags = info->flags;
client->addr = info->addr;
client->irq = info->irq;
strlcpy(client->name, info->type, sizeof(client->name));
/* Check for address business */
status = i2c_check_addr(adap, client->addr);
if (status)
goto out_err;
client->dev.parent = &client->adapter->dev;
client->dev.bus = &i2c_bus_type;
client->dev.type = &i2c_client_type;
dev_set_name(&client->dev, "%d-%04x", i2c_adapter_id(adap),
client->addr);
status = device_register(&client->dev);
if (status)
goto out_err;
dev_dbg(&adap->dev, "client [%s] registered with bus id %sn",
client->name, dev_name(&client->dev));
return client;
out_err:
dev_err(&adap->dev, "Failed to register i2c client %s at 0x%02x "
"(%d)n", client->name, client->addr, status);
kfree(client);
return NULL;
}
在probe中
struct platform_device *data;
pdata=(struct platform_device*)client->dev.platform_data;
要知道怎么实现的需要读代码,可以从下面代码看起
struct i2c_client *
i2c_new_device(struct i2c_adapter *adap, struct i2c_board_info const *info)
{
struct i2c_client *client;
int status;
client = kzalloc(sizeof *client, GFP_KERNEL);
if (!client)
return NULL;
client->adapter = adap;
client->dev.platform_data = info->platform_data;
if (info->archdata)
client->dev.archdata = *info->archdata;
client->flags = info->flags;
client->addr = info->addr;
client->irq = info->irq;
strlcpy(client->name, info->type, sizeof(client->name));
/* Check for address business */
status = i2c_check_addr(adap, client->addr);
if (status)
goto out_err;
client->dev.parent = &client->adapter->dev;
client->dev.bus = &i2c_bus_type;
client->dev.type = &i2c_client_type;
dev_set_name(&client->dev, "%d-%04x", i2c_adapter_id(adap),
client->addr);
status = device_register(&client->dev);
if (status)
goto out_err;
dev_dbg(&adap->dev, "client [%s] registered with bus id %sn",
client->name, dev_name(&client->dev));
return client;
out_err:
dev_err(&adap->dev, "Failed to register i2c client %s at 0x%02x "
"(%d)n", client->name, client->addr, status);
kfree(client);
return NULL;
}
|
首先楼主要搞明白i2c驱动注册的过程,另外最好再搞明白linux下虚拟的所谓平台设备。
一般在硬件驱动初始化中有个函数叫platform_driver_register,或driver_register之类的函数,传入他们的参数需要带设备的名字,如果设备被注册到系统中,那么这个函数会继续调用上成的所谓probe的函数,当然传入的就是找到的与驱动相关联的设备。
楼主要是不介意的话,可以先看看下面这个链接,看完后估计你就会明白了。
http://blog.donews.com/21cnbao/archive/2010/07/14/1581997.aspx
一般在硬件驱动初始化中有个函数叫platform_driver_register,或driver_register之类的函数,传入他们的参数需要带设备的名字,如果设备被注册到系统中,那么这个函数会继续调用上成的所谓probe的函数,当然传入的就是找到的与驱动相关联的设备。
楼主要是不介意的话,可以先看看下面这个链接,看完后估计你就会明白了。
http://blog.donews.com/21cnbao/archive/2010/07/14/1581997.aspx
|
1.为什么I2C设备驱动probe带的不是:platform_device参数而是:struct i2c_client *client ?
2.两者有什么联系?从struct i2c_client *client怎样才能得到:struct platform_device s3c_device_i2c1?
答:这是平台驱动,平台统一了硬件资源管理, 仔细看源代码, 内核封装了相应的函数.
2.两者有什么联系?从struct i2c_client *client怎样才能得到:struct platform_device s3c_device_i2c1?
答:这是平台驱动,平台统一了硬件资源管理, 仔细看源代码, 内核封装了相应的函数.
|
用过i2c协议,不过楼主说的这个驱动方面的小弟就不懂了,友情帮顶一下。