当前位置: 代码迷 >> 驱动开发 >> 编写ARM上Linux驱动程序出错,百分相送
  详细解决方案

编写ARM上Linux驱动程序出错,百分相送

热度:40   发布时间:2016-04-28 11:12:10.0
编写ARM上Linux驱动程序出错,百分相送请教高手
请教大家:  
我在Intel   PXA270   ARM开发板上/usr/local和/root/code/两个地方放了开发板附带的交错编译工具,在/toxp/linux-2.6.9目录放了开发板附带的Linux内核文件,  

我自己编写了一个空的驱动测试程序,用以下命令行编译:  
/usr/local/arm-linux/bin/arm-linux-gcc   -D__KERNEL__   -DMOUDULE   -DDEBUG_PRINTK   -static   -I   /root/code/arm-linux/arm-linux/include/linux   -Wall   -c   driver.c  
生成testm.o文件拷到ARM板上用insmod   testm.o加载,提示错误如下:  

[[email protected]   /]#insmod   testm.o  
Using   testm.o  
No   module   found   in   object  
insmod:   cannot   insert   `testm.o ':   Invalid   module   format   (-1):   Exec   format   error  
[[email protected]   /]#  


我又用命令行:  
/usr/local/arm-linux/bin/arm-linux-gcc   -D__KERNEL__   -DMOUDULE   -DDEBUG_PRINTK   -static   -I   /toxp/linux-2.6.9/include   -Wall   -c   driver.c  
生成testm.o文件拷到ARM板上用insmod   testm.o加载,提示同样的错误。  


我用file   testm.o命令查看testm.o的信息,屏幕显示:  
testm.o:   ELF   32-bit   LSB   relocatable,   ARM,   version   1   (ARM),   not   stripped  
用uname   -a在PXA270板上查看LINUX版本显示:Linux   2.6.9-270   SLI。  

我想请问:  
是否我用的gcc编译命令行有错误?   --是否还要加什么参数?或应该加什么库文件编译?  

全部程序代码如下:

#ifndef   __KERNEL__
#   define   __KERNEL__
#endif

#ifndef   MODULE
#   define   MODULE
#endif

#include <linux/init.h>
#include <linux/config.h>
#include <linux/kernel.h>
#include <linux/module.h>
/*#ifdef   CONFIG_SMP
#define   __SMP__
#endif*/
MODULE_LICENSE( "GPL ");

static   int   hello_init(void)
  {
    printk(KERN_ALERT   "Hello,world\n ");
    return   0;
  }

static   void   hello_exit(void)
  {
    printk(KERN_ALERT   "Goodbye,cruel   world\n ");
  }

module_init(hello_init);
module_exit(hello_exit);

------解决方案--------------------
感觉gcc编译命令行没问题
我一般都是用:
gcc -D__KERNEL__ -DMODULE -DLINUX -I /usr/local/src/linux2.4/include -c -o hello.o hello.c

试试在hello_init前加__init
hello_exit前加__exit
------解决方案--------------------
要不你就换个2.4的内核,要不你就按照2.6的编译方法编译。不要弄混了。
2.6的编译方法网上找找,很多。编译出来是.ko文件,makefile也不是你命令行里那样。
------解决方案--------------------
a.在Makefile中找到下面这一行:
SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
-e s/arm.*/arm/ -e s/sa110/arm/ \
-e s/s390x/s390/ -e s/parisc64/parisc/ \
-e s/ppc64/powerpc/ )
前面加#,将它注销掉。
b.找到下列行:
ARCH ?=$(SUBARCH)
CROSS_COMPILE ?=
改成:
ARCH := arm
CROSS_COMPILE =/usr/local/arm-linux/bin/arm-linux-gcc


也可以用别的办法,方法较多。
------解决方案--------------------
如果是2.6的内核,那你就看LINUX设备驱动第3版

那上边有比较完备的makefile

2.4-> 2.6在驱动上做了很大改动,2.4的驱动基本用不了。