打印
[嵌入式linux]

linux函数请教

[复制链接]
1293|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yutanjie|  楼主 | 2013-10-9 14:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有一个I2C驱动结构体如下
static struct platform_driver s3c2440_i2c_driver = {
        .probe                = s3c24xx_i2c_probe,
        .remove                = s3c24xx_i2c_remove,
        .suspend_late        = s3c24xx_i2c_suspend_late,
        .resume                = s3c24xx_i2c_resume,
        .driver                = {
                .owner        = THIS_MODULE,
                .name        = "s3c2440-i2c",
        },
};

我想请问.probe的意思是不是系统中的probe函数都用s3c24xx_i2c_probe函数使用,但是s3c24xx_i2c_probe函数是有形参的,不知道形参是什么?怎么传入的

相关帖子

沙发
原野之狼| | 2013-10-11 12:18 | 只看该作者
probe是platform_driver结构体中的一个元素,它是一个函数指针。

参数是在通过函数指针调用时传入的。

以上是C语言基础知识,得好好补习一下。

使用特权

评论回复
板凳
yutanjie|  楼主 | 2013-10-11 14:27 | 只看该作者
原野之狼 发表于 2013-10-11 12:18
probe是platform_driver结构体中的一个元素,它是一个函数指针。

参数是在通过函数指针调用时传入的。

大侠请教下,代码如下在调用s3c24xx_i2c_probe函数时,传入的参数是哪个?
static int __init i2c_adap_s3c_init(void)
{
        int ret;

        ret = platform_driver_register(&s3c2410_i2c_driver);
        if (ret == 0) {
                ret = platform_driver_register(&s3c2440_i2c_driver);
                if (ret)
                        platform_driver_unregister(&s3c2410_i2c_driver);
        }

        return ret;
}

static struct platform_driver s3c2410_i2c_driver = {
        .probe                = s3c24xx_i2c_probe,
        .remove                = s3c24xx_i2c_remove,
        .suspend_late        = s3c24xx_i2c_suspend_late,
        .resume                = s3c24xx_i2c_resume,
        .driver                = {
                .owner        = THIS_MODULE,
                .name        = "s3c2410-i2c",
        },
};

int platform_driver_register(struct platform_driver *drv)
{
        drv->driver.bus = &platform_bus_type;
        if (drv->probe)  //调用s3c24xx_i2c_probe
                drv->driver.probe = platform_drv_probe;
        if (drv->remove)
                drv->driver.remove = platform_drv_remove;
        if (drv->shutdown)
                drv->driver.shutdown = platform_drv_shutdown;
        if (drv->suspend)
                drv->driver.suspend = platform_drv_suspend;
        if (drv->resume)
                drv->driver.resume = platform_drv_resume;
        return driver_register(&drv->driver);
}

static int s3c24xx_i2c_probe(struct platform_device *pdev)
{
        struct s3c24xx_i2c *i2c;
        struct s3c2410_platform_i2c *pdata;
        struct resource *res;
        int ret;

使用特权

评论回复
地板
原野之狼| | 2013-10-12 08:45 | 只看该作者
给出的代码没有调用操作

使用特权

评论回复
5
yutanjie|  楼主 | 2013-10-14 15:41 | 只看该作者
原野之狼 发表于 2013-10-12 08:45
给出的代码没有调用操作

if (drv->probe)  //  这条语句不是调用s3c24xx_i2c_probe吗?

使用特权

评论回复
6
yutanjie|  楼主 | 2013-10-14 17:16 | 只看该作者
yutanjie 发表于 2013-10-14 15:41
if (drv->probe)  //  这条语句不是调用s3c24xx_i2c_probe吗?

是否我理解错了,drv->probe根本没有调用函数,调用函数的格式为drv->probe(x,x) ,那么
drv->probe是个什么值呢?

使用特权

评论回复
7
yutanjie|  楼主 | 2013-10-14 17:26 | 只看该作者
yutanjie 发表于 2013-10-14 17:16
是否我理解错了,drv->probe根本没有调用函数,调用函数的格式为drv->probe(x,x) ,那么
drv->probe是个 ...

莫非drv->probe的值是现在这个指针在内存中的地址?那岂不是不可能为0?

使用特权

评论回复
8
原野之狼| | 2013-10-15 08:35 | 只看该作者
yutanjie 发表于 2013-10-14 17:26
莫非drv->probe的值是现在这个指针在内存中的地址?那岂不是不可能为0?

不要瞎猜  把C语言再好好补习一下

使用特权

评论回复
9
yutanjie|  楼主 | 2013-10-16 16:32 | 只看该作者
原野之狼 发表于 2013-10-15 08:35
不要瞎猜  把C语言再好好补习一下

大侠,我想我搞明白了。
if (drv->probe)是判断这个指针是否为空,显然在调用platform_driver_register(&s3c2410_i2c_driver)时已经将指针指向了s3c24xx_i2c_probe,所以不为空。如果没有这个指向,那指针就为空。也就是说函数指针也是指针,如果在定义时没有初始化,那么指针就为空。

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
原野之狼 + 2 赞一个!
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

50

帖子

1

粉丝