Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1301200
  • 博文数量: 548
  • 博客积分: 7597
  • 博客等级: 少将
  • 技术积分: 4224
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-15 13:21
个人简介

嵌入式软件工程师&&太极拳

文章分类

全部博文(548)

文章存档

2014年(10)

2013年(76)

2012年(175)

2011年(287)

分类: LINUX

2011-02-21 00:12:46

设备驱动程序和CPU没有任何关系
一直以来都没有弄清楚驱动程序到底占什么位置,为什么我们开发时要自己编写驱动,难道没有现成的驱动可以用吗?PC上关于RT8139网卡PCI驱动可以直接用在ARM中吗?看完本文后,你会得出结论:)
架构相关操作:
IO端口的操作、内存分配的操作、DMA的基本操作、中断的初始化、系统时钟,这些操作和具体的CPU构架有很大的关系。也就是常说的芯片级移植。
对于不同的CPU需要编写相应的各种底层函数,这些函数由内核移植人员完成。在不同的系统应用中,针对同一型号CPU的内核可以通用,只需在该内核基础上增加设备驱动程序即可。设备驱动既可以编译到内核中作为内核的一部分,又可以编译成模块,动态加载。
针对特定的CPU编写内核,需要硬件仿真器的支持。实现的文件也很多,比如arch/i386目录下面的所有文件就是针对PC上的CPU编写的内核代码;而arch/arm目录下面的所有文件则是针对ARM处理器的内核代码。由于台式机的CPU多是intel和amd出品,处理器之间的差异比较小,代码的通用性很好。而对于ARM处理器,虽然ARM公司给出了规范,但是ARM核的版本(arm7、arm9)和同一内核的不同厂家的处理器(飞利浦和三星的 arm7)差别还是很大,所以有可能要针对每一个处理器分别在芯片级移植内核。
架构无关操作:
当我们已经拥有针对该CPU的移植好的内核后,所有的操作就不必考虑架构的问题。即使是编写设备驱动程序,由于所有移植好的内核对上层提供的接口界面一致(内存分配、中断分配、IO端口),也不必考虑底层细节问题。
驱动程序编写人员面对的多是板极开发支持,技术难度要比前面所说的芯片级支持容易的多。编写一个好的设备驱动还是需要对内核的机制有所了解的。
举个例子来看:
i386的CPU基础上,驱动开发我们调用内存分配使用kmalloc。
arm的CPU基础上,驱动开发我们调用内存分配仍使用kmalloc。
因此对于驱动开发人员,往往不必太关心kmalloc函数的实现,而对于芯片级移植,开发人员就要具体实现kmalloc函数。其实i386和arm的kmalloc实现差别还是很大的!
再看看linux内核的文件组织结构,我们发现drivers目录是和arch目录平级的。这说明驱动程序是平台无关的,在i386架构的驱动程序可以不加修改的移植到ARM架构上。虽然驱动程序可以独立于CPU的架构,可是和主板的配置相关。
举个例子:以8255并口芯片为例,该芯片作为并口扩展可以应用于任何CPU平台。i386架构中,我们的CPU是P4,而并口扩展使用8255。在ARM架构中,CPU是LH7A404(夏普的ARM9),并口扩展仍然使用8255。
如果你发现一个基于8255的并口驱动程序,恭喜你,不必再自己编写驱动了,但也不是拿过来就可以用的。这和前面所说的并不矛盾,因为P4平台的8255 的IO地址和LH7A404的IO地址不一定完全一致!如果P4平台的8255的IO地址为0X0378-0X037f,而LH7A404平台上的 8255的IO地址为0Xc0000248-0Xc000024f,则需要修改地址定义即可。这些地址是在设计主板时由电路本身决定。在i386中端口和内存分开寻址,端口使用16位地址。在ARM中端口和内存是统一编址的,使用32位地址。由于IO端口的操作已经由内核移植人员完成,所以就可以直接使用了。
阅读(1578) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~