rk3399 kernel
I. 拿到主板后首先需要编译uboot,kenerl内核,rootfs文件系统,并打包主板固件,进行主板固件的烧写工作。
在firefly中,源码系统 统一通过android源码管理工具repo维护在同一个 Linux-SDK 仓库中。
- 下载repo工具:
git clone https://github.com/FireflyTeam/repo.git
- 初始化repo仓库:
cd linux-sdk && ../repo/repo init --repo-url https://github.com/FireflyTeam/repo.git -u https://github.com/FireflyTeam/manifests.git -b linux-sdk -m rk3399/rk3399_linux_release.xml
下载 Linux-SDK 并同步源码:
../repo/repo sync -c
更新代码
cp .repo/repo /usr/bin/repo # 安装 repo同步工具
repo sync -c # 同步
AIO-3399C AI版
II. manifest 当我们需要切换不同的主板系统时 只需要通过配置 repo 所要拉取的 manifest
比如我们现在需要从 core-3399-jd4 切换到 AIO-3288j_ubuntu18.04 仓库时,只需要执行以下命令:cd linux-sdk/.repo/ && ln -fs manifests/rk3288/rk3288_linux_ubuntu_release.xml manifest.xml
III. branch 重要切换项目 【不同的项目,在uboot和kernel目录是对应不同的分支】
AIO-3399C AI版:
u-boot: firefly-linux/stable-4.4-rk3399
kernel: firefly-linux/stable-4.4-rk3399-linux
./build.sh aio-3399c.mk
AIO-3288J:
u-boot:firefly-linux/stable-4.4-rk3288-linux
kernel:firefly-linux/stable-4.4-rk3288-linux
IV. 编译uboot
./build.sh uboot
V. 编译kernel
修改编译参数
device/rockchip/rk3288/aio-3288j.mk
export RK_KERNEL_DEFCONFIG=firefly_linux_defconfig
# Kernel dts
export RK_KERNEL_DTS=rk3288-firefly-aio-lvds
# boot image type
export RK_BOOT_IMG=zboot.img
# rootfs image path
export RK_ROOTFS_IMG=buildroot/output/$RK_CFG_BUILDROOT/images/rootfs.$RK_ROOTFS_TYPE
export RK_ROOTFS_IMG=rootfs/ubuntu_18.04_arm64_npu_rootfs.img
生成rockdev目录下的 快捷方式 mkfirmware.sh
sudo apt-get install genext2fs
./mkfirmware.sh
根据rockdev 生成 update.img
./build.sh updateimg
【常见错误】 ubuntu18.04
' genext2fs -b 8192 -N 2048 -d /home/ubuntu/firefly/aio-3399c/device/rockchip/oem/oem_normal /home/ubuntu/firefly/aio-3399c/rockdev/oem.img sudo apt-get install git gcc-arm-linux-gnueabihf u-boot-tools device-tree-compiler mtools 安装 ARM 交叉编译工具链和编译内核相关软件包 在编译过程中出现如下错误:/bin/sh: 1: lz4c: not found 显然是lz4c没有找到,应该就是有依赖工具没有安装,通过 现象: 在 kernel 目录下执行 make menucofig 之后, 将内核重新配置之后,此时生成新的.config 文件。但是再次执行./build.sh kernel 进行编译.config 重新配置的模块无法生效。 》》》 defconfig扫盲: a. defconfig 存放的路径: b. 一些通用的内容defconfig并不会保存,怎样剔出掉这些在.config通用的内容? CONFIG_SCSI=y CONFIG_BLK_DEV_SD=y make menuconfigsudo apt-get install libncurses5-dev
#make menuconfig
(如ubuntu下的用户不能执行该命令则先执行如下命令 sudo apt-get install libncurses5-dev)【常见错误】 内核kernel编译
parted libudev-dev libusb-1.0-0-dev python-linaro-image-tools linaro-image-tools libssl-dev
autotools-dev libsigsegv2 m4 libdrm-dev curl sed make binutils build-essential gcc g++ bash
patch gzip bzip2 perl tar cpio python unzip rsync file bc wget libncurses5 libglib2.0-dev openssh-client lib32stdc++6
$ sudo apt-get install gcc-arm-linux-gnueabihf
gcc-aarch64-linux-gnu device-tree-compiler lzop libncurses5-dev
libssl1.0.0 libssl-dev
arch/arm64/boot/Makefile:36: recipe for target 'arch/arm64/boot/Image.lz4' failedsudo apt-get install liblz4-tool
安装即可,继续make -j4编译,最后得到arch/arm64/boot/Image.lz4-dtb【常见错误】 内核模块无法保存的问题
解决: 用新生成的defconfig文件覆盖,或者直接编辑使用的defconfig文件make savedefconfig && mv ./defconfig arch/arm/configs/xxx_defconfig
make xxx_defconfig
生成的.config与原xxx_defconfig有差异并解决后,引发我的对.config保存方式的疑惑。原来在arch/arm/configs/中保存的默认xxx_defconfig文件并不是一个完整的.config文件。其实执行过make xxx_defconfig后产生的.config会比原来的多近2000行配置。这些配置在执行make xxx_defconfig自动添加进去的。
对于32位arm架构: arch/arm/configs/xxx_defconfig
make ARCH=arm xxx_defconfig
对于64位arm架构: arch/arm64/configs/xxx_defconfig
make ARCH=arm64 xxx_defconfig
make savedefconfig - Save current config as ./defconfig (minimal config
内核中提供了make savedefconfig这个命令。这样做的优点相当多了就,节省空间以至于Linux内核的代码量不会太大,第二对比差异的时候好对比一些。更重要的是这个是一个正统的方式。make savedefconfig && mv ./defconfig arch/arm/configs/xxx_defconfig
配置神经网路 /dev/sg*
CONFIG_CHR_DEV_SG=y
CONFIG_CHR_DEV_SCH=y
CONFIG_SCSI_CONSTANTS=y
CONFIG_SCSI_LOGGING=y
CONFIG_SCSI_SCAN_ASYNC=y->Check the option [*] Enable loadable module support --->
-> Device Drivers --->
-> SCSI device support --->
-> <*> SCSI generic support