Orange Pi内核编译
1.配置交叉编译器:
(1)解包gcc-linaro-arm-linux-gnueabihf-4.7-2013.03-20130313_linux.tar.bz2
tar -jxvf gcc-linaro-arm-linux-gnueabihf-4.7-2013.03-20130313_linux.tar.bz2
(2)将解压后的目录名改名为arm-gcc //为了容易记,容易写(也可以不改,但如果不改,下面配置环境变量时记得要写正确路径)
(3)配置(增加)环境变量:
sudo vim /etc/bash.bashrc
增加语句:
export PATH=/arm-gcc所在目录/arm-gcc/bin:$PATH
(保存退出后,注消系统后环境变量生效)
(重登系统后,在终端就可以直接使用arm-linux-gnueabihf-*来编译)
2.内核编译:
(1)进入orangepi_sdk/source/linux-3.4.112内核源码目录
注意:
uboot,linux内核都是可以支持多种CPU架构,一个CPU架构下又有多种SOC,一个SOC又可以做成多种方案;所以我们编译前都需要指定编译哪种架构,哪种SOC,哪种方案。
linux内核里的配置项非常多,厂家一般都会提供一些默认的配置。配置文件在CPU架构目录下的configs目录。
我们可用的配置在arch/arm/configs:
sun8iw7p1smp_android_defconfig sun8iw7p1smp_linux_defconfig
sun8iw7p1smp_android_karaok_defconfig sun8iw7p1smp_min_defconfig
sun8iw7p1smp_android_secure_defconfig sun8iw7p1smp_secure_defconfig
sun8iw7p1smp_defconfig
使用厂商提供的默认配置:
可以把xxx_defconfig直接复制成源码根目录下的.config
也可以:make xxx_defconfig来生成.config文件
(2)编译生成.config文件:
make sun8iw7p1smp_android_defconfig ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
(注意:以后只要在linux里打"make"都需指定ARCH和CROSS_COMPILE)
(3)配置内核:
make menuconfig ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
出现界面后(按空格键选上或取消选中项):
[*] Enable loadable module support --->
[*] Forced module unloading
[ ] Module versioning support
[ ] Source checksum for all modules
Device Drivers --->
<*> Multimedia support --->
[*] Video capture adapters --->
[*] V4L USB devices --->
<*> USB Video Class (UVC)
General setup --->
[ ] Initial RAM filesystem and RAM disk (initramfs/initrd) support
CPU Power Management --->
CPU Frequency scaling --->
[ ] CPU Frequency scaling
(4)在drivers/base/firmware_class.c里写上包含头文件<linux/genhd.h> //不然会出错(原因是那源文件里没有包含"kobj_to_dev"的头文件)
(5)编译内核(编译完成后,在arch/arm/boot/uImage会生成编译出来的内核镜像):
make -j4 uImage ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- //-j4为使用4线程进行编译
(6)把板上sd卡接上pc,把编译出来的内核镜像放到卡的第一个分区(即fat分区),也可以放到第二个分区(需注意命令)
(7)把sd卡重放到板上后,即可读出来到内存来启动
(8)读取分区内容:
fatload mmc 0:1 0x43000000 /script.bin //内核用的配置文件(如果sd卡为ext4格式,则用ext4load)
fatload mmc 0:1 0x42000000 /uImage //内核镜像(如果sd卡为ext4格式,则用ext4load)
(9)启动内核:
bootm 0x42000000
如果出现以下错误:
Error: unrecognized/unsupported machine ID (r1 = 0x00000000).
Available machine support:
ID (hex) NAME
00001029 sun8i
Please check your kernel config and/or bootloader.
修正方法:设置uboot的环境变量"setenv machid 0x1029",保存再重新启动内核即可
(启动后,只要有一堆的东西输出即是正常的了)
(10)如果想要开发板开机后自动引导内核,可以修改bootcmd环境变量来完成:
setenv bootcmd "fatload mmc 0:1 0x43000000 /script.bin; fatload mmc 0:1 0x42000000 /uImage; bootm 0x42000000"
saveenv //保存环境变量
注意:
因为还没有文件系统,所以在启动后,当启动到内核时会卡死,不过等写入文件系统后就没问题了(文件系统的制作在下一章)。