首先简单介绍一下自己,本人是成都地区一所高校学生,专业本不是计算机或者搞电子方面的,和嵌入式边也不沾的专业,就连C语言也没有学习(苦逼啊),是搞电力发方面的,新一届*上台了,大施改革,电力系统也不算铁饭碗了(以后买房买车,还有好多东西,算了这些都是私事)还是学一个有技术含量的把。本人在学院的创新实验室学习嵌入式,关于驱动这块前辈们都觉得很难,在网上查了一些资料,了解了学习方法和专业术语(本人没有有学习操作系统等),本着它山之石可以攻玉的学习原则,总结了一下关于驱动方面的学习要点以及学习思维。Linux简单字符驱动很简单,只需要在初始化时对物理地址进行映射,再注册一个fileopenration操作集,然后就和写裸机程序一样实现操作集就可以了。
问题一:为什么要进行物理地址到虚拟地址的映射?
因为引入了MMU内存管理,只允许用户操作虚拟地址。
问题二:为什么要引入MMU,而不让用户直接操作物理地址?因为内存管理非常复杂,主要是为了安全考虑。假如:驱动甲用到了一块物理地址0x20000000进行操作,驱动乙也刚好用到了这块物理地址。这种情况怎么办?注意,这时候并不会报错,可能发生的事情不可预料。而用虚拟地址为种情况就可以避免发生了,该物理地址要是已有人用,内核会提醒映射失败用户则可以考虑另选一块物理地址映射。百度的结果:第一,是安全。第二,便捷。第三,统一通用。第四,方便管理。第五,便于应用… 可是这么简单的驱动你几乎是在linux内核里看不到了,几乎所有内核带的驱动都是平台驱动.(你自己写的除外)。
问题三:linux为什么要引入平台驱动来增加驱动的开发难度呢? 答案就是:便于移植。
打个比方:从你家到北京。如果你知道地形的话随便怎么走都可以到北京。可是现在要所有的人都能从你家到北京,大部分人可能都不会走,这时候该怎么办?当然你 可以带他们走,可是我们讲的是所有人。这时候可以这样,修一条高速公路从你家到北京,然后所有的人(包括认路的不认路的,会开车的不会开车的)只需要按照 一定规则在路边等待专车就可以了,车子会带你到北京。
缺点:必须要先修一条从你家到北京的路,然后请一些有专业经验的司机。
优点:原本所有人需要学会认路的本领自己上北京,现在只需要知道一些车子的信息在公路旁边按照一定规则等就就可以了(你只需要知道你坐哪一路车,然后告诉司机你到哪下就行了)。
1、修一条路就好比建一条平台总线,有经验的司机就好比各种器件的原始设备厂商。
2、所有人就表示要做平板电脑,手机…各种的系统产品制造商。
3、“坐哪一路车,告诉司机到哪下”就是我们移植驱动需要告诉内核我们不同的芯片使用的硬件资源是哪些。分析:建立一条平台总线,这事linux帮你做了, 各种各样复杂的驱动(各种网卡芯片,传感器芯片…)原始设备厂商他帮你实现了驱动与硬件无关的驱动部分。(当然也不要佩服这些人,因为这些人他们只会写一种驱动,就是说网卡产商他们专门写网卡驱动,只写一种驱动从无到有并不是很困难)好了,现在最难的部分都让有linux内核和原始设备厂商都帮我们做了。我们只需要在驱动移植的时候告诉驱动我们使用的硬件资源就行了。
总结:随着linux内核越来越复杂化linux从2.6开始引入了平台驱动,其实是对开发做分工从而发挥嵌入式的优势.
平台驱动、平台设备主要设及到四个重要的结构
struct platform_driver,struct platform_device,struct device_driver,struct device。
本人真正意义上接触计算机应该是大学,我一直认为,我初入计算机行业的时候,上帝给了我一个努力追求技术的心。而在当前物联网、互联网、云计算、嵌入式行业空前发展的时代,上帝给了我一个追求时代前沿技术的恒心。”技术和发展不互相冲突。