weety 发表于 2015-10-6 23:45:00

CC-A80在lubuntu上原生编译linux内核和驱动的方法(兼容SDK)

本帖最后由 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

希望对大家有所帮助。



weety 发表于 2015-10-10 23:23:33




gen_check_code二进制工具的逆向工程C源码已经搞定,见帖子:http://cubie.cc/forum.php?mod=viewthread&tid=4488&extra=

linux_biaon 发表于 2015-10-16 15:57:04

想问下楼主,这个二进制工具有什么用

weety 发表于 2015-10-16 21:13:40

linux_biaon 发表于 2015-10-16 15:57 static/image/common/back.gif
想问下楼主,这个二进制工具有什么用

这个工具是给rusume1.bin加头的,用来回复挂起的系统,这段代码运行在芯片内部SRAM中,该工具可以计算代码长度和计算checksum值。原来给的是X86_64的二进制代码,在板子上不能运行。

weety 发表于 2015-10-16 21:13:23

linux_biaon 发表于 2015-10-16 15:57 static/image/common/back.gif
想问下楼主,这个二进制工具有什么用

这个工具是给rusume1.bin加头的,用来回复挂起的系统,这段代码运行在芯片内部SRAM中,该工具可以计算代码长度和计算checksum值。原来给的是X86_64的二进制代码,在板子上不能运行。
页: [1]
查看完整版本: CC-A80在lubuntu上原生编译linux内核和驱动的方法(兼容SDK)