免费注册 查看新帖 |

Chinaunix

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

平台设备注册、串口驱动的疑惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-23 12:00 |只看该作者 |倒序浏览
我是个菜鸟,最近在弄串口驱动,有两问题弄了好久都不明白,向各位请教,您看到请一定帮我理一下头绪,这两天都被这两问题弄挺不爽的,以下按调用顺序贴上部分代码:
问题1,平台设备注册(将串口作为平台设备向内核注册):

static int __init s3c2440_serial_init(void)
{
        return s3c24xx_serial_init(&s3c2440_serial_drv, &s3c2440_uart_inf);
}

调用s3c24xx_serial_init:
int s3c24xx_serial_init(struct platform_driver *drv, struct s3c24xx_uart_info *info)
{
        dbg("s3c24xx_serial_init(%p,%p)\n", drv, info);

#ifdef CONFIG_PM
        drv->suspend = s3c24xx_serial_suspend;
        drv->resume = s3c24xx_serial_resume;
#endif

        return platform_driver_register(drv);
}

调用platform_driver_register:
int platform_driver_register(struct platform_driver *drv)
{
        drv->driver.bus = &platform_bus_type;
        if (drv->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);
}

函数platform_drv_probe:
static int platform_drv_probe(struct device *_dev)
{
        struct platform_driver *drv = to_platform_driver(_dev->driver);
        struct platform_device *dev = to_platform_device(_dev);

        return drv->probe(dev);
}

看不懂、不明白的地方:
    语句drv->driver.probe = platform_drv_probe其作用应该是给drv->driver.probe 赋值drv->probe(dev),那在函数platform_drv_probe里面
           struct platform_driver *drv = to_platform_driver(_dev->driver);
        struct platform_device *dev = to_platform_device(_dev);
      这两条语句是做什么用的?主要是看不懂to_platform_driver,to_platform_device这两个宏的意思,更具体是看不懂container_of
            #define to_platform_driver(drv)    (container_of((drv), struct platform_driver,  driver))
************************************************************************************************************
问题2.这个问题跟问题1可能是有关联,也许1就是2的答案,叙述起来比较麻烦,我就按函数执行的顺序将函数名贴上来:
     接问题1当内核找到一个匹配的设备开始调用static struct platform_drivers3c2440_serial_drv的成员.probe = s3c2440_serial_probe,执行
     static int s3c2440_serial_probe(struct platform_device *dev)---->s3c24xx_serial_probe(dev, &s3c2440_uart_inf)---->
        ret = s3c24xx_serial_init_port(ourport, info, dev)
        在函数:static int s3c24xx_serial_init_port(struct s3c24xx_uart_port *ourport,
                                    struct s3c24xx_uart_info *info,
                                    struct platform_device *platdev)  里面有一条语句 cfg = s3c24xx_dev_to_cfg(&platdev->dev);
     (cfg定义过了:struct s3c2410_uartcfg *cfg)

不懂的地方:
   s3c24xx_dev_to_cfg也是个宏:
   #define s3c24xx_dev_to_cfg(__dev)  (struct s3c2410_uartcfg *)((__dev)->platform_data)
    那么上面的语句cfg = s3c24xx_dev_to_cfg(&platdev->dev);其作用就是为cfg赋值platdev->dev.platform_data,问题是这个platdev->dev.platform_data又没有初始化过,
  (还是已经初始化过了,我自己找不到地方?直觉这种可能性很大)它本身是个什么东西都不知道呢,那将它赋值给cfg还有什么意义呢

论坛徽章:
0
2 [报告]
发表于 2011-11-23 12:06 |只看该作者
呵呵,我自己顶一下,是2.6.29的,打开Source Insight,找到串口吧,扫一眼,可能就给我解惑了,
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP