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

满堂花醉三千客,一剑霜寒十四洲。这篇文章主要讲述Hi3516开发笔记:Hi3516虚拟机基础环境搭建之交叉编译环境境搭建以及开机启动脚本分析相关的知识,希望能为你提供帮助。
前言    前面进行了可以传输,那么写一个简单的C程序来交叉编译并传入运行。
虚拟机    上一篇搭建的虚拟机环境,包含了sftp传递文件,网络能ping通,基于上一篇的虚拟机继续搭建。
海思交叉编译虚拟机搭建    查看开发板提供的引导文档,先搭建ubuntu的基础软件软件,然后再解压交叉编译器搭建交叉编译的环境。
安装本机软件包 dash改为bash
    Ubuntu一般默认为使用dash,我们要使用bash,所以如下:

sudo dpkg-reconfigure dash

    弹出界面如下,我们选择“no”,不使用dash:
   
Hi3516开发笔记(Hi3516虚拟机基础环境搭建之交叉编译环境境搭建以及开机启动脚本分析)

文章图片

安装依赖包    直接复制命令行安装即可
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

    安装完成后即可。
安装交叉编译工具(交叉编译器) 拷贝编译工具
【Hi3516开发笔记(Hi3516虚拟机基础环境搭建之交叉编译环境境搭建以及开机启动脚本分析)】    拿到开发板海思资料中的交叉编译器,如下图:
   
Hi3516开发笔记(Hi3516虚拟机基础环境搭建之交叉编译环境境搭建以及开机启动脚本分析)

文章图片

    有点大,如下图:
   
Hi3516开发笔记(Hi3516虚拟机基础环境搭建之交叉编译环境境搭建以及开机启动脚本分析)

文章图片

    专门在虚拟机新建work/tools目录存放,work为存放所有代码,源码,交叉编译环境等的库地址。
   
Hi3516开发笔记(Hi3516虚拟机基础环境搭建之交叉编译环境境搭建以及开机启动脚本分析)

文章图片

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

文章图片

解压安装
    开发板厂家已经帮我们弄好了,所以解压,跑脚本即可。
   
Hi3516开发笔记(Hi3516虚拟机基础环境搭建之交叉编译环境境搭建以及开机启动脚本分析)

文章图片

    开发板提供的安装脚本arm-himix200-linux.install的内容如下:
#!/bin/bashTOP_DIR=/opt/hisi-linux/x86-arm if [ -n "$1" ] then [ -d "$1" ] & & TOP_DIR=$1 fiTOOL_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 +eecho "Installing HuaWei LiteOS Linux at $TOP_DIR"mkdir -pv $TOP_DIRif [ -d $TOOL_DIR ] then echo "Delete exist directory..." > & 2 rm $TOOL_DIR -rf else mkdir -pv $TOOL_DIR fiecho "Extract cross tools ..." > & 2 tar -xf $TOOLS_PKG -C $TOP_DIR# creat linksed -i/\\/arm-hisiv610-liteOS\\//d /etc/profileif [ -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 +eecho "Installing HuaWei LiteOS Linux at $TOP_DIR"mkdir -pv $TOP_DIRif [ -d $TOOL_DIR ] then echo "Delete exist directory..." > & 2 rm $TOOL_DIR -rf else mkdir -pv $TOOL_DIR fiecho "Extract cross tools ..." > & 2 tar -xf $TOOLS_PKG -C $TOP_DIR# creat linksed -i/\\/arm-hisiv610-liteOS\\//d /etc/profileif [ -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 linksed -i/\\/arm-hisiv610-liteOS\\//d /etc/profile
if [ -z " grep "$TAR_BIN_DIR" & lt; /etc/profile" ] ;
then
echo " export path $TAR_BIN_DIR" > & 2
cat > > /etc/profile < < EOF
date HuaWei LiteOS Linux, Cross-Toolchain PATHexport 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
& emsp; & emsp; 然后命令行安装,如下图: & emsp; & emsp; ![在这里插入图片描述](https://s4.51cto.com/images/blog/202111/23111117_619c5bd59cd6b11048.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=) & emsp; & emsp; 然后相当漫长的等待,可以看看,此处我们打发下时间,可以先继续往下看。 & emsp; & emsp; ![在这里插入图片描述](https://s4.51cto.com/images/blog/202111/23111117_619c5bd5b840c79681.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=) & emsp; & emsp; Ok了,解压完成。# 测试交叉编译器 & emsp; & emsp; 交叉编译器全局引入之后,应该能调用到,实际发现arm-linux然后tab无法迁出,查看/etc/profile脚本,引入了tools/bin目录,bin目录下有对应的执行文件指向host_bin目录下,发现引入tools/arm-himix200-linux/bin无法提示出编译器,只好尝试强制引入host_bin试试,结果是可以的,如下图: & emsp; & emsp; & emsp; & emsp; 所以c++编译器好了。< br> # 测试Demo & emsp; & emsp; & emsp; & emsp; & emsp; & emsp; 将a.out使用sftp传入Hi3516: & emsp; & emsp; 然后使用命令运行查看结果: & emsp; & emsp; < br> # 定位开机启动文件 ## 启动文件分布 & emsp; & emsp; 查看开机启动应用,一般linux下的开机启动初始化都会放在/etc/init.d目录下,然后有一个rcS脚本,循环从S00*到S99*顺序执行,定位到目录查看如下: & emsp; & emsp; ![在这里插入图片描述](https://s4.51cto.com/images/blog/202111/23111117_619c5bd5a8cf981415.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=) - **S00dev**:看名称就知道是设备(不深究) & emsp; & emsp; ![在这里插入图片描述](https://s4.51cto.com/images/blog/202111/23111117_619c5bd5c093433762.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=) -**S01udev**:看名称是设备管理器,即管理设备树(不深究) & emsp; & emsp; ![在这里插入图片描述](https://s4.51cto.com/images/blog/202111/23111117_619c5bd5c75a451726.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=) -**S41dhcpcd**:根据名称应该是dhcp服务(不深究) & emsp; & emsp; ![在这里插入图片描述](https://s4.51cto.com/images/blog/202111/23111117_619c5bd5e463c1505.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=) -**S50sshd**:是sftp,ssh等一些服务(不深究) & emsp; & emsp; ![在这里插入图片描述](https://s4.51cto.com/images/blog/202111/23111117_619c5bd5eba0756319.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=) -**S80network**:网络配置,配置动态地址,静态地址可以改这个脚本(不深究) & emsp; & emsp; ![在这里插入图片描述](https://s4.51cto.com/images/blog/202111/23111118_619c5bd60ae4f69750.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=) -**rcS**:主要运行的脚本,脚本中可以做一些操作,并轮询S??*系列初始化。 & emsp; & emsp; ![在这里插入图片描述](https://s4.51cto.com/images/blog/202111/23111118_619c5bd6114d878036.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=) ## 查看/user/qt5.12/qt-env.sh & emsp; & emsp; 改脚本只是引入了一些qt的环境变量。 & emsp; & emsp; ![在这里插入图片描述](https://s4.51cto.com/images/blog/202111/23111118_619c5bd623d3b43136.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=) ### 补充:以下是另外一个环境的qt环境变量(关于显示和触摸是和具体的驱动程序相关) & emsp; & emsp; ![在这里插入图片描述](https://s4.51cto.com/images/blog/202111/23111118_619c5bd6183e339263.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=) ## 查看/usr/script/hi3516dv300.sh脚本 & emsp; & emsp; 该基本,基本是做测试用的,定位到启动开机应用: ```cpp 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 fish /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 $SNS1insmod /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 #fiif [ 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 0echo "end of hi3516dv300.sh"

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

文章图片

    我们注释这一部分,重启看结果:
   
Hi3516开发笔记(Hi3516虚拟机基础环境搭建之交叉编译环境境搭建以及开机启动脚本分析)

文章图片

    开机后,确实没有显示。
    我们打印出来,看看这句话,获取到自己跑改应用需要的一些参数,如LCD配置,-t,-T等一些参数(注意双引号)。
   
Hi3516开发笔记(Hi3516虚拟机基础环境搭建之交叉编译环境境搭建以及开机启动脚本分析)

文章图片

    使用top和kill -9杀掉ExpertCode_Main进程,然后手动启动,如下图:
   
Hi3516开发笔记(Hi3516虚拟机基础环境搭建之交叉编译环境境搭建以及开机启动脚本分析)

文章图片

    成功跑起来应用。

    推荐阅读