• Hi3516开发笔记(三):Hi3516虚拟机基础环境搭建之交叉编译环境境搭建以及开机启动脚本分析


    前言

      前面进行了可以传输,那么写一个简单的C程序来交叉编译并传入运行。

     

    虚拟机

      上一篇搭建的虚拟机环境,包含了sftp传递文件,网络能ping通,基于上一篇的虚拟机继续搭建。

     

    海思交叉编译虚拟机搭建

      查看开发板提供的引导文档,先搭建ubuntu的基础软件软件,然后再解压交叉编译器搭建交叉编译的环境。

    安装本机软件包

    dash改为bash

      Ubuntu一般默认为使用dash,我们要使用bash,所以如下:

    sudo dpkg-reconfigure dash
    

      弹出界面如下,我们选择“no”,不使用dash:
      在这里插入图片描述

    安装依赖包

      直接复制命令行安装即可

    sudo apt-get install make libc6:i386 lib32z1 lib32stdc++6 zlib1g-dev libncurses5-dev
    sudo apt-get install ncurses-term libncursesw5-dev g++ u-boot-tools:i386 texinfo
    sudo apt-get install texlive gawk libssl-dev openssl bc uuid-dev
    

      安装完成后即可。

    安装交叉编译工具(交叉编译器)

    拷贝编译工具

      拿到开发板海思资料中的交叉编译器,如下图:
       在这里插入图片描述
      有点大,如下图:
      在这里插入图片描述
      专门在虚拟机新建work/tools目录存放,work为存放所有代码,源码,交叉编译环境等的库地址。
      在这里插入图片描述

      传递完成:
      在这里插入图片描述

    解压安装

      开发板厂家已经帮我们弄好了,所以解压,跑脚本即可。
      在这里插入图片描述
      开发板提供的安装脚本arm-himix200-linux.install的内容如下:

    #!/bin/bash
    
    TOP_DIR=/opt/hisi-linux/x86-arm
    if [ -n "$1" ]
    then
    	[ -d "$1" ] && TOP_DIR=$1
    fi
    
    TOOL_DIR=$TOP_DIR/arm-himix200-linux
    TAR_BIN_DIR=$TOOL_DIR/bin
    TOOLS_PKG="$PWD/arm-himix200-linux.tar.bz2"
    RUNTIME_LIB_PKG="$PWD/runtime_glibc.tgz"
    
    set +e
    
    echo "Installing HuaWei LiteOS Linux at $TOP_DIR"
    
    mkdir -pv $TOP_DIR
    
    if [ -d $TOOL_DIR ]
    then
    	echo "Delete exist directory..." >&2
    	rm $TOOL_DIR -rf 
    else
    	mkdir -pv $TOOL_DIR
    fi
    
    echo "Extract cross tools ..." >&2
    tar -xf $TOOLS_PKG -C $TOP_DIR
    
    # creat link
    
    sed -i  '/\/arm-hisiv610-liteOS\//d' /etc/profile
    
    if [ -z "`grep "$TAR_BIN_DIR" < /etc/profile`" ] ;
    then
    	echo "export path $TAR_BIN_DIR" >&2
    	cat >> /etc/profile << EOF
    
    # `date`
    # HuaWei LiteOS Linux, Cross-Toolchain PATH
    export PATH="$TAR_BIN_DIR:\$PATH" 
    # 
    
    EOF
     	source /etc/profile
    else
    	echo "skip export toolchains path" >&2
    fi
    tar -xzf $RUNTIME_LIB_PKG -C $TOOL_DIR
    	根据自己的习惯,先备份,然后修改如下,主要修改的几个点如下:
    	TOP_DIR:为工作目录
    	TOOL_DIR:之前tool,新建一个tools存放解压安装的
    #!/bin/bash
    
    #TOP_DIR=/opt/hisi-linux/x86-arm
    TOP_DIR=/home/yang/work/tools
    if [ -n "$1" ]
    then
    	[ -d "$1" ] && TOP_DIR=$1
    fi
    
    #TOOL_DIR=$TOP_DIR/arm-himix200-linux
    TOOL_DIR=$TOP_DIR/arm-himix200-linux
    TAR_BIN_DIR=$TOOL_DIR/bin
    TOOLS_PKG="$PWD/arm-himix200-linux.tar.bz2"
    RUNTIME_LIB_PKG="$PWD/runtime_glibc.tgz"
    
    set +e
    
    echo "Installing HuaWei LiteOS Linux at $TOP_DIR"
    
    mkdir -pv $TOP_DIR
    
    if [ -d $TOOL_DIR ]
    then
    	echo "Delete exist directory..." >&2
    	rm $TOOL_DIR -rf 
    else
    	mkdir -pv $TOOL_DIR
    fi
    
    echo "Extract cross tools ..." >&2
    tar -xf $TOOLS_PKG -C $TOP_DIR
    
    # creat link
    
    sed -i  '/\/arm-hisiv610-liteOS\//d' /etc/profile
    
    if [ -z "`grep "$TAR_BIN_DIR" < /etc/profile`" ] ;
    then
    	echo "export path $TAR_BIN_DIR" >&2
    	cat >> /etc/profile << EOF
    
    # `date`
    # HuaWei LiteOS Linux, Cross-Toolchain PATH
    export PATH="$TAR_BIN_DIR:\$PATH" 
    # 
    
    EOF
     	source /etc/profile
    else
    	echo "skip export toolchains path" >&2
    fi
    tar -xzf $RUNTIME_LIB_PKG -C $TOOL_DIR	
    

      根据自己的习惯,先备份,然后修改如下,主要修改的几个点如下:

    • TOP_DIR:为工作目录
    • TOOL_DIR:之前tool,新建一个tools存放解压安装的
    #!/bin/bash
    
    #TOP_DIR=/opt/hisi-linux/x86-arm
    TOP_DIR=/home/yang/work/tools
    if [ -n "$1" ]
    then
    	[ -d "$1" ] && TOP_DIR=$1
    fi
    
    #TOOL_DIR=$TOP_DIR/arm-himix200-linux
    TOOL_DIR=$TOP_DIR/arm-himix200-linux
    TAR_BIN_DIR=$TOOL_DIR/bin
    TOOLS_PKG="$PWD/arm-himix200-linux.tar.bz2"
    RUNTIME_LIB_PKG="$PWD/runtime_glibc.tgz"
    
    set +e
    
    echo "Installing HuaWei LiteOS Linux at $TOP_DIR"
    
    mkdir -pv $TOP_DIR
    
    if [ -d $TOOL_DIR ]
    then
    	echo "Delete exist directory..." >&2
    	rm $TOOL_DIR -rf 
    else
    	mkdir -pv $TOOL_DIR
    fi
    
    echo "Extract cross tools ..." >&2
    tar -xf $TOOLS_PKG -C $TOP_DIR
    
    # creat link
    
    sed -i  '/\/arm-hisiv610-liteOS\//d' /etc/profile
    
    if [ -z "`grep "$TAR_BIN_DIR" < /etc/profile`" ] ;
    then
    	echo "export path $TAR_BIN_DIR" >&2
    	cat >> /etc/profile << EOF
    
    # `date`
    # HuaWei LiteOS Linux, Cross-Toolchain PATH
    export PATH="$TAR_BIN_DIR:\$PATH" 
    # 
    
    EOF
     	source /etc/profile
    else
    	echo "skip export toolchains path" >&2
    fi
    
    
    tar -xzf $RUNTIME_LIB_PKG -C $TOOL_DIR	
    
    

      然后命令行安装,如下图:
      在这里插入图片描述
      然后相当漫长的等待,可以看看,此处我们打发下时间,可以先继续往下看。
      在这里插入图片描述
      Ok了,解压完成。

     

    测试交叉编译器

      交叉编译器全局引入之后,应该能调用到,实际发现arm-linux然后tab无法迁出,查看/etc/profile脚本,引入了tools/bin目录,bin目录下有对应的执行文件指向host_bin目录下,发现引入tools/arm-himix200-linux/bin无法提示出编译器,只好尝试强制引入host_bin试试,结果是可以的,如下图:
      
      所以c++编译器好了。

     

    测试Demo

      
      
      将a.out使用sftp传入Hi3516:
      
    然后使用命令运行查看结果:
      

     

    定位开机启动文件

    启动文件分布

      查看开机启动应用,一般linux下的开机启动初始化都会放在/etc/init.d目录下,然后有一个rcS脚本,循环从S00到S99顺序执行,定位到目录查看如下:
      在这里插入图片描述

    • S00dev:看名称就知道是设备(不深究)
        在这里插入图片描述
    • S01udev:看名称是设备管理器,即管理设备树(不深究)
        在这里插入图片描述
    • S41dhcpcd:根据名称应该是dhcp服务(不深究)
        在这里插入图片描述
    • S50sshd:是sftp,ssh等一些服务(不深究)
        在这里插入图片描述
    • S80network:网络配置,配置动态地址,静态地址可以改这个脚本(不深究)
        在这里插入图片描述
    • rcS:主要运行的脚本,脚本中可以做一些操作,并轮询S??*系列初始化。
        在这里插入图片描述

    查看/user/qt5.12/qt-env.sh

      改脚本只是引入了一些qt的环境变量。
      在这里插入图片描述

    补充:以下是另外一个环境的qt环境变量(关于显示和触摸是和具体的驱动程序相关)

      在这里插入图片描述

    查看/usr/script/hi3516dv300.sh脚本

      该基本,基本是做测试用的,定位到启动开机应用:

    mount /dev/mmcblk0p4 /userdata
    . /userdata/user.conf
    
    # eth0 ethernet interface config
    if [ X$ETH0_CFG == Xstatic ]; then
            ifconfig eth0 $BOARD_IP netmask $NETMASK broadcast $BROADCAST
    elif [ X$ETH0_CFG == Xdhcp ]; then
            :
    else
            ifconfig eth0 192.168.1.120 netmask 255.255.255.0 broadcast 192.168.1.255
    fi
    
    # telnetd start
    if [ X$RUN_TELNETD == Xyes ]; then
            telnetd &
    fi
    
    # openssh config
    if [ X$SSHD_EN != Xyes ]; then
            if [ -e /etc/init.d/S50sshd ]; then
                    mv /etc/init.d/S50sshd /etc/init.d/backup/
            fi
    else
            if [ -e /etc/init.d/backup/S50sshd ]; then
                    mv /etc/init.d/backup/S50sshd /etc/init.d/
            fi
    fi
    
    sh /userdata/user-script.sh
    
    # mount user partition
    if [ -e /dev/mmcblk0p5 ]; then
            mount /dev/mmcblk0p5 /user
            if [ $? != 0 ]; then
                    mkfs.ext4 /dev/mmcblk0p5
                    mount /dev/mmcblk0p5 /user
            fi
    fi
    
    # start_wifi
    cd /lib/
    ln -s libnl-genl.so.2.0.0 libnl-genl.so.2
    ln -s libnl.so.2.0.0 libnl.so.2
    
    # load3516dv300
    cd /usr/ko/
    ./load3516dv300 -i -sensor0 $SNS0 -sensor1 $SNS1
    
    insmod /usr/ko/cfg80211.ko
    insmod /usr/ko/8189fs.ko
    
    # insmod touchscreen driver
    if [[ -n $TOUCHSCREEN ]]; then
            insmod /usr/ko/$TOUCHSCREEN lcd=$LCD debug=$TP_DEBUG
    fi
    
    # audio enable
    sh /usr/script/audio-gpio.sh
    # camera enable and reset
    sh /usr/script/camera-gpio.sh 1
    # lcd enable and reset
    sh /usr/script/lcd-gpio.sh 1
    # lcd backlight enable
    #sh /usr/script/lcd-pwm.sh 1
    
    # enable camera led
    #sh /usr/script/ir-led.sh 1
    #sh /usr/script/bl-led.sh 1
    
    # camera preview
    cd /usr/sample/vio/
    #if [ X$DISPLAY == X10 ] || [ X$DISPLAY == X12 ]; then
    #       ./sample_vio -f $DISPLAY -t $SNS0_TYPE -T $SNS1_TYPE -l $LCD -s $SATURATION -r $SNS0_ROTATE -R $SNS1E
    #elif [ X$DISPLAY == X9 ] || [ X$DISPLAY == X11 ]; then
    #       ./sample_vio -f $DISPLAY -t $SNS0_TYPE -l $LCD -s $SATURATION -r $SNS0_ROTATE 
    #       ./sample_vio -f $DISPLAY -t $SNS0_TYPE -T $SNS1_TYPE -l $LCD -s $SATURATION -r $SNS0_ROTATE -R $SNS1E
    #else
    #       ./sample_vio -f $DISPLAY -t $SNS0_TYPE
    #fi
    
    if [ X$DISPLAY == X11 ] || [ X$DISPLAY == X12 ]; then
        ./sample_vio -f $DISPLAY -t $SNS0_TYPE -T $SNS1_TYPE -l $LCD -s $SATURATION -r $SNS0_ROTATE -R $SNS1_ROTE
    else
            cd /usr/sample/ExpertCode/
        /usr/sample/ExpertCode/ExpertCode_Main -l $LCD -t $SNS0_TYPE -T $SNS1_TYPE &
    fi
    
    # disable camera lcd backlight 
    #sh /usr/script/camera-gpio.sh 0
    #sh /usr/script/lcd-gpio.sh 0
    #sh /usr/script/lcd-pwm.sh 0
    
    # disable camera led
    #sh /usr/script/ir-led.sh 0
    #sh /usr/script/bl-led.sh 0
    
    echo "end of hi3516dv300.sh"
    

      开启应用如下图:
      在这里插入图片描述

      我们注释这一部分,重启看结果:
      在这里插入图片描述

      开机后,确实没有显示。
      我们打印出来,看看这句话,获取到自己跑改应用需要的一些参数,如LCD配置,-t,-T等一些参数(注意双引号)。
      在这里插入图片描述
      使用top和kill -9杀掉ExpertCode_Main进程,然后手动启动,如下图:
      在这里插入图片描述
      成功跑起来应用。

  • 相关阅读:
    CNZZ友盟访问明细的采集办法
    实时采集新加坡交易所A50指数
    深入理解DIP、IoC、DI以及IoC容器
    PHP依赖注入(DI)和控制反转(IoC)详解
    PHP 的命令行模式
    浅析PHP中的闭包和匿名函数
    PHP_CodeSniffer 使用攻略
    PSR规范学习笔记
    Composer 的简介、安装及使用
    win7下使用手动安装composer
  • 原文地址:https://www.cnblogs.com/qq21497936/p/15592318.html
Copyright © 2020-2023  润新知