求助: 关于linux下i2c驱动的一些疑问

认真帅 2019-08-22 05:09:01
i2c驱动主要分为三部分:i2c总线驱动,i2c核心,i2c外设驱动。在学习宋宝华编写的<<设备驱动开发详解>>,对于其总结的,主机和外设眼中的linux世界图,如下图所示,有以下几点疑问: 问题1:i2c总线驱动和外设驱动中,注册具体是指什么? 问题2:platform_device是什么时候,怎么注册的? 问题3:platform_drive.probe函数的主要功能是什么? 问题4:platform_driver.probe函数是如何注册i2c_adapter 的? 问题5:i2c_client是什么时候,怎么注册的? 问题6:i2c_driver.probe()的作用是什么? 问题7:i2c_driver.probe()中调用register_chrdev注册字符设备,这个注册与i2c_client注册有什么区别和联系? 问题有点多,希望了解的前辈们可以解答一下,谢谢
...全文
110 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
YGLeeeon 2019-09-15
  • 打赏
  • 举报
回复
回答1:应该指的就是这个宏module_platform_driver(xxx_i2c_drv); 回答2:那个平台设备注册我也没找到源码在哪,应该是在设备树中体现了这个设备的存在 回答3:probe就是用来探测对应的,并将匹配到的设备的私有信息全部和驱动接口绑定 这是我截取的某个probe接口里的内容: platform_set_drvdata(pdev, id); match = of_match_node(cdns_i2c_of_match, pdev->dev.of_node); if (match && match->data) { const struct cdns_platform_data *data = match->data; id->quirks = data->quirks; } r_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); id->membase = devm_ioremap_resource(&pdev->dev, r_mem); if (IS_ERR(id->membase)) return PTR_ERR(id->membase); id->irq = platform_get_irq(pdev, 0); id->adap.dev.of_node = pdev->dev.of_node; id->adap.algo = &cdns_i2c_algo; id->adap.timeout = CDNS_I2C_TIMEOUT; id->adap.retries = 3; /* Default retry value. */ id->adap.algo_data = id; id->adap.dev.parent = &pdev->dev; 回答4:这个probe不能注册adapter,只能将探测到的设备挂到adapter上去,上面这段代码里也有体现 回答5:client也不是注册出来的,只有设备和驱动可以注册,client应该是抽象出来的一个对象,可以登记到文件系统 中,我看到i2c-core.c中有登记的宏,你可以自己读一下 回答6:你这个问题是不是和问题三重合了。应该区分一下platform_driver和i2c_driver,是直接与芯片相连的i2c控制 器的驱动,而platform_driver是先挂在了适配器上的i2c控制器,而适配器与总线相连。其中的probe接口应该没 有功能上的差异 回答7:client对于系统来说就是一字符设备,client在虚拟文件系统中登记为一个字符设备。 【注】:看到这我想说:我也是个菜鸟,希望回答引起楼主共鸣,但是有歧义的话我也不敢保证我说得对。哈哈哈

21,616

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧