系统定制

修改kernel

修改 kernel, 重新编译 Linux kernel image, 每张 EVB 都有对应的 dts 档案来定义其 device tree, 以 bm1688_wevb_emmc 为例, 其 DTS 档案定义在:

./build/boards/sophon/bm1688_wevb_emmc/dts_arm64/bm1688_wevb_emmc.dts

/dts-v1/;
#include "soph_base_arm64.dtsi"
//#include "soph_asic_bga.dtsi"
#include "soph_asic_emmc.dtsi"
#include "soph_default_memmap.dtsi"
...

其相对应的 linux 组态,定义在:

./build/boards/sophon/bm1688_wevb_emmc/linux/bm1688_wevb_emmc_defconfig

CONFIG_SYSVIPC=y
CONFIG_POSIX_MQUEUE=y
CONFIG_NO_HZ_IDLE=y
CONFIG_HIGH_RES_TIMERS=y
CONFIG_TASKSTATS=y
CONFIG_IKCONFIG=y
CONFIG_IKCONFIG_PROC=y
CONFIG_SCHED_AUTOGROUP=y
CONFIG_BLK_DEV_INITRD=y
CONFIG_BLK_DEV_RAM=y
...

以图形化接口修改 Kernel Config

$ menuconfig_kernel

退出后会把设定储存在: ./linux/build/bm1688_wevb_emmc/.config

$ build_kernel

完成后会生成 boot.emmc

安装Ubuntu-desktop方法

  1. 更换阿里云源,加快安装速度。

    sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
    sudo sed -i 's/ports.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
    sudo apt update
    
  2. ubuntu桌面可能跟SophonUI冲突,所以需要先关闭SophonUI,命令如下:

    sudo systemctl disable SophonHDMI.service
    
  3. 安装 ubuntu-desktop,不更换源的话要1小时以上,更换阿里云源大概30分钟左右。

    sudo apt install -y ubuntu-desktop
    
  4. 重启。

    sudo reboot
    
  5. 安装完桌面后, 如果想要暂时关闭ubuntu桌面,可以运行如下命令,重启生效。

    sudo systemctl set-default multi-user
    
  6. 想重新开启桌面,可以运行如下命令,重启生效。

    sudo systemctl set-default graphical
    

定制化软件包

您可以通过以下操作获取您所需要的特定的软件包:

  1. 从官网获取sdcard.tgz基础软件包。

  2. 您需要参考文件结构一节准备相关文件,将 sdcard.tgz 软件包复制到 $OUTPUT_DIR 目录下,其中 $OUTPUT_DIR 所代表的目录与defconfig命令指定的配置有关系,例如

    source build/cvisetup.sh
    
    defconfig bm1688_wevb_emmc
    

终端会打印如下内容:

Run defconfig function
Loaded configuration '/data/sdk_release_1.3/build/boards/sophon/bm1688_wevb_emmc/bm1688_wevb_emmc_defconfig'
No change to configuration in '.config'
Loaded configuration '.config'
No change to minimal configuration in '/data/sdk_release_1.3/build/.defconfig'
/data/sdk_release_1.3/build /data/sdk_release_1.3
/data/sdk_release_1.3

====== Environment Variables =======

PROJECT: bm1688_wevb_emmc, DDR_CFG=ddr4_3200_x16_2s
CHIP_ARCH: SOPHON, DEBUG=0
SDK VERSION: 64bit, RPC=0
ATF options: ATF_KEY_SEL=default, BL32=1
Linux source folder:linux_5.10, Uboot source folder: u-boot-2021.10
CROSS_COMPILE_PREFIX: aarch64-linux-gnu-
ENABLE_BOOTLOGO: 0
Flash layout xml: /data/sdk_release_1.3/build/boards/sophon/bm1688_wevb_emmc/partition/partition_emmc.xml
Sensor tuning bin: gcore_gc4653
Output path: /data/sdk_release_1.3/install/soc_bm1688_wevb_emmc

其中最后一行,Output path对应的结果即为$OUTPUT_DIR对应的目录,如果$OUTPUT_DIR对应的目录不存在,则可以执行如下命令创建:

mkdir -p $OUTPUT_DIR

创建目录后,将 sdcard.tgz 基础软件包复制到该目录下,使用命令:

cp -rf {your_path}/sdcard.tgz $OUTPUT_DIR/    // {your_path}是您获取的sdcard.tgz基础软件包的本地路径
  1. 执行revert_package命令:

    revert_package
    

该命令执行完成之后,会在$OUTPUT_DIR/package_edge目录下生成boot.tgz,data.tgz,recovery.tgz,rootfs.tgz,rootfs_rw.tgz 这五个软件包,并且在 $OUTPUT_DIR/package_update/目录下生成 sdcard 和 update 两个文件夹。

这里的 sdcard 文件夹是 sdcard.tgz 软件包解压出来的文件,update 文件夹保存了执行revert_package 命令之后初始打包的五个软件包。

boot.tgz 软件包主要用于 kernel。

data.tgz 软件包主要用于 data 分区。

recovery.tgz 软件包主要用于用户恢复出厂设置。

rootfs.tgz 软件包可以用来制作您所需要的文件系统。

rootfs_rw.tgz 软件包文件系统 overlay 区,包括了所有系统安装的 app,lib,脚本,服务,/etc 下的设置,更新后都会清除。

  1. 如果您要修改分区信息,您需要修改build/scripts/下的partition32G.xml文件。

  2. 将修改后的*.tgz包替换掉$OUTPUT_DIR/package_edge下的同名*.tgz包,然后根据需要重新编译刷机包。

    build_update sdcard  // 重新编译sdcard刷机包
    build_update tftp    // 重新编译tftp刷机包
    

执行编译刷机包命令结束后,会在 $OUTPUT_DIR/package_edge 目录下生成sdcard目录和tftp目录,该目录下为刷机所需文件。

在 BM1688 上编译内核模块

您可以选择直接在 BM1688 板卡上直接编译kernel module,可以省去上述搭建交叉编译环境的麻烦。步骤如下:

  1. uname -r得到kernel版本号,与/home/linaro/bsp-debs和/lib/modules里面的文件名比较,确保一致

  2. 因为kernel在交叉编译环境下做make bindeb-pkg的缺陷,需要再额外做如下处理:

    1. 用date命令检查当前系统时间,如果跟实际时间相差太多,请设置为当前时间,如

      sudo date -s "01:01:01 2021-03-01"
      
    2. 检查是否存在/home/linaro/bsp-debs/linux-headers-install.sh,如果有的话,执行它即可

    3. 如果没有的话,需要手工操作:

      sudo dpkg -i /home/linaro/bsp-debs/linux-headers-*.deb
      sudo mkdir -p /usr/src/linux-headers-$(uname -r)/tools/include/tools
      sudo cp /home/linaro/bsp-debs/*.h /usr/src/linux-headers-$(uname-r)/tools/
      include/tools
      cd /usr/src/linux-headers-$(uname -r)
      sudo apt update
      sudo apt-get install -y build-essential bc bison flex libssl-dev
      sudo make scripts
      

修改分区表

BM1688 使用GPT分区表。分区表的配置文件在
build/scripts/partition32G.xml

其中依次描述了每个分区的大小信息。不建议您修改分区的顺序和个数,以及readonly和format属性,以免与其它一些预装脚本中的写法发生冲突。您可以修改每个分区的大小。最后一个分区的大小不需要凑满eMMC实际容量,可以把它设成一个比较小的值,只要足够存放您准备预装的文件(即data.tgz解开后的内容)就可以。刷机后第一次开机时,会有一个脚本将这个分区自动扩大到填满eMMC的全部剩余可用空间。

开机自启动服务

如果您有开机自动启动某些服务的需求,可以参考本节内容。 BM1688系列芯片使用systemd实现核心服务bmrt_setup的开机自启动,该服务包含以下三个关键文件:

/etc/systemd/system/bmrt_setup.service (服务描述文件)
/etc/systemd/system/multi-user.target.wants/bmrt_setup.service (软链接)
/usr/sbin/bmrt_setup.sh (执行脚本)

其中bmrt_setup.service的内容如下,您可以参考它的写法,在/etc/systemd/system目录下构建自己的服务。

[Unit]
Description=setup bitmain runtime env.
After=docker.service # 表明该服务在docker服务后启动

[Service]
User=root
ExecStart=/usr/sbin/bmrt_setup.sh # 指定服务启动执行的命令
Type=oneshot

[Install]
WantedBy=multi-user.target

在bmrt_setup.sh脚本中,我们加载了VPU、JPU以及TPU等关键驱动,所以请您把自定义的服务放在这个服务后面执行,或者在您的业务逻辑中等待驱动加载完成(可以使用systemd-analyze plot > boot.svg 生成一张启动详细信息矢量图,然后用图像浏览器或者网页浏览器打开查看所有服务的启动顺序和耗时)。

修改DTS_TYPE

如果进入了linux系统shell界面,则可直接使用dts_tool工具进行更改。

如下图,输入dts_tool后会读出当前使用的dts_type为bm1688_se9v1_8G,选中目标平台要使用的dts_type的序号,比如bm1688_se9v1_8G,序号为23,输入23再回车即可

_images/image25.png

如果是在uboot界面,默认的dts配置不能进入系统,需要选择正确的dts_type,可以在系统固件包sophon-img/boot/muilt.its查询正确的dts_type。

设置命令如下:

setenv DTS_TYPE config-bm1688_se9v1_8G   ###设置dts_type

bootd  #启动系统