linux系统驱动程序的开发和移植

2019-07-13 06:00发布

1.驱动程序:操作系统通过各种驱动程序来驾驭硬件设备。 驱动程序没有主函数,也不会主动执行,应用程序来调用执行驱动程序。驱动程序是内核的一部分
2.系统调用操作系统向应用层提供的一组接口函数,应用层通过这组接口函数可以访问系统提供的特殊的功能。 API
对于ARM架构的CPU,系统调用函数会执行swi指令,引起异常,执行异常处理程序
异常处理程序判断是哪个系统调用引起的异常,分析该函数调用的参数,进而找到对应的驱动程序(通过设备节点对应的设备号)
设备节点文件是链接应用程序和驱动程序的纽带。应用程序把所有的外设都当成是文件,对外设的操作,就是对设备节点文件的操作。
主设备号: 用来区别不同类型的设备次设备号:区别通类型的设备中不同的个体
1> 驱动程序操作步骤:注册---》初始化---》打开---》操作---》关闭---》卸载
2.设备分为:字符设备,块设备,网络设备。3.字符设备:通过设备文件节点访问。

设备的注册方式有:杂项注册: >主设备号固定为10。 >次设备号范围是0~254。 >当次设备号为255时,是由内核自动分配。 >自动创建设备节点文件。
2.6申请主设备号,次设备号也要指定
经典:只申请主设备号,次设备号任意

————————————————平台总线驱动程序模块特点: 1. 使用一个.c 编辑,最终生成一个模块2. 移植性不太好,设备和驱动不是分离的3. 不方便设备资源的统一管理
平台总线统一管理:平台设备驱动模型特点(四点):1. 分层思想:把一个设备驱动分成 设备层 和 驱动层 两个部分,增强可移植性 和 代码维护简单。 1)当加载驱动层时,平台总线会把驱动结构中的name成员取出和平台总线当前设备链表上全部设备的name成员进行逐个比较,如果发现相同,就把这个驱动和这个设备绑定上,然后驱动的探测函数会被调用。 2)当加载设备层时,平台总线会把设备结构中的name成员取出和平台总线当前驱动链表上全部驱动的name成员进行逐个比较,如果发现相同,就把这个驱动和这个设备绑定上,然后驱动的探测函数会被调用。
2. 资源统一由内核管理,安全可靠。 所有要使用的资源都是以下流程: 探测资源-->向内核申请资源--->内核审批后--->映射--->使用 这个工作是由探测函数来完成。
3. 很容易实现设备电源管理机制。 提供统一的API接口,只要实现相应的接口就可以了。 int (*suspend)(struct platform_device *, pm_message_t state); //挂起函数 int (*resume)(struct platform_device *); //恢复函数
4. 设备层的注册都放在一起,可以很方便的完成对外设功能的选择和管理。

现在都是平台总线移植。修改设备层,就可以完成整个驱动层的移植。