海思linux编译流程(纯技术)

2025-02-27 11:23:43 2点赞 2收藏 3评论

SDK环境准备

主机开发环境

  • 根据sdk版本文档,061sdk推荐使用ubuntu 14.04,我在debian11下编译也没有发现问题

  • 软件包安装

sudo apt-get install gcc make gettext zlib1g-dev libncurses5-dev bison flex bc texinfo tree

  • 必须使用bash作为shell

rm -f /bin/sh ln -s /bin/bash /bin/sh

sdk准备

  • 以HiSTBLinuxV100R005C00SPC061的sdk准备为例

tar xvf /sata/设备相关/海思/HiSTBLinuxV100R005C00SPC061/HiSTBLinuxV100R005C00SPC060.tar.gz

tar xvf /sata/设备相关/海思/HiSTBLinuxV100R005C00SPC061/HiSTBLinuxV100R005C00SPC061.tar.gz

cd HiSTBLinuxV100R005C00SPC061/

./patch.sh ../HiSTBLinuxV100R005C00SPC060

cd ..

rm HiSTBLinuxV100R005C00SPC061 -r

mv HiSTBLinuxV100R005C00SPC060 HiSTBLinuxV100R005C00SPC061

cd HiSTBLinuxV100R005C00SPC061

cp /path/to/linux-4.4.35.tar.gz third_party/open_source/

source ./env.sh

海思linux编译流程(纯技术)

其中 /path/to/linux-4.4.35.tar.gz是sdk需要但是没有的linux内核,请改为真实路径,下载地址为

编译流程

以n2ns1为例

原厂固件提取reg文件和gpio配置

  • 通过ttl中断uboot,printenv可以获得bootargs

bootdelay=0 verify=n baudrate=115200 ipaddr=192.168.1.10 serverip=192.168.1.1 netmask=255.255.255.0 bootfile="uImage" phy_intf=mii,rgmii use_mdio=0,1 phy_addr=2,1 gmac_debug=0 bootargs_512M=mem=512M mmz=ddr,0,0,40M vmalloc=500M bootargs_768M=mem=768M mmz=ddr,0,0,40M vmalloc=500M bootargs_1G=mem=1G mmz=ddr,0,0,60M vmalloc=500M bootargs_2G=mem=2G mmz=ddr,0,0,60M vmalloc=500M stdin=serial stdout=serial stderr=serial ethact=up bootargs=console=ttyAMA0,115200 initrd=0x10A00000,0x4600000 root=/dev/ram blkdevparts=mmcblk0:2M(fastboot),1M(bootargs),4M(deviceinfo),6M(stbinfo),8M(baseparam),20M(logo),8M(pqparam),40M(private),10M(privatebak),80M(factory),40M(trustedcore_linux),80M(kernel0),80M(kernel1),150M(root0),150M(root1),300M(roothome),-(userdata) mem=1G mmz=ddr,0,0,48M vmalloc=500M coherent_pool=2M RUNLEVEL=1 bootcmd=mmc read 0 10000000 95800 28000;bootm 10000000 ethaddr=0C:56:5C:69:15:BE ver=Fastboot 3.3.0 (liushuo@PlatServer) (Nov 10 2017 - 13:59:29)

  • 根据上述bootargs制作hitool用的分区布局文件n2ns1.xml

    根据

    blkdevparts=mmcblk0:2M(fastboot),1M(bootargs),4M(deviceinfo),6M(stbinfo),8M(baseparam),20M(logo),8M(pqparam),40M(private),10M(privatebak),80M(factory),40M(trustedcore_linux),80M(kernel0),80M(kernel1),150M(root0),150M(root1),300M(roothome),-(userdata)在hitool中逐个输入分区名称,分区位置和大小,不赘述,网上搜索

海思linux编译流程(纯技术)
  • 使用hitool备份所有分区

  • 使用regbin从fastboot中提取reg文件

海思linux编译流程(纯技术)

需要说明的是运行regbin需要reg base文件,在sdk目录source/boot/sysreg/hi3798mv200/中的hi3798mv200_reg_base_v1.6.0.bin就是 海思的fastboot中同时包含多个reg文件,mv200支持6个,即reg0-reg5,具体使用哪个,主要看芯片的lsadc采样电压,如下图n2ns1的fastboot导入后可以看到有6个reg

  • 判断实际使用的reg

    要留意n2ns1的ttl启动信息如下,留意第三行,可知根据lsadc采样电压,生效reg的index是2,即为1.925v电压对应的reg,导出该reg即可。

    我导出的是hi3798mv2dmc_hi3798mv200_DDR4-2133_2GB_16bitx2_4layers_n2ns1.reg、hi3798mv2dmc_hi3798mv200_DDR4-2133_2GB_16bitx2_4layers_n2ns1.bin两个文件编译uboot时,reg2用该reg替换即可。

  • GPIO信息

    根据dtb,脚本等内容,每个设备都不通,需要根据经验并验证gpio信息,n2ns1的gpio信息如下

海思linux编译流程(纯技术)
  • uboot编译

    • 拷贝reg文件 将上一步制作的reg文件hi3798mv2dmc_hi3798mv200_DDR4-2133_2GB_16bitx2_4layers_n2ns1.reg、hi3798mv2dmc_hi3798mv200_DDR4-2133_2GB_16bitx2_4layers_n2ns1.bin两个文件拷贝到sdk目录 source/boot/sysreg/hi3798mv200/下

    • 拷贝SDK配置文件 SDK参考配置文件存放在 configs 目录,按芯片区分。 SDK参考配置文件的命名方法:单板名称_芯片名称_特性_cfg.mak,如: hi3798cv2dmb_hi3798cv200_tee_cfg.mak。 复制一个配置文件 cp configs/hi3798mv200/hi3798mv2dmo_hi3798mv200_cfg.mak configs/hi3798mv200/hi3798mv2dmc_n2ns1_cfg.mak

    • 修改SDK配置文件

    make SDK_CFGFILE=configs/hi3798mv200/hi3798mv2dmc_n2ns1_cfg.mak menuconfig

    在 menuconfig 配置菜单中参考 help 信息修改配置选项。其中reg文件就是在此配置,可以直接修改 uboot编译只需要配置base,board,boot system三个部分,以我配置的为例,改动如下

    @@ -32,12 +32,12 @@ # # System Config # -CFG_HI_32BIT_SYSTEM=y +CFG_HI_64BIT_SYSTEM=y +# CFG_HI_USER_SPACE_LIB is not set +CFG_HI_USER_SPACE_LIB64=y +# CFG_HI_32BIT_SYSTEM is not set # CFG_HI_USER_SPACE_ALL_LIB is not set -CFG_HI_CPU_ARCH=arm +CFG_HI_CPU_ARCH=arm64 # # Toolchains Config @@ -49,7 +49,7 @@ CFG_AARCH64_HISTBV100_LINUX=y # CFG_AARCH64_HISTBV400_LINUX is not set CFG_HI_AARCH64_TOOLCHAINS_NAME=aarch64-histbv100-linux -CFG_HI_OUT_DIR=hi3798mv2dmo +CFG_HI_OUT_DIR=hi3798mv2dmc_n2ns1 CFG_HI_USB3_SUPPORT=y CFG_HI_SATA_SUPPORT=y CFG_HI_JPGE_SUPPORT=y @@ -87,27 +87,17 @@ # # Flash Config # -CFG_HI_NAND_FLASH_SUPPORT=y - -# -# Nand Flash device support -# -CFG_HI_NAND_SUPPORT=y -# CFG_HI_SPI_NAND_SUPPORT is not set -CFG_HI_NAND_BLOCK_SIZE=0x20000 -CFG_HI_NAND_PAGE_SIZE=2k -CFG_HI_NAND_ECC_TYPE=4bit -# CFG_HI_MFTL_SUPPORT is not set +# CFG_HI_NAND_FLASH_SUPPORT is not set # CFG_HI_SPI_SUPPORT is not set CFG_HI_EMMC_SUPPORT=y # CFG_HI_KEYLED_74HC164_SELECT is not set -# CFG_HI_KEYLED_GPIOKEY_SELECT is not set -CFG_HI_KEYLED_CT1642_SELECT=y +CFG_HI_KEYLED_GPIOKEY_SELECT=y +# CFG_HI_KEYLED_CT1642_SELECT is not set # CFG_HI_KEYLED_PT6961_SELECT is not set # CFG_HI_KEYLED_PT6964_SELECT is not set # CFG_HI_KEYLED_FD650_SELECT is not set CFG_HI_GPIO_LIGHT_SUPPORT=y -CFG_HI_POSITIVE_GPIO_LIGHT_NUMBER=0xff +CFG_HI_POSITIVE_GPIO_LIGHT_NUMBER=0x29 CFG_HI_NEGATIVE_GPIO_LIGHT_NUMBER=0x28 # @@ -116,20 +106,6 @@ CFG_HI_PCIE_SUPPORT=y CFG_HI_GPIO_PCIE_RESET=0xff # CFG_HI_GPIO_PCIE_POWER_EN_SUPPORT is not set - -# -# SCI Config -# -CFG_HI_SCI_CLK_MODE_CMOS=y -# CFG_HI_SCI_CLK_MODE_OD is not set -CFG_HI_SCI_VCCEN_MODE_CMOS=y -# CFG_HI_SCI_VCCEN_MODE_OD is not set -CFG_HI_SCI_RESET_MODE_CMOS=y -# CFG_HI_SCI_RESET_MODE_OD is not set -CFG_HI_SCI_VCCEN_LOW=y -# CFG_HI_SCI_VCCEN_HIGH is not set -CFG_HI_SCI_DETECT_LOW=y -# CFG_HI_SCI_DETECT_HIGH is not set CFG_HI_AUDIO_EXTERNAL_AMP=y # CFG_HI_AUDIO_INTERNAL_AMP is not set CFG_HI_SND_MUTECTL_SUPPORT=y @@ -148,7 +124,7 @@ # Boot Regfile Config List # CFG_HI_BOOT_REG1_NAME=hi3798mv2dmb_hi3798mv200_DDR4-2133_2GB_16bitx2_2layers.reg -CFG_HI_BOOT_REG2_NAME=hi3798mv2dmc_hi3798mv200_DDR4-2133_2GB_16bitx2_4layers.reg +CFG_HI_BOOT_REG2_NAME=hi3798mv2dmc_hi3798mv200_DDR4-2133_2GB_16bitx2_4layers_n2ns1.reg CFG_HI_BOOT_REG3_NAME= CFG_HI_BOOT_REG4_NAME=hi3798mv2dme_hi3798mv200_DDR4-2133_2GB_16bitx2_8layers.reg CFG_HI_BOOT_REG5_NAME=hi3798mv2dmp_hi3798mv200_DDR3-1866_1GB_16bitx2_2layers.reg @@ -165,7 +141,7 @@ # CFG_HI_MINIBOOT_SUPPORT is not set CFG_HI_BOOT_LOG_SUPPORT=y # CFG_HI_FORCE_ENV_TO_MEDIA is not set -CFG_HI_BOOT_ENV_STARTADDR=0x100000 +CFG_HI_BOOT_ENV_STARTADDR=0x200000 CFG_HI_BOOT_ENV_SIZE=0x10000 CFG_HI_BOOT_ENV_RANGE=0x10000 # CFG_HI_BOOT_ENV_BAK_SUPPORT is not set @@ -175,8 +151,8 @@ CFG_HI_BUILD_WITH_PRODUCT=y CFG_HI_BOOT_LOGO_SUPPORT=y CFG_HI_BOOT_UPGRADE_SUPPORT=y -# CFG_HI_BUILD_WITH_KEYLED is not set -# CFG_HI_BUILD_WITH_IR is not set +CFG_HI_BUILD_WITH_KEYLED=y +CFG_HI_BUILD_WITH_IR=y

  • 编译 make SDK_CFGFILE=configs/hi3798mv200/hi3798mv2dmc_n2ns1_cfg.mak hiboot 完成后在out/hi3798mv200/hi3798mv2dmc_n2ns1目录下可以看到编译生成的文件,其中fastboot在image/emmc_image下

  • 内核编译

    • 源码准备 首先请下载sdk对应的源码,061sdk对应的内核为4.4.35,下载地址 将源码包放入third_party/open_source 运行命令自动解压源码并合并入海思补丁

    cd source/kernel/ make SDK_CFGFILE=configs/hi3798mv200/hi3798mv2dmc_n2ns1_cfg.mak prepare

    这条命令可能会报错,因为我的sdk配置文件中内核配置文件为hi3798mv200_n2ns1_defconfig,但其实这个文件还不存在,所以,报错,不影响,只要前几条命令运行,此时在source/kernel/中已经建立了linux-4.4.y 此时可以删除linux-4.4.y.patch文件夹,如果不删除,每次都会用patch文件夹覆盖,所以改动的文件可能被覆盖,建议删除patch文件夹。

    • 内核配置 内核配置受sdk配置文件影响,可以在sdk配置文件中配置的在sdk配置文件中配置,sdk配置文件中没有的才需要再内核配置文件中修改 复制内核默认配置文件 cp linux-4.4.y/arch/arm64/configs/hi3798mv200_defconfig linux-4.4.y/arch/arm64/configs/hi3798mv200_n2ns1_defconfig 配置内核 make SDK_CFGFILE=configs/hi3798mv200/hi3798mv2dmc_n2ns1_cfg.mak menuconfig 需要注意的是这个配置生成的是../../out/hi3798mv200/hi3798mv2dmc_n2ns1/obj64/source/kernel/linux-4.4.y/.config 文件,配置完成后需要拷贝到配置目录

作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~

展开 收起
3评论

  • 精彩
  • 最新
  • 请问SDK在哪下载呢

    校验提示文案

    提交
  • 网上多的是,恩兔那个网盘也有

    校验提示文案

    提交
  • 没找到061的sdk,只在github上找到了060的,请问大佬是否方便分享一下061的sdk吗

    校验提示文案

    提交
提示信息

取消
确认
评论举报

相关文章推荐

更多精彩文章
更多精彩文章
最新文章 热门文章
2
扫一下,分享更方便,购买更轻松