linux驱动移植经验总结
来源:互联网 发布:java data原理图 编辑:程序博客网 时间:2024/05/17 22:56
最近刚开始做驱动移植,犯了好多错误,现在总结一下,也算一点经验了。
一、 移植驱动前先弄清楚四个平台的性质:原宿主机平台、原目标机平台、现宿主机平台、现目标机平台。
原宿主机平台、原目标机平台:弄清楚是大端还是小端,这两个平台决定了原来的交叉编译链。一般情况下,做移植之前的驱动在原宿主机环境下是可以编译通过的,在原目标机平台下是可以顺利运行的。
现宿主机平台、 现目标机平台:弄清楚是大端还是小端,这两个平台决定了现在的交叉编译链。一般情况下,做移植之前的驱动在现宿主机环境下是不能编译通过的,在现目标机平台下是不能顺利运行的。
一般情况下,如果需要修改大小端,在应用程序里面修改时最容易修改的,应用程序应该有总开关,可以打开和关闭。但是如果有特殊要求,则需要修改驱动程序的寄存器来配置大小端。这里大概介绍一下,X86平台一般是小端,arm平台有大端,但更常用的是小端,powerpc平台的常用的是大端,也有小端的情况。
二、在做内存映射的时候需要注意平台CPU的编制方式。
例如,X86平台的驱动移植到PPC平台时,内存映射机制不同。
X86:独立编址。
PowerPC:统一编址。
应用程序代码:
#ifdef POWERPC
offset = ioctl申请来的内存地址(物理地址)的起始地址
fd = 打开文件为 \"/dev/mem\"
#else
offset = 寄存器的物理起始地址;
fd = 打开文件为 \"/dev/wwenc0\"
#endif
mmap(NULL,Size,PROT_READ|PROT_WRITE,MAP_SHARED,fd,offset);
/*
* 此处涉及平台问题.X86和PPC.前者是独立编址,后者是统一编址.
* 独立编址 : 把外设与内存分开编址.如X86.
* 统一编址 : 把外设和内存集中起来统一编址.如PPC.
* 此处,fd的值不同.
* X86 : fd 打开文件为 \"/dev/mem\"
* PPC : fd 打开文件为 \"/dev/wwenc0\"
* 并且,offset的值也不同.
* X86 : offset = ioctl申请来的内存地址(物理地址)的起始地址.
* PPC : offset = 0x3000.或0x4000.
* 0x3000在602寄存器中未使用;0x4000为SDRAM配置寄存器的物理起始地址.
*/
映射完成后代码:
#ifdef POWERPC
close(fd_devmem);
#endif
memset(arg.u.PhyBuf.VirtAddr,0,size);
memcpy(PB, &arg.u.PhyBuf,sizeof(*PB));
独立编址的X86把内存和外设分开编址,所以不能使用内存的物理地址来映射,因为申请来的物理地址是内存的,并非外设的。而PPC却可以,因为它是统一编址,部分内存和外设,全部都当做内存地址来使用。
独立编址区分I/O内存和I/O端口,统一编址不区分.
- linux驱动移植经验总结
- linux RTC驱动移植
- linux-wireless驱动移植
- Linux移植RT73驱动
- linux驱动移植笔记
- linux 蓝牙驱动移植
- linux I2C驱动移植
- 【ARM】Linux驱动移植
- Linux跨平台移植经验总结(前言)
- LINUX移植——LED驱动移植
- linux系统移植之LCD驱动移植
- Linux 2.6 内核驱动移植
- Linux 2.6 内核驱动移植
- linux下USB驱动移植
- linux下移植RT3070 驱动
- Linux下触摸屏驱动移植
- Linux下音频设备驱动移植
- linux驱动摸索 --tslib移植
- 独立编址,统一编址,IO端口,IO内存,冯·诺伊曼,哈佛结构
- struct vm_area_struct
- pci设备probe函数的调用时机
- 自旋锁(spinlock)
- copy_to_user,copy_from_user,get_user,put_user函数比较
- linux驱动移植经验总结
- 【引用】Linux-2.6.32.2内核在mini2440上的移植(一)---构建自主开发环境
- 【引用】Linux-2.6.32.2内核在mini2440上的移植(二)---yaffs2文件系统移植
- 【引用】Linux-2.6.32.2内核在mini2440上的移植(三)---DM9000网卡驱动移植
- 【引用】Linux-2.6.32.2内核在mini2440上的移植(四)---根文件系统制作(1)
- 【引用】Linux-2.6.32.2内核在mini2440上的移植(五)---激活RTC驱动
- 【引用】Linux-2.6.32.2内核在mini2440上的移植(六)---添加LCD背光驱动
- 【引用】Linux-2.6.32.2内核在mini2440上的移植(七)---LCD驱动移植
- 【引用】Linux-2.6.32.2内核在mini2440上的移植(八)---添加ADC驱动