Astra Yocto Linux用户指南

概述

本文档介绍 Astra Linux 操作系统环境, 以及板级支持包(BSP)。它提供了关于构成BSP的组件以及如何与它们对接的信息。

支持的硬件

本指南涵盖以下参考套件和平台:

  • Astra系列 AI开发套件(Foundation)SL1620

  • Astra系列 AI开发套件(Foundation)SL1640

  • Astra系列 AI开发套件(Foundation)SL1680

参考资料

介绍

Astra Linux板级支持包(BSP)包含操作Astra系列 AI开发套件所需的软件和固件。 它包含启动操作系统和与硬件接口所需的组件。 本指南提供了这些软件组件的说明以及如何与它们进行接口的信息。 本文对于想要评估Astra系列 AI开发套件并使用这些处理器构建产品的用户非常有用。

本文档涵盖了Linux操作系统使用的组件。 为Astra系列 AI开发套件设置构建环境并基于Yocto创建映像的相关说明,请参阅 Astra Yocto Linux开发人员指南

关于Astra系列 AI开发套件硬件的具体信息, 请参阅 Astra系列 AI开发套件 页面,并在 Synaptics Astra GitHub page 上可以找到源代码库。

Astra系列 AI开发套件接口

存在几种与Astra系列 AI开发套件交互的方法, 包括在外部显示器上使用图形桌面。此外,可以通过SSH、ADB和串行控制台进行Shell访问。

图形桌面

Astra系列 AI开发套件的图形桌面是默认启用的。 HDMI端口接入的外部显示器或MIPI显示器上可以显示。 接入标准的HID USB键盘和鼠标可以输入。

wayland-desktop.jpg

Astra系列 AI开发套件上的Wayland桌面

点击左上角的图标将打开一个终端。

wayland-terminal.jpg

打开终端的Wayland Desktop

备注

当前SL1620不支持HDMI

SH Shell

Astra 开发套件默认启用ssh。 通过网络接受来自ssh客户端的连接。使用 root 用户名登录。无需密码:

ssh root@10.10.10.100

备注

在上面的示例中, Astra 开发套件的地址是 10.10.10.100 。请将此IP替换为您的设备IP地址。

ADB Shell

Astra 开发套件支持USB上的Android Debug Bridge(ADB)。 ADB应用于Android设备,并已移植到Astra 开发套件上。谷歌在 这里 提供了大量关于ADB的文档。

要使用ADB,请将USB线将主机系统与Astra 开发套件的USB Type-C USB 2.0端口相连(靠近以太网口)。

usb-c.png

Astra 开发套件 组件图,红框为USB Type-C USB 2.0端口

Google为Mac、Linux和Windows提供了不同版本的ADB。 安装ADB后,请运行 adb devices 以查看连接到主机的所有ADB设备。 然后运行:

adb shell

或者,如果有多个ADB设备:

adb -s SL16x0 shell
powershell-adb.png

在Windows PowerShell中使用ADB

串行控制台

Astra系列 AI开发套件提供了一个串行控制台, 用于在运行在主机系统上的终端仿真器上显示来自Bootloader和操作系统的消息。 在启动过程的早期或显示器未连接时,这些消息有助于确定Astra 开发套件的状态。 它还可以在操作中提供有用的信息。在固件更新过程中,串行控制台也是需要的。

设置串行控制台

通过将USB-TTL适配器连接到40针GPIO连接器的RX、TX和GND引脚,可以访问Astra RDK上的串行控制台。 USB-TTL适配器可以是带有跳线的板,也可以是带有独立引脚的集成USB电缆。

USB TTL

Astra 开发套件

GND

GND(Pin 6)

RXD

TX(Pin 8)

TXD

RX(Pin 10)

备注

RX 和 TX 管脚工作在3.3V典型电压下。

以下的USB-TTL适配器已正式确认可与Astra系列AI开发套件配合使用:

Adafruit USB to UART Debug / Console Cable (CP2102 Driver IC)

管脚功能

颜色标识

Astra SL16x0 40针连接器

Astra SL16x0 40针功能

5V-Out

Red

NC

NC

TX-Out

Green

Pin-10

UART0_Rx-In

RX-In

White

Pin-8

UART0_Tx-Out

GND

Black

Pin-6

GND

CenryKay USB转UART调试/控制台 线 (CH340G驱动IC)

管脚功能

颜色标识

Astra SL16x0 40针连接器

Astra SL16x0 40针功能

5V-Out

Red

NC

NC

TX-Out

Green

Pin-10

UART0_Rx-In

RX-In

White

Pin-8

UART0_Tx-Out

GND

Black

Pin-6

GND

备注

使用 PL2303FT232R 驱动IC的USB-TTL线 尚未 被确认为Astra系列AI开发套件中可配套使用的配件。

usb-ttl-board.png

示例,USB TTL板

usb-ttl-cable.png

示例, USB TTL cable

board-ports.png

含标注的40 GPIO接头的Astra 开发套件

40-pin-connector.png

Astra 开发套件的40针GPIO接头引脚分配

某些USB-TTL适配器需要在Windows和Mac主机上安装驱动程序。 请向适配器制造商咨询下载和安装驱动程序的说明。

可以使用终端模拟器程序(如 Putty 、HyperTerminal、 Tera-Term 、Screen或Minicom)访问串行控制台。

putty.png

Windows上的Putty终端仿真器

configure-minicom.png

Mac操作系统上的Minicon终端模拟器

Linux操作系统登录

Linux成功启动后,串行控制台中将显示登录提示。请使用 root 用户名登录。无需密码。

login-prompt.png

在Minicom中看到的启动成功

多媒体

Astra系列 AI开发套件包含可加速处理多媒体工作负载的硬件和软件组件。 Linux BSP提供多个Gstreamer插件,用户可应用这些多媒体组件来开发程序以提升多媒体性能的。 本节概述了如何使用Gstreamer命令行界面来应用这些插件构建管道。有关Gstreamer框架的信息,请访问 https://gstreamer.freedesktop.org/

Gstreamer插件

Gstreamer用插件模块来扩展Gstreamer功能。 Astra 开发套件用插件来使其硬件组件能被Gstreamer管道使用。 下表格列出了Astra 开发套件支持的编解码器所用的插件。

视频编解码器

SL1620

编解码器

解析器插件

解码器插件

编码器插件

H.264

h264parse

avdec_h264

N/A

H.265

H265Parse

avdec_h265

N/A

VP8

N/A

avdec_vp8

N/A

VP9

vp9parse

avdec_vp9

N/A

SL1640 / SL1680

编解码器

解析器插件

解码器插件

编码器插件

H.264

h264parse

v4l2h264dec

v4l2h264enc

H.265

H265Parse

v4l2h265dec

N/A

VP8

N/A

v4l2vp8dec

v4l2vp8enc

VP9

vp9parse

v4l2vp9dec

N/A

AV1

av1parse

v4l2av1dec

N/A

音频编解码器

编解码器

解析器插件

解码器插件

编码器插件

AAC

aacparse

fdkaacdec

fdkaacenc

Vorbis

N/A

vorbisdec

vorbisenc

MPEG 2

mpegaudioparse

avdec_mp2float

avenc_mp2

MPEG 3

mpegaudioparse

avdec_mp3

N/A

AC3

N/A

avdec_ac3

avenc_ac3

OPUS

N/A

avdec_opus

avenc_opus

插件信息

Astra系列套件包含 gst-inspect-1.0 命令,可用于显示系统上可用插件的信息。

gst-inspect-synainfer.png

示例, gst-inspect-1.0 --no-colors synapinfer 命令的输出

备注

如果您的终端不支持颜色,您可能需要使用 –no colors 选项来禁用颜色。

Gstreamer示例

以下这些示例,使用gst-launch-1.0命令行程序来构造一个管道并启动播放。 gst-launch-1.0命令接受一个由感叹号分隔的元素类型列表。 这些元素也可含有可选属性(更多详情,请参阅 GStreamer文档 )。以下示例将显示该命令的结构,提供简要说明,并附一个或多个示例。

媒体播放

音频接收器

以下示例使用ALSA音频接收器通过ALSA音频API来输出音频(更多详情,请参阅 GStreamer文档。 )。示例所用设备 hw:0,7 对应于SL1680上的HDMI输出设备。硬件设备可以在文件 /proc/asound/pcm 中找到。下面是SL1680上的pcm设备示例。Device 0-7对应于HDMI设备,并在下面的示例中使用。

示例, SL1680的 /proc/asound/pcm 输出:

root@sl1680:~# cat /proc/asound/pcm
00-00: soc-i2so1 snd-soc-dummy-dai-0 :  : playback 1
00-01: soc-i2so3 snd-soc-dummy-dai-1 :  : playback 1
00-02: soc-dmic snd-soc-dummy-dai-2 :  : capture 1
00-03: soc-i2si2 snd-soc-dummy-dai-3 :  : capture 1
00-04: btsco-in snd-soc-dummy-dai-4 :  : capture 1
00-05: soc-i2s-pri-lpbk snd-soc-dummy-dai-5 :  : capture 1
00-06: soc-i2s-hdmi-lpbk snd-soc-dummy-dai-6 :  : capture 1
00-07: soc-hdmio snd-soc-dummy-dai-7 :  : playback 1
视频接收器

Astra开发套件上的支持两组视频接收器。 主视频接收器 waylandsink 使用wayland协议和合成器来显示视频输出. Astra开发套件还支持DRM KMS接收器,它使用 kmssink 直接向Linux DRM设备显示视频帧。

Wayland接收器

以下许多示例使用Wayland视频接收器创建窗口并渲染解码帧(有关更多详细信息,请参阅 GStreamer文档 )。

使用Wayland接收器时,请确保在您的环境中设置以下变量。 从串行控制台或远程shell运行命令时,可能需要设置这些变量:

export XDG_RUNTIME_DIR=/var/run/user/0
export WAYLAND_DISPLAY=wayland-1

XDG_RUNTIME_DIR 变量指定了包含属于用户的Wayland套接字的目录。 WAYLAND_DISPLAY 变量指定要连接到哪个WAYLAND合成器。

KMS接收器

KMS接收器支持显示视频,无需运行像Wayland这样的窗口系统,因为它可以直接与Linux DRM设备交互。 (有关更多详细信息,请参阅 GStreamer文档 )。

在使用 kmssink 之前,如果 Wayland 服务正在运行,请务必禁用它::

systemctl stop weston.service

您还需要识别主平面的平面id,并将此id提供给 kmssink 元素。 您可以使用 modetest 命令识别平面id:

modetest -M synaptics

平面id识别支持这些格式: NV12 NV21 UYVY VYUY YUYV YVYU

modetest-ouput.png

示例, SL1680上平面部分的 modetest 输出

备注

仅 SL1640 和 SL1680 支持 kmssink

音频播放

播放音频文件涉及读取和解析编码的音频数据,解码数据,并将其输出到音频接收器。 在将数据发送到音频接收器之前,某些数据格式和音频接收器可能还需要对数据做转换和重采样:

gst-launch-1.0 filesrc location=audio_file ! parser ! decoder ! [ convert ] ! [ resample ] ! audiosink

此示例使用外接 HDMI 设备的扬声器来播放 MP3 文件:

gst-launch-1.0 filesrc location=audio_file.mp3 ! mpegaudioparse ! mpg123audiodec ! audioconvert ! audioresample ! alsasink device=hw:0,7

视频播放

播放视频文件涉及读取文件、对视频流进行解复用、解析编码数据、以及使用视频解码器对数据进行解码。 最后,将解码后的帧输出到视频接收器:

gst-launch-1.0 filesrc location=video_file ! demux ! queue ! parser ! decoder ! videosink

以下示例播放MP4文件的主视频流, 并使用Wayland显示视频。

示例, SL1640/SL1680H265 编码视频文件:

gst-launch-1.0 filesrc location=test_file.mp4 ! qtdemux name=demux demux.video_0 ! queue ! h265parse ! v4l2h265dec ! waylandsink fullscreen=true

示例, SL1620H265 编码视频文件:

gst-launch-1.0 filesrc location=test_file.mp4 ! qtdemux name=demux demux.video_0 ! queue ! h265parse ! avdec_h265 ! waylandsink fullscreen=true

类似的示例,但在 SL1640/SL1680 上使用 AV1 编码的文件:

gst-launch-1.0 filesrc location=test_file.mp4 ! qtdemux name=demux demux.video_0 ! queue ! av1parse ! v4l2av1dec ! waylandsink fullscreen=true

示例, SL1640/SL1680 上使用 kmssinkH265 编码视频文件:

gst-launch-1.0 filesrc location=test_file.mp4 ! qtdemux name=demux demux.video_0 ! queue ! h265parse ! v4l2h265dec ! kmssink driver-name=synaptics plane-id=31

音视频文件播放

播放同时包含音频流和视频流的文件,需要创建解析和解码这两种流的管道:

gst-launch-1.0 filesrc location=video_file ! demux.video ! queue ! parser ! decoder ! videosink \
  demux.audio ! queue ! parser ! decoder ! [ convert ] ! [ resample ] ! audiosink

播放带有H265编码的视频流和AAC编码的音频流的MP4文件:

gst-launch-1.0 filesrc location=test_file.mp4  ! qtdemux name=demux \
  demux.video_0 ! queue ! h265parse ! v4l2h265dec ! queue ! waylandsink fullscreen=true \
  demux.audio_0 ! queue ! aacparse ! fdkaacdec ! audioconvert ! alsasink device=hw:0,7

录制

音频录制

音频录制包括从麦克风等捕获设备读取数据,对数据进行转换、编码和多路复用后,再写入输出文件:

gst-launch-1.0 -v alsasrc device=device ! queue ! convert ! encode ! mux ! filesink location=output file

以下示例录制来自 ALSA 捕获设备0,2的音频。 然后编码器将原始数据转换为可被Vorbis编解码器编码的格式。 一旦数据被编码,它就被多路复用到Ogg容器中并写入文件 /tmp/alsasrc.ogg

gst-launch-1.0 -v alsasrc device=hw:0,2 ! queue ! audioconvert ! vorbisenc ! oggmux ! filesink location=/tmp/alsasrc.ogg

摄像头

Astra系列 AI开发套件支持带有V4L2驱动程序栈的USB(UVC)摄像头。该栈可与Gstreamer一起构建管道来使用摄像头。

备注

只有使用SL1680 ISP的 SL1680 才支持图像传感器相机。

要将摄像头捕获的视频输出到视频接收器,请执行以下操作:

gst-launch-1.0 v4l2src device=/dev/videoX ! "video data,framerate,format,width,height" ! video sink

以下示例从V4L2设备 /dev/video2 读取捕获的数据,并在输出到wayland接收器之前应用了多功能过滤器:

gst-launch-1.0 v4l2src device=/dev/video2 ! "video/x-raw,framerate=30/1,format=YUY2,width=640,height=480" ! waylandsink fullscreen=true
图像传感器摄像头

SL1680包括一个集成ISP,并支持使用MIPI-CSI连接器连接图像传感器相机模块。 Gstreamer可以使用V4L2接口使用这些摄像头。 ISP支持3条输出路径,主路径支持输出4K分辨率(如果传感器支持4K),次路径支持2K分辨率。 每个路径在 /dev 中都有自己的视频设备文件。

以4K分辨率显示ISP主路径的视频:

gst-launch-1.0 v4l2src device=/dev/video0 ! 'video/x-raw, format=(string)NV12, width=(int)3840, height=(int)2160, framerate=(fraction)30/1' ! waylandsink

显示ISP次要路径1的视频:

gst-launch-1.0 v4l2src device=/dev/video1 ! 'video/x-raw, format=(string)NV12, width=(int)1920, height=(int)1080, framerate=(fraction)30/1' ! waylandsink

要显示ISP次要路径2中的视频,请执行以下操作:

gst-launch-1.0 v4l2src device=/dev/video2 ! 'video/x-raw, format=(string)NV12, width=(int)1920, height=(int)1080, framerate=(fraction)30/1' ! waylandsink

设备文件号可能因配置而异。您可以使用 v4l2-ctl 命令查找与每个ISP路径关联的设备文件。

isp-path-devices.png

v4l2-ctl --list-devices 输出,突出显示ISP Path设备

RTSP摄像头

Astra开发套件使用Gstreamer RTSP插件支持RTSP摄像头。

本示例将接收摄像机头的H.264编码数据流,并使用硬件解码将其显示在SL1640和SL1680上。 rtspsrc 元素通过网络连接到摄像头,并将延迟设置为2000毫秒。 延迟参数和 rtpjitterbuffer 元素用于缓存数据流来尽可能减少网络抖动。 rtph264depay 元素从H.264流中取出有效载荷。 其 wait-for-keyframe 选项会在输出数据流之前等待关键帧,来确保同步。 随后,使用 h264parsev4l2h264dec 元素解析和解码H.264流。 然后,使用wayland接收器在屏幕上显示解码后的视频:

gst-launch-1.0 rtspsrc location="rtsp://<user>:<password>@<ip>/stream" latency=2000 ! rtpjitterbuffer ! rtph264depay wait-for-keyframe=true ! \
    video/x-h264, width=1920, height=1080 ! h264parse ! v4l2h264dec ! videoscale ! video/x-raw,width=1920,height=1080 ! waylandsink

本示例使用软件解码,适用于SL1620、SL1640和SL1680:

gst-launch-1.0 rtspsrc location="rtsp://<user>:<password>@<ip>/stream" latency=2000 ! rtpjitterbuffer ! rtph264depay wait-for-keyframe=true ! \
    video/x-h264, width=1920, height=1080 ! h264parse ! avdec_h264 ! videoscale ! video/x-raw,width=1920,height=1080 ! waylandsink

多条RTSP流可同时显示。本示例使用 glvideomixer 元素来解码显示4条1080p RTSP流:

gst-launch-1.0 glvideomixer name=comp \
    sink_0::alpha=1 sink_0::xpos=0 sink_0::ypos=0 sink_0::width=960 sink_0::height=540 \
    sink_1::alpha=1 sink_1::xpos=960 sink_1::ypos=0 sink_1::width=960 sink_1::height=540 \
    sink_2::alpha=1 sink_2::xpos=0 sink_2::ypos=540 sink_2::width=960 sink_2::height=540 \
    sink_3::alpha=1 sink_3::xpos=960 sink_3::ypos=540 sink_3::width=960 sink_3::height=540 \
    ! queue2 ! videoconvert ! "video/x-raw, width=(int)1920, height=(int)1080, interlace-mode=(string)progressive, pixel-aspect-ratio=(fraction)1/1" ! waylandsink \
    rtspsrc location="rtsp://<user>:<password>@<ip>/stream1" latency=2000  ! rtpjitterbuffer ! rtph264depay wait-for-keyframe=true ! video/x-h265, width=1920, height=1080 !  h264parse ! v4l2h264dec ! comp.sink_0 \
    rtspsrc location="rtsp://<user>:<password>@<ip>/stream2" latency=2000  ! rtpjitterbuffer ! rtph264depay wait-for-keyframe=true ! video/x-h265, width=1920, height=1080 !  h264parse ! v4l2h264dec ! comp.sink_1 \
    rtspsrc location="rtsp://<user>:<password>@<ip>/stream3" latency=2000  ! rtpjitterbuffer ! rtph264depay wait-for-keyframe=true ! video/x-h265, width=1920, height=1080 !  h264parse ! v4l2h264dec ! comp.sink_2 \
    rtspsrc location="rtsp://<user>:<password>@<ip>/stream4" latency=2000  ! rtpjitterbuffer ! rtph264depay wait-for-keyframe=true ! video/x-h265, width=1920, height=1080 !  h264parse ! v4l2h264dec ! comp.sink_3

HDMI-RX

SL1680通过核心模块上的micro HDMI端口来支持从外部设备(HDMI-RX)来的HDMI输入流。 Gstreamer可以使用V4L2接口来处理和显示来自外部HDMI设备的视频和音频流。

sl1680-hdmi-rx.png

SL1680的HDMI-RX micro HDMI端口,见红框所示

HDMI-RX支持以下典型的PC视频源和V4L2视频源的视频格式。

可支持的格式
典型的PC视频格式

格式

每通道的Bit数

分辨率

RGB

8, 10, 12 bits

4K60

YUV422

8, 10, 12 bits

4K60

YUV444

8, 10, 12 bits

4K60

V4L2视频格式

格式

分辨率

NV12

4K60

UYVY

4K60

音频格式

通道数

采样率

Bit深度

2

48kHz

32 bit

V4L2设备文件号可能因配置而异。您可以使用 v4l2-ctl 命令查找与HDMI-RX设备关联的设备文件。

hdmi-rx-device.png

V4L2 HDMI-RX 视频设备文件

使用 arecord 命令来决定哪个ALSA capture设备与HDMI-RX相关联。

hdmi-rx-audio-capture-device.png

ALSA HDMI-RX 音频接收设备

使用 aplay 命令来决定使用哪个ALSA播放设备来播放捕获的音频。 以下示例将使用与HDMI接收器相关的扬声器。

sl1680-hdmi-output-device.png

HDMI 音频输出设备

此示例使用 waylandsink 来显示来自外部HDMI设备的2K30流:

gst-launch-1.0 v4l2src device=/dev/video6 ! video/x-raw,width=1920,height=1080,fps=30,format=NV12 ! waylandsink fullscreen=true

此示例使用 waylandsink 来显示来自外部HDMI设备的4K30流:

gst-launch-1.0 v4l2src device=/dev/video6 ! video/x-raw,width=3840,height=2160,fps=30,format=NV12 ! waylandsink fullscreen=true

此示例使用 kmssink 来显示来自外部HDMI设备的4K30流:

gst-launch-1.0 v4l2src device=/dev/video6 ! video/x-raw,width=3840,height=2160,fps=30,format=NV12 !  kmssink driver-name=synaptics plane-id=31

此示例使用 waylandsink 来显示带有文本的4K30流:

gst-launch-1.0 v4l2src device=/dev/video6 ! video/x-raw,width=3840,height=2160,fps=30,format=NV12 ! textoverlay text=”Sample Text” ! clockoverlay ! waylandsink fullscreen=true

此示例使用 waylandsink 启动2K30流,然后创建一个48K、S32_LE、双通道的音频管道。 音频将在HDMI接收设备的扬声器上播放:

gst-launch-1.0 v4l2src device=/dev/video6 ! video/x-raw,width=1920,height=1080,fps=30,format=NV12 ! waylandsink fullscreen=true &
gst-launch-1.0 alsasrc device=hw:0,8 ! queue ! audio/x-raw,format=S32LE,rate=48000,channnels=2 ! alsasink device=hw:0,7 sync=false

备注

FPS是由源设备来设置的,且必须在管道启动前完成源设备上的配置。

备注

kmssink 不支持4K60 输出。

Gstreamer Playbin插件

Astra 开发套件包含Gstreamer playbin插件。该插件可以基于自动文件类型识别来自动确定构建何种类型的管道(请参阅 GStreamer文档 )。这简化了管道的创建。

Playbin将自动检测位于指定 uri 的媒体文件, 并为其创建管道。然后,它将在视频接收器上显示视频,并在音频接收器上播放音频。 Video-sinkaudio-sink 的参数是可选的。 如果不带参数,则将使用默认的视频和音频接收器:

gst-launch-1.0 playbin uri=file:///path/to/file video-sink="video sink" audio-sink="audio sink"

使用playbin,音频接收器 中的示例可以简化为:

gst-launch-1.0 playbin uri=file:///path/to/file video-sink="waylandsink fullscreen=true" audio-sink="alsasink device=hw:0,7"

GStreamer SyNAP插件

Astra 开发套件提供了一个Sysnaptics Gstreamer AI插件( gstsynap ), 可在Gstreamer管道中添加ML处理。 该插件使用SyNAP框架与硬件加速器交互以提高ML处理的性能 ML处理。 有关SyNAP的信息,请参阅 使用SyNAP进行机器学习

Synaptics Gstreamer AI插件由两个插件组成。 gstsynapserence 插件使用SyNAP处理AI推理, gstsynapsoverlay 插件输出 gstsynapsidence 的结果,然后叠加在源数据之上。

gstsynapserence 插件可以在两种模式下操作它。 第一种模式输出结构化数据,以供 gstsynapsoverlay 使用。 它支持常见的用例,如绘制边界框或覆盖文本,而无需编写额外的代码。 以下是几个示例使用 gstsynapserence 进行推理并用 gstsynapsoverlay 覆盖结果。 这些示例显示了基于本地文件和外部USB摄像头运行的推理。 gstsynapserence 插件可以在两种模式下操作它。 第一种模式输出结构化数据,以供 gstsynapsoverlay 使用。 它支持常见的用例,如绘制边界框或覆盖文本,而无需编写额外的代码。 以下是几个示例使用 gstsynapserence 进行推理并用 gstsynapsoverlay 覆盖结果。 这些示例显示了基于本地文件和外部USB摄像头运行的推理。

示例,使用YOLOv8(USB相机源)进行物体检测:

gst-launch-1.0 v4l2src device=/dev/videoX ! video/x-raw,framerate=30/1,format=YUY2,width=640,height=480 ! videoconvert ! \
    tee name=t_data t_data. ! queue ! synapoverlay name=overlay label=/usr/share/synap/models/object_detection/coco/info.json \
    ! videoconvert ! waylandsink t_data. ! queue ! videoconvert ! videoscale ! video/x-raw,width=640,height=384,format=RGB  ! \
    synapinfer model=/usr/share/synap/models/object_detection/coco/model/yolov8s-640x384/model.synap mode=detector frameinterval=3 \
    ! overlay.inference_sink

示例,使用YOLOv8进行目标检测(视频):

gst-launch-1.0 filesrc location=video_file.mp4 ! qtdemux name=demux demux.video_0 ! queue ! h264parse ! avdec_h264 ! videoconvert ! \
    tee name=t_data t_data. ! queue ! synapoverlay name=overlay label=/usr/share/synap/models/object_detection/coco/info.json ! \
    videoconvert ! waylandsink t_data. ! queue ! videoconvert ! videoscale ! video/x-raw,width=640,height=384,format=RGB  ! \
    synapinfer model=/usr/share/synap/models/object_detection/coco/model/yolov8s-640x384/model.synap mode=detector frameinterval=3 \
    ! overlay.inference_sink

示例,使用YOLOv8(RTSP流)进行目标检测:

gst-launch-1.0 rtspsrc location="rtsp://<user>:<password>@<ip>/stream" latency=2000 ! rtpjitterbuffer ! rtph264depay wait-for-keyframe=true ! \
    video/x-h264, width=1920, height=1080 ! h264parse ! avdec_h264 ! videoconvert ! \
    tee name=t_data t_data. ! queue ! synapoverlay name=overlay label=/usr/share/synap/models/object_detection/coco/info.json ! \
    videoconvert ! waylandsink t_data. ! queue ! videoconvert ! videoscale ! video/x-raw,width=640,height=384,format=RGB  ! \
    synapinfer model=/usr/share/synap/models/object_detection/coco/model/yolov8s-640x384/model.synap mode=detector frameinterval=3 \
    ! overlay.inference_sink

示例,使用YOLOv5(USB摄像头源)进行人脸检测:

gst-launch-1.0 v4l2src device=/dev/videoX ! video/x-raw,framerate=30/1,format=YUY2,width=640,height=480 ! videoconvert ! \
    tee name=t_data t_data. ! queue ! synapoverlay name=overlay ! videoconvert ! waylandsink t_data. ! queue ! videoconvert ! \
    videoscale ! video/x-raw,width=480,height=352,format=RGB  ! \
    synapinfer model=/usr/share/synap/models/object_detection/face/model/yolov5s_face_640x480_onnx_mq/model.synap mode=detector \
    frameinterval=3 ! overlay.inference_sink

示例,使用YOLOv5(RTSP流)进行人脸检测:

gst-launch-1.0 rtspsrc location="rtsp://<user>:<password>@<ip>/stream" latency=2000 ! rtpjitterbuffer ! rtph264depay wait-for-keyframe=true ! \
    video/x-h264, width=1920, height=1080 ! h264parse ! avdec_h264 ! videoconvert ! \
    tee name=t_data t_data. ! queue ! synapoverlay name=overlay ! videoconvert ! waylandsink t_data. ! queue ! videoconvert ! \
    videoscale ! video/x-raw,width=480,height=352,format=RGB  ! \
    synapinfer model=/usr/share/synap/models/object_detection/face/model/yolov5s_face_640x480_onnx_mq/model.synap mode=detector \
    frameinterval=3 ! overlay.inference_sink

示例,使用YOLOv8(USB摄像头源)进行姿态估计:

gst-launch-1.0 v4l2src device=/dev/videoX ! video/x-raw,framerate=30/1,format=YUY2,width=640,height=480 ! videoconvert ! \
    tee name=t_data t_data. ! queue ! synapoverlay name=overlay ! videoconvert ! waylandsink t_data. ! queue ! videoconvert \
    ! videoscale ! video/x-raw,width=640,height=352,format=RGB  ! \
    synapinfer model=/usr/share/synap/models/object_detection/body_pose/model/yolov8s-pose/model.synap mode=detector frameinterval=3 \
    ! overlay.inference_sink

示例,使用YOLOv8进行姿态估计(视频):

gst-launch-1.0 filesrc location=fitness.mp4 ! qtdemux name=demux demux.video_0 ! queue ! h264parse ! avdec_h264 ! videoconvert ! \
    tee name=t_data t_data. ! queue ! synapoverlay name=overlay ! videoconvert ! waylandsink t_data. ! queue ! videoconvert ! \
    videoscale ! video/x-raw,width=640,height=352,format=RGB  ! \
    synapinfer model=/usr/share/synap/models/object_detection/body_pose/model/yolov8s-pose/model.synap mode=detector frameinterval=3 \
    ! overlay.inference_sink

示例,使用YOLOv8(RTSP流)进行姿态估计:

gst-launch-1.0 rtspsrc location="rtsp://<user>:<password>@<ip>/stream" latency=2000 ! rtpjitterbuffer ! rtph264depay wait-for-keyframe=true ! \
    video/x-h264, width=1920, height=1080 ! h264parse ! avdec_h264 ! videoconvert ! \
    tee name=t_data t_data. ! queue ! synapoverlay name=overlay ! videoconvert ! waylandsink t_data. ! queue ! videoconvert ! \
    videoscale ! video/x-raw,width=640,height=352,format=RGB  ! \
    synapinfer model=/usr/share/synap/models/object_detection/body_pose/model/yolov8s-pose/model.synap mode=detector frameinterval=3 \
    ! overlay.inference_sink

备注

请将 /dev/videoX 替换为与外部USB摄像头关联的设备文件。

备注

上述示例使用软件解码来解码视频文件和RTSP流。 SL1640和SL1680还支持硬件解码,可以通过将 avdec_h264 元素更改为 v4l2h264dec 来启用硬件解码。

gstsynapserence 的第二种模式下,推理结果以JSON字符串的形式输出。 这使得应用程序可以直接处理叠加或对结果进行额外处理。

我们提供了一个使用 gstsynapserence 第二种模式的 示例应用程序 。该应用程序在播放视频的同时对视频帧进行图像分类,然后将结果标签叠加到视频上。 Astra系统映像中包含应用程序的预构建版本。

使用以下命令运行示例应用程序:

gst-ai --appmode=IC --input=test_file.mp4 --output=screen --paramfile=/usr/share/gst-ai/ic.json

gst-ai 程序使用JSON参数文件来设置其他配置选项。 这些选项包括解码模式、模型、模型元数据、计数、置信阈值和后处理模式。 Astra 开发套件映像在 /usr/share/gst ai/ic.JSON 中提供了一个用于图像分类的默认JSON文件。支持的解码模式(decmode)是 ffmpegv4l2 。当设置为 ffmpeg 时,gst-ai程序将使用 ffmpeg库 在软件中执行视频流的解码。当设置为 v4l2 时,gst-ai将使用V4L2 API通过硬件加速来执行视频流的解码。

备注

SL1620要求将decmode设置为 ffmpeg ,因为它不支持 V4L2 解码。

多媒体演示应用程序

我们还提供了两个 QT应用程序演示 ,演示了Astra开发套件的多媒体和人工智能功能。 Syna Video Player应用程序演示了解码和播放多达四个视频流。 Syna AI Player应用程序通过执行对象检测、面部检测和姿态估计示例来演示Astra开发套件的AI功能。

应用程序需要设置以下环境变量:

export XDG_RUNTIME_DIR=/var/run/user/0
export WESTON_DISABLE_GBM_MODIFIERS=true
export WAYLAND_DISPLAY=wayland-1
export QT_QPA_PLATFORM=wayland

多媒体演示定制

这两个应用程序都使用 QML 文件进行配置。这允许用户自定义应用程序。 自定义包括修改应用程序中使用的视频。 由于Astra 开发套件映像上没有预安装示例视频文件, 用户需要将自己的视频文件添加到应用程序的QML文件中。 默认QML文件预安装在 /home/root/demos/qmls 中。

Syna Video Player

Syna Video Player应用程序展示了Astra开发套件播放和解码视频的能力。 它支持播放单个视频,或在网格中最多播放四个视频。

syna-video-player.png

Syna Video Player的主界面

运行Syna Video Player:

root@sl1680:~# syna-video-player --mach=sl1680 --mode=ffmpeg

Syna Video Player需要两个参数,机器类型和模式。 机器类型是运行应用程序的Astra 开发套件的版本。 有效选项为 sl1620sl1640sl1680 。模式指定应使用哪种解码模式。选项是 ffmpegv4l2 。当设置为 ffmpeg 时,Syna Video Player应用程序将使用 ffmpeg库 在软件中执行视频流的解码。当设置为 v4l2 时,Syna Video Player将使用v4l2 API通过硬件加速执行视频流的解码。

备注

SL1620要求将模式设置为 ffmpeg ,因为它不支持 V4L2 解码

视频文件的信息定义在 /home/root/dedemos/qmls/ 目录的QML文件中。 请更新这些文件中的视频名称和路径,以便Syna video Player可以找到您系统上安装的视频。 视频信息在文件 <mach>-<mode>.qml 中设置。 例如,要在ffmpeg模式下更新 SL1680 上的视频文件, 请修改 /home/root/demos/qmls/SL1680-ffmpeg.qml

Syna AI Player

Syna AI Player应用程序使用上述gstreamer管道来显示对象检测、面部检测和姿态估计。 它还支持Multi-AI视图,在播放视频时同时进行对象检测、人脸检测和姿态估计。

syna-ai-player.png

Syna AI Player的主界面

运行Syna AI Player:

root@sl1680:~# syna-ai-player --mach=sl1680

Syna AI Player需要机器类型参数。机器类型是运行应用程序的Astra开发套件的版本。 有效选项为 sl1620sl1640sl1680

Multi View窗口中使用的视频文件的信息是定义在 /home/root/demos/qmls/ 目录下QML文件中的。 请更新此文件中的视频名称和路径,以便Syna AI Player可以找到您系统上安装的视频。 视频信息设置在文件 /home/root/demos/qmls/panels/MultiAi.qml 中。

备注

默认情况下,Multi AI模式需要3个独立的摄像头。其中之一需要是USB 3.0设备。

Multiview定制

修改QML文件还允许运行自定义Gstreamer管道。 更改 GridItem 部分中的命令参数将更改 MulitAI 面板中显示的管道。 以下示例将显示运行3个单独AI模型的4个RTSP流:

GridLayout {
    width: ma.width * 0.9
    anchors.top: header.bottom
    anchors.centerIn: parent

    GridItem {
        type: 2
        image: "qrc:/res/images/multiicon.png"
        title:  qsTr("Multi-AI")
        command1: "rtspsrc location=\"rtsp://<user>:<password>@<ip>/stream1\" latency=2000 ! rtpjitterbuffer ! rtph264depay wait-for-keyframe=true ! video/x-h264, width=1920, height=1080  ! h264parse ! v4l2h264dec ! tee name=t_data t_data. ! queue ! v4l2convert extra-controls=\"c,io_mmu_capture_buffer=0,io_mmu_output_buffer=0\" ! video/x-raw, width=640, height=384 ! glupload ! glcolorconvert ! video/x-raw\(memory:GLMemory\), format=RGB ! gldownload ! synapinfer model=/usr/share/synap/models/object_detection/coco/model/yolov8s-640x384/model.synap mode=detector frameinterval=3 ! overlay.inference_sink t_data. ! queue ! glupload ! glcolorconvert ! video/x-raw\(memory:GLMemory\), format=BGRA ! gldownload ! synapoverlay name=overlay label=/usr/share/synap/models/object_detection/coco/info.json ! waylandsink"
        command2: "rtspsrc location=\"rtsp://<user>:<password>@<ip>/stream2\" latency=2000 ! rtpjitterbuffer ! rtph264depay wait-for-keyframe=true ! video/x-h264, width=1920, height=1080  ! h264parse ! v4l2h264dec ! tee name=t_data t_data. ! queue ! v4l2convert extra-controls=\"c,io_mmu_capture_buffer=0,io_mmu_output_buffer=0\" ! video/x-raw, width=480, height=352 ! glupload ! glcolorconvert ! video/x-raw\(memory:GLMemory\), format=RGB ! gldownload ! synapinfer model=/usr/share/synap/models/object_detection/face/model/yolov5s_face_640x480_onnx_mq/model.synap mode=detector frameinterval=3 ! overlay.inference_sink t_data. ! queue ! glupload ! glcolorconvert ! video/x-raw\(memory:GLMemory\), format=BGRA ! gldownload ! synapoverlay name=overlay ! waylandsink"
        command3: "rtspsrc location=\"rtsp://<user>:<password>@<ip>/stream3\" latency=2000 ! rtpjitterbuffer ! rtph264depay wait-for-keyframe=true ! video/x-h264, width=1920, height=1080  ! h264parse ! v4l2h264dec ! tee name=t_data t_data. ! queue ! v4l2convert extra-controls=\"c,io_mmu_capture_buffer=0,io_mmu_output_buffer=0\" ! video/x-raw, width=640, height=352 ! glupload ! glcolorconvert ! video/x-raw\(memory:GLMemory\), format=RGB ! gldownload ! synapinfer model=/usr/share/synap/models/object_detection/body_pose/model/yolov8s-pose/model.synap mode=detector frameinterval=3 ! overlay.inference_sink t_data. ! queue ! glupload ! glcolorconvert ! video/x-raw\(memory:GLMemory\), format=BGRA ! gldownload ! synapoverlay name=overlay ! waylandsink"
        command4: "rtspsrc location=\"rtsp://<user>:<password>@<ip>/stream4\" latency=2000 ! rtpjitterbuffer ! rtph264depay wait-for-keyframe=true ! video/x-h264, width=1920, height=1080  ! h264parse ! v4l2h264dec ! tee name=t_data t_data. ! queue ! v4l2convert extra-controls=\"c,io_mmu_capture_buffer=0,io_mmu_output_buffer=0\" ! video/x-raw, width=640, height=384 ! glupload ! glcolorconvert ! video/x-raw\(memory:GLMemory\), format=RGB ! gldownload ! synapinfer model=/usr/share/synap/models/object_detection/coco/model/yolov8s-640x384/model.synap mode=detector frameinterval=3 ! overlay.inference_sink t_data. ! queue ! glupload ! glcolorconvert ! video/x-raw\(memory:GLMemory\), format=BGRA ! gldownload ! synapoverlay name=overlay label=/usr/share/synap/models/object_detection/coco/info.json ! waylandsink"
    }
}

备注

仅SL1680支持Multiview。

使用SyNAP进行机器学习

Astra 开发套件使用SyNAP框架,通过平台硬件加速器来执行神经网络。 该框架允许用户运行程序,利用神经处理单元(NPU)和图形处理单元(GPU)来加速神经网络的执行。 (更多详情,请参阅 SyNAP 下载 。)

连接

Astra系列 AI开发套件通过板载芯片解决方案和外部硬件来支持蓝牙和Wi-Fi。 下表列出了各种板载芯片和外部解决方案:

SL处理器

无线设备

物理接口

(M.2 PCIe/M.2 SDIO)

软件信息

SL1620

SYNA 43711

M.2 SDIO

  • wpa_supplicant v2.10

  • WiFi驱动程序版本:v101.10.478

SL1640

SYNA 43752

M.2 PCIe

  • wpa_supplicant v2.10

  • WiFi驱动程序版本:v101.10.478

SL1680

SYNA 43752

M.2 PCIe

  • wpa_supplicant v2.10

  • WiFi驱动程序版本:v101.10.478

Astra Linux BSP包含使用具备PCIe和SDIO接口的43xxx模块所需的所有驱动程序和固件。无线网络管理由 WPA Supplicant 守护进程处理,该守护进程与WPA验证器进行密钥协商。 它支持WEP、WPA、WPA2和WPA3身份验证标准。(更多细节,请参阅 wpa_supplicant )。

使用WPA Suppliant设置WiFi

以下章节介绍在Astra 开发套件上如何使用WPA Supplicant设置WiFi。

生成WPA预共享密钥

从密码短语生成预共享密钥,可避免将密码短语存储在WPA Supplicant配置文件中。

在shell中,使用 wpa_passphrase 命令行工具,从密码短语中生成WPA预共享密钥:

root@sl1680:^# wpa_passphrase network_name 12345678
network={
    ssid="network_name"
    psk=5ba83b0673ea069dafe5d5f1af8216771c13be6ad6f11dac9dc0e90b0c604981
}

创建WPA Supplicant配置文件

WPA Supplicant使用配置文件来配置WiFi连接。这个配置文件位于 /etc/wpa_supplicant 中。

创建 /etc/wpa_supplicant 目录:

mkdir -p /etc/wpa_supplicant

创建文件 /etc/wpa_supplicant/wpa_supplicant-wlan0.conf ,其中包含WiFi网络的选项。

wpa_supplicant-wlan0.conf 示例的内容:

ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=0
update_config=1

network={
    ssid="network_name"
    psk=5ba83b0673ea069dafe5d5f1af8216771c13be6ad6f11dac9dc0e90b0c604981
    key_mgmt=WPA-PSK
    scan_ssid=1
}

配置systemd-networkd

wlan接口需要在 systemd-networkd 系统守护进程配置中启用。

创建新文件 /etc/systemd/network/25-wlan.network ,包含以下内容:

[Match]
Name=wlan0

[Network]
DHCP=ipv4

启用wpa_supplicant进程

后台启动 wpa_supplicant 进程,配置无线网络接口wlan0并加载配置文件:

wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant-wlan0.conf

开启WLAN接口

使用 ifconfig 指示内核开启wlan接口:

ifconfig wlan0 up

启用WiFi服务

需要重启网络守护进程来加载新的配置。

重新启动网络守护程序:

systemctl restart systemd-networkd.service
systemctl restart wpa_supplicant@wlan0.service

在启动时启用 wpa_supplicant

systemctl enable wpa_supplicant@wlan0.service

执行吞吐量测试

以下部分介绍如何在TCP和UDP模式下使用 iPerf 命令运行吞吐量测试。

TCP流量

客户端:

$ iperf -c <IP address of iperf server> -i 1 -w 12M -t 60 -l 1470

服务器端:

$ iperf -s -i 1 -w 12M -l 1470

UDP流量

客户端:

$ iperf -c <IP address of iperf server> -i 1 -w 12M -u -b 1000M -t 60 -l 1470

服务器端:

$ iperf -s -i 1 -w 12M -l 1470

使用蓝牙A2DP源角色

搜索并连接到耳机

首先,您需要使用以下命令进入蓝牙控制台:

root@sl1640:~# bluetoothctl
[bluetooth]#

一旦进入蓝牙控制台,您就可以运行各种命令来控制蓝牙协议栈, 如以下段落所述。

您可以使用 show 命令显示主板上蓝牙控制器的信息:

[bluetooth]# show
Controller C0:F5:35:AA:7D:8F (public)
        Name: sl1640
        Alias: sl1640
        Class: 0x00000000
        Powered: no
        Discoverable: no
        DiscoverableTimeout: 0x000000b4
        Pairable: yes
        UUID: Audio Source              (0000110a-0000-1000-8000-00805f9b34fb)
        UUID: Generic Attribute Profile (00001801-0000-1000-8000-00805f9b34fb)
        UUID: Generic Access Profile    (00001800-0000-1000-8000-00805f9b34fb)
        UUID: PnP Information           (00001200-0000-1000-8000-00805f9b34fb)
        UUID: A/V Remote Control Target (0000110c-0000-1000-8000-00805f9b34fb)
        UUID: A/V Remote Control        (0000110e-0000-1000-8000-00805f9b34fb)
        UUID: Device Information        (0000180a-0000-1000-8000-00805f9b34fb)
        Modalias: usb:v1D6Bp0246d0541
        Discovering: no
        Roles: central
        Roles: peripheral
Advertising Features:
        ActiveInstances: 0x00 (0)
        SupportedInstances: 0x06 (6)
        SupportedIncludes: tx-power
        SupportedIncludes: appearance
        SupportedIncludes: local-name
        SupportedSecondaryChannels: 1M
        SupportedSecondaryChannels: 2M
        SupportedSecondaryChannels: Coded

为了连接到耳机,首先您需要打开蓝牙控制器:

[bluetooth]# power on
[CHG] Controller C0:F5:35:AA:7D:8F Class: 0x00080000
Changing power on succeeded
[CHG] Controller C0:F5:35:AA:7D:8F Powered: yes

然后,您需要将控制器设置为可配对模式:

[bluetooth]# pairable on
Changing pairable on succeeded

然后,您可以搜索耳机(请确保耳机处于可发现模式):

[bluetooth]# scan on
Discovery started
[CHG] Controller C0:F5:35:AA:7D:8F Discovering: yes
[NEW] Device 2D:9A:A9:4F:54:37 2D-9A-A9-4F-54-37
[NEW] Device 4E:E7:B0:20:2A:11 4E-E7-B0-20-2A-11
[NEW] Device 7F:84:A3:29:E9:E9 7F-84-A3-29-E9-E9
[NEW] Device 6A:B0:95:7E:58:79 6A-B0-95-7E-58-79
[NEW] Device 7E:4D:8F:C4:3B:6F 7E-4D-8F-C4-3B-6F
[NEW] Device 40:93:CE:4D:F1:8E 40-93-CE-4D-F1-8E
[NEW] Device 47:14:71:A3:79:A9 47-14-71-A3-79-A9
[NEW] Device 67:62:9C:4B:F9:7D 67-62-9C-4B-F9-7D
[NEW] Device 8C:F8:C5:BD:6F:1D DTKBTQ3
[NEW] Device 0A:73:76:09:55:C0 BT208

此命令将返回当前连接的所有设备的MAC地址。您需从中找出您要配对的那副耳机。

找到该耳机后,您可以使用带有该耳机MAC地址的 pair 命令进行耳机配对:

[bluetooth]# pair 0A:73:76:09:55:C0
Attempting to pair with 0A:73:76:09:55:C0
[CHG] Device 0A:73:76:09:55:C0 Connected: yes
[CHG] Device 0A:73:76:09:55:C0 Bonded: yes
[CHG] Device 0A:73:76:09:55:C0 UUIDs: 00001108-0000-1000-8000-00805f9b34fb
[CHG] Device 0A:73:76:09:55:C0 UUIDs: 0000110b-0000-1000-8000-00805f9b34fb
[CHG] Device 0A:73:76:09:55:C0 UUIDs: 0000110c-0000-1000-8000-00805f9b34fb
[CHG] Device 0A:73:76:09:55:C0 UUIDs: 0000110e-0000-1000-8000-00805f9b34fb
[CHG] Device 0A:73:76:09:55:C0 UUIDs: 0000111e-0000-1000-8000-00805f9b34fb
[CHG] Device 0A:73:76:09:55:C0 ServicesResolved: yes
[CHG] Device 0A:73:76:09:55:C0 Paired: yes
Pairing successful
[CHG] Device 0A:73:76:09:55:C0 ServicesResolved: no
[CHG] Device 0A:73:76:09:55:C0 Connected: no

下一步,将设备标记为可信:

[bluetooth]# trust 0A:73:76:09:55:C0
[CHG] Device 0A:73:76:09:55:C0 Trusted: yes
Changing 0A:73:76:09:55:C0 trust succeeded

最后一步,设置与耳机的连接:

[bluetooth]# connect 0A:73:76:09:55:C0
Attempting to connect to 0A:73:76:09:55:C0
[CHG] Device 0A:73:76:09:55:C0 Connected: yes
[NEW] Endpoint /org/bluez/hci0/dev_0A_73_76_09_55_C0/sep1
[NEW] Transport /org/bluez/hci0/dev_0A_73_76_09_55_C0/sep1/fd0
Connection successful
[BT208]# [  286.922414] input: BT208 (AVRCP) as /devices/virtual/input/input1
[CHG] Transport /org/bluez/hci0/dev_0A_73_76_09_55_C0/sep1/fd0 Volume: 0x0060 (96)
[DEL] Device D4:D2:D6:4F:80:60 445HD_BT_60
[CHG] Device 0A:73:76:09:55:C0 ServicesResolved: ye
[BT208]#

如果连接成功,串口控制台提示信息将显示我们连接到的设备的名称。

现在,我们可以获取该设备的信息:

[BT208]# info
Device 0A:73:76:09:55:C0 (public)
        Name: BT208
        Alias: BT208
        Class: 0x00240404
        Icon: audio-headset
        Paired: yes
        Bonded: yes
        Trusted: yes
        Blocked: no
        Connected: yes
        LegacyPairing: no
        UUID: Headset                   (00001108-0000-1000-8000-00805f9b34fb)
        UUID: Audio Sink                (0000110b-0000-1000-8000-00805f9b34fb)
        UUID: A/V Remote Control Target (0000110c-0000-1000-8000-00805f9b34fb)
        UUID: A/V Remote Control        (0000110e-0000-1000-8000-00805f9b34fb)
        UUID: Handsfree                 (0000111e-0000-1000-8000-00805f9b34fb)
        RSSI: -69
        TxPower: 4

通过耳机播放音乐

为了测试播放, 您需要上传一个声音文件( .wav 格式)到板上,比如通过 scp

可以使用 aplay 命令将文件播放到A2DP接收器。 其参数有 耳机的MAC地址(以下示例中为 0A:73:76:09:55:C0 ) 和wave文件的名称(以下示例中为 /home/root/example.wav ):

root@sl1640:~# aplay --verbose -D  bluealsa:DEV=0A:73:76:09:55:C0 -t wav /home/root/example.wav
Playing WAVE '/home/root/example.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Stereo
Plug PCM: BlueALSA PCM: /org/bluealsa/hci0/dev_0A_73_76_09_55_C0/a2dpsrc/sink
BlueALSA BlueZ device: /org/bluez/hci0/dev_0A_73_76_09_55_C0
BlueALSA Bluetooth codec: SBC
Its setup is:
stream       : PLAYBACK
access       : RW_INTERLEAVED
format       : S16_LE
subformat    : STD
channels     : 2
rate         : 48000
exact rate   : 48000 (48000/1)
msbits       : 16
buffer_size  : 24000
period_size  : 6000
period_time  : 125000
tstamp_mode  : NONE
tstamp_type  : GETTIMEOFDAY
period_step  : 1
avail_min    : 6000
period_event : 0
start_threshold  : 24000
stop_threshold   : 24000
silence_threshold: 0
silence_size : 0
boundary     : 6755399441055744000

Linux启动过程

在Linux内核开始在Astra 开发套件上执行之前, 底层固件和软件会对硬件初始化并准备启动系统。 本节概述了为系统启动Linux内核所准备的软件组件。

软件概述

Astra系列 AI开发套件 使用多级启动过程。这部分简要描述了每个组件。

预引导固件

预引导固件是一个底层固件集, 用于初始化特定硬件组件并加载在Arm TrustZone环境中运行的软件。 预引导固件完成后,将跳转到bootloader中去执行。预引导固件是以 可写入启动设备的二进制映像的方式 提供。

Bootloader

Astra 开发套件使用Astra U—Boot(SUBoot)bootloader来执行剩余硬件的初始化,并启动Linux内核。 SUBoot是基于开源项目U—Boot的。( U—Boot文档

Linux内核和设备树

Astra 开发套件主要运行使用Linux的操作系统内核。 Linux内核提供应用程序运行的环境,管理CPU、内存和设备等资源。 一般来说,Linux内核将作为《Astra Yocto用户指南》中描述的Yocto构建过程的一部分进行构建。

Linux内核使用设备树数据结构来描述系统的硬件组件及配置。 设备树源文件位于Linux内核源代码树中,其路径为 arch/arm64/boot/dts/synaptics/ 。这些文件放在 Astra Linux Kernel Overlay repository 中。

根文件系统

根文件系统(rootfs)涵盖了Linux操作系统中执行程序所需的所有用户空间二进制文件和库以及系统配置文件。 预构建映像使用Yocto来构建rootfs。 有关如何使用Yocto构建和配置rootfs的说明,请参阅 Astra Yocto Linux开发人员指南

U—Boot

如上所述,Astra 开发套件使用U-Boot作为其bootloader。 Astra 开发套件使用三种类型的U-Boot。 除了SUBoot,还有 SPI U-Boot 和 USB U-Boot 变体,用于闪存或恢复设备。

映像类型

映像用法

SPI U—Boot

通过TFTP服务器或USB驱动器烧录eMMC映像

USB U-Boot

通过USB主机的TFTP服务器烧录eMMC映像

SUBoot

通过TFTP服务器或USB驱动器烧录eMMC映像,启动Linux

USB U-Boot和SPI U-Boot用于启动eMMC未烧录映像的设备,或者需要对emmc进行覆盖更新的设备。

USB U-Boot允许板卡通过USB接口接收U-Boot的USB版本。 主机系统运行usb_boot工具来将USB U-Boot映像加载到板上并执行。 一旦USB U-Boot在板上运行,可用它将映像文件写入eMMC。

SPI U—Boot类似于USB U—Boot,不同之处在于U—Boot是运行在SPI闪存上。 SPI闪存可以在Astra 开发套件的主板上,也可以在设备中所插的SPI子卡上。 一旦SPI U—Boot在板上运行,就可用它将映像文件写入eMMC。

Synaptics U-Boot Source Code

从SPI和SD卡启动

Astra 开发套件的I/O板有一个标记为 SD-Boot 的跳线。 这个jumper控制设备是从eMMC启动还是从内部SPI闪存启动。 如果连上跳线帽,设备将从内部SPI闪存启动。拔掉跳线帽,则从eMMC启动。

sd-boot-jumper.png

Astra 开发套件组件图,突出显示SD-Boot跳线

Astra 开发套件的内部SPI闪存已预先烧录好SPI U-Boot。 当SD-Boot跳线被连上,设备将从插在SD卡插槽中的SD卡启动。 如果没有插入SD卡,SPI U-Boot将引导到U-Boot提示符 “=>”。 U-Boot提示符可用于设置变量,或烧录eMMC以及内部SPI闪存。

备注

SL1620 RDK上WIFI和SD共用SDIO接口。在SL1620 RDK默认配置下,支持WIFI功能而不支持从SD卡启动。

生成可启动的SD卡映像

创建可引导的SD卡需要将现有映像转换为适合写入SD卡的格式。 您可以转换预构建的发布映像或您自己构建的映像。在image目录中运行 gen_sd.sh 脚本。你可以在 GitHub 上找到 gen_sd.sh 脚本。点击“Download Raw File”下载脚本。该脚本在安装了 mkfs.ext4gzipgdisksgdisk 实用程序的Linux环境中运行。

download_gen_sd.png

从GitHub上下载 gen_sd.sh

start_gen_sd.png

示例,在预构建的 eMMCimg 目录中运行gen_sd.sh

在转换过程中, gen_sd.sh 将创建新文件 sd.img 。这是用于写入SD卡的新映像文件。

end_gen_sd.png

gen_sd.sh完成后

将可启动映像写入SD卡

SD.img 文件使用 Balena Etcher 工具写入SD卡。首先下载并安装该工具。 然后运行该工具并按照UI中的步骤选择image和target device。 最后,单击flash按钮启动该过程。

balena_etcher.png

Balena Etcher的启动界面

balena_etcher_flash.png

选择图像文件和目标设备后的Balena Etcher

烧写过程完成后,SD卡现在已准备好引导Astra开发套件。

balena_etcher_complete.png

成功将图像闪存到SD卡后的Balena Etcher

带SUBoot的U-Boot提示符

从内部eMMC或从SD卡启动时,SUBoot将自动加载Linux内核。 但是,在启动过程中按串行控制台中的任何键都可以中断此过程。 如果U-Boot检测到按键,它将停在U-Boot提示符 “=>” 处。 U-Boot提示符可用于设置变量,或烧录eMMC和内部SPI闪存。 U-Boot等待输入的超时设置默认为0,因此需要在U-Boot启动之前发送按键。

更新固件

上电后,Astra 开发套件将从启动设备中读取固件、bootloader和Linux内核。 最常见的启动设备是板载eMMC设备。 本节将讨论如何将启动映像文件写入eMMC。

Astra系统映像

astra_image.png

Astra映像的屏幕截图

“Astra系统映像”是一个包含多个 subimg 文件以及 emmc_part_listemmc_image_listemmc_image_list_full 的目录。

  • emmc_part_list 描述了将被用于eMMC的GUID分区表(GPT)。

  • emmc_image_list* 文件则指定哪些子映像文件应被写到emmc上的哪个分区。

示例,SL1640分区表:

分区名称

内容

是否可删除

被谁访问

factory_setting

用户空间使用的MAC地址和其他出厂设置文件

不可

Linux用户空间

key_a

AVB密钥、用户密钥(A 副本)

是的

初期启动(boot分区)

tzk_a

TrustZone 内核(A 副本)

是的

初期启动(boot分区)

key_b

AVB秘钥,用户秘钥(B 副本)

是的

初期启动(boot分区)

tzk_b

TrustZone 内核(B 副本)

是的

初期启动(boot分区)

bl_a

OEM启动加载程序(A 副本)

是的

初期启动(boot分区)

bl_b

OEM启动加载程序(B 副本)

是的

初期启动(boot分区)

boot_a

Linux内核,由OEM bootloader加载(A 副本)

不可

OEM启动加载程序(bl_a)

boot_b

Linux内核,由OEM bootloader加载(B 副本)

不可

OEM启动加载程序(bl_b)

firmware_a

GPU/DSP/SM固件,由初期启动来加载,必须的(A 副本)

是的

初期启动(boot分区)

firmware_b

GPU/DSP/SM固件,由初期启动来加载,必须的(B 副本)

是的

初期启动(boot分区)

rootfs_a

根文件系统,供Linux使用,可更改(A 副本)

不可

Linux(boot_a)

rootfs_b

根文件系统,供Linux使用,可更改(B 副本)

不可

Linux(boot_b)

fastlogo_a

fast logo 映像,由OEM bootloader加载,可更改(A 副本)

不可

OEM bootloader(bl_a)

fastlogo_b

fast logo 映像,由OEM bootloader加载,可更改(B 副本)

不可

OEM bootloader(bl_b)

devinfo

设备信息(如序列号、MAC地址),必须的

是的

初期启动(boot分区)

Misc

启动控制设置,必须的

是的

初期启动(boot分区)

home

挂载在/home下,可定制

不可

Linux用户空间

使用USB更新固件

Astra 开发套件支持使用USB更新固件。

设置USB启动环境

从USB启动需要在主机系统上安装USB_boot软件工具。 支持Windows、Mac和Linux主机。 Windows系统还需要Astra WinUSB驱动。 Mac和Linux系统则不需要任何额外的驱动程序。 USB启动还需要按照前面的 设置串行控制台 章节中的说明来设置串行控制台。 本节介绍如何配置主机系统和准备USB启动。

硬件设置

要运行 usb_boot,您需要将USB-TTL板和电缆连接到Astra系列 AI开发套件,如前面 设置串行控制台 章节中所述。 这将让您可以在烧录过程看到控制台消息,并向 bootloader 输入指令。 您还需要用USB线将主机系统连接到Astra系列 AI开发套件上的USB Type-C USB 2.0端口(靠近以太网端口)。

usb-c.png

Astra系列 AI开发套件 组件图,突出显示USB Type—C USB 2.0端口

安装WinUSB驱动程序(仅限Windows)

Windows需要一个特定的USB内核驱动程序来通过USB与Astra 系列AI开发套件通信。请从以下地址下载驱动程序 GitHub 。Linux和Mac主机可以从用户空间访问Astra板,不需要任何额外的内核驱动程序。

下载并解压缩USB Boot软件包后, 右键单击 Synaptics_WinUSB_Driver 目录中的 SYNA_WinUSB.inf 文件。 从下拉菜单中选择“安装”。

备注

安装Windows驱动程序需要具有管理权限的帐户。 如果您没有足够的权限,请联系您的系统管理员。

install_driver_win.png

安装驱动程序

安装驱动程序后,在USB Boot模式下运行时, Astra 开发套件将在Windows设备管理器中显示为 “ Synaptics IoT: Tools package USB Driver for Synaptics Processors ”。

devices_win.png

安装驱动程序后操作系统列出的设备

运行USB Boot工具

如果以前没有下载过 usb_boot 工具,请先从 GitHub 下载。

备注

请查看发行说明,确认您有兼容版本的 usb_boot发行说明v1.1.0

usb_boot 工具通过usb与Astra开发套件通信。 每个Astra 开发套件变种都有自己的usb_boot目录。 每个目录中都包含一个 usb_boot 二进制文件和用来运行它的 run 脚本。 该目录还将包含一个映像目录,该目录包含通过usb启动板卡所需的所有映像文件。 这些映像文件中包括USB U-Boot bootloader。

在Windows上,双击 run.bat 文件以启动该工具。 该脚本将以所用Astra 开发套件变种需要的特定选项来执行二进制文件。

usb_user_tool_win.png

Windows上包含USBBoot工具的目录

运行 run.bat 后, 将打开一个窗口,显示flash进程的状态。

usbtool_output_win.png

Windows上usb_boot工具的输出

在Mac上,右键单击包含usb_boot版本的目录,该版本须与您即将启动的Astra 开发套件变种相匹配。 从下拉菜单中选择 Services -> New Terminal at Folder

mac-open-terminal.jpg

在Mac上打开终端,用于USB Boot

这将打开所选usb_boot目录中的一个终端。 从那里运行 run.sh 脚本来运行该工具。 由于脚本内部会调用sudo,因此可能会提示您输入密码。 工具需要额外的权限才能连接USB设备并访问系统资源。

mac-run-usbboot.png

Mac上usb_boot工具的输出

在Linux上,右键单击包含usb_boot版本的目录,该版本须与您将要启动的Astra 开发套件变体相匹配。 从下拉菜单中选择 Open in Terminal

linux-open-terminal.png

在Linux上打开终端,用于USB Boot

这将打开所选usb_boot目录内的一个终端。 从那里运行 run.sh 脚本来运行该工具。 由于脚本内部调用sudo,因此可能会提示您输入密码。 该工具需要额外的权限才能连接USB设备并访问系统资源。

linux-run-usbboot.png

Linux上usb_boot工具的输出

使用USB Boot引导

一旦设置了usb_boot环境并且在主机系统上运行了usb_boot工具,Astra系列 AI开发套件需要被设置成 USB Boot 模式。 要执行此操作,请按住I/O板上的 “USB_BOOT” 按钮。 然后按下并松开 “RESET” 按钮。 确保按住 “USB_BOOT” 按钮足够长的时间,以便板卡可以复位并检测 “USB_BOOT” 按钮被按下。 启动进入 USB Boot 模式后,串行控制台中将显示 U-Boot 提示符 “=>”。

usb-boot-and-reset.png

Astra系列 AI开发套件组件图,突出显示USB_BOOT和RESET按钮

usb_boot_output_win.png

成功引导后,usb_boot工具和串行控制台的输出

putty-usb-boot.png

使用USB Boot引导后的串行控制台

备注

只有设备进入USB Boot模式,Astra系列 AI开发套件才显示在窗口的设备管理器中,才能被工具看到。如上所述,按住USB_BOOT并按下RESET按钮。

使用USB Boot将固件烧录到eMMC
emmc_flash_snapshot.png

包含用来烧录eMMC映像的文件的目录

从USB启动时,usb_boot工具允许直接通过USB接口传输eMMC映像文件。 要通过USB烧录eMMC映像,请将映像文件复制到Astra 开发套件变种的usb_boot工具目录下的 images 文件夹中。

使用以下命令将映像文件写入eMMC:

=> l2emmc eMMCimg

参数 eMMCimg 是 usb_boot 工具下映像文件目录的名称。

复位

如果在主板上电时,eMMC中已写入有效的映像,Astra 开发套件将启动进入linux。 将映像文件写入eMMC后,请在U-boot中发出复位命令。 按下主板上的“RESET”按钮,或重启主板电源,来启动进入Linux。

U-Boot复位命令:

=> reset

备注

确保从eMMC启动时未连接 SD-Boot 跳线。 否则,设备将从内部SPI闪存或SD卡启动。请参阅 从SPI和SD卡启动

从SPI更新固件

从SPI和SD卡启动 中所述,Astra 开发套件有一个内部SPI闪存芯片,其中包含SPI U-Boot Bootloader。 这允许在不使用USB主机系统的情况下更新固件。 映像文件可以从外接的USB驱动器加载或从本地网络上的TFTP服务器下载。

备注

请查看发行说明,确认内部SPI闪存上安装了兼容版本的SPI U-Boot。 版本1.2.0

设置SPI启动环境

从内部SPI闪存启动不需要在主机上安装任何附加软件, 除了前面 设置串行控制台 章节所述的使用串行控制台的软件以外。

硬件设置

对于SPI启动,您需要连接串行端口的USB线,如前面 设置串行控制台 章节所述。 这将允许您在烧录过程中看到控制台消息,并将命令输入给SPI U-Boot bootloader。 您还需要一个USB驱动器或以太网线,具体取决于eMMC映像文件的所在位置。 USB驱动器可以插入4个USB Type-A USB 3.0端口中的任一个, 或USB Type-C USB 2.0端口(可能需要USB Type-C转USB Type-A的适配器)。

usb-and-ethernet-ports.png

Astra系列 AI开发套件组件图,突出显示USB口和以太网口

从USB驱动器烧录映像

要从外接USB驱动器烧录Astra系统映像,只需将映像目录复制到USB驱动器即可。 USB驱动器需要有一个 FAT32 格式的文件系统分区,且需要有足够的容量来容纳 Astra 系统映像。

使用以下命令将映像写入eMMC:

=> usb2emmc eMMCimg

参数 eMMCimg 是USB驱动器上映像文件目录的名称。

从TFTP服务器烧录映像

要从TFTP服务器烧录Astra系统映像,您首先需要通过以太网口将Astra 开发套件连接到本地网络。 将Astra映像复制到TFTP服务器上,这样它可以通过网络被设备访问。 设备连接到网络后,启动到U-boot提示符。

初始化网络,并从本地网络上的DHCP服务器获取IP地址:

=> net_init; dhcp;
=> setenv serverip 10.10.10.10;

使用以下命令,将映像文件从TFTP服务器写入eMMC:

=> tftp2emmc eMMCimg

参数 eMMCimg 是TFTP服务器上映像文件目录的名称。

备注

SPI U-Boot初始化网络并自动请求IP。 使用SPI U-Boot时不需要 net_initdhcp 命令。

备注

在上面的示例中,TFTP服务器的地址是 10.10.10.10 。 请将此IP替换为承载TFTP的服务器IP地址。

更新内部SPI闪存固件

Astra开发套件上的内部SPI闪存也可以使用上述方法进行更新。您可以在 GitHub 上找到SPI映像的最新版本。

从USB Boot烧录内部SPI闪存固件

要使用usb_boot更新内部SPI闪存固件,必须首先按照 设置USB启动环境 章节中的步骤进行操作。

spi_flash_snapshot.png

包含用来刷新SPI闪存的文件的目录

在Astra 开发套件通过USB启动U-Boot后, 将SPI映像文件复制到 usb_boot 工具目录下的 images 目录中,对SPI闪存进行烧写。

然后使用以下命令,将映像写入SPI闪存:

=> usbload u-boot-astra-v1.0.0.sl1680.rdk.spi.bin 0x10000000
=> spinit;
=> erase f0000000 f01fffff; cp.b 0x10000000 0xf0000000 0x200000;

可以使用以下命令安装SPI闪存固件的可选备份副本:

=> erase f0200000 f03fffff; cp.b 0x10000000 0xf0200000 0x200000;

从外部USB驱动器烧录内部SPI闪存固件

要使用外接USB驱动器更新内部SPI闪存固件,只需将映像复制到该驱动器即可。 USB驱动器需要一个具有Fat32格式文件系统的分区。

使用以下命令,将映像写入SPI闪存:

=> usb start; fatload usb 0 0x10000000 u-boot-astra-v1.0.0.sl1680.rdk.spi.bin;
=> spinit;
=> erase f0000000 f01fffff; cp.b 0x10000000 0xf0000000 0x200000;

可以使用以下命令安装SPI闪存固件的可选备份副本:

=> erase f0200000 f03fffff; cp.b 0x10000000 0xf0200000 0x200000;

从TFTP服务器烧录内部SPI闪存固件

要通过从TFTP服务器下载来更新内部SPI闪存固件,只需将映像复制到TFTP服务器。

使用以下命令,将SPI映像从TFTP服务器写入SPI闪存:

=> net_init; dhcp;
=> setenv serverip 10.10.10.10;
=> tftpboot 0x10000000 u-boot-astra-v1.0.0.sl1680.rdk.spi.bin;
=> spinit;
=> erase f0000000 f01fffff; cp.b 0x10000000 0xf0000000 0x200000;

可以使用以下命令安装SPI闪存固件的可选备份副本:

=> erase f0200000 f03fffff; cp.b 0x10000000 0xf0200000 0x200000;

备注

SPI U-Boot初始化网络并自动请求IP。 使用SPI U-Boot时不需要 net_initdhcp 命令。

备注

在上面的示例中,TFTP服务器的地址是 10.10.10.10 。 请将此IP替换为承载TFTP服务器的IP地址。