大信 ALSET (QQ:8125036)

         感谢地平线科技给予的RDK X3Module开发板试用机会。地平线RDK X3 Module开发板是由X3 核心模块和底板组成。其核心模块就是RDK X3 Module模块。RDK X3 Module的全称是Horizon Robotics Developer Kit X3 Module,其搭载了地平线旭日3系列高性能的智能芯片,具备强大端侧计算能力与地平线公司推出的开源TogetheROS.Bot机器人操作系统。

        RDK X3 Module设计兼容树莓派CM4,方便使用者快速集成各种应用解决方案。RDK X3 Module基于Quad-core ARM® Cortex® A53@1.5G核心,并且具备Dual-core Bernoulli Arch, ~5Tops AI推理计算能力。并且具备H264,H265的实的编解码多媒体能力,还具有MIPI DSI/CSI HDMI输出能力。

       从其硬件能力推测这个模块可以再高级图形图像处理、高级成像、高级机器视觉、机器人控制等嵌入式应用等跨领域应用场景有广泛的适用。

一、开箱套件介绍

      收到快递后,非常惊讶的是很小的一个包装,几乎怀疑是不是快递送错了东西。如上图,大小是一个火柴盒的东西,打开包装后,包装内物品就是RDK X3 模块,没有更多多余的东西,可谓简洁明了。对照其宣传资料真实难以置信这么强大的硬件却只有如此小巧的身材

取出静电包装中的模块,非常精致:

主控芯片近看,可清晰的看到地平线的LOGO

     核心板大约5cmX4cm大小,模块整体是黑金风格PCB板,白色丝印,核心板通过 200 pin BTB接口插入底板座中,核心板的对外接口兼容树莓派4B,因此可以使用很多树莓派的底板来验证的该模块的硬件设计方案,并且可以很快转到产品化设计上,大大减少硬件开发的时间,缩短产品开发到成品的周期。

二、核心板介绍

     核心板采用10层高密度高速PCB设计,沉金工艺生产,独立的接地信号层,无铅;在大小为55mmx40mm的板上集成了地平线旭日3芯片,LPDDR4eMMCPMIC电源管理等芯片。

核心板功能逻辑结构图如下

三、核心模块主要技术参数

在对板子动手之前,有必要线看一下板子的技术参数:

CPU

Quad-core ARM® Cortex® A53@1.5G

BPU

Dual-core Bernoulli Arch, ~5Tops

内存

2GB/4GB LPDDR4 RAM

存储

16G/32G/64G eMMC or Micro SD

多媒体

H.265 (HEVC) Encoding and Decoding   Main profile, L5.1 4K@60fps

H.264 Encoding and Decoding     Baseline/Main/High profiles, L5.1
4k@60fps.

JPEG Encoding and Decoding      16Mpixels

CBR, VBR, AVBR, FixQp and QpMap bitrate control

Sensor接口

1 x 4-lane MIPI CSI

2 x 2-lane MIPI CSI

USB接口

1 x USB3.0

Debug串口

1 x UART,Debug串口

显示接口

1 x HDMI 1.4 (up to 1080p60 )

1 x MIPI-DSI (up to 1080p60)

无线网络接口

WiFi/Bluetooth二合一模块(可选)

WiFi 2.4GHz/5GHz、Bluetooth 4.2

有线网络接口

1 x GPHY

其他IO

32 x GPIOs:

3 x UART、2 x SPI、2 x I2S、4 x I2C、PWM等

电源输入

5V 3A

 

该模块的开发文档在这里:

https://developer.horizon.ai/api/v1/fileData/documents_rdk/index.html

该模块的软件资料下载链接:

http://archive.sunrisepi.tech/downloads

四、开发板上电启动

先连组装核心板和底板,把核心板扣在底板上,在扣下时,听到清脆的啪一声,即为扣紧了。并且在开发板上接好各个连线,鼠标,键盘,HDMIM显示器,网线,然后准备一个12V3A的电源,使用5.2mm的同心电源插口,给开发板供电,组装完成如下图。

插入电源后,课件到电源指示LED亮起,几秒后系统运行指示LED亮起,说明开发板运行正常。

此时连接HDMI的显示器显示出系统的桌面,即系统默认的Ubuntu20的桌面图像:

五、连接开发板串口

核心模块连接地板后组成完整的开发板,开发板可以通过USB串口或者网络方式连接到开发主机。该开发板底板集成了USBUART 的功能,可以直接使用micro USB线,连接开发板和电脑。

micro USB线接入底板debug USB口上,另外一头插入笔记本电脑USB口中,查看系统设备管理,出现新的串口提示:

可见低板上的USB转串口使用的是CH340芯片,因为电脑里已经安装过该USBUART的驱动,因此直接支持可用,如果没有装CH340的驱动,可以网上搜索CH340系列的USB2UART的驱动安装即可支持。

然后在电脑上使用 SccureCRT 终端软件启动快速连接,选择serial连接设定串口通讯各参数,速率921600, 8,N,1,点连接开发板,出现终端窗口提示连接成功。在连的时候,要把 RTS/CTS 选项去掉,否则串口只能接收信息无法发送信息。

由于开发板内的emmc已经内置了默认的系统,可以直接从emmc中启动。因此接上电源就可以从串口看到启动时输出的信息了。

启动完成,进入终端用户登录提示,输入 root ,密码root即可以登录

六、查看主机系统信息

串口连接正常后,就可以先查看一下主机基本的硬件信息,如CPU,内存,文件系统的信息,显示如下:

查看 CPU 信息cat /proc/cpuinfo

内存硬件信息:cat /proc/meminfo

文件系统挂载信息:

df –h

然后查看网络信息,如下:

   这个默认网卡配置信息是系统/etc/dnsmasq.conf:#dhcp-boot=pxelinux,server.name,192.168.1.100 文件默认配置。

七、网络地址配置

    这个地址因为跟我所在的局域网不通,并不是我们需要的地址,而且每次在桌面上修改这个地址,启动后这个IP地址会变回原样,因此有必要设置为一个静态地址,方式是在系统里添加静态配置文件:

/etc/systemd/network ,添加 10-static-eth0.network 文件,内容如下:

[Match]
Name=eth0

[Network]
Address=192.168.3.160/24
Gateway=192.168.3.1
DNS=8.8.8.8

重新启动网络系统,地址变为所设置的静态地址了,查看网卡地址已正确了。

执行:systemctl restart systemd-networkd

ping网关和互联网主机通信终于正常了,如下图:

八、使用SSH进行远程登录

   在连接好网线,测试号板子的以太网络后,就可以建立SSH的远程登录功能了,这也是为后续开发传输文件等必不可少的方式。这里使用 SecureCRT 8.7.1 版本软件,低于此版的会登录不成功。

建立SSH连接,使用用户名sunrise,密码sunrise ,就可以直接就登录进入了开发板了。

至此,成功的建立了串口和有线网络连接PC主机的通道。可以通过网络登录板子进行命令操作,也可以上传文件。

需要注意的是,SSH用户名不能使用root,SSH进入系统后也不能使用通过su提权的方式使用root账号,推测是系统为了安全起见限制了通过网络登录开发板的用户的账号的限制。再ssh普通用户登录,使用su提权时,会提示:

到此就建立好开发板的基本工作环境,可以进行下一步的开发测试相关工作了。

九、板上编译测试C/C++程序

为了后续的测试使用,需要检查一下板上的开发环境,经过测试,发现板上系统带有gcc的编译器和python执行器,意味着一些简单的开发可以在板上进行,那么这里就先测试一下开发板上的编译环境,先测试一个简单的hello,worldc程序:

写一个hello测试程序:

再写一个Makefile

然后编译,运行,结果如下图:

可见输出了正确的结果,表示板上的c/c++编译工具链基础完备。

再写一个C++代码,使用 bbp 算法计算1000位圆周率的代码,如下:

#include <iostream>
#include <math.h>
#include <stdio.h>
#include <time.h>

using namespace std;

double bbp(int n, int k, int l)
{
	int i;
	long b = 1;
	double c = 1;
	if (n > k)
	{
		for (i = n - k; i != 0; i--)
			b = (b * 16 + 0) % (8 * k + l);
		return(((double)b) / ((double)(8 * k + l)));
	}
	else
		if (n == k)
			return(((double)1) / ((double)(8 * k + l)));
		else
		{
			for (i = 0; i < (k - n); i++)
				c = c / 16;
			return(c / (8 * k + l));
		}
};

void pi(int m, int n, int p[])
{
	double a = 0;
	int k = 0;
	while (k < (n + 8))
	{
		a += 4 + 4 * bbp(n, k, 1) - 2 * bbp(n, k, 4) - bbp(n, k, 5) - bbp(n, k, 6);
		a = a - (int)a;
		k++;
	}
	for (k = 0; k < m; k++)
	{
		a *= 16;
		p[k] = (int)a;
		a = a - (int)a;
	}
}
void div(int p[])
{
	int i, j = 0;
	for (i = 0; i < 300; i++)
	{
		p[i] = j * 10000 + p[i];
		j = p[i] % 2;
		p[i] = p[i] / 2;
	}
}
void add(int a[], int b[])
{
	int i, j = 0;
	for (i = 299; i >= 0; i--)
	{
		a[i] = a[i] + b[i] + j;
		if (a[i] >= 10000)
		{
			a[i] -= 10000;
			j = 1;
		}
		else
			j = 0;
	}
}

void pi_calc()
{
	int i, j, p[1100] = { 0 }, r[300] = { 0 };
	short q[4000];
	for (i = 0; i < 125; i++)
		pi(8, i * 8, p + i * 8);
	for (i = 0; i < 1000; i++)
	{
		j = p[i];
		q[i * 4 + 3] = j % 2;
		j = j / 2;
		q[i * 4 + 2] = j % 2;
		j = j / 2;
		q[i * 4 + 1] = j % 2;
		j = j / 2;
		q[i * 4 + 0] = j % 2;
		p[i] = 0;
	}
	p[0] = 10000;
	for (i = 0; i < 4000; i++)
	{
		div(p);
		if (q[i])
			add(r, p);
	}
	//cout<<3<<" ";//
	printf("3.");
	for (i = 0; i < 250; i++)
		printf("%04d", r[i]);
	for (i = 0; i < 0; i++)
	{
		if (r[i] < 10)
			cout << "000";
		else
			if (r[i] < 100)
				cout << "00";
			else
				if (r[i] < 1000)
					cout << "0";
		cout << r[i];
	}
	cout << endl;
}

int main() {
	clock_t start, finish;
	double duration;
	printf("Time start...\n ");
	start = clock();
	pi_calc();
	finish = clock();
	duration = (double)(finish - start) / CLOCKS_PER_SEC;
	printf("Escaping %f seconds\n", duration);
	return 0;
}

再在上面Makefile基础上修改一下,写一个c++程序的编译脚本,如下:

target = pi
src = pi_bbp.cpp
objs = $(patsubst % .c, % .o, $(patsubst % .cpp, % .o, $(src)))

.phony: all

all:$(objs) $(target)

% .o : % .cpp
   $(CXX) - I . - c - o $@ $<

$(target) : $(objs)
	$(CXX) - o $(target) $(objs)

clean:
   @rm - rf * .o $(target) * .bak

然后编译如下:

运行,结果如下:

可见,产生1000位圆周率只用了1.9秒,用时是之前NXP的一款imx6处理器开发板的1/5,可谓速度提升了5倍之多

十、使用测试总结

        本次从拿到X3模块到连接网络,建立与主机的通讯,成功的建立了串口和有线网络连接PC主机的通道,并且使用开发板内自带的编译环境测试了c/c++程序,测试总体顺利,使用起来非常方便,也初步的体验到了该模块的强大性能。构建的SSH可以通过网络登录板子进行命令操作,也可以上传文件,为后续的测试开发搭建了基础的环境。

      本次测试总体感受非常不错,X3模块和底板各个接口提示非常明确,按提示插接即可组装成为开发平台,再连接串口和网络,简单的设置就能够建立完整的开发测试工作环境,对于熟悉linux开发的人来说,上手非常容易,并且和在PC上开发并无大异,而其强大的性能,足以让使用者产生是在使用PC的错觉。

      做完基本的了解和测试后,就开始准备更进一步的开发和测试了。