先前购买了一款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个舵机的运动。因此我不想做删减内核的操作,只希望编写相应驱动程序(动态加载)与应用程序来实现。
请问以上两个问题如何解决?顺便请教一下我上述设计思想是否可行?
万分感谢!