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端口,统一编址不区分.     

 

 

 

                                                                                                                                                                                                                                                                       

原创粉丝点击