设备驱动程序和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端口的操作已经由内核移植人员完成,所以就可以直接使用了。 市场决定一切!!! :lol: 咋就没关系,看你用的是啥设备了 :roll: 如果我是把linux/driver里面的东西往别的系统移植呢?
而且在其它系统上,比如pSOS,cpu为philips的PNX系列DSP
>架构相关操作:
>IO端口的操作、内存分配的操作、DMA的基本操作、中断的初始化、系统时钟,这些操作和具
>体的CPU构架有很大的关系。
这些内容已在pSOS系统中实现,
有可能把这些操作独立抽象出来,在不同系统中移植linux的驱动部分吗?
没关系指的是驱动程序开发
不要把驱动程序和内核然到一起了。内核当然和架构有很大关系,IO,中断,DMA,内存都是在移植内核是考虑的问题。
驱动程序是基于移植好的内核的,当然和架构无关! to comker:
我指的架构无关是硬件平台,不是软件平台。
你所说的其他系统是不能直接使用Linux驱动的,就像你不能把windows下的驱动拿到linux下用。 to comker:
我指的架构无关是硬件平台,不是软件平台。
我的意图也就是想把linux的驱动部分依赖于linux软件平台的部分独立抽象出来,
从而可以容易的把代码移植到其它系统上,也就是linux/drivers的部分移植.
毕竟嵌入式做得最多的方面也就是驱动,
而并不是每一个嵌入式上跑的都是linux操作系统.
页:
[1]