主题 : 有关驱动模块加载的问题 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 64700
精华: 0
发帖: 7
金钱: 35 两
威望: 7 点
综合积分: 14 分
注册时间: 2012-03-08
最后登录: 2012-03-27
楼主  发表于: 2012-03-08 19:55

 有关驱动模块加载的问题

先前购买了一款mini2440配W35显示屏的开发板,在学习驱动开发方面遇到一点问题,特此请教,谢谢。
配置信息:
开发板上的bootloader、内核以及根文件系统均是采用出场设置,内核为2.6.32.2版本。
虚拟机使用VMware安装fedora9,版本信息
Linux Dakk 2.6.25-14.fc9.i686 #1 SMP Thu May 1 06:28:41 EDT 2008 i686 i686 i386 GNU/Linux

问题1:参考网上的视频我编写了hello.c驱动程序
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int __init hello_init(void)  
{  
    printk(KERN_ALERT "hello module!\n");  
    return 0;  
}  
static void __exit hello_exit(void)  
{  
    printk(KERN_ALERT "bye module!\n");  
}  
  
module_init(hello_init);  
module_exit(hello_exit);

Makefile文件:
ifneq ($(KERNELRELEASE), )
obj-m := hello.o
else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
         $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif
此时可以正常的执行make生成hello.ko,但是当下载到开发板中执行insmod hello.ko,会报告
[root@FriendlyARM /text]# insmod hello.ko
insmod: cannot insert 'hello.ko': invalid module format

问题2:
查阅一些资料后我发现可能是pc上linux内核和开发板内核不匹配造成的,因此我将开发板配套光盘中/linux目录下linux-2.6.32.2-mini2440-20110413.tar.gz文件解压并且将解压后的文件夹复制到VMware虚拟机中/lib/modules目录下,然后将相应的Makefile文件指向这个目录
ifneq ($(KERNELRELEASE), )
obj-m := hello.o
else
KERNELDIR ?= /lib/modules/linux-2.6.32.2-mini2440-20110413/linux-2.6.32.2
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif
但是在执行make指令时会报错
[root@Dakk 1]# make
make -C /lib/modules/linux-2.6.32.2 M=/root/text/1 modules
make[1]: Entering directory `/lib/modules/linux-2.6.32.2'
  ERROR: Kernel configuration is invalid.
         include/linux/autoconf.h or include/config/auto.conf are missing.
         Run 'make oldconfig && make prepare' on kernel src to fix it.

  WARNING: Symbol version dump /lib/modules/linux-2.6.32.2/Module.symvers
           is missing; modules will have no dependencies and modversions.
  Building modules, stage 2.
/lib/modules/linux-2.6.32.2/scripts/Makefile.modpost:42: include/config/auto.conf: 没有那个文件或目录
make[2]: *** 没有规则可以创建目标“include/config/auto.conf”。 停止。
make[1]: *** [modules] 错误 2
make[1]: Leaving directory `/lib/modules/linux-2.6.32.2'
make: *** [default] 错误 2

以上两个问题困扰我良久。我的最终目标是利用板上的GPIO接口同时输出10路不同频率的pwm波,以此来控制10个舵机的运动。因此我不想做删减内核的操作,只希望编写相应驱动程序(动态加载)与应用程序来实现。
请问以上两个问题如何解决?顺便请教一下我上述设计思想是否可行?
万分感谢!
级别: 新手上路
UID: 64700
精华: 0
发帖: 7
金钱: 35 两
威望: 7 点
综合积分: 14 分
注册时间: 2012-03-08
最后登录: 2012-03-27
1楼  发表于: 2012-03-08 20:20
另外问一下将开发板中/opt/FriendlyARM/mini2440/3g/linux-2.6.32.2
文件夹整个拷贝到pc的linux虚拟机下,重新指向Makefile文件是否可行?
级别: 新手上路
UID: 64700
精华: 0
发帖: 7
金钱: 35 两
威望: 7 点
综合积分: 14 分
注册时间: 2012-03-08
最后登录: 2012-03-27
2楼  发表于: 2012-03-08 22:54
木有人帮帮忙么。。?虽然问题弱爆了的样子。。
在线等。。码字辛苦求帮助。。
级别: 侠客
UID: 63650
精华: 0
发帖: 64
金钱: 330 两
威望: 66 点
综合积分: 128 分
注册时间: 2012-02-22
最后登录: 2016-12-03
3楼  发表于: 2012-03-09 09:50
通常的情况下:
先安装友善提供的arm交叉编译环境(arm-linux-gcc),配置好环境变量,展开友善提供的内核源码,尝试编译内核。如果可以正常编译内核,你再把hello.c加到内核源码树中执行编译即可。
级别: 新手上路
UID: 64700
精华: 0
发帖: 7
金钱: 35 两
威望: 7 点
综合积分: 14 分
注册时间: 2012-03-08
最后登录: 2012-03-27
4楼  发表于: 2012-03-09 11:21

 回 3楼(liupeng_ch) 的帖子

谢谢~不过这样的话岂不是每次更新都需要编译一次内核?很耗费时间的吧?可不可以动态加载?
级别: 侠客
UID: 63650
精华: 0
发帖: 64
金钱: 330 两
威望: 66 点
综合积分: 128 分
注册时间: 2012-02-22
最后登录: 2016-12-03
5楼  发表于: 2012-03-09 13:44
内核编译一次即可,在make  menuconfig中设定hello为M属性,再执行make module就可以单独编译hello.c了。
级别: 新手上路
UID: 64700
精华: 0
发帖: 7
金钱: 35 两
威望: 7 点
综合积分: 14 分
注册时间: 2012-03-08
最后登录: 2012-03-27
6楼  发表于: 2012-03-09 15:44

 回 5楼(liupeng_ch) 的帖子

多谢多谢!
级别: 新手上路
UID: 111900
精华: 0
发帖: 9
金钱: 45 两
威望: 9 点
综合积分: 18 分
注册时间: 2015-01-10
最后登录: 2015-01-31
7楼  发表于: 2015-01-19 11:52
楼主,我也遇到了你说的问题2,请问怎么解决的呢?
级别: 新手上路
UID: 111900
精华: 0
发帖: 9
金钱: 45 两
威望: 9 点
综合积分: 18 分
注册时间: 2015-01-10
最后登录: 2015-01-31
8楼  发表于: 2015-01-21 12:03
解决了。
参照
通常的情况下:
先安装友善提供的arm交叉编译环境(arm-linux-gcc),配置好环境变量,展开友善提供的内核源码,尝试编译内核。如果可以正常编译内核,你再把hello.c加到内核源码树中执行编译即可。

但是我自己的应用程序不晓得怎么烧写。