|
本帖最后由 weety 于 2015-10-6 23:55 编辑
CC-A80运行的lubuntu上的gcc是4.8.4版本的hardfloat ABI编译器,同A80 SDK的4.6.3版本softfp ABI编译器不兼容,直接使用lubuntu上自带的gcc编译器编译的驱动无法加载。因此我根据SDK的编译器版本及配置重新编译了ARM ubuntu版本的gcc编译器,可以安装到lubuntu上来编译kernel和驱动。
ARM版本的gcc-4.6.3编译器可以在我的百度云下载:http://pan.baidu.com/s/1sj5QAXv
CC-A80内核源码下载路径:https://github.com/cubieboard/CC-A80-kernel-source.git
内核配置文件下载路径:https://github.com/cubieboard/CC ... ga/kernel_defconfig
内核编译脚本下载路径:http://pan.baidu.com/s/1kT4aYnt
需要根据实际路径进行修改。
中间会出现编译错误,可以参考http://www.cubie.cc/forum.php?mod=viewthread&tid=4323#lastpost,这篇帖子中的方法进行处理,主要是解决方法2:
2.arch/arm/mach-sunxi/pm/standby/gen_check_code是X86的二进制执行文件无法在ARM下运行,按Makefile的指令在X86的机上运行后将生成的文件拷到CC-A80对应的文件上,然后注释掉对应的Makefile指令。
如果不涉及到芯片机密信息,全志能够提供gen_check_code工具的源码就更好了,不然总是有个疙瘩在那里。
内核编译采用上面提供的脚本进行,完成了内核编译安装后就可以进行内核模块开发了。
下面给个helloworld模块的例子供大家参考:
helloworld.c源码- #include<linux/init.h>
- #include<linux/module.h>
- MODULE_LICENSE("DUAL BSD/GPL");
- static int hello_init(void)
- {
- printk(KERN_EMERG "Hello world enter\n");
- return 0;
- }
- static void hello_exit(void)
- {
- printk(KERN_EMERG "Hello World exit\n");
- }
- module_init(hello_init);
- module_exit(hello_exit);
复制代码 Makefile文件内容- CC := arm-linux-gnueabi-gcc
- ifneq ($(KERNELRELEASE),)
- obj-m := helloworld.o
- else
- #KERNELDIR :=/lib/modules/$(shell uname -r)/build
- KERNELDIR :=/home/linaro/work/git/CC-A80-kernel-source
- PWD := $(shell pwd)
- all:
- $(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) modules
- endif
- clean:
- rm -f *.o *.ko *.mod.c .hello*
复制代码 内核源码路径可以修改,当然也可以直接安装到系统lib目录下,覆盖原系统的文件,这样可以使用KERNELDIR :=/lib/modules/$(shell uname -r)/build来找到内核源码路径。
执行make命令后得到helloworld.ko文件,使用insmod加载模块执行,使用dmesg命令可以看到helloworld模块加载的打印信息。
以上所有命令编译环境如下:
1.系统Ubuntu-linaro-desktop(Linaro-v1.0) (ARM)
2.工具链arm-linux-gnueabi-
3.GCC版本GCC-4.6.3
希望对大家有所帮助。
|
|