Hi3531D调试手记(一):Linux开发环境搭建

Ubuntu系统版本:Ubuntu 16.04.7 LTS

前置安装一些支持库:

sudo apt-get install lib32z1-dev
sudo apt-get install lib32stdc++6
sudo apt-get install u-boot-tools
sudo apt-get install libncurses5-dev

一、安装交叉编译工具

  店家给的资料中只有 arm-hisiv500-linux(基于uclibc) 这一种,莫得选择。

  • 进入到工具链的目录下解压:
tar -xvf arm-hisiv500-linux.tar.bz2
ls -l	# 检查安装工具的可执行权限

在这里插入图片描述

  • 如果安装工具无可执行权限,则需修改权限:
chmod 775 arm-hisiv500-linux.install
sudo ./arm-hisiv500-linux.install	# 现在可以直接安装了
source /etc/profile		# 安装完成后运行一下,安装交叉编译器的脚本配置的环境变量就可以生效了。或者重启系统也可以

  实际上它的PATH是直接被写到 /etc/profile 的末尾的。测试一下:

arm-hisiv500-linux-gcc -v

在这里插入图片描述
  出现了版本信息,说明已经安装成功了。

二、展开SDK包

  店家给的资料里对应的SDK包版本为:Hi3531DV100_SDK_V1.0.4.0。

  • 首先检查 Ubuntu 的 shell 的默认指向:
ls -l /bin/sh

在这里插入图片描述

  • 如果发现指向的不是 bash 而是 dash 则需要进行修改:
sudo dpkg-reconfigure dash # 之后会进入一个配置界面,选择 No 后回车
tar -xvf Hi3531DV100_SDK_V1.0.4.0.tgz	# 将包解压,注意解压后的SDK包的存储路径中不要出现空格等特殊字符
./sdk.unpack	# 进入解压后的SDK目录,展开SDK包

  如果系统提示展开工具无可执行权限,处理方法与交叉编译器的类似。展开完成后的终端处理结果如下:在这里插入图片描述

三、搭建TFTP和NFS服务器

  这一部分与网络相关,没有必要立即着手完成,可以等后续有需要时再着手落实。

1.TFTP服务器搭建

  • 首先需要安装一些东西:
sudo apt-get install tftp-hpa tftpd-hpa
sudo apt-get install xinetd
  • 然后创建 tftp 服务器的文件装载目录,并把权限打开以便 uboot 能从里面下载文件:
mkdir /home/USERNAME/linux/tftpboot			# USERNAME 为用户指定的主目录用户名
chmod 777 /home/USERNAME/linux/tftpboot
  • 配置 /etc/xinetd.conf 文件,将其内容修改为如下部分:
# Simple configuration file for xinetd
#
# Some defaults, and include /etc/xinetd.d/

defaults
{

# Please note that you need a log_type line to be able to use log_on_success
# and log_on_failure. The default is the following :
# log_type = SYSLOG daemon info

}

includedir /etc/xinetd.d
  • 配置 /etc/default/tftpd-hpa 文件,将其内容修改为如下部分:
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/home/USERNAME/linux/tftpboot" # 这里指定tftpd-hpa的服务目录,也就是之前创建的文件夹路径
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="-l -c -s" # -c是可以上传文件的参数,-s是指定tftpd-hpa服务目录,上面已经指定
  • 配置 /etc/xinetd.d/tftp,将其内容修改为如下部分:
service tftp
{
  socket_type = dgram
  wait = yes
  disable = no
  user = root
  protocol = udp
  server = /usr/sbin/in.tftpd
  server_args = -s /home/USERNAME/linux/tftpboot
  #log_on_success += PID HOST DURATION
  #log_on_failure += HOST
  per_source = 11
  cps =100 2
  flags = IPv4
}
  • 每次修改完配置文件后,都需要使用下面的指令重启服务(如果出现了 tftp 突然不能使用的情况也可以尝试重启服务后重新连接):
sudo service tftpd-hpa restart
sudo /etc/init.d/xinetd reload
sudo /etc/init.d/xinetd restart

  至此 tftp 服务就可以正常使用了,在网络连接配置好以后就可以使用 tftp 命令在线更新板子上的 uboot、Linux 内核以及根文件系统镜像了。

2.NFS服务器搭建

  • 首先也需要安装 NFS 服务:
sudo apt-get install nfs-kernel-server
  • 创建 nfs 共享目录,并把权限打开:
mkdir /home/USERNAME/linux/nfs
chmod 777 /home/USERNAME/linux/nfs
  • 配置 /etc/exports 文件,在文件末尾追加内容:
/home/USERNAME/linux/nfs *(rw,sync,no_root_squash)

# /home/USERNAME/linux/nfs 指定nfs共享目录的路径
# *表示允许所有的网络段访问
# rw表示访问者具有可读写权限
# sync表示同步缓存
# no_root_squash表示访问者具有 root 权限
  • 之后重启 NFS 服务即可(如果出现突然不能使用的情况也可以直接重启服务):
sudo /etc/init.d/nfs-kernel-server restart

  至此 NFS 服务器也已经搭建完成,可以使用指令 showmount -e 来检查 NFS 服务的共享目录是否是之前配置时指定的目录:
在这里插入图片描述
  接下来是通过 NFS 将 Ubuntu 上的目录挂载到开发板上。

(1)挂载普通目录

  • 在 nfs 共享目录下继续创建一个 rootfs 目录用于存放根文件系统,然后在里面加上一个测试用文件:
mkdir /home/USERNAME/linux/nfs/rootfs
touch test.c

在这里插入图片描述

  • 然后使用指令 ifconfigroute 检查开发板的 linux 上网络是否配置完好,如果没有配置,就需要手动进行临时性配置或是永久性配置:
# 这是临时性的手动配置,系统下次启动就失效了
ifconfig eth0 hw ether 00:00:23:34:45:66
ifconfig eth0 211.66.18.57 netmask 255.255.255.0

在这里插入图片描述
  如果要做永久性配置,则需要在 uboot 中的 bootargs 参数尾部加上关于 ip 地址的设置:

setenv bootargs 'mem=64M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 rw mtdparts=hi_sfc:1M(boot),4M(kernel),27M(rootfs);hinand:256M(nand) ip=211.66.18.57:211.66.18.56::255.255.255.0::eth0:off'
  • ping 一下 Ubuntu,连接正常,可以尝试挂载目录:
    在这里插入图片描述
  • 挂载完以后到指定的挂载点查看挂载结果:
mount -t nfs -o nolock 211.66.18.56:/home/karas/linux/nfs /nfsroot

在这里插入图片描述

  • 在板子这边创建一个新文件,可以发现 Ubuntu 那边也出现了对应的文件,看上去还有些权限配置的问题,不过 nfs 共享目录确实是可以使用了:
    在这里插入图片描述
    在这里插入图片描述

PS:如果是要挂载U盘上的目录,首先往板子上插入U盘,然后用 fdisk -l 指令查看U盘信息,最后用 mount -t vfat /dev/sda1 /mnt/ 挂载就可以了。卸载则用 umount /mnt/ 指令。

(2)挂载根文件系统

  • 首先修改并保存 uboot 中的启动参数 bootargs:
setenv bootargs 'mem=64M console=ttyAMA0,115200 root=/dev/nfs nfsroot=211.66.18.56:/home/karas/linux/nfs/rootfs rootfstype=jffs2 rw ip=211.66.18.57:211.66.18.56::255.255.255.0::eth0:off'
saveenv
  • 然后修改 linux 内核中关于 nfs 的配置后重新生成内核镜像:
->  Networking support
  ->  Networking options
      [*]   IP: kernel level autoconfiguration
 
-> File systems
  [*] Network File Systems
      <*>   NFS client support
      <*>     NFS client support for NFS  version 3
      [*]       NFS client support for the NFSv3  ACL protocol extension
      [*]   Root file system on NFS

3.网络挂载内核、设备树和根文件系统

  上一节记录了挂载根文件系统的实现过程,这里补充记录挂载内核和设备树的实现过程。
  修改并保存 uboot 中的启动指令 bootcmd:

setenv bootcmd 'tftp 42000000 uImage;bootm 0x42000000'
saveenv

  然后就可以配合之前的 nfs 根文件系统一起使用了。这里实际上只是设置了启动时使用从服务器端获取到的内核镜像,内存中原本保留的内核镜像不会被覆盖掉。

四、交叉编译ffmpeg

  同样没有必要立即着手完成,这是后续用于视频码流封装的工具。这玩意儿有点折腾,先记录个初版,以后指不定回来返工。

  • 首先要到 ffmpeg 官网 去下载源码包。本文使用的源码包为 ffmpeg-4.3.2 版本。

PS:一开始没经验只能跟着网上的配置走,发现 4.x 以上版本使用 arm-hisiv500-linux 交叉编译后面会报错,尝试了网络上的多种配置均无法解决。最终在另一篇 CSDN 博客中看到博主说是需要交叉编译器开启支持浮点操作,然而咱并不知道,也没在网上找到怎么开启。所以要么自己改配置要么换成 3.x 版本。

  • 将下载好的源码包放到指定目录下解压出来,之后进入目录创建空白的 build.sh 脚本,用于存放 ffmpeg 的相关配置参数。

  接下来会花一定的篇幅对部分参数配置进行说明。ffmpeg 的配置参数说明实际上就在源码包目录下的 configure 文件中,就在文件头附近不远。

1.Component options (九大库)

  ffmpeg 的九大库分别是 avcodec, avdevice, avfilter, avformat, avresample, postproc, swresample, swscale, 加上它们的共同依赖 avutil。这九个库里除 avresample 以外其余八个都是默认开启的,但实际使用过程中可能没有这么多需求,可以酌情裁剪(博主只需要用到码流的封装功能)。

libavcodec:用于各种类型声音/图像编解码。该库是音视频编解码核心;
libavdevice:各种设备的输入输出
libavfilter:滤镜特效处理,如水印;
libavformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能;
libavresample:音视频封转编解码格式预设;
libpostproc:用于后期效果处理;音视频应用的后处理;
libswresample:音频采样格式数据转换;
libswscale:用于视频场景比例缩放、色彩映射转换;图像颜色空间或格式转换;
libavutil:包含一些公共的工具函数的使用库

  这些库之间存在一定的依赖关系,在源码包目录下的 ./ffbuild/config.mak 文件中提及,同样在文件头附近不远。
在这里插入图片描述

2.Licensing options

  ffmpeg 默认许可证 LGPL 2.1,如果需要加 gpl 的库需要使用 gpl 的许可证,例如 libx264 就是 gpl 的,如果需要加入 libx264 则需要配置 --enable-gpl;如果想更新许可证版本到 3,那么就加入 --enable-version3。

3.Configuration options

  ffmpeg 下默认启用静态库以及关闭动态库,如有需求可以增加配置 --disable-static 和 --enable-shared 来进行调整。

4.Program options

  ffmpeg 在交叉编译完成后可以生成三个 bin 软件:ffmpeg、ffplay 和 ffprobe,都是可以在开发板上运行的,不过咱要做的视频封装是实时封装而不是割裂式封装,所以用不到这仨,就配置成 --disable-programs 了。

5.Individual component options

  ffmpeg 提供了 encoders,decoders,hwaccels,muxers,demuxers,parsers,bsfs,protocols,devices,indevs,outdevs,filters 共9种组件,数量相当庞大,全部编译会花费很多不必要的时间(一般来说也用不到那么多,大概率编译完了扔一边吃灰),可以用 --disable-everything 全关了,然后再 enable 需要使用的功能。当然如果实在没把握那还是全留着比较稳妥。

6.Toolchain options

  如果需要交叉编译 ffmpeg 的话,就需要配置 --arch=arm、–target-os=linux 和 --cross-prefix=arm-hisiv500-linux- 了(具体参数内容根据实际情况修改)。如果配置了 --cross-prefix, configure 就会自动添加 --enable-cross-compile 选项,因此可以省略不写。

7.Optimization options

  这里可以选择是否关闭各个平台的汇编优化(默认开启),全部关闭就是 --disable-asm。

  • 接下来就是编辑 ./build.sh,按自己的需求添加配置参数了:
./configure \
	--prefix=/home/karas/linux/ffmpeg-4.3.2 \
	--disable-avdevice \
	--disable-avfilter \
	--disable-postproc \
	--disable-swscale \
	--enable-gpl \
	--enable-shared \
	--disable-programs \
	--arch=arm \
	--target-os=linux \
	--cross-prefix=arm-hisiv500-linux- \
	--disable-asm 
  • 之后就在当前目录下配置、编译、安装:
./build.sh
make
make install

PS:运行完 ./build.sh 后,即便没有报错也先不要急着 make,可以看一看输出信息,最终开启了哪些功能,可以使用哪些组件,最终会生成什么文件,这些是不是符合自己预期的配置,以便及时调整。毕竟 make 一次花的时间也不少,一次给它整完多好。


注意:调用 ffmpeg 库编程有个大坑!如果明明链接了全部需要用到的静态库但是仍然报“未定义的引用”的错,那大概率是静态库的链接顺序有问题!下面的顺序是正确的:

STATIC_OLIB+= \
$(DIR_LIB_FFMPEG_LIB)/libavformat.a \
$(DIR_LIB_FFMPEG_LIB)/libavdevice.a \
$(DIR_LIB_FFMPEG_LIB)/libavcodec.a \
$(DIR_LIB_FFMPEG_LIB)/libavutil.a \
$(DIR_LIB_FFMPEG_LIB)/libswresample.a \ 
$(DIR_LIB_FFMPEG_LIB)/libavfilter.a \
$(DIR_LIB_FFMPEG_LIB)/libpostproc.a \
$(DIR_LIB_FFMPEG_LIB)/libswscale.a
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值