[X]关闭

驱动之平台总线platform编写

文档创建者:ぉ沙皮狗的忧伤
浏览次数:3512
最后更新:2019-11-19
本帖最后由 ぉ沙皮狗的忧伤 于 2019-11-19 13:43 编辑

注:参考卫东山学习视频笔记,这个resource硬件信息描述的结构体困扰我很久了,由于zynq的GPIO寄存器和TI三星的存在很大区别,阅读别人的dev驱动代码看硬件描述信息,还是不明白他为啥要这么写,起始地址是描述GPIO口的基地址吗,结束地址又是描述什么?难到是GPIO操作寄存器的最后一个寄存器的地址?那他怎么实现单独传递某个GPIO口的信息,又是去配置GPIO口模式了?带着这些疑问,查看资料和看视频


1、先看框架,大致了解平台总线platform分层思想


2、了解platform_device和platform_driver实现的流程


3、撸代码device部分
*******************************************************************************************************
platform_device_register(&platform_led_pdev);
在平台总线上注册device设备

platform_led_pdev描述硬件设备,一个用于匹配的名字,另外一个就是resource结构体



我也被这个resource这个结构体困扰了很久,究竟要怎样去写???你想怎么写就怎么写,你只要把自己想传达的信息通过device传递给driver就可以了,就例如下面这个例子,start就传一个基地址,end同样也可以传基地址,为了代码的通用性及可读性flags标志位必须标明清楚,你传递的是地址、中断、IO等等


我这里就操作了一个MIO,所以硬件描述信息很简单
*****************************************************************************************************




driver部分
*****************************************************************************************************
platform_driver_register(&led_driver);
在平台总线上注册一个led_driver设备驱动

在led_driver结构体中除了probe和remove函数指针外最重要的是driver中的name,这里name的字符串一定要和device里面的名字匹配,否则无法在平台总线上匹配到device设备


先在probe里面先是申请设备号、创建设备、创建类

通过platform_get_resource函数获取从device文件中传递过来的硬件描述信号,地址or中断等等

在对传过来的地址进行偏移,操作相应的寄存器,点灯

最后在remove函数指针里面释放掉
*****************************************************************************************************


4、上电看现象
——》上电——》内核启动——》先装载platform_drv.ko——》在装载platform_dev.ko








5、深入扣代码









====》》

====》》

如果不能通过驱动名称进行强制匹配的话,那就采用其他方式匹配

匹配ID表;通过在driver的ID表中遍历device设备名,去寻找匹配

略略略略










本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

发表评论已发布 1

uisrc

发表于 2019-11-19 13:57:40 | 显示全部楼层

越努力越幸运!加油!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则