暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

手把手教你搭建鸿蒙Hi3518开发和运行环境

鸿蒙技术社区 2021-01-14
764

学习 C 语言,C++ 语言,数据结构和算法,操作系统,网络,驱动,设计模式等知识用鸿蒙来强化就太对了。本文教你一步一步搭建鸿蒙的开发和运行环境,有点啰嗦,适合小白。

本文所涉及的所有工具都可以在这里找到:

https://pan.baidu.com/s/1HL835nX2JAWsL0DNOnNIFg

(提取码pbe2)


具体有下列步骤:

  • 组装开发板

  • 连接开发板

  • 安装串口驱动

  • 安装 USB 驱动

  • 安装烧录工具

  • 擦除引导程序

  • 烧录系统

  • 登录开发板

  • 修改 OS 启动地址

  • 运行可执行程序

  • 安装 VMWARE

  • 安装编译服务器

  • 访问编译服务器

  • 编译鸿蒙产品

  • 编译鸿蒙组件

  • 打通开发板网络

  • 部署 NFS

  • 新增自定义组件


01

组装开发板


我们选用 HiSpark IPC DIY Camera 产品,内部含 hi3518ev300 芯片。请参考产品的安装说明书,或者参考安装视频指导:
https://www.bilibili.com/video/BV18r4y1F7Lx?from=search&seid=16503504888266711974


02

连接开发板


开发板和 PC 的连接关系如下图。2 条 usb 线(产品包装中的,其中一个三针插头,一个四针插头。

03

安装串口驱动


请双击 USB-to-Serial Comm Port.exe。进行串口驱动安装,安装完成后。在设备管理器中应该能看到下面这样的 COM 接口,你的 COM 接口编号可能有所不同。表明串口驱动安装成功。

04

安装 USB 驱动


然后双击 zadig-2.5.exe 安装通用 USB 驱动,点击中间的 Install。

05

安装烧录工具


直接解压 HiTool-HM-5.4.9-win32-x86_64.zip 文件。然后双击其中的 HiTool.exe. 界面如下图。然后先将芯片切换到 3518ev300。

06

擦除引导程序


然后就是擦除 uboot 了,记得使用串口来擦除。

有几点需要注意:
  • 由于编译服务器还没有创建,所以我把自己编译好的文件放网上了,你可以下载。

  • 文件路径根据你自己的实际路径,下载下来后存放的位置。

  • COM 口根据你之前设备管理器看到的那个 CH340 口选择。

  • 确保顶部选中的芯片是 3518ev300。

  • 传输方式选择串口。

  • 按分区烧写。

  • 器件类型 spi nor。

  • 开始地址 0,长度 1M。

  • 点击擦除后 10 秒内拔插 usb 电源线接口(即接 4 个针脚的那个 usb 口,小的那个 usb 头,让板子重启。


很快就能看到擦除成功的提示:

07

烧录系统


主要注意如下几点:
  • 使用 usb 口烧录(不是串口

  • 现在需要烧录 4 个文件(通过右侧绿色+可以添加文件

  • 每个文件的名称,器件类型,地址,长度要填写正确。

  • 最后点击烧写。


然后等待烧写成功:

如果你的烧写不成功,请检查之前的 usb 驱动是否已安装。

08

登录开发板


鸿蒙系统烧录好以后,就可以进去看一下鸿蒙系统的模样了。
双击 MobaXterm_Personal_20.2.exe. 也可以用你自己喜欢的终端工具。然后点击 Session,在弹出的窗口中填好相关字段。

点击 OK 以后,会进入下面这个界面:

这里是 uboot 程序的界面,还没有进入鸿蒙 OS,原因是 uboot 此时不知道鸿蒙 OS 的启动地址。然后我们设置启动地址。


09

设置 OS 启动地址


setenv bootcmd "sf probe 0;sf read 0x40000000 0x100000 0x600000;go 0x40000000";
setenv bootargs "console=ttyAMA0,115200n8 root=flash fstype=jffs2 rw rootaddr=7M rootsize=8M";


保存配置:

saveenv


然后重启:

然后,很快就可以看到鸿蒙 OS 起来了。

如果你没有看到 OHOS# 字样,请按下几次 enter 键。接下来,我们手动运行一个鸿蒙的程序。


10

运行可执行程序


进入 bin 目录,运行 writer 程序(这个程序是我新增的,如果你的开发板上没有,你可以运行 ./camera_app 程序

11

创建编译服务器


为了省去搭建编译环境的繁琐,本次将一个已经搭建好的编译服务器制作成镜像。我们只需要使用这个镜像即可获得编译环境。

镜像文件比较大(超过 8G),请直接找老师获取,也可以去前言提到的地方下载(建议晚上睡觉时下载)。

本次使用的 Ubuntu 是不带桌面环境的。内部已经安装好 HarmonyOS 的编译环境,并且安装了 samba 文件共享工具,方便 windows 访问。


请先安装 VMWARE WorkStation 软件,然后打开它, 选择文件→打开。

然后开始了服务器创建过程,这个过程比较漫长,请保持耐心。


12

访问服务器


服务器创建完成后。然后我们对它进行上电启动:

等待服务器开机。1 分钟内一般就能正常起来。这个过程中,注意保持网线插入,因为虚拟机和 PC 之间是通过有线网卡桥接的。启机过程有软件会探测网络是否在,否则会很慢。


当屏幕输出变慢后,我们就可以访问它了,当然也可以在黑窗口里面直接键入各种命令,不过不方便。

把鼠标放入黑窗口,点击以后,鼠标焦点就进入黑窗口了,让焦点退出来的方法是按 CTRL+g。


如果想在黑窗口操作 linux 相关命令,则键入用户名 compile,密码 compile。一般我们不在黑窗口操作。

我们需要如下2种方法来访问虚拟机:
  • 通过 ssh 访问,即可以远程登录虚拟机的 shell,并执行命令。

  • 通过文件共享访问,可以在 windows 上查看和修改虚拟机中的文件。


注意:

  • 当前创建的虚拟机采用的是桥接模式,它的 IP 地址为 192.168.2.20。你需要确保虚拟机中的 IP 地址和自己 PC 的 IP 地址在同一个网段。

    最简单的方法是在自己的网卡上添加一个 192.168.2.X 网段的 IP 地址。Windows 添加 IP 地址的方法请自行查阅。

  • 如果多台编译服务器在同一个局域网络,那么 IP 地址会冲突,因为都是 192.168.2.20。所以,需要对地址进行修改。


13

SSH 访问


点击 OK 以后,就登录到了编译服务器的 shell。

14

文件共享访问


为了从 Windows 访问编译服务器上的源代码和编译出的目标文件,在编译服务器上已经安装好了 samba 文件共享服务,只需要在 windows 这边映射网络驱动器即可,按如下方法操作。

右键点击计算机,选择映射网络驱动器。

然后就可以在 windows 看到编译服务器上的内容了。

现在开始,你就可以像操作 windows 的文件一样来操作编译服务器里面的文件)比如通过 Visual Studio 来修改服务器上的 C/C++ 代码文件


15

编译产品


整个工程是存放在 ~/harmonyos/openharmony 目录,得先进入这个目录,然后执行 python 脚本来编译产品。

如下红色框即编译整个产品:

特别提醒:

python build.py ipcamera_hi3518ev300 -b debug


编译 debug 版本才会含有调试的 shell,如果省略 -b debug,无法通过 shell 命令行执行命令。

大约需要 10 多分钟完成产品编译,编译成功后,结果如下:

然后在 windows 文件夹下可以看到编译出来的结果:

每次系统烧录时,将上述 3 个文件以及 uboot 文件:

(Z:\vendor\hisi\hi35xx\hi3518ev300\uboot\out\boot\u-boot-hi3518ev300.bin)


拷贝到 windows 某个目录下(比如我的例子中的 D:\BIN),然后用 HiTool.exe 来烧录。


16

更新源码


鸿蒙系统目前更新比较频繁,如果需要获取最新版本,请执行下面的命令更新源码。

这里有一个问题:编译服务器预设的 192.168.2.20 无法上网。这个时候你可以再添加 1 个 IP 地址(添加可以上网的 IP 地址

然后再执行下面 2 条命令:
cd ~/harmonyos/openharmony
repo sync -c


待贴图...


17

编译组件


编译完整产品比较耗时,大多数时候我们修改的代码较少,只需要编译指定的组件就行了。

由 -T 指定编译一个已经存在的组件,只编译一个小组件,速度飞快。

注意,编译组件的时候 -T 后面的路径需要使用全路径。如何确定 -T 后面的参数?请看下图。

文本编辑器(如 notepad++)打开 build/lite/product/ ipcamera_hi3518ev300.json 文件:

这个组件涉及的代码文件是哪些呢,继续看对应目录的 BUILD.gn 文件,对于此例子为 applications/sample/camera/app:

生成的程序在下面这个目录:

18

打通网络


设备本身没有以太口,只有 wifi 接口。但默认情况下 wifi 是无法工作的。输入 ifconfig 你会看到 wlan0 接口 IP 地址为 0。

需要做如下工作才能让 wifi 正常运行起来:
  • 配置 SSID 和密码

  • 修改 wpa_sample.c 源码

  • 配置自启动

  • 编译系统


19

配置 SSID 和密码


修改:

applications\sample\camera\communication\wpa_supplicant\configwpa_supplicant.conf


修改后的内容如下。这个文件的目的是配置 wifi 用户名和密码:

country=GB
ctrl_interface=udp
network={
        ssid="teacher"
        psk="12345678qwe"
    }


注意:
  • = 号 2 端不要留空格。

  • ssid 和 psk 按你自己的实际进行配置,比如你手机热点的网络名和密码。


20

修改源码


修改 applications\sample\camera\communication\wpa_supplicant\src\wpa_sample.c 源代码。

只修改 main 函数部分。这个程序的目的是读取 wifi 用户名和密码配置文件,并进行 wifi 连接。

int main(int argc, char *argv[])
{
    g_wpaArgc = argc;
    for (int i = 0; i < g_wpaArgc; i++) {
        g_wpaArg[i] = argv[i];
    }

    g_wpaArgc=5;
    g_wpaArg[1] = "-i";
    g_wpaArg[2]="wlan0";
    g_wpaArg[3]="-c";
    g_wpaArg[4]="/etc/wpa_supplicant.conf";

    int ret = pthread_create(&g_wpaThread, NULL, ThreadMain, NULL);
    if (ret != 0) {
        printf("[WpaSample]create thread failed error:%s.\n", strerror(ret));
        return 1;
    }
    pthread_join(g_wpaThread, NULL);
    return 0;
}


21

配置自启动


刚才修改的 main 会生成一个可执行程序,这个程序我们需要把它配置在启动脚本中,这样每次板子重启都会运行这个程序。

修改文件 vendor\huawei\camera\init_configs\ init_liteos_a_3518ev300.cfg  ,红色部分为新增:

{
    "jobs" : [{
            "name" : "pre-init",
            "cmds" : [
                "mkdir /storage/data/log",
                "chmod 0755 /storage/data/log",
                "chown 4 4 /storage/data/log",
                "mkdir /storage/data/softbus",
                "chmod 0700 /storage/data/softbus",
                "chown 7 7 /storage/data/softbus",
                "mkdir /sdcard",
                "chmod 0777 /sdcard",
                "mount vfat /dev/mmcblk0 /sdcard rw,umask=000",
                "mount vfat /dev/mmcblk1 /sdcard rw,umask=000"
            ]
        }, {
            "name" : "init",
            "cmds" : [
                "start shell",
                "start apphilogcat",
                "start foundation",
                "start bundle_daemon",
                "start media_server",
                "start appspawn",
  "start wpa_supplicant"
            ]
        }, {
            "name" : "post-init",
            "cmds" : [
                "chown 0 99 /dev/dev_mgr",
                "chown 0 99 /dev/hdfwifi",
                "chown 0 99 /dev/gpio",
                "chown 0 99 /dev/i2c-0",
                "chown 0 99 /dev/i2c-1",
                "chown 0 99 /dev/i2c-2",
                "chown 0 99 /dev/uartdev-0",
                "chown 0 99 /dev/uartdev-1",
                "chown 0 99 /dev/uartdev-2",
                "chown 0 99 /dev/spidev0.0",
                "chown 0 99 /dev/spidev1.0",
                "chown 0 99 /dev/spidev1.1"
            ]
        }
    ],
    "services" : [{
            "name" : "foundation",
            "path" : "/bin/foundation",
            "uid" : 7,
            "gid" : 7,
            "once" : 0,
            "importance" : 1,
            "caps" : [10111213]
        }, {
            "name" : "shell",
            "path" : "/bin/shell",
            "uid" : 2,
            "gid" : 2,
            "once" : 0,
            "importance" : 0,
            "caps" : [4294967295]
        }, {
            "name" : "appspawn",
            "path" : "/bin/appspawn",
            "uid" : 1,
            "gid" : 1,
            "once" : 0,
            "importance" : 0,
            "caps" : [267823]
        }, {
            "name" : "apphilogcat",
            "path" : "/bin/apphilogcat",
            "uid" : 4,
            "gid" : 4,
            "once" : 1,
            "importance" : 0,
            "caps" : []
        }, {
            "name" : "media_server",
            "path" : "/bin/media_server",
            "uid" : 5,
            "gid" : 5,
            "once" : 1,
            "importance" : 0,
            "caps" : []
        }, {
            "name" : "wms_server",
            "path" : "/bin/wms_server",
            "uid" : 6,
            "gid" : 6,
            "once" : 1,
            "importance" : 0,
            "caps" : []
        }, {
            "name" : "bundle_daemon",
            "path" : "/bin/bundle_daemon",
            "uid" : 8,
            "gid" : 8,
            "once" : 0,
            "importance" : 0,
            "caps" : [01]
        },{
     "name""wpa_supplicant",
     "path""/bin/wpa_supplicant",
     "uid" : 0,
     "gid" :  0,
     "once" : 1
     "importance" : 0,
     "caps": [] 
 }
    ]
}


22

编译系统


此时我们配置好了 wifi 用户名和密码,也修改了 wifi 启动程序并设置好了启动脚本。接下来我们把这些修改编译到系统中,然后再烧录到板子上。

当完整编译系统,烧录好以后,新版本的系统起来以后,我们可以看到 wlan0 的接口的 IP 地址正常获取到了。

23

部署 NFS


当网络打通以后,我们就可以部署 NFS(网络文件系统)了。部署 NFS 最大的好处是,可以将 windows 的某个文件夹当成开发板上的文件夹来使用,这样,不需要把编译的程序手动拷贝到开发板去,就可以执行编译出来的程序。


主要分为如下 3 个过程:
  • 安装 NFS Server

  • 配置和启动 Server

  • 挂载 NFS


24

安装 NFS


在 PC 上安装 NFS 服务器。双击 nfs1169.exe 进行安装,同常规软件安装方法。


25

配置 NFS


安装好以后,就是配置了,这一步稍微麻烦。首先需要以管理员身份运行 NFS 服务器。

开始→所有程序→haneWIN 软件→NFS→NFS 服务器(右键点击--选择(以管理员身份运行

编辑输出表文件,如下:

然后保存,然后我们配置防火墙,使得 NFS 相关的网络通信畅通。先看需要放行哪些端口。

需要放行的端口有: 111, 1058, 2049。TCP 和 UDP 都需要。然后我们配置放行这些端口(即允许这些端口的流量通过

控制面板\系统和安全\Windows 防火墙:

确保规则已配置好。然后重启防火墙(关闭防火墙,再打开防火墙)。

26

重启 NFS


开始---所有程序---haneWIN 软件---NFS---重启所有服务(以管理员身份运行


27

挂载 NFS


在开发板 shell 界面,挂载 NFS。

先确保开发板和 PC 之间能互通(可以从 PC ping 开发板。我的开发板和 PC 都通过 wifi 连接手机热点,所以在一个网段,能互相 ping 通。然后开发板上面执行下面的命令。

除了 IP 地址调整成你 PC 的地址,其它信息照抄。挂载成功会显示 finished 如红框所示。

然后我们就可以执行 windows 上的程序了。

在我的机器上,上述文件存放在 d:\BIN 目录。因为这个目录我配置成了 NFS Server 的根目录,所以,能从开发板上看到并运行它们。

上述这些内容,是通过从编译服务器拷贝出来的。如何拷贝,请参阅访问虚拟机章节。


28

添加组件


如果我们要新增程序怎么处理。请仿照范例中的 camer_app 处理。具体如下,比如我新增了一个 reader 程序,一个 writer 程序。以下描述 reader 的添加逻辑。
 

在 applications\sample\camera 目录下,将 app 目录复制一份,改名为 reader:

然后修改 reader 里面的文件。先修改 BUILD.gn:

然后源码根据自己的实际情况修改。最后修改编译脚本 build\lite\product\ ipcamera_hi3518ev300.json。添加红框中的一行,然后按组件编译方式编译就可以了。

编译好的程序在 out\ipcamera_hi3518ev300\bin 目录下。


👇扫码关注鸿蒙技术社区👇

专注开源技术,共建鸿蒙生态


“阅读原文”了解更多

文章转载自鸿蒙技术社区,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论