本文档主机操作系统为 Ubuntu12.04 64 位,gcc-arm-linux-gnueabi 版本为 4.6
一 交叉编译环境搭建
$sudo apt-get update
$sudo apt-get upgrade
$sudo apt-get install ia32-libs
$sudo apt-get install ncurses-dev
$sudo apt-get install build-essential git u-boot-tools
$sudo apt-get install texinfo texlive ccache zlib1g-dev gawk bison flex gettext uuid-dev
$sudo apt-get install build-essential u-boot-tools uboot-mkimage
$sudo apt-get install binutils-arm-linux-gnueabihf gcc-arm-linux-gnueabi
$sudo apt-get install gcc-arm-linux-gnueabihf cpp-arm-linux-gnueabihf
$sudo apt-get install libusb-1.0-0 libusb-1.0-0-dev
$sudo apt-get install git wget fakeroot kernel-package zlib1g-dev libncurses5-dev
二 .获取内核源码
使用 Cubieboard1,Cubieboard2,Cubietruck:
$git clone https://github.com/cubieboard/linux-sdk-kernel-source linux-sunxi
获取内核配置 kernel_config
$git clone https://github.com/cubieboard/linux-sdk-card-products products
三. 编译
3.1.编译内核自带的驱动
以 ct-linaro-server 的为例
$cp products/ct/ct-linaro-server/kernel_defconfig linux-sunxi/arch/arm/configs/
$cd linux-sunxi/
$make mrproper
$make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- kernel_defconfig
$make ARCH=arm menuconfig
选择要编译的驱动
$make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j4 uImage
编译内核吗没报错,则进入到需要的编译模块 如。
$ cd drives/spi/
$ make -c /work/sdk/linux-sunxi M='pwd' modules ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf
-C 后面使用内核源码目录 linux-sunxi 的绝对路径
编译生 spi-sun7i.ko,spidev.ko。当然这两个驱动在 kernel_defconfig 被指定为“M”模块
注意:
不要用 gcc-arm-linux-gnueabihf 4.8 版本编译的内核 ,使用命令:arm-linux-gnueabihf-gcc
-v 查看版本
$cp products/ct/ct-linaro-server/kernel_defconfig linux-sunxi/arch/arm/configs/
$cd linux-sunxi/
$make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- kernel_defconfig
$make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j4 uImage
编译添加的驱动
$cp products/ct/ct-linaro-server/kernel_defconfig linux-sunxi/arch/arm/configs/
$cd linux-sunxi/
$make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- kernel_defconfig
$make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j4 uImage
也需要编译成功编译内核,才可以开始编译自己要添加进去的驱动
假设要编译的驱动为 hello.c ,内容为:
#include <linux/init.h>
#include <linux/module.h>
static int hello_init(void)
{
printk( "Hello, world/n");
return 0;
}
static void hello_exit(void)
{
printk( "Goodbye, world/n");
}
MODULE_LICENSE("GPL");
module_init(hello_init);
module_exit(hello_exit);
在同目录下,创建名为 Makefile 文件,内容如下:
ifneq ($(KERNELRELEASE),)
obj-m:=hello.o
else
KERNELDIR:=/work/sdk/linux-sunxi
PWD:=$(shell pwd)
default:
$(MAKE) ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -C $(KERNELDIR) M=$
(PWD) modules
clean:
rm -rf *.o *.mod.c *.mod.o *.ko .*.cmd modules.order Module.symvers .tmp_versions
endif
注意:修改 KERNELDIR:= 后面应修改成自己的内核源码目录路径。obj-m:= 后面应为驱动名
字,后缀.o 。 $(MAKE) 前面为 Tab 缩进。
$make
生成文件如下
hello.ko