(可选)驱动源码编译

简介

发布包中提供了驱动源码包{soc version}-driver-{software version}-minios.aarch64-src.tar.gz,用户可自行根据需要进行驱动的定制。定制完成后,可参考本章节进行源码编译。

源码编译依赖于HCC编译器,HCC编译器存在于Toolkit安装包的toolchain目录下。

操作步骤

  1. 执行以下命令切换到root用户,后续操作都需要以root用户执行。

    su - root

  2. 解压软件包获取中的驱动源码包{soc version}-driver-{software version}-minios.aarch64-src.tar.gz。

    例如在/usr/local/software/目录下执行如下解压命令:

    tar -zxvf {soc version}-driver-{software version}-minios.aarch64-src.tar.gz

    若已执行过此操作,此步骤可跳过。

  3. 进入驱动源码包解压后的driver目录,例如/usr/local/software/driver
  4. 关闭内核模块(KO)签名功能。

    Device操作系统内核模块默认开启了签名功能,若用户自定义驱动源码,需要关闭内核模块的签名功能,操作步骤如下:

    1. 进入/usr/local/software/driver/kernel/linux-4.19目录。

      cd /usr/local/software/driver/source/kernel/linux-4.19

    2. 执行如下命令生成.config文件。

      make ARCH=arm64 CROSS_COMPILE=${INSTALL_DIR}/toolkit/toolchain/hcc/bin/aarch64-target-linux-gnu- eulerosv2r9_defconfig

      • ${INSTALL_DIR}请替换为CANN软件安装后文件存储路径
      • 此命令依赖bison与flex,可使用如下命令进行安装:yum install bison flex

        说明:如果执行命令时提示缺少其他依赖,请根据提示自行安装。

    3. 修改内核配置选项。
      1. 执行如下命令,弹出内核配置界面。

        make ARCH=arm64 CROSS_COMPILE=${INSTALL_DIR}/toolkit/toolchain/hcc/bin/aarch64-target-linux-gnu- menuconfig

        • ${INSTALL_DIR}请替换为CANN软件安装后文件存储路径
        • 此命令依赖ncurses-devel,可使用如下命令进行安装:yum install -y ncurses-devel

          说明:如果执行命令时提示缺少其他依赖,请根据提示自行安装。

      2. 在配置界面中输入“/”,进入搜索界面,搜索“MODULE_SIG”。

        如下图所示:

      3. 选择“Ok”,进入搜索结果界面,在搜索结果界面中按数字键“1”跳转到CONFIG选项。

        如下图所示:

        按空格键关闭内核模块校验选项,[ ]里面存在“*”表示打开,[ ]空白表示关闭,关闭后示例如下所示:

      4. 选择“Save”保存,进入配置文件名称界面,如下所示。

        请注意,需要保持默认文件名“.config”,然后选择“Ok”。

      5. 连续选择“Exit”,退出内核配置界面。
    4. 替换“.config”文件。

      cp .config arch/arm64/configs/eulerosv2r9_defconfig

    5. 执行如下命令重新编译生成内核镜像。

      make ARCH=arm64 CROSS_COMPILE=${INSTALL_DIR}/toolkit/toolchain/hcc/bin/aarch64-target-linux-gnu- Image

      ${INSTALL_DIR}请替换为CANN软件安装后文件存储路径

      在弹出的回显信息中默认输入“y”,命令执行完成后,会在“kernel/linux-4.19/arch/arm64/boot”目录下生成内核镜像文件“Image”。

      提升编译内核镜像效率的方法如下:

      内核镜像编译支持-j[N]参数指定编译CPU核数,N表示使用N个CPU并发编译,不指定则使用1个cpu编译内核。N参数应根据实际编译环境CPU个数配置(可执行“cat /proc/cpuinfo | grep processor | wc -l”命令查看),比如编译环境有32个CPU,则可以使用20个CPU编译,命令示例如下所示:

      make ARCH=arm64 CROSS_COMPILE=${INSTALL_DIR}/toolkit/toolchain/hcc/bin/aarch64-target-linux-gnu- Image -j20

    6. 为重新生成的内核镜像增加签名头。

      进入内核镜像文件所在目录。

      cd arch/arm64/boot/

      执行如下两条命令为内核镜像文件增加签名头:

      python3.7 /usr/local/software/driver/source/vendor/hisi/tools/signtool/image_pack/esbc_header.py -raw_img Image -out_img header-ascend710.image -version 1.1.1.1.1 -nvcnt 0 -tag uimage -platform hi1951

      python3.7 /usr/local/software/driver/source/vendor/hisi/tools/signtool/image_pack/image_pack.py -raw_img header-ascend710.image -out_img ascend710.image -D -platform hi1951

      • /usr/local/software/2中{soc version}-driver-{software version}-minios.aarch64-src.tar.gz解压目录。
      • -raw_img:原始镜像文件路径,保持与示例一致即可。
      • -out_img:重新打包后的镜像文件输出路径,保持与示例一致即可。
      • -version:镜像版本号,格式为x.x.x.x.x用户可自定义。
      • 其他参数请保持默认值即可。

      命令执行完成后,会在“kernel/linux-4.19/arch/arm64/boot”目录下生成增加签名头后的文件系统镜像文件ascend710.image。

    7. 替换Driver安装目录下device文件夹下的的ascend710.image。

      替换前请先备份 /usr/local/Ascend/driver/device/目录下的ascend710.image文件到其他目录,防止内核镜像编译出错。

      • 为ascend710.image文件添加写权限。

        chattr -i /usr/local/Ascend/driver/device/ascend710.image

      • 替换/usr/local/Ascend/driver/device/目录下的ascend710.image。

        cp -rf /usr/local/software/driver/source/kernel/linux-4.19/arch/arm64/boot/ascend710.image /usr/local/Ascend/driver/device/

      • 取消ascend710.cpio.gz文件的写权限。

        chattr +i /usr/local/Ascend/driver/device/ascend710.image

    8. 删除编译生成文件,为后续编译驱动源码做准备。

      cd /usr/local/software/driver/source/kernel/linux-4.19

      make mrproper

  5. 进入/usr/local/software/driver下的source目录,安装相关依赖并进行源码编译。

    1. 进入驱动源码目录。

      cd /usr/local/software/driver/source

    2. 编译驱动。

      make driver_device product=mini CROSS_COMPILE=${INSTALL_DIR}/toolkit/toolchain/hcc/bin/aarch64-target-linux-gnu- KERNEL_DIR=/usr/local/software/driver/source/kernel/linux-4.19 KERNEL_DEFCONFIG=/usr/local/software/driver/source/kernel/linux-4.19/arch/arm64/configs/eulerosv2r9_defconfig build_device=true

      • CROSS_COMPILE:为HCC交叉编译器所在目录,其中${INSTALL_DIR}CANN软件安装后文件存储路径,请根据实际路径替换。
      • KERNEL_DIR与 KERNEL_DEFCONFIG:/usr/local/software/为驱动源码包所在目录。
      • 其他请保持不变。

      命令执行成功后,会在source目录的out/device/文件夹下生成如下表所示的内核对象文件。

      表1 内核对象文件列表

      内核对象

      描述

      ascend_event_sched.ko

      事件调度,提供TS、DVPP等事件与AI CPU间的调度。

      drv_base.ko

      DVPP系统基础模块,提供内存管理等功能。

      drv_buff_module.ko

      buffer管理模块,对进程间共享内存进行管理,通过共享内存的零拷贝特性提高进程间内存使用性能。

      drv_chnl.ko

      任务调度器模块,为VENC模块的驱动源。

      drv_devdrv.ko

      设备驱动模块,涉及驱动与TS模块交互,驱动将上层下发下来的计算任务传递给TS模块,由TS模块进行调度计算。

      drv_devmm.ko

      内存管理模块,设备侧的内存申请释放等功能的实现。

      drv_devmng.ko

      设备管理模块,提供获取设备信息、设置设备配置等管理类功能。

      drv_dfm.ko

      提供黑匣子异常注册功能,上报接口给其他内核调用。

      drv_h264e.ko

      H.264协议处理模块,是对图像按照H.264协议进行编码处理的模块。

      drv_h265e.ko

      H.265协议处理模块,是对图像按照H.265协议进行编码处理的模块。

      drv_jpegd.ko

      图片解码模块,提供jpeg图像解码功能。

      drv_jpege.ko

      图片编码模块,提供图像编码功能。

      drv_log.ko

      日志模块,提供日志采集功能,将日志传到host侧。

      drv_osal.ko

      DVPP系统基础模块,操作系统抽象层。

      drv_pcie_hdc.ko

      提供统一、高效的Host与Device通信功能。对外提供类似Socket的接口,如Send/Recv/Close等,内部利用DMA,实现快速的内存搬移。

      drv_pcie.ko

      提供PCIe通讯功能,设备PCIe初始化,执行镜像搬移流程,提供PCIe消息功能和DMA功能给其他模块使用。

      drv_pcie_vnic.ko

      提供虚拟网口功能,用户可通过标准ssh流程访问设备。

      drv_pkicms.ko

      签名校验模块,提供SOC(Security Operations Center )签名校验等功能。

      drv_platform.ko

      平台模块。

      drv_prof.ko

      数据采集模块,提供数据采集通道。

      drv_rc.ko

      码率控制模块,实现对编码码率进行控制。

      drv_spi.ko

      master控制器驱动,控制spi master。

      drv_sys.ko

      DVPP系统基础模块,提供DVPP系统初始化功能。

      drv_ts.ko

      Task Schedule与AI CPU交互事件的mailbox通道和datadump通道。

      drv_upgrade.ko

      升级模块,提供升级内核态功能。

      drv_user_cfg.ko

      用于进行flash用户配置区管理,主要flash对用户配置区进行读取、配置、清除操作。

      drv_vdec.ko

      视频解码模块,提供解码器的通道管理,参数设置,码流接收等功能。

      drv_vedu.ko

      硬件配置模块,主要任务为根据软件配置进行逻辑处理。

      drv_venc.ko

      编码通道模块,为编码模块与外部的交互模块。

      drv_vfmw.ko

      视频解码模块,提供解码器的码流切割,语法解析,配置硬件解码等功能。

      drv_vpc.ko

      图像预处理模块,提供图像处理Core初始化、寄存器配置等功能。

      hsm_firmware_update.ko

      固件安全升级模块,提供固件安全升级等功能。

      hsm_heartbeat.ko

      HSM子系统状态查询模块,提供HSM状态查询、PG信息查询等功能。

      ipc_drv.ko

      IPC通信模块,IPC消息发送接收等。

      retr.ko

      特征检索驱动,实现在千亿级规模的目标库中,秒级检索特征相似度高的目标。

      tzdriver.ko

      提供teeos与normal world的交互功能。

      vpc.ko

      图像预处理模块,提供图像处理Core调度、队列管理等功能。

      mntn_bbox.ko

      提供黑匣子相关功能。

      drv_pm.ko

      低功耗模块,提供睡眠唤醒功能。

      kbox_init.ko

      抓取内核异常信息日志的模块,依赖kbox.ko。

      kbox.ko

      为kbox提供日志接口,并管理已存储的日志。

      hsm_flash.ko

      提供Flash读取能力。

      说明:

      以上内核对象的源码都在driver/source/目录下。在driver/source/目录下通过grep -r xx.ko命令,通过对应的module.mk文件,找到源码所在的文件夹,如下所示:

      则drv_pcie_hdc.ko对应的源码文件夹为drivers/ai_sdk/arc/linux/kernel_space/src/drv_pcie_device/pcie_slave。

  6. 替换文件系统中的相关内核对象文件。

    拷贝编译生成的*.ko到解压后的文件系统的var目录下。

    cd /usr/local/software/driver/source/out/device

    cp -rf *.ko /usr/local/filesys_modify/tempdir/var/

异常处理

若进行源码编译时,一直循环提示类似如下信息:

请检查当前系统时间是否早于source/kernel/linux-4.19/scripts下的文件创建时间,若是,则请更改当前系统时间,然后重新进行编译操作。