heijin
驱动程序的作用:
1)向linux内核注册/注销设备号,创建/删除设备节点文件(这个操作可以分离出来),供应用程序调用。(设备节点文件中的设备号要与驱动程序申请注册的设备号一致)
2)将物理地址转为虚拟地址进行设备操作,将应用程序的文件调用转为对自定义的驱动函数调用;
驱动的创建:配置环境变量(作用?),在petalinux下创建,并在配置界面选中驱动;驱动代码由自己编写;
驱动的编译:在petalinux下编译,生成.ko文件,即驱动模块;
驱动的调用:在开发板上运行linux系统,(使用命令)加载驱动模块,创建设备节点文件。然后(使用命令)运行应用程序。(应用程序通过设备节点文件关联到驱动程序)
设备号的申请:可以不在驱动代码中写死,而是由Linux内核分配。并且可以把设备节点文件的创建和删除也放到驱动代码中。
设备树:
系统的设备树文件(*.dtsi),包含设备名称,寄存器地址定义等等信息。被内核解析后,将各个设备类型创建到/proc/devicetree目录下;
驱动程序(可以按照设备名)到设备树中找到相应的设备,然后进行初始化和注册设备;
如果设备树文件改变了,对于petalinux来说要重新编译到内核。
可以这样理解:设备树提供了设备信息,驱动程序到设备树去查找并根据这个设备信息去初始化和注册设备,创建设备节点文件,然后应用程序去操作设备节点文件,最终操作设备。
pinctrl子系统:
1)不在驱动程序中直接操作寄存器地址,而是通过支持pinctrl的设备树来申请,然后以函数调用的方式来操作;
2)需要修改设备树文件(定义节点并例化设备),使之支持pinctrl方式;
虚拟平台模型分为platform_bus,platform_driver,platform_device,可实现驱动设备分离功能,可根据驱动和设备的属性,自动匹配。
platform_bus首先将驱动和设备树比对,如果没有设备树或者无法匹配,也可以直接比对驱动和设备。
这里的驱动,是指linux与各种设备之间的接口及文件调用方式;设备,是指针对外围设备的不同时序或使用方式;两者都是代码,结合起来可以操作各种设备。
platform_bus匹配后,会调用驱动程序的probe函数去读设备程序的信息,获取寄存器操作地址等等。
在虚拟平台模型下,可以使用设备树替代platform_device,此时,platform_driver中的属性参数要去和设备树匹配;
(如果一个SPI总线挂了几个外设,那么可能是通过不同的驱动程序来实现的。因为设备程序不同,那么驱动在调用设备函数的时候也不同)
更多推荐
heijin
发布评论