海思linux编译流程(纯技术)
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

其中 /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中逐个输入分区名称,分区位置和大小,不赘述,网上搜索

使用hitool备份所有分区
使用regbin从fastboot中提取reg文件

需要说明的是运行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信息如下

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 文件,配置完成后需要拷贝到配置目录
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~

值友6406463078
校验提示文案
-稍息
校验提示文案
值友3538571250
校验提示文案
值友3538571250
校验提示文案
-稍息
校验提示文案
值友6406463078
校验提示文案