rk3399 kernel


原文链接: rk3399 kernel

Linux开发 — Firefly Wiki

I. 拿到主板后首先需要编译uboot,kenerl内核,rootfs文件系统,并打包主板固件,进行主板固件的烧写工作。

在firefly中,源码系统 统一通过android源码管理工具repo维护在同一个 Linux-SDK 仓库中。

  1. 下载repo工具:git clone https://github.com/FireflyTeam/repo.git
  2. 初始化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
  3. 下载 Linux-SDK 并同步源码: ../repo/repo sync -c

  4. 更新代码
    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
  1. 生成rockdev目录下的 快捷方式 mkfirmware.sh
    sudo apt-get install genext2fs
    ./mkfirmware.sh

  2. 根据rockdev 生成 update.img

./build.sh updateimg

【常见错误】 ubuntu18.04

':0:12: fatal error: curses.h: No such file or directory'
sudo apt-get install libncurses5-dev
#make menuconfig
      (如ubuntu下的用户不能执行该命令则先执行如下命令 sudo apt-get install libncurses5-dev)

genext2fs -b 8192 -N 2048 -d /home/ubuntu/firefly/aio-3399c/device/rockchip/oem/oem_normal /home/ubuntu/firefly/aio-3399c/rockdev/oem.img

【常见错误】 内核kernel编译

sudo apt-get install git gcc-arm-linux-gnueabihf u-boot-tools device-tree-compiler mtools
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

安装 ARM 交叉编译工具链和编译内核相关软件包
$ sudo apt-get install gcc-arm-linux-gnueabihf
gcc-aarch64-linux-gnu device-tree-compiler lzop libncurses5-dev
libssl1.0.0 libssl-dev

在编译过程中出现如下错误:/bin/sh: 1: lz4c: not found
arch/arm64/boot/Makefile:36: recipe for target 'arch/arm64/boot/Image.lz4' failed

显然是lz4c没有找到,应该就是有依赖工具没有安装,通过sudo apt-get install liblz4-tool 安装即可,继续make -j4编译,最后得到arch/arm64/boot/Image.lz4-dtb

【常见错误】 内核模块无法保存的问题

现象: 在 kernel 目录下执行 make menucofig 之后, 将内核重新配置之后,此时生成新的.config 文件。但是再次执行./build.sh kernel 进行编译.config 重新配置的模块无法生效。
解决: 用新生成的defconfig文件覆盖,或者直接编辑使用的defconfig文件

  1. 执行 make menuconfig
  2. 生成 defconfig 文件make savedefconfig && mv ./defconfig arch/arm/configs/xxx_defconfig
  3. 用新的defconfig进行编译

》》》 defconfig扫盲:
make xxx_defconfig生成的.config与原xxx_defconfig有差异并解决后,引发我的对.config保存方式的疑惑。原来在arch/arm/configs/中保存的默认xxx_defconfig文件并不是一个完整的.config文件。其实执行过make xxx_defconfig后产生的.config会比原来的多近2000行配置。这些配置在执行make xxx_defconfig自动添加进去的。

a. 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

b. 一些通用的内容defconfig并不会保存,怎样剔出掉这些在.config通用的内容?
make savedefconfig   - Save current config as ./defconfig (minimal config
内核中提供了make savedefconfig这个命令。这样做的优点相当多了就,节省空间以至于Linux内核的代码量不会太大,第二对比差异的时候好对比一些。更重要的是这个是一个正统的方式。

make savedefconfig && mv ./defconfig arch/arm/configs/xxx_defconfig

配置神经网路 /dev/sg*

CONFIG_SCSI=y

CONFIG_BLK_DEV_SD=y
CONFIG_CHR_DEV_SG=y
CONFIG_CHR_DEV_SCH=y
CONFIG_SCSI_CONSTANTS=y
CONFIG_SCSI_LOGGING=y
CONFIG_SCSI_SCAN_ASYNC=y

make menuconfig

->Check the option [*] Enable loadable module support --->
     -> Device Drivers --->
        -> SCSI device support --->
        -> <*> SCSI generic support
`