主机平台:x64 ubuntu 16.04 LTS
本文档详细介绍rk3288 bsp开发细节,涵盖源码获取,编译生成,主要改动点等内容。
方便起见,首先罗列出所参考资料的站点(以下流程原理都可在下面链接找到更专业解释):
rockchip芯片软硬件资料站点主页:
http://opensource.rock-chips.com/wiki_Main_Page
rockchip yocto资料站点主页:
http://opensource.rock-chips.com/wiki_Yocto
rk3288的bsp构建方式有三种:
rockchip维护的linux sdk包,涵盖uboot、kernel、buildroot(便于构建rootfs)、toolchain。
其中buildroot也是官方主推的bsp维护方式,采用make、pkg-config工作模式,使用简单。
独立获取rockchip的uboot、kernel,其相对于原版拥有rockchip的patch。
rockchip维护的yocto,类似buildroot但比之略微复杂,使用bitbake工作模式,相对应的,其工作方式更加灵活而强大。
本文档基于yocto的构建方式而介绍。
获取yocto源码
$cd /opt/
$mkdir rk-yocto-bsp
$cd rk-yocto-bsp
初始化并同步sdk源码树
$repo init --repo-url=https://github.com/rockchip-linux/repo -u https://github.com/rockchip-linux/manifests -b yocto -m pyro.xml
$repo sync
(注意加粗部分,表示获取最新稳定版,否则将获取”master”主线版本)
构建宿主机环境(这些包由官方文档注明)
$sudo apt-get install fop dblatex xmlto python-git libssl-dev pv
$ sudo apt-get install gawk wget git-core diffstat unzip texinfo gcc-multilib \
build-essential chrpath socat cpio python python3 python3-pip python3-pexpect
$ sudo apt-get install libsdl1.2-dev xtermp python3-pexpect
$ sudo apt-get install make xsltproc docbook-utils fop dblatex xmlto
$ sudo apt-get install python-git
构建yocto环境(以后每次重新打开一个新的shell使用bitbake前都需要执行下面一行)
$MACHINE= firefly-rk3288 DISTRO=rk-x11 . ./setup-environment -b rk3288-x11
(注意两个点之间有空格,这一步通过执行setup-environment脚本建立yocto构建系统环境变量,其中MACHINE指定机型,DISTRO指定图形后端,rk-x11表示使用x11后端,rk-wayland使用wayland后端,rk-none使用eglfs后端,-b指定构建目录,命令执行成功将直接跳进构建目录)
修改本地化配置文件以追加自己需要的组件(修改以下行)
$vi conf/local.conf
PACKAGE_CLASSES ?= 'package_rpm package_ipk package_deb'
IMAGE_INSTALL_append = "dpkg openssh perl opkg python3-flask jsoncpp rpm bash nfs-utils"CKAGE_CLASSES中配置的'package_rpm package_ipk package_deb'指示yocto将生成组件的rpm、deb、ipk三种形式的包, IMAGE_INSTALL_append指示在镜像中安装用户指定组件,其后bitbake构建的镜像中的文件系统将包含这些软件。)
修改carmachine_git.bb文件:
$vi ../sources/meta-rockchip-extra/recipes-rk/carmachine/carmachine_git.bb
SRC_URI = " \
git://github.com/rockchip-linux/carmachine.git;branch=rk3399 \
file://0001-don-t-use-frameless-for-mainwindow.patch \
"
SRCREV = "c042da6827a0159a328e9a4041777af7d0f4466d"
(注意,这里branch本来是master,虽然是rk3288的版本但这里还是要配成rk3399分支,远程站点只有master和rk3399两个分支,而默认的master站点找不到SRCREV对应的版本,rk3399恰好有,可能是分支调整导致的bug)
重点内容修改rockchip-mali_rk.bb文件(重要陷井):
$vi ../sources/meta-rockchip/recipes-graphics/libgles/rockchip-mali_rk.bb
MALI_X11_rk3288 = "libmali-midgard-t76x-r14p0-r1p0-x11-gbm.so"
MALI_WAYLAND_rk3288 = "libmali-midgard-t76x-r14p0-r1p0-wayland-gbm.so "
MALI_GBM_rk3288 = "libmali-midgard-t76x-r14p0-r1p0-gbm.so "
(这里选择r1p0的mali gpu硬件版本,由于手上板子如此,可能后续会根据实际板子选择r0p0。另外,对于x11版本需要选择-x11-gbm.so结尾的否则会出现gbm引用的bug)
下面可以开始编译qt5-image
$bitbake qt5-image
完成后在rk3288-x11/tmp/deploy/images/ firefly-rk3288 /目录下会出现以下包:
idbloader.img
qt5-image-firefly-rk3288-boot.img
qt5-image-firefly-rk3288.ext4
qt5-image-firefly-rk3288-gpt.img
其中qt5-image-firefly-rk3288-gpt.img是包含分区信息的整合镜像,可以直接烧写到sd/emmc 0位置处,其他三个为独立镜像,不含分区信息,需要单独烧写到相应分区。
qt5-image-firefly-rk3288-gpt.img烧写:
eMMC:
$./flash_tool.sh -c rk3288 -p system -i rk3288-x11/tmp/deploy/images/firefly-rk3288/qt5-image-firefly-rk3288-gpt.img
* SD-Card:*
$./flash_tool.sh -c rk3288 -d /dev/sdc -p system -i rk3288-x11/tmp/deploy/images/ firefly-rk3288/ qt5-image-firefly-rk3288-gpt.img
(注意,sdc指定为真实的sd卡,否则可能会误破环本地磁盘结构)
独立烧写(仅列出sd卡方式,emmc方式参见windows工具):
sudo dd if=idbloader.img of=/dev/sdc seek=64
sudo dd if=qt5-image-firefly-rk3288-boot.img of=/dev/sdc seek=32768
sudo dd if= image-firefly-rk3288.ext4 of=/dev/sdc seek=262144
编译交叉编译环境
$scp /sbin/ldconfig /opt/rk-yocto-bsp/rk-3288-x11/tmp/work/cortexa17hf-neon-vfpv4-rk-linux-gnueabi/meta-toolchain-qt5/1.0-r0/recipe-sysroot-native/sbin/
$bitbake meta-toolchain-qt5