当前位置:  技术问答>linux和unix

i2c/pca9539.c文件的新模式probe疑问

    来源: 互联网  发布时间:2016-10-12

    本文导语:  linux内核是2.6.28的 新模式下client从哪里来的,我在网站上看到有人说是在i2c_register_info()函数调用过程中注册的,可是我仔细看了下i2c_register_info()函数,没有涉及到client额,还有新模式下pca9539_detect()函数主要完成...

linux内核是2.6.28的
新模式下client从哪里来的,我在网站上看到有人说是在i2c_register_info()函数调用过程中注册的,可是我仔细看了下i2c_register_info()函数,没有涉及到client额,还有新模式下pca9539_detect()函数主要完成些什么功能呢?
望大侠们指教一二,小弟不胜感激!

|
看i2c-core.c里面的内容
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;
}

上面注册到dev,这里面通过总线的probe找到自己的probe
static int i2c_device_probe(struct device *dev)
{
struct i2c_client *client = i2c_verify_client(dev);
struct i2c_driver *driver;
int status;

if (!client)
return 0;

driver = to_i2c_driver(dev->driver);
if (!driver->probe || !driver->id_table)
return -ENODEV;
client->driver = driver;
if (!device_can_wakeup(&client->dev))
device_init_wakeup(&client->dev,
client->flags & I2C_CLIENT_WAKE);
dev_dbg(dev, "proben");

status = driver->probe(client, i2c_match_id(driver->id_table, client));
if (status)
client->driver = NULL;
return status;
}

|
http://www.embedu.org/Column/Column213.htm
看到现在我们应该会有这样的疑问,在Adapter模式中,i2c_client是我们自己构造出来的,而现在的i2c_client是从哪来的呢?看看下面的解释

●    注册i2c_board_info

对于Probe模式,通常在平台代码中要完成i2c_board_info的注册。方法如下:

static struct i2c_board_info __initdata test_i2c_devices[] = {
                {
                        I2C_BOARD_INFO("pca9555", 0x27),//pca9555为芯片名称,0x27为芯片地址
                        .platform_data = &pca9555_data,
                }, {
                        I2C_BOARD_INFO("mt9v022", 0x48),
                        .platform_data = &iclink[0], /* With extender */
                }, {
                        I2C_BOARD_INFO("mt9m001", 0x5d),
                        .platform_data = &iclink[0], /* With extender */
                },
        };
        i2c_register_board_info(0, test_i2c_devices,ARRAY_SIZE(test_i2c_devices)); //注册

i2c_client就是在注册过程中构建的。但有一点需要注意的是i2c_register_board_info并没有EXPORT_SYMBOL给模块使用。

我也在弄,还不是很清楚,这个也许对你有用。

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • kernel中关于i2c处的问题,大家指教。
  • 关于I2C传输协议和串口问题
  • I2C设备数据通信问题
  • I2C 错误
  • i2c 驱动的问题,高人指教。
  • linux2.6 i2c驱动的几个问题
  • 如何读取i2c 上 ds1337时钟芯片 ~~~~~~~
  • 求助,LINUX的I2C
  • 视屏采集和I2C设备使用的问题请教
  • i2c通信问题
  • 100分请教高手I2C驱动的clock指针的问题
  • I2C驱动测试 有问题啊啊啊
  • i2c设备加载驱动后没有执行probe
  • 【求教】Linux I2C设备驱动开发流程
  • 100分请教高手一个 android串口控制台和i2c超时的问题(本人结贴率达到90%)
  • Linux下的i2c驱动
  • 关于LINUX I2C,GCC的奇怪问题。。。问题依旧。。
  • jquery iis7站长之家
  • I2c能否通过mmap读写
  • 关于LINUX的 I2C,高手速度进!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3