基于Hi3516DV300的嵌入式入门演练(上)

您所在的位置:网站首页 linux开发板在线软件升级的支持是什么 基于Hi3516DV300的嵌入式入门演练(上)

基于Hi3516DV300的嵌入式入门演练(上)

2024-07-14 16:38| 来源: 网络整理| 查看: 265

基于Hi3516DV300的嵌入式入门演练(上)

基于Hi3516DV300的嵌入式入门演练(下)

文章目录 信息前言勉励1 开始之前1.1 操作系统与开发准备1.2 推荐的书籍1.3 书本之外 2 最小系统环境的搭建流程2.1 VMWare Workstation Player和Kubuntu2.1.1 创建虚拟机2.1.2 Kubuntu系统安装 2.2 搭建Hi3516DV300的开发环境2.2.1 工具链安装与开发环境配置2.2.2 展开SDK 2.3 U-Boot的编译2.4 Kernel的编译2.5 根文件系统制作 3 存储器适配与烧录3.1 使用Nand Flash的情况3.1.1 Nand存储器分区规划3.1.2 文件系统打包(yaffs2)3.1.3 使用有线网络烧录到Nand Flash的示例3.1.4 内核启动参数和U-Boot命令配置 3.2 使用eMMC的情况3.2.1 eMMC存储器分区规划3.2.2 文件系统打包(ext4)3.2.3 使用USB烧录到eMMC的示例3.2.4 内核启动参数和U-Boot命令配置 4 常用软件编译方法4.1 wpa_supplicant4.2 hostapd4.3 iperf34.4 gdb4.5 lrzsz4.6 himm和devmem4.7 ntpdate

信息

当前版本作者联系方式(长期有效):E-mail: [email protected]

当前版本:2022-4-16-R1.0-预发布-问题意见征集

前言

本文拟基于 Hi3516DV300 介绍开发环境和最小系统搭建过程,以及一些不依赖于特定平台的通用嵌入式Linux开发技能和工具,因此学习将绕过芯片内相关资源的使用。如果你希望学习基于海思的音视频编解码,那更好的建议是在完成本文档的演练后,专注于海思SDK中提供的MPP例程,那里将成为你上手IPC(IP Camera,网络摄像机)开发的起点。

作为 “入门演练” ,我们将避过程序编写和内核调试等内容,仅通过对已有的工具进行编译、配置和测试来帮助你熟悉嵌入式设备的开发和调试过程。而后围绕该过程扩充其中如设备树、内核(Kernel)、构建系统(Build System)、常用工具和外设等知识节点。诚然,这么多内容放在一篇文档中,其叙述必将十分浅显,但是如此记录却能降低你们的学习门槛——至少不用花时间为了某个错误找遍论坛或者翻阅十几篇博客。

需要注意的是,本文档的内容具备时效性!这因你使用的工具或环境的版本更新而变化。即便你使用随本文提供的资源和软硬件,开发机中的各种依赖包却依然会不断升级迭代,如果它们不能提供很好的前向兼容(Forward Compatibility),那旧版本的程序将不能在新环境中工作。随时更新本文档可以避免这样的问题,提醒维护者不要忘记对每一版发布的文档指定正确且唯一的版本编号,这将为后续维护者提供文档是否应当被更新的参考。

阅读本文不需要你有太多的基础,否则就感觉不到新奇和兴奋了。但为了能理解我的叙述,你至少应该 了解 过Linux的基本使用、嵌入式的基本概念和大致内容,第1章中给出的几本书会帮助你构筑这方面的知识体系。至于本文的写作风格…我尽力把它写的好像是我在你身边亲自对你说话一样,也许这会使你印象深刻一些。另外,我虽然有心将本文写得全面,使你能够无障碍复现,但是内容中的众多细节,还是需要你亲自去查阅资料。

本入门文档 不包含 以下内容:

海思音视频编解码和软编解码(e.g. x264…)IPC相关协议(e.g. TCP/UDP/RTP/RTSP/RTMP/Onvif…)及相关推流框架(e.g. JRTPlib/Live555/ffmpeg…)内核精简、驱动开发和系统优化安全启动与固件加密屏幕、触摸、GUI和嵌入式Qt应用开发(e.g. 网络编程/多线程/多进程…)…… 勉励

我曾在其它文档中说过,现在要再说一遍:这世界上任何事情,一旦追求极致就根本不可能轻松。如果想要轻松,不学就是最轻松的了。

就算你身边没有混日子的人,你也总能听说一些——他们的热情消磨殆尽、惰于自己的舒适区;他们的追求仅限于欲望和金钱;他们的娱乐被限制在虚拟的游戏之内,刷着微博抖音看着剧,明明是自己的生命填充的却是他人的时间。也许我没有资格对别人的生活品头论足,只是,我希望你们能和“他们”有些许的不同。

1 开始之前

本章将介绍一些必备的技能和工具。

通常情况下,学习嵌入式需要先准备好一块硬件开发板,因为嵌入式方向必须实际上手操作才能真正学到东西,就好比捧着C语言教程不会让你入门编程,焊一焊洞洞板不会让你完美Layout一样,你读过了那么多的书,不上手做一做就无法积累经验。但在这一章,请你暂时按捺住购买的欲望,先对基础知识查缺补漏一番,如果没有本章所述的技能,在面对后续的操作和命令时你可能会无所适从。

1.1 操作系统与开发准备

计算机的基本操作和组成是现代化社会中作为电子类专业的学生必会的常识。Windows操作系统的使用和一些常用外设是必须要知道的,比如这里说几个名词:处理器/RAM/磁盘/通用串行总线/FAT32/路由/驱动程序……如果你认为这些名字不过是小儿科,那就意味着你已经达到了作为嵌入式开发者的入门级要求。

和单片机开发不同,海思的开发离不开Linux环境。因此在开始本文的演练之前,你需要多少学习一下Linux的基本操作。个人推荐的Linux发行版是Debain系的Ubuntu或Kubuntu,前者的桌面环境使用GNOME,后者则使用KDE,你可以根据喜好随意选择。一些老教程通常选择CentOS,这可能是一些历史原因造成的,但相信我,Ubuntu是一个更友好、漂亮又易于使用的发行版。你可以在虚拟机(e.g. VMWare Player)中安装Linux,并尝试在Linux中做你在Windows下做的那些事,经过一段时间的磨合后,你将对后续的操作得心应手。

如果你学习过单片机开发,那么应该对串口非常的熟悉了。嵌入式Linux开发板上都会提供一个调试串口,用于对接Linux的串口控制台(Console),因此对应地,开发机上应当准备一个虚拟终端软件以调试在开发板上的Linux系统(或内核)。我使用的虚拟终端软件是SecureCRT(V8.5.3),或者根据你的喜好,Xshell和MobaXterm也是不错的选择,至于正版和盗版…你懂的。而在Linux下,可以使用免费好用的minicom。开发板的调试串口通过USB转TTL小板连接到电脑上,电脑就能识别出一个串口设备了,在Windows下可通过查看设备管理器找到一个被分配有COMx的串口;在Linux下则会在/dev目录下生成诸如ttyUSBx的节点。

[关于USB转TTL]

市面上常见的USB转TTL小板使用的几种芯片如:CH340、PL2303、FT232和CP210x等,在使用之前记得安装对应的驱动。

嵌入式应用开发通常离不开网络编程,因此开发者还需要掌握一些网络知识,如基本的IPv4协议等,你可以在国家计算机等级考试三级(网络技术)和四级(网络工程师)中找到这些内容。除编程所需外,当开发板提供有线网络连接时,可以通过TFTP方式向开发板下载镜像或者挂载NFS文件系统,网络知识就显得更加不可或缺了。

最后,还要收拾一下心情。我能够理解一个人面对新征程时的兴奋感,也能够体会每一个小成功带来的喜悦之情,但开发者无论面临什么景况都应当保持内心镇静——无论是程序一次成功还是长久的调试无果。总要戒骄戒躁默默耕耘,怀着持久且谦虚的学习态度,是在这个行业上保持自己竞争力的唯一方法。

1.2 推荐的书籍

书是读不完的!关于入门的图书,我可以向你推荐一些,它们并不是全部,却实实在在能帮助你了解嵌入式世界。此外,如果你想向更深入的方向探索,就必须要主动去寻找那些知识了。

《嵌入式Linux基础教程》

本书向你介绍了通用嵌入式Linux开发的诸多细节,属于入门类的书籍,在速读阶段建议不求甚解。

《C Primer Plus(第6版)中文版》

该书能够完善你的C语言基础,嵌入式方向中,C语言或许不是最适合手头开发需求的,但绝对是必须要掌握的。如果你是完全的零基础,那并不建议使用这本书作为学习C语言的第一本书,因为它涉及的东西太全了。因此如果你没有时间通览全书,将它作为工具书摆在案头也是极好的。

《C陷阱与缺陷》

《C语言解惑》

《高质量嵌入式Linux C编程(第2版)》

该书可以作为嵌入式Linux学习的第一本书,读这本书时,不要过分考究前半部分的内容,如Makefile等,它们虽然必需,但不是最要紧的事情,后面有关Linux的编程部分才是首先需要掌握的东西。

《嵌入式Linux编程》(《Mastering Embedded Linux Programming》)

该书介绍了一个嵌入式产品的开发流程和嵌入式开发中经常使用到的构建系统的概念。这本书可以对开阔嵌入式视野、增加知识广度起到很大的帮助。

《Linux环境编程 从应用到内核》(《Programming in Linux Environment from Userspace to Kernel》)

在动手实操一些例子之后,这本书可以帮助你从内核的层面上理解应用编程的细节,比如读写锁、线程安全和信号安全等等。

《C++ Primer Plus中文版》

如果你的工作是应用方向,那么C++将是必需的。如果你还没有觉悟啃下这本书,那也许你还没准备好学习C++。但时代在发展,这本书也并不是万全的,随着C++标准不断更新,你应当即时跟进新的标准和技术。

《Linux设备驱动开发详解》

如果你的方向是底层驱动开发或者对内核的驱动子系统感兴趣,则宋宝华这本书是必读的。虽然Kernel已经迭代到5.x版本了,但4.x的内容仍然适用于目前大多开发需求。

《奔跑吧Linux内核》

这本书比较新,是基于Linux5.x版本的,如果你想成为内核工程师,那就读一读吧。

《UNIX环境高级编程》

上面的书籍都可以在学校的图书馆借到,如果时过境迁,有新的版本发售,那就去看最新的版本。如果可以的话,建议读书结合着工程和编码一起进行,这能够帮助你更好地理解它们。还有很多其它的优秀书籍,可我不想在这里罗列清单——文档的读者是新手,他们需要自己探索和发现并享受这个过程带来的成就感,因此他们不应该被无谓的建议束缚了手脚。

对了,我不是很推荐看视频,因为看视频的时间利用率实在是太低了。文字记录能方便读者根据自己的速度阅读,也方便索引和查找。如果视频能让你学到东西,那看书会让你学到更多。你应当谨慎地选择自己阅读的书籍,好像战士细心挑选自己的兵器一样。

1.3 书本之外

不要被所谓软件和硬件方向限制了视野。和IT/互联网不同,嵌入式领域的人必须对软硬件有交叉认知:硬件是如何依赖软件运行的,软件又如何使用硬件提供的功能。嵌入式是软件和硬件的结合体,因此越是接近底层开发,开发者就越是需要掌握硬件测试和原理图阅读等技能。

经常逛逛论坛或者在行业群里看看别人的闲聊内容很有好处,至少可以开阔你的视野。且论坛上并不是只有吹水的人,一些真正的大佬玩家和开源项目维护者大都活跃在论坛,如海思平台为主的 Ebaina(易佰纳)电子技术论坛 和全志平台为主的 Whycan社区 等。不过千万不要花太长时间在上面,我们毕竟是学业为重!

琳琅满目的市场就好像论坛一样,充斥着大量的开发板产品。在选择开发板时,你可能会注重配套资料和教程的多少,或者其开源社区建设,比如正点原子和野火这些大店铺的产品,以及韦东山、朱友鹏、稚辉君、飞凌、DOPI、各种水果派(树莓派、香橙派、荔枝派、蓝莓派、香蕉派、樱桃派…)的板子。这自然是没有问题的,但要记得:不要轻易搞收藏;选择要适合学习计划或职业规划;初期不要一味追求高性能的平台。

啰嗦了半天,可以开始了!本文并不局限于某个固定的开发板,你可以先试着做一做前面不需要开发板的部分内容,待熟练之后再尝试在自己的板子上做差异化学习。

2 最小系统环境的搭建流程

本章将以 Hi3516CV500R001C02SPC020 (提取码:6i6q)开发包为基准,讲述最基本的开发环境搭建步骤和Hi3516DV300所需的最小系统环境的构建过程。

本章内容无需开发板。

2.1 VMWare Workstation Player和Kubuntu

VMWare Workstation Player是一款免费好用的虚拟机软件;Kubuntu是一款Debain系的Linux发行版,本文档后续的叙述将基于它们进行。本文使用的VMWare Player版本为16,使用的Kubuntu版本为20.04.3 LTS。

2.1.1 创建虚拟机

VMWareWorkstationPlayer16软件主界面

打开VMWarePlayer,点击右侧【创建新虚拟机】,而后按照向导配置虚拟机。

VMWarePlayer-创建虚拟机-选择镜像

选择我们下载好的Kubuntu20.04系统镜像,虚拟机自动识别到了OS信息。

VMWarePlayer-创建虚拟机-用户信息

设置机器名字、用户名和密码,建议简单一些,因为开发机可能经常用到root权限,密码太长是自找麻烦。

VMWarePlayer-创建虚拟机-虚拟机命名

设置在VMWarePlayer中展示的虚拟机名字和存储位置。

VMWarePlayer-创建虚拟机-磁盘大小设置

磁盘不要太小,否则后期扩容是一件麻烦事。

VMWarePlayer-创建虚拟机-信息确认

这里我们不需要太多关注虚拟机设置,除非你的内存和CPU资源不足需要修改,否则全部保持默认即可,最后点击【完成】。

2.1.2 Kubuntu系统安装

系统启动后,将自动载入ISO镜像,并检查文件系统。

VMWarePlayer-系统安装-文件系统检查

这里可以跳过,因为我们使用的是虚拟机,“磁盘”不会有什么问题。VMWarePlayer的简易安装非常便捷,我们几乎不需要手动操作,只管 耐心 等待。

VMWarePlayer-系统安装-安装完成

[关于Dolphin]

Dolphin是Kubuntu的“资源管理器”,可以使用它浏览本机上存储的内容,默认打开位置为用户的Home目录,使用 Shift+F4 可在当前目录打开终端窗口;使用 F4 可在当前目录调出内嵌的终端。

Kubuntu-Dolphin介绍

安装完成后,点击【徽标键】-【Konsole】打开终端,而后使用以下命令升级软件包:

sudo apt update sudo apt upgrade

[为Ubuntu操作系统更换镜像源]

Apt默认使用的仓库源所在地为美国,因此访问速度可能比较缓慢,可以选择更换为国内镜像源以加快软件下载的速度。

在【Update】程序中的【Settings】界面,按照以下方式更换国内镜像源。

Kubuntu-更换镜像源

再执行 apt update 命令就能看到镜像源已经更换完成了。

Kubuntu-更换镜像源-完成

至此,虚拟机和Linux系统环境已经准备完成。

[学习使用apt安装应用程序]

apt是Debain系OS的默认包管理程序,通过它可下载并管理发布在其仓库中的众多应用程序。以 lolcat 为例,使用以下命令进行安装:

sudo apt install lolcat

而后在终端中执行该程序(如 man lolcat |lolcat )查看效果:

lolcat示意

2.2 搭建Hi3516DV300的开发环境

还记得本章伊始提及到的那一大长串名字的开发包吗?那里面包含了这款芯片从文档到例程的所有开发资料。你可能会问,我们不是要学习Hi3516DV300么,为什么开发包的名字是Hi3516CV500呢?因为它们同属一个系列,这几款芯片共用文档、例程和开发包,就这么简单。

开发包目录分析-1

文档部分请自己查阅,海思的文档相当细致,但这里我还是会亲手带你走一遍。

开发包目录分析-2

进入 Hi3516CV500R001C01SPC020 目录,同名压缩包就是我们接下来要用到的,下载并解压它,将其中的01.Software/ board/ Hi3516CV500_SDK_V2.0.2.0.tgz 拷贝到虚拟机中。SVP(Smart Vision Platform) 是海思媒体处理芯片智能视觉异构加速平台,该平台包含了CPU、DSP、NNIE等多个硬件处理单元和运行在这些硬件上SDK开发环境,本文暂时用不到,如果你需要在该平台部署深度学习模型或者部署异构算法,你才需要用到这个包中的内容。Toochain 是交叉编译工具链,是我们后面编译各种程序要用到的,下载并解压得到 arm-himix200-linux.tgz ,拷贝到虚拟机中。

Kubuntu-拷贝工具链和SDK

解压这两个文件,可以通过右键文件-【Extract】-【Extract archive here, autodetect sobfolder】实现。

Kubuntu-文件解压

2.2.1 工具链安装与开发环境配置

进入 arm-himix200-linux 目录下,在当前窗口按 F4 调出终端,执行以下命令安装工具链:

sudo ./arm-himix200-linux.install

安装后重启虚拟机,在终端中输入 arm-himix200-linux- 并按下两次 tab 键,则会展示出安装的工具链。

命令补全示例

而后安装开发环境所需的必要软件包:

sudo apt install vim make gcc g++ patch python net-tools swig u-boot-tools bison flex sudo apt install python-dev libssl-dev libncurses-dev python3-dev python3-distutils sudo apt install build-essential lib32z1 lib32stdc++6

完成之后,工具链就可以成功运行了。原压缩包和安装程序所在目录可以删除。

查看工具链GCC版本

[关于32位兼容包]

当使用32位操作系统时,无需安装上面的 lib32z1 和 lib32stdc++6 包。

2.2.2 展开SDK

由于SDK脚本不支持dash,故首先在终端输入 sudo dpkg-reconfigure dash 并在弹出的窗口中通过方向键选择 no 并回车保存以禁用dash。

禁用dash

进入 Hi3516CV500_SDK_V2.0.2.0 目录下,在当前窗口按 F4 调出终端,执行以下命令展开SDK:

./sdk.unpack

SDK展开后的目录

SDK展开完成后的目录结构如图所示。

hi3516dv300_spi_smp_image_glibc

该目录中存放官方编译好的镜像文件可供直接验证所需,其中后缀名表示固件采用的文件系统格式。但我们的目标是自己编译制作镜像文件,故可以略过这个目录。

osdrv

该目录下存放着与嵌入式板端操作系统相关的程序和脚本,也是本章主要的工作目录。

package

该目录下存放 osdrv 和 smp 目录内容的原始压缩包。

smp

该目录下存放关于MPP和音视频编码例程相关的内容。不在本文档学习范围内。

SDK中提供的程序和资源要多留意查看,也许你暂时不会或用不到它们,但是理解和认识这些工具也是学习的一部分。况且既然官方提供了这些工具,那就说明它们对制作一个IPC固件而言确是必要的。

至此我们已经准备好基本资源和开发环境,可以真正上手制作Hi3516DV300的最小系统了。

2.3 U-Boot的编译

U-Boot是基于PowerPC,ARM,MIPS和其他几种处理器的嵌入式板的引导加载程序,可以安装在引导ROM中,用于初始化和测试硬件或下载运行应用程序代码。

[U-Boot名字和拼写]

根据U-Boot自述文件中的叙述,该项目的“正式”名称是“Das U-Boot”。所有书面文本(文档,源文件中的注释等)均应使用拼写“U-Boot”。例:

这是U-Boot项目的README文件。

文件名等应基于字符串“u-boot”。例:

include/asm-ppc/u-boot.h #include

变量名称,预处理器常量等应基于字符串“u_boot”或基于“U_BOOT”。例:

U_BOOT_VERSION u_boot_logo IH_OS_U_BOOT u_boot_hush_start

使用正确的拼写是程序员的基本素质之一,且是对他人工作和项目的认可与尊重。

进入展开后SDK的 osdrv/opensource/uboot 目录下,解压 u-boot-2016.11.tgz ,随后在 u-boot-2016.11 目录下打开终端(可在该目录下按 Shift+F4 打开终端窗口,后文不再提示),并执行以下命令编译:

# 根据使用的存储器类型进行选择,Nor和Nand使用前者,eMMC使用后者 make ARCH=arm CROSS_COMPILE=arm-himix200-linux- hi3516dv300_defconfig make ARCH=arm CROSS_COMPILE=arm-himix200-linux- hi3516dv300_emmc_defconfig # 配置(可选) make ARCH=arm CROSS_COMPILE=arm-himix200-linux- menuconfig # 编译 make ARCH=arm CROSS_COMPILE=arm-himix200-linux- -j2

即可得到u-boot.bin文件。

[make和构建工具]

GCC是编译工具;make调用GCC,通过Makefile指定编译规则,属于构建工具;cmake可创建Makefile文件指导make构建过程,称为元构建工具。

进入 展开后的SDK根目录 下 依次 执行:

cd ./osdrv/tools/pc/uboot_tools tar -zxf hiregbin-v5.0.1.tgz cd hiregbin-v5.0.1 sudo chmod +x hiregbin ./hiregbin ../Hi3516DV300-DMEB_4L_FLYBY-DDR3_1800M_512MB_16bitx2-A7_900M-SYSBUS_300M.xlsm ./reg.bin cp reg.bin ../../../../opensource/uboot/u-boot-2016.11/.reg cd ../../../../opensource/uboot/u-boot-2016.11 make ARCH=arm CROSS_COMPILE=arm-himix200-linux- u-boot-z.bin

至此,我们得到了最终的u-boot镜像文件 u-boot-hi3516dv300.bin 。

[重要 - 关于hiregbin和DDR适配]

U-Boot的一项重要任务是初始化DDR控制器,为此,海思提供了hiregbin工具以从xlsm表格模板中生成配置文件。

Hi3516DV300-DMEB_4L_FLYBY-DDR3_1800M_512MB_16bitx2-A7_900M-SYSBUS_300M.xlsm 文件从名字看适配的是 16bit*2/两颗2Gbit的DDR3内存颗粒。然而实际上该文件当前适配的是 16bit*2/两颗4Gbit的DDR3内存颗粒,即支持两片512MB共1GB的内存配置。开发者需自行确认该处设置与所用硬件保持一致。

更详细的内容可查看官方文档《Hi3516DV300 DDR3 参数配置方法》,此处不再赘述。

2.4 Kernel的编译

下载 linux-4.9.37.tar.gz,拷贝到展开后SDK的 osdrv/opensource/kernel 目录下,并在该目录下执行:

tar -zxf linux-4.9.37.tar.gz mv linux-4.9.37 linux-4.9.y && cd linux-4.9.y patch -p1


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3