最近买了个orangepizero版本的,用的是全志的H2芯片。看起来有短小精悍。不过网上资料较少。看了下好多东西都是参考别人的弄过来的。所以看起来代码有一些混乱。但是如果做高层开发。这些都不是问题。因为高层开发不需要了解底层硬件的区别。只当做是一台电脑就行。不过遗憾的是,我是做驱动开发。
话不多说,详细的编译过程,可以参考官方给的文档。这里对里面的个别细节做展开分析。
一、代码的下载过程
第一步是通过git 下载到这个类似工程管理器的project,下载后运行一个脚本,通过用户选择脚本里面的开发板名字,进一步下载工程文件。没什么难度。但是有两个细节很郁闷。
1.github在墙内下载速度非常慢,经常断开,且git不能断点续传,兜兜转转,总是失败。
orangepi zero有很多个版本,有zero,zero plus,plus2.第一次搞,下载错了版本,不能运行的。也是郁闷。标题也不醒目。
git下来后,就是对应的工程代码了,我下载的是这个
“OrangePiH2_mainline ”
下面,重点对这个这个目录里面的细节展开。
二、“OrangePiH2_mainline ”目录结构
从名字就能知道这些目录的作用了
目录
作用
build.sh
生成img的脚本
external
生成rootfs需要用到里面的文件
kernel
内核源码工程
output
编译生成的东西,会存放在这里
scripts
orangpi 官方自己写的一些方便生成工程的脚本
toolchain
编译所需的工具链
uboot
uboot源码目录
三、build.sh
这是一个软连接
使用软连接的好处,
1.方便用户调用。
2.执行的时候,脚本可以知道工程的根目录在哪里。因为软链接需要放在根目录里面,才能正常执行。
build.sh文件解读
大致流程
1.判断运行是否是root用户
2.运行前环境检查
3.给出图形化界面,让用户选择作业内容(如生成kernel等)
- 判断是否是root用户
包含其他的脚本文件。里面的函数就在这些脚本文件里面
环境检查
这里要说下这个,对于第一次编译,一定要环境检查,因为编译需要安装很多额外的软件包(通过apt),需要从github里面检查是否有代码更新。
如果已经成功编译生成了img文件了,可以把这个prepare_host函数给注释掉。因为每次编译都去检查环境,很耗时,还要联网,网络环境不好,还会exit。
这个函数在lib/general.sh这个脚本里面定义。
作业选择
脚本后面的代码,都是作业选择的代码,不贴出来了,都是一些case语句。
对于我的开发板,我是对应这条case
比较重要的是两个参数,ARCH变量和CHIP变量被赋值了
这两个参数很重要,在make的时候会用到。
如下代码是公共的作业内容选择对话脚本。
可以看到不同的作业,对用不同的函数,封装的还是挺不错的。
四、kernel编译过程
上面选择编译kernel后,会调用compile_kernel函数。这个函数的定义在“lib/compilation.sh”脚本中
找到compile_kernel函数
函数对不同平台应用不同的case语句,我的是
其主要步骤有
1.生成.config文件
2.make kernel的img
生成.config文件
生成.config的方式为make xxx_defconfig的方式,不是make menuconfig的方式,切记。不过高级用户也能改成menuconfig的方式。
make -C $LINUX ARCH="${ARCH}" CROSS_COMPILE=$TOOLS "${CHIP}"smp_defconfig V=1
我在这一句的后面加上了V=1,这样可以在执行的时候,看到更详细的过程。这个命令,带了很多之前赋值的变量。
"${CHIP}"smp_defconfig 展开后对应的是目录“kernel/arch/arm/configs
”,里面的文件“sun8iw7p1smp_defconfig”
make kernel
make -C $LINUX ARCH="${ARCH}" CROSS_COMPILE=$TOOLS -j${CORES}
综合上述,如果要修改编译的内容。需要修改un8iw7p1smp_defconfig文件,将对应的编译开关打开。