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键盘和鼠标可以输入。
点击左上角的图标将打开一个终端。
备注
当前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端口相连(靠近以太网口)。
Google为Mac、Linux和Windows提供了不同版本的ADB。
安装ADB后,请运行 adb devices
以查看连接到主机的所有ADB设备。
然后运行:
adb shell
或者,如果有多个ADB设备:
adb -s SL16x0 shell
串行控制台
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
备注
使用 PL2303
或 FT232R
驱动IC的USB-TTL线 尚未 被确认为Astra系列AI开发套件中可配套使用的配件。
某些USB-TTL适配器需要在Windows和Mac主机上安装驱动程序。 请向适配器制造商咨询下载和安装驱动程序的说明。
可以使用终端模拟器程序(如 Putty 、HyperTerminal、 Tera-Term 、Screen或Minicom)访问串行控制台。
Linux操作系统登录
Linux成功启动后,串行控制台中将显示登录提示。请使用 root
用户名登录。无需密码。
多媒体
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
命令,可用于显示系统上可用插件的信息。
备注
如果您的终端不支持颜色,您可能需要使用 –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
。
备注
仅 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/SL1680
上 H265
编码视频文件:
gst-launch-1.0 filesrc location=test_file.mp4 ! qtdemux name=demux demux.video_0 ! queue ! h265parse ! v4l2h265dec ! waylandsink fullscreen=true
示例, SL1620
上 H265
编码视频文件:
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
上使用 kmssink
的 H265
编码视频文件:
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路径关联的设备文件。
RTSP摄像头
Astra开发套件使用Gstreamer RTSP插件支持RTSP摄像头。
本示例将接收摄像机头的H.264编码数据流,并使用硬件解码将其显示在SL1640和SL1680上。
rtspsrc
元素通过网络连接到摄像头,并将延迟设置为2000毫秒。
延迟参数和 rtpjitterbuffer
元素用于缓存数据流来尽可能减少网络抖动。
rtph264depay
元素从H.264流中取出有效载荷。
其 wait-for-keyframe
选项会在输出数据流之前等待关键帧,来确保同步。
随后,使用 h264parse
和 v4l2h264dec
元素解析和解码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设备的视频和音频流。
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设备关联的设备文件。
使用 arecord
命令来决定哪个ALSA capture设备与HDMI-RX相关联。
使用 aplay
命令来决定使用哪个ALSA播放设备来播放捕获的音频。
以下示例将使用与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-sink
和 audio-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)是
ffmpeg
和
v4l2
。当设置为
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:
root@sl1680:~# syna-video-player --mach=sl1680 --mode=ffmpeg
Syna Video Player需要两个参数,机器类型和模式。
机器类型是运行应用程序的Astra 开发套件的版本。
有效选项为
sl1620
、
sl1640
和
sl1680
。模式指定应使用哪种解码模式。选项是
ffmpeg
和
v4l2
。当设置为
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:
root@sl1680:~# syna-ai-player --mach=sl1680
Syna AI Player需要机器类型参数。机器类型是运行应用程序的Astra开发套件的版本。
有效选项为 sl1620
、 sl1640
和 sl1680
。
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 |
|
SL1640 |
SYNA 43752 |
M.2 PCIe |
|
SL1680 |
SYNA 43752 |
M.2 PCIe |
|
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。
从SPI和SD卡启动
Astra 开发套件的I/O板有一个标记为 SD-Boot
的跳线。
这个jumper控制设备是从eMMC启动还是从内部SPI闪存启动。
如果连上跳线帽,设备将从内部SPI闪存启动。拔掉跳线帽,则从eMMC启动。
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.ext4
、
gzip
、
gdisk
和
sgdisk
实用程序的Linux环境中运行。
在转换过程中, gen_sd.sh
将创建新文件 sd.img
。这是用于写入SD卡的新映像文件。
将可启动映像写入SD卡
SD.img
文件使用
Balena Etcher
工具写入SD卡。首先下载并安装该工具。
然后运行该工具并按照UI中的步骤选择image和target device。
最后,单击flash按钮启动该过程。
烧写过程完成后,SD卡现在已准备好引导Astra开发套件。
带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系统映像”是一个包含多个 subimg
文件以及 emmc_part_list
、 emmc_image_list
和 emmc_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端口(靠近以太网端口)。
安装WinUSB驱动程序(仅限Windows)
Windows需要一个特定的USB内核驱动程序来通过USB与Astra 系列AI开发套件通信。请从以下地址下载驱动程序 GitHub 。Linux和Mac主机可以从用户空间访问Astra板,不需要任何额外的内核驱动程序。
下载并解压缩USB Boot软件包后,
右键单击 Synaptics_WinUSB_Driver
目录中的 SYNA_WinUSB.inf
文件。
从下拉菜单中选择“安装”。
备注
安装Windows驱动程序需要具有管理权限的帐户。 如果您没有足够的权限,请联系您的系统管理员。
安装驱动程序后,在USB Boot模式下运行时,
Astra 开发套件将在Windows设备管理器中显示为 “ Synaptics IoT: Tools package USB Driver for Synaptics Processors
”。
运行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 开发套件变种需要的特定选项来执行二进制文件。
运行 run.bat
后, 将打开一个窗口,显示flash进程的状态。
在Mac上,右键单击包含usb_boot版本的目录,该版本须与您即将启动的Astra 开发套件变种相匹配。
从下拉菜单中选择 Services -> New Terminal at Folder
。
这将打开所选usb_boot目录中的一个终端。
从那里运行 run.sh
脚本来运行该工具。
由于脚本内部会调用sudo,因此可能会提示您输入密码。
工具需要额外的权限才能连接USB设备并访问系统资源。
在Linux上,右键单击包含usb_boot版本的目录,该版本须与您将要启动的Astra 开发套件变体相匹配。
从下拉菜单中选择 Open in Terminal
。
这将打开所选usb_boot目录内的一个终端。
从那里运行 run.sh
脚本来运行该工具。
由于脚本内部调用sudo,因此可能会提示您输入密码。
该工具需要额外的权限才能连接USB设备并访问系统资源。
使用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模式,Astra系列 AI开发套件才显示在窗口的设备管理器中,才能被工具看到。如上所述,按住USB_BOOT并按下RESET按钮。
使用USB Boot将固件烧录到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驱动器烧录映像
要从外接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_init
和 dhcp
命令。
备注
在上面的示例中,TFTP服务器的地址是 10.10.10.10
。
请将此IP替换为承载TFTP的服务器IP地址。
更新内部SPI闪存固件
Astra开发套件上的内部SPI闪存也可以使用上述方法进行更新。您可以在 GitHub 上找到SPI映像的最新版本。
从USB Boot烧录内部SPI闪存固件
要使用usb_boot更新内部SPI闪存固件,必须首先按照 设置USB启动环境 章节中的步骤进行操作。
在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_init
和 dhcp
命令。
备注
在上面的示例中,TFTP服务器的地址是 10.10.10.10
。
请将此IP替换为承载TFTP服务器的IP地址。