第5章 启用单独仿真
可以在i.MX 6DualLite SABRE-SD和i.MX 6DualLite SABRE-AI板上启用单独仿真。这是通过使用
引导加载程序构建过程中的特定U-Boot配置。
当在i.MX 6DualLite SABRE平台上启用此单独仿真时,i.MX 6DualLite的功能将更改为以下内容:
•对于单独仿真,使用6DualLite DTB并将MaxCPU=1添加到U-Boot的bootcmd。
•DDR RAM上的32位数据总线。
•i.MX 6DualLite SABRE-AI的1 GB RAM。
•512 MB RAM,用于i.MX 6DualLite SABRE-SD。
要在i.MX 6DualLite SABRE-SD卡上为i.MX 6Solo构建U-Boot,请使用以下命令:
MACHINE=imx6solosabresd bitbake u-boot-imx
要在i.MX 6DualLite SABRE-AI卡上为i.MX 6Solo构建U-Boot,请使用以下命令:
MACHINE=imx6solosabreauto bitbake u-boot-imx
第六章 电源管理
i.MX电源管理使用标准的Linux接口。有关标准命令的信息,请查看标准的Linux电源文档。i.MX Linux®参考手册(IMXLXRM)包含了关于可用的电源模式的信息,以及在电源管理部分的其他i.MX特定信息。
在i.MX单板上,主要有三种电源管理技术:暂停和恢复命令、CPU调频和总线调频。它们将在下面的部分中进行描述。
6.1挂起和恢复
可以通过设置Linux标准状态“/sys/power/state”来改变电源状态。将电源状态设置为挂起模式的命令为echo mem > /sys/power/state。值mem可以被替换为任何有效的电源状态,如i.MX Linux®参考手册(IMXLXRM)所描述的。
使用下列方法之一从挂起模式唤醒系统。
•调试UART可以设置为唤醒源:
echo enabled > /sys/class/tty/ttymxc0/power/wakeup
请注意:ttylp0代表i.m x8quadxplus和i.m x8quadmax, ttylp0代表i.m x8dxl。
•RTC可以通过以下命令进入和退出暂停模式:
/unit_test/SRTC/rtcwakeup.out -d rtc0 -m mem -s 10
该命令表示休眠10秒。该命令自动将电源状态设置为mem模式。
6.2 CPU调频
在Linux内核中使用伸缩调控器来设置CPU频率。CPU频率可以根据系统负载自动伸缩,可以响应ACPI事件,也可以由用户空间程序手动伸缩。有关调控器的更多信息,请阅读www.kernel.org/doc/Documentation/cpu-freq/governors.txt中的governors.txt。
下面是一些更常用的命令:
这些命令返回系统信息和当前设置。
•内核预先配置为只支持某些频率。目前支持的频率列表可从以下网站获得:
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies
•获得可用的缩放调节器:
cat /sys/devices/system/cpu/*/cpufreq/scaling_available_governors
•查看当前CPU频率:
cat /sys/devices/system/cpu/*/cpufreq/cpuinfo_cur_freq
频率的显示取决于调控器设置。
•检查最大频率:
cat /sys/devices/system/cpu/*/cpufreq/cpuinfo_max_freq
•检查最小频率:
cat /sys/devices/system/cpu/*/cpufreq/cpuinfo_min_freq
这些命令设置固定的CPU频率:
•使用最大频率:
echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
•用当前频率作为恒频:
echo userspace > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
•以下两个命令将缩放调节器设置为指定的频率,如果该频率是受支持的。如果不支持该频率,则使用最近的支持频率:
echo userspace > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
echo > /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed
6.3总线频率缩放
该版本不支持i.MX 7ULP EVK上的总线频率伸缩特性。
本版本不支持i.MX 8QuadXPlus和i.MX 8QuadMax上的总线频率缩放功能。
系统自动调整总线频率(DDR, AHB等),以达到最佳性能,基于活跃的设备。
总线频率驱动默认为开启状态。支持的DDR频率如下:
•DDR正常频率—U-Boot默认频率
•音频DDR频率:i.MX 6Quad、i.MX 6DualLite和i.MX 6SoloX的音频频率为50 MHz, i.MX 7Dual的音频频率为100 MHz。
•低功耗空闲DDR频率- 24 MHz
在i.MX 8M板上:
•LPDDR4配置“Audio DDR频率”为25 MHz,低功耗空闲DDR频率为25 MHz。
•DDR4的音频DDR频率为166 MHz,低功耗空闲DDR频率为166 MHz。
如果需要设置低功耗的DDR空闲频率,请确保所有需要高频率DDR的设备都已关闭。大多数驱动程序进行主动时钟管理,但可以使用某些命令来避免等待超时发生:
echo 1 > /sys/class/graphics/fb0/blank ->设置为空白显示(如果多个显示活动,可能需要将fb1、fb2等设置为空白)。
ifconfig eth0 down ->禁用以太模块。在i.MX 6SoloX、i.MX 7Dual、i.MX 6UltraLite和i.MX 6UltraLiteLite上也应禁用以太网1 (eth1)。
i.MX 8M Plus需要一些额外的步骤来启用USB运行时PM:
echo auto > /sys/bus/platform/devices/32f10100.usb/38100000.dwc3/power/control
echo auto > /sys/bus/platform/devices/32f10108.usb/38200000.dwc3/power/control
echo auto > /sys/bus/platform/devices/32f10108.usb/38200000.dwc3/xhci-hcd.1.auto/power/control
在大多数系统上,执行以上两个命令后,芯片进入低功耗IDLE模式。
要操作总线频率,使用以下命令来获得所需的结果:
cat /sys/bus/platform/drivers/imx_busfreq/soc\:busfreq/enable ->显示总线频率状态。
echo 0 > /sys/bus/platform/drivers/imx_busfreq/soc\:busfreq/enable ->禁用总线频率。
echo 1 > /sys/bus/platform/drivers/imx_busfreq/soc\:busfreq/enable ->使能总线频率。
i.MX Linux®参考手册(IMXLXRM)在DVFS的章节中有更多关于总线频率的信息。
第七章 多媒体
i.MX提供音频优化的软件编解码器、解析器、硬件加速单元和相关插件。i.MX提供了GStreamer插件来访问i.MX多媒体库和硬件加速单元。本章提供各种多媒体用例和GStreamer命令行示例。
7.1 i.MX多媒体包
由于许可证的限制,i.MX多媒体软件包可以在两个地方找到:
•标准封装:由NXP semiconductors mirror提供。
•限制访问包:在nxp.com上提供控制访问。
具体操作请参见《i.MX发布说明(IMXLXRN)》。
7.2构建有限的访问包
将受限访问包放置在下载目录中,并读取每个包中的自述文件。
例如imxcodec-microsoft-$version.tar.gz包中的“README-microsoft”。
7.3多媒体用例
GStreamer是Linux操作系统中默认的多媒体框架。下面的小节提供了用于执行指定的特定功能的GStreamer命令示例。下表给出了本文档常用功能的参考方法和具体命令。
一种选择是将它们设置为环境变量,如下面的示例所示。在系统上使用该命令的完整路径。
export GSTL=gst-launch-1.0
export PLAYBIN=playbin
export GPLAY=gplay-1.0
export GSTINSPECT=gst-inspect-1.0
在本文档中,变量通常用于描述具有多个选项的命令参数。这些变量的格式为 d e s c r i p t i o n ,其中描述了可以使用的值的类型。可能的选项可以在 i . M X L i n u x ® 发布说明 ( I M X L X R N ) 关于多媒体的章节中找到 i . M X 特定的选项,或者在“ g s t r e a m e r . f r e e d e s k t o p . o r g / ”社区选项。 G S t r e a m e r 命令行通过各种插件传输输入。命令行中的每个插件部分都有一个感叹号 ( ! ) 。每个插件都可以有自己的参数,它们出现在命令行中插件名称之后和下一个感叹号 ( ! ) 之前。使用 description,其中描述了可以使用的值的类型。可能的选项可以在i.MX Linux®发布说明(IMXLXRN)关于多媒体的章节中找到i.MX特定的选项,或者在“gstreamer.freedesktop.org/”社区选项。 GStreamer命令行通过各种插件传输输入。命令行中的每个插件部分都有一个感叹号(!)。每个插件都可以有自己的参数,它们出现在命令行中插件名称之后和下一个感叹号(!)之前。使用 description,其中描述了可以使用的值的类型。可能的选项可以在i.MXLinuxR◯发布说明(IMXLXRN)关于多媒体的章节中找到i.MX特定的选项,或者在“gstreamer.freedesktop.org/”社区选项。GStreamer命令行通过各种插件传输输入。命令行中的每个插件部分都有一个感叹号(!)。每个插件都可以有自己的参数,它们出现在命令行中插件名称之后和下一个感叹号(!)之前。使用GSTINSPECT $plugin获取关于插件的信息以及它可以使用的参数。
方括号([])表示命令行的可选部分。
7.3.1回放用例
回放用例包括以下几个方面:
•音频回放
•视频回放
•音频/视频文件播放
•其他播放方法
7.3.1.1音频回放
audio-only播放命令使用如下格式:
$GSTL filesrc location=$clip_name [typefind=true] ! [$id3parse] ! queue ! $audio_parser_plugins ! $audio_decoder_plugin ! $audio_sink_plugin
如果要播放的文件包含ID3头,请使用ID3解析器。如果文件没有ID3头,则没有任何效果。
这个例子在音频插孔输出中播放MP3文件。
$GSTL filesrc location=test.mp3 ! id3demux ! queue ! mpegaudioparse ! beepdec ! pulsesink
7.3.1.2视频回放
$GSTL filesrc location=test.video typefind=true
! $capsfilter ! $demuxer_plugin ! queue max-size-time=0
! $video_decoder_plugin ! $video_sink_plugin
这是一个H.264编码格式的MP4容器视频文件播放的例子:
$GSTL filesrc location=test.mp4 typefind=true
! video/quicktime ! aiurdemux ! queue max-size-time=0
! v4l2h264dec ! autovideosink
7.3.1.3播放音频/视频文件
这是一个使用音频播放视频文件的命令示例:
$GSTL filesrc location=test_file typefind=true ! $capsfilter
! $demuxer_plugin name=demux demux.
! queue max-size-buffers=0 max-size-time=0
! $video_decoder_plugin ! $video_sink_plugin demux.
! queue max-size-buffers=0 max-size-time=0
! $audio_decoder_plugin !
$audio_sink_plugin
这是一个AVI文件的例子:
$GSTL filesrc location=test.avi typefind=true ! video/x-msvideo
! aiurdemux name=demux demux.
! queue max-size-buffers=0 max-size-time=0
! $video_decoder_plugin ! autovideosink demux.
! queue max-size-buffers=0 max-size-time=0 ! beepdec
! alsasink
对于没有VPU硬件的平台, v i d e o d e c o d e r p l u g i n 可以是像 a v d e c h 264 这样的软件解码器插件。 7.3.1.4 多路音频播放开启“脉冲音频”后,多路音频回放设置请参见“脉冲音频输入 / 输出设置”。 7.3.1.5 其他回放方式使用 video_decoder_plugin可以是像avdec_h264这样的软件解码器插件。 7.3.1.4多路音频播放 开启“脉冲音频”后,多路音频回放设置请参见“脉冲音频输入/输出设置”。 7.3.1.5其他回放方式 使用 videodecoderplugin可以是像avdech264这样的软件解码器插件。7.3.1.4多路音频播放开启“脉冲音频”后,多路音频回放设置请参见“脉冲音频输入/输出设置”。7.3.1.5其他回放方式使用PLAYBIN插件或i.MX $GPLAY命令行播放器播放媒体文件。
$GSTL $PLAYBIN uri=file:///mnt/sdcard/test.avi
$GPLAY /mnt/sdcard/test.avi
7.3.1.6视频多显示器回放
视频回放到多个显示器可以支持一个视频接收器插件。用于多显示模式的视频接收器不能在i.MX 8系列soc上工作。
这个用例要求系统以多显示模式启动(双/三/四,支持的显示数量由SOC和BSP决定)。配置系统以该方式启动的方法请参见《i.MX移植指南(IMXBSPPG)》。
7.3.1.6.1在不同的显示器上播放不同的视频
在不同的显示器上播放两个视频的命令行可能是这样的:
$GSTL P L A Y B I N u r i = f i l e : / / / PLAYBIN uri=file:/// PLAYBINuri=file:///file1 P L A Y B I N u r i = f i l e : / / / PLAYBIN uri=file:/// PLAYBINuri=file:///file2 video-sink=“overlaysink display-master=false display-slave=true”
7.3.1.6.2将同一视频路由到不同的显示器
一个视频可以在多个显示器上显示,使用如下命令:
$GSTL P L A Y B I N u r i = f i l e : / / / PLAYBIN uri=file:/// PLAYBINuri=file:///filename video-sink=“overlaysink display-slave=true”
7.3.1.6.3多个视频叠加
overlaysink插件支持将多个视频合成在一起,并将它们呈现在同一个显示器上。结果可能如下图所示。
gst-launch-1.0 playbin uri=file://$FILE1
video-sink="overlaysink overlay-width=512 overlay-height=384"
playbin uri=file://$FILE2 flags=0x41
video-sink="overlaysink overlay-left=512 overlay-width=512 overlay-height=384"
playbin uri=file://$FILE3 flags=0x41
video-sink="overlaysink overlay-top=384 overlay-width=512 overlay-height=384"
playbin uri=file://$FILE4 flags=0x41
video-sink="overlaysink overlay-left=512 overlay-top=384 overlay-width=512 overlay-height=384"
playbin uri=file://$FILE5 flags=0x41
video-sink="overlaysink overlay-left=352 overlay-top=264 overlay-width=320 overlay-height=240 zorder=1"
7.3.2音频编码
这里有一些MP3编码的例子。
$GSTL filesrc location=test.wav ! wavparse ! lamemp3enc
! filesink location=output.mp3
7.3.3视频编码
下面的命令提供了一些关于如何使用由VPU硬件加速的插件来编码一些媒体文件的建议(尽管它们只能在带有VPU的SoC上工作)。
VPU视频编码只能在支持VPU编码器的SoC上工作。
对于i.MX 6,使用以下命令:
$GSTL filesrc location=test.yuv
! videoparse format=2 witdh=$WIDTH height=$HEIGHT framerate=30/1
! vpuenc_xxx ! $MUXER ! filesink location=$output
对于i.MX 8M Mini/8M Plus,使用以下命令:
$GSTL filesrc location=test.yuv
! rawvideoparse format=2 witdh=$WIDTH height=$HEIGHT framerate=30/1 colorimetry=bt709
! v4l2xxxenc ! $MUXER ! filesink location=$output
•目标编码器编解码器类型可以是:
$GSTL filesrc location=$filename typefind=true ! $capsfilter ! aiurdemux
! vpudec ! imxvideoconvert_ipu ! $CAPS1 ! vpuenc_xxx ! matroskamux ! filesink location=720p.mkv
capsfilter是容器的mime类型。其中CAPS1为目标视频分辨率,vpuenc_xxx为vpuenc_mpeg4、vpuenc_h263、vpuenc_h264、vpuenc_jpeg。
例如:
gst-launch-1.0 filesrc location=$FILE.mp4 typefind=true ! video/quicktime ! aiurdemux ! vpudec ! imxvideoconvert_ipu ! video/x-raw,format=NV12,width=1280,height=720 ! vpuenc_h264 ! [h264parse] ! matroskamux ! filesink location=$FILE.mkv
对于i.MX 8QuadMax/8QuadXPlus,使用以下命令:
gst-launch-1.0 filesrc location=$FILE.mp4 typefind=true ! video/quicktime ! aiurdemux ! v4l2h264dec ! queue ! imxvideoconvert_g2d ! queue ! videoconvert ! queue ! v4l2h264enc ! [h264parse] ! matroskamux ! filesink location=$FILE.mkv
对于i.MX 8M Mini/8M Plus,使用以下命令:
gst-launch-1.0 filesrc location=$FILE.mp4 typefind=true ! video/quicktime ! aiurdemux ! v4l2h264dec ! queue ! v4l2h264enc ! [h264parse] ! matroskamux ! filesink location=$FILE.mkv
7.3.5录音
在i.m x8m Plus上的EARC录音。
PCM格式:
gst-launch-1.0 -v alsasrc device=sysdefault:CARD=imxaudioxcvr ! audio/x-raw,format=S16LE,channels=2,rate=48000 ! playsink audio-sink="alsasink device=sysdefault:CARD=wm8960audio buffer-time=40000"
压缩格式:
gst-launch-1.0 alsasrc device=sysdefault:CARD=imxaudioxcvr ! audio/x-raw,format=S16LE,channels=2,rate=48000 ! queue max-size-buffers=0 max-size-bytes=0 max-size-time=0 ! spdifdemux ! decodebin ! playsink audio-sink="alsasink device=sysdefault:CARD=wm8960audio buffer-time=40000 sync=false"
以下示例演示如何录制MP3或WMA音频。
•MP3录音
$GSTL pulsesrc num-buffers=$NUMBER blocksize=$SIZE ! lamemp3enc ! filesink location=output.mp3
7.3.6录像
视频录制是使用摄像头输入完成的,所以这个活动只适用于有摄像头的平台。不同的相机需要设置不同的捕捉模式,以达到特殊的分辨率。参见i.MX BSP移植指南(IMXBSPPG)第14章“使用CSI支持摄像机”和第15章“使用MIPI-CSI支持摄像机”。
VPU视频编码只能在支持VPU编码器的SoC上工作。imxv4l2src仅在i.MX 6和i.MX 7上支持。i. MX 8支持开源插件v4l2src作为相机源。
可以使用$GSTINSPECT命令获取关于codec属性的更多信息。
录音的一个例子可能是这样的:
$GSTL $V4L2SRC device=$DEVICE num-buffers=300 ! $INPUT_CAPS ! queue ! $video_encoder_plugin ! [h264parse] ! $MUXER ! filesink location=output.$EXTENSION
•根据SoC, V 4 L 2 S R C 可以是 i m x v 4 l 2 s r c ,也可以是 v 4 l 2 s r c 。•根据系统视频输入设备, V4L2SRC可以是imxv4l2src,也可以是v4l2src。 •根据系统视频输入设备, V4L2SRC可以是imxv4l2src,也可以是v4l2src。•根据系统视频输入设备,DEVICE可以设置为/dev/video, /dev/video0,或/dev/video1。
• I N P U T C A P S 应该设置为 v i d e o / x − r a w , f o r m a t = ( s t r i n g ) N V 12 , w i d t h = 1920 , h e i g h t = 1080 , f r a m e r a t e = ( f r a c t i o n ) 30 / 1 。• INPUT_CAPS应该设置为video/x-raw,format=(string)NV12,width=1920,height=1080,framerate=(fraction)30/1。 • INPUTCAPS应该设置为video/x−raw,format=(string)NV12,width=1920,height=1080,framerate=(fraction)30/1。•MUXER可以设置为qtmux、matroskamux、mp4mux、avimux或flvmux。
• E X T E N S I O N 是根据 m u x e r 类型指定的文件名扩展名。请参阅视频编码部分来选择正确的 EXTENSION是根据muxer类型指定的文件名扩展名。 请参阅视频编码部分来选择正确的 EXTENSION是根据muxer类型指定的文件名扩展名。请参阅视频编码部分来选择正确的video_encoder_plugin。
7.3.7音频/视频录制
这是一个用来同时录制音频和视频的命令示例:
$GSTL –e $V4L2SRC device=$DEVICE ! $INPUT_CAPS ! queue ! $video_encoder_plugin ! [h264parse] ! queue ! mux. pulsesrc ! 'audio/x-raw, rate=44100, channels=2' ! lamemp3enc ! queue ! mux. $MUXER name=mux ! filesink location= output.$EXTENSION
•根据SoC的不同, V 4 L 2 S R C 可以是 i m x v 4 l 2 s r c 或 v 4 l 2 s r c 。• V4L2SRC可以是imxv4l2src或v4l2src。 • V4L2SRC可以是imxv4l2src或v4l2src。•INPUT_CAPS应该设置为video/x-raw, format=(string)NV12, width=1920, height=1080, framerate=(fraction)30/1。
• M U X E R 可以设置为 q t m u x 、 m a t r o s k a m u x 、 m p 4 m u x 、 a v i m u x 或 f l v m u x 。请参阅视频编码部分来选择正确的 MUXER可以设置为qtmux、matroskamux、mp4mux、avimux或flvmux。 请参阅视频编码部分来选择正确的 MUXER可以设置为qtmux、matroskamux、mp4mux、avimux或flvmux。请参阅视频编码部分来选择正确的video_encoder_plugin。
常用参数如下:
•-e表示当用户按下Ctrl+C时发送EOS,以避免输出损坏。
•$EXTENSION是根据多路复用器类型的文件名扩展名。
7.3.8相机预览
这个例子显示了摄像头看到的东西。它只适用于带有摄像头的平台。
$GSTL v4l2src ! 'video/x-raw, format=(string)$FORMAT, width=$WIDTH, height=$HEIGHT, framerate=(fraction)30/1'
! v4l2sink
相机预览的例子:
$GSTL v4l2src device=/dev/video1 ! 'video/x-raw, format=(string)UYVY,width=640,height=480,framerate=(fraction)30/1'
! autovideosink
参数的评论:
•使用gst-inspect-1.0 v4l2src获取摄像头支持格式和分辨率。
•如果用户需要其他格式或分辨率,根据相机支持的功能设置caps filter。
•确保设置了正确的caps过滤器,这也需要v4l2sink支持。
7.3.9录制TV-in源
TV-in源插件从电视解码器获取视频帧。它基于V4l2捕获接口。命令行示例如下:
gst-launch-1.0 v4l2src ! autovideosink
请注意:电视解码器是ADV7180。它支持NTSC和PAL电视模式。输出视频帧是交错的,所以sink插件需要启用去交错。v4l2sink deinterface的默认值为True。
7.3.10网络摄像头
下面的命令行是一个如何记录和传输网络摄像机输入的示例。
$GSTL v4l2src device=/dev/video1 ! $video_encoder_plugin ! rtph264pay ! udpsink host=$HOST_IP
HOST_IP是发送报文到的IP/组播组。
这个命令行是一个如何接收和显示网络摄像头输入的示例。
$GSTL udpsrc ! buffer-size=204800 (example number) application/x-rtp ! rtph264depay ! $video_decoder_plugin ! autovideosink
7.3.11 HTTP流媒体
HTTP流包括以下内容:
•人工管道
$GSTL souphttpsrc location= http://SERVER/test.avi ! typefind
! aiurdemux name=demux demux. ! queue max-size-buffers=0 max-size-time=0 ! $video_decoder_plugin
! $video_sink_plugin demux. ! queue max-size-buffers=0 max-size-time=0
! beepdec ! $audio_sink_plugin
•PLAYBIN
$GSTL $PLAYBIN uri=http://SERVER/test.avi
•GPLAY
$GPLAY http://SERVER/test.avi
7.3.12 HTTP直播
HLS流包括以下内容:
•PLAYBIN
$GSTL $PLAYBIN uri=http://SERVER/test.m3u8
•GPLAY
$GPLAY http://SERVER/test.m3u8
7.3.13 MPEG-DASH流
The MPEG-DASH 流包括以下内容:
• PLAYBIN
$GSTL $PLAYBIN uri=http://SERVER/test.mpd
• GPLAY
$GPLAY http://SERVER/test.mpd
7.3.14 RTSP (Real Time Streaming Protocol)回放
使用以下命令查看GStreamer RTP depacketize插件:
$GSTINSPECT | grep depay
RTSP流可以通过手动管道或使用播放箱来播放。命令格式如下。
•人工管道
$GSTL rtspsrc location=$RTSP_URI name=source
! queue ! $video_rtp_depacketize_plugin ! $vpu_dec ! $video_sink_plugin source.
! queue ! $audio_rtp_depacketize_plugin ! $audio_parse_plugin ! beepdec ! $audio_sink_plugin
•PLAYBIN
$GSTL $PLAYBIN uri=$RTSP_URI
rtspsrc的两个属性对RTSP流是有用的:
• 延迟:这是管道额外增加的延迟,默认值为200毫秒。如果您需要低延迟的RTSP流播放,请将此属性设置为较小的值。
•Buffer-mode:该属性用于控制正在使用的缓冲算法。它包括四种模式:
—None:输出时间戳直接从RTP时间戳计算,不适合实时应用程序。
—Slave:计算发送方和接收方之间的倾斜,并产生平滑调整的传出时间戳,有利于低延迟通信。
—缓冲:在低、高水印之间缓冲数据包,有利于流通信。
—自动:根据流的不同选择以上三种模式。这是默认设置。
要暂停或恢复RTSP流播放,对rtspsrc使用slave或none的缓冲模式,如在buffer-mode=buffer中。
恢复后,时间戳强制从0开始,这将导致在恢复后删除缓冲区。
手动管道的例子:
$GSTL rtspsrc location=rtsp://10.192.241.11:8554/test name=source
! queue ! rtph264depay ! avdec_h264 ! overlaysink source.
! queue ! rtpmp4gdepay ! aacparse ! beepdec ! pulsesink
回放在GStreamer 1.X 中不会自动退出。如果在RTPSRC插件中将缓冲区模式设置为缓冲区。
7.3.15 RTP/UDP MPEGTS流
有一些点要记住当做RTP/UDP MPEGTS流:
•UDP/RTP服务器发送的源文件必须为TS格式。
•服务器启动时间比客户端启动时间提前1秒。
对于UDP/RTP TS流来说,aiurdemux的两个属性是有用的:
流延迟:这是管道额外增加的延迟,默认值为400毫秒。这个值是针对客户机首先启动的情况设计的。如果该值太小,则由于缺乏音频或视频缓冲区,整个管道可能无法运行。在这种情况下,您应该取消当前命令并重新启动管道。如果设置过大,启动服务器后等待较长时间才能看到视频。
low_latency_tolerance:这个值是总延迟时间在流延迟时间周围波动的范围。默认情况下该属性是禁用的。当用户设置这个值时,最大延迟是(stream -latency + low_latency_tolerance)。
UDP MPEGTS流命令行格式如下:
$GSTL udpsrc do-timestamp=false uri=$UDP_URI caps="video/mpegts"
! aiurdemux streaming_latency=400 name=d d.
! queue ! $vpu_dec ! queue ! $video_render_sink sync=true d. ! queue ! beepdec ! $audio_sink_plugin sync=true
$GSTL udpsrc do-timestamp=false uri=udp://10.192.241.255:10000 caps="video/mpegts"
! aiurdemux streaming_latency=400 name=d d.
! queue ! vpudec ! queue ! overlaysink sync=true d. ! queue ! beepdec ! pulsesink sync=true
RTP MPEGTS流媒体命令的格式如下:
$GSTL udpsrc do-timestamp=false uri=$RTP_URI caps="application/x-rtp"
! rtpmp2tdepay ! aiurdemux streaming_latency=400 name=d d.
! queue ! $vpu_dec ! queue ! $video_render_sink sync=true d. ! queue ! beepdec ! $audio_sink_plugin sync=true
$GSTL udpsrc do-timestamp=false uri=udp://10.192.241.255:10000 caps="application/x-rtp"
! rtpmp2tdepay ! aiurdemux streaming_latency=400 name=d d.
! queue ! vpudec ! queue ! overlaysink sync=true d.
! queue ! beepdec ! pulsesink sync=true
7.3.16 RTSP流媒体服务器
RTSP流媒体服务器用例基于开源包gst-rtsp-server。它使用i.MX aiurdemux插件将文件解复用到音频或视频基本流,并通过RTP发送出去。在一块板上启动RTSP流媒体服务器,使用RTSP流媒体回放命令在另一块板上播放RTSP流媒体服务器。
Yocto Project版本默认不安装gst-rtsp-server包。按照以下步骤构建和安装它。
$yocto_root/build/tmp/work/cortexa9hf-vfp-neon-poky-linux-gnueabi/gstreamer1.0-rtsp-server/ $version/ build/examples/
test-uri $RTSP_URI
例如:
test-uri file:///home/root/temp/TestSource/mp4/1.mp4
•服务器地址:
rtsp://$SERVER_IP:8554/test
例如:
rtsp://10.192.241.106:8554/test
•支持的客户端操作有播放、停止、暂停、恢复、查找。
7.3.17视频转换
有三个视频转换插件,imxvideoconvert_ipu、imxvideoconvert_g2d和imxvideoconvert_pxp。它们都可以用于视频色彩空间转换、调整大小和旋转。Imxvideoconvert_ipu还可以用于执行视频去交错。它们可用于在ximagesink之前进行连接,以启用X Windows上的视频渲染,或用于转码以更改视频大小、旋转或去交错。
使用gst-inspect-1.0来获得每个转换器的功能以及支持的输入和输出格式。注意,imxvideoconvert_g2d只能执行颜色空间到RGB空间的转换。
色彩空间转换(CSC)
gst-launch-1.0 videotestsrc ! video/x-raw,format=NV12 ! imxvideoconvert_{xxx} ! video/x-raw,format=RGB16 ! ximagesink display=:0
调整
gst-launch-1.0 videotestsrc ! video/x-raw,format=NV12,width=800,height=600 ! imxvideoconvert_{xxx} ! video/x-raw, width=640, height=480 ! ximagesink display=:0
旋转
gst-launch-1.0 videotestsrc ! imxvideoconvert_{xxx} rotation=2 ! ximagesink display=:0
与i.MX与IPU分离
gst-launch-1.0 playbin uri=file://$FILE video-sink="imxvideoconvert_ipu deinterlace=3 ! ximagesink display=:0 sync=false"
用i.MX和VPU转码
gst-launch-1.0 filesrc location=$FILE.mp4 typefind=true ! video/quicktime ! aiurdemux ! vpudec ! imxvideoconvert_ipu ! video/x-raw,format=NV12,width=1280,height=720 ! vpuenc_h263 ! avimux ! filesink location=$FILE.avi
i.MX与IPU或VPU的结合
可以同时组合CSC、调整大小、旋转和去交错。可以在管道中同时使用imxvideoconvert_ipu和imxvideoconvert_g2d。示例如下:
gst-launch-1.0 videotestsrc ! video/x-raw,format=I420,width=1280,height=800,interlacemode=interleaved ! imxvideoconvert_ipu rotation=2 deinterlace=3 ! video/xraw,format=NV12,width=800,height=600 ! vpuenc_h264 ! vpudec ! imxvideoconvert_g2d rotation=3 ! video/x-raw,format=RGB16,width=640,height=480 ! ximagesink sync=false display=:0
7.3.18视频组成
Imxcompositor_g2d使用相应的硬件来加速视频合成。它可以用来合成多个视频到一个。视频的位置、大小和旋转可以在合成时指定。如果输入和输出的视频不一样,视频颜色空间转换也会自动执行。每个视频都可以设置为一个alpha和z轴值,以获得alpha混合和视频混合序列。
注意,imxcompositor_g2d只能输出RGB颜色空间格式。使用gst-inspect-1.0可以获得更详细的信息,包括支持的输入和输出视频格式。
•将两个视频合成为一个视频。
gst-launch-1.0 imxcompositor_{xxx} name=comp sink_1::xpos=160 sink_1::ypos=120 ! overlaysink videotestsrc ! comp.sink_0 videotestsrc ! comp.sink_
•将两个视频合成为一个红色背景色。
gst-launch-1.0 imxcompositor_{xxx} background=0x000000FF name=comp sink_1::xpos=160 sink_1::ypos=120 ! overlaysink videotestsrc ! comp.sink_0 videotestsrc ! comp.sink_1
•用CSC将两个视频合成为一个,调整大小,旋转。
gst-launch-1.0 imxcompositor_{xxx} name=comp sink_0::width=640 sink_0::height=480 sink_1::xpos=160 sink_1::ypos=120 sink_1::width=640 sink_1::height=480 sink_1::rotate=1 ! video/x-raw,format=RGB16 ! overlaysink videotestsrc ! video/x-raw,format=NV12,width=320,height=240 ! comp.sink_0 videotestsrc ! video/x-raw,format=I420,width=320,height=240 ! comp.sink_1
•用CSC将三个视频合成为一个,调整大小,旋转,alpha, z顺序,并保持长宽比。
gst-launch-1.0 imxcompositor_{xxx} name=comp sink_0::width=640 sink_0::height=480 sink_0::alpha=0.5 sink_0::z-order=3 sink_1::alpha=0.8 sink_1::z-order=2 sink_1::xpos=160 sink_1::ypos=120 sink_1::width=640 sink_1::height=480 sink_1::rotate=1 sink_2::xpos=320 sink_2::ypos=240 sink_2::width=500 sink_2::height=500 sink_2::alpha=0.6 sink_2::keep-ratio=true ! video/x-raw,format=RGB16 ! overlaysink videotestsrc ! video/x-raw,format=NV12,width=320,height=240 ! comp.sink_0 videotestsrc ! video/x-raw,format=I420,width=320,height=240 ! comp.sink_1 videotestsrc ! video/x-raw,format=RGB16,width=320,height=240 ! comp.sink_2
7.4脉冲音频输入/输出设置
如果rootfs中安装了PulseAudio,可能需要设置PulseAudio输入/输出设置。
音频输出设置
使用pactl命令列出所有可用的音频接收器:
$ pactl list sinks
显示可用的音频接收器列表:
Sink #0
State: SUSPENDED
Name: alsa_output.platform-soc-audio.1.analog-stereo
Description: sgtl5000-audio Analog Stereo ... ...
Sink #1
State: SUSPENDED
Name: alsa_output.platform-soc-audio.4.analog-stereo
Description: imx-hdmi-soc Analog Stereo ... ...
使用pacmd命令根据上面列表中的接收号设置默认音频接收:
$ pacmd set-default-sink $sink-number
在上面的例子中,$sink-number可以是0或1。
设置默认接收器后,使用下面的命令来验证音频路径:
$ gst-launch audiotestsrc !pulsesink
音频输入设置
使用pactl命令列出所有可用的音频源:
$ pactl list sources
系统显示可用的音频源列表。
Source #0
State: SUSPENDED
Name: alsa_output.platform-soc-audio.1.analog-stereo.monitor
Description: Monitor of sgtl5000-audio Analog Stereo ... ...
Source #1
State: SUSPENDED
Name: alsa_input.platform-soc-audio.1.analog-stereo
Description: sgtl5000-audio Analog Stereo ... ... ...
使用pacmd命令根据上面列表中的音频源编号设置默认音频源:
$ pacmd set-default-source $sink-number
在上面的例子中,$sink-number可以是0或1。如果不需要同时录制和回放,则不需要设置监控模式。
PulseAudio I/O路径设置状态可以通过以下方式检查:
$ pactl stat
多通道输出支持设置
对于那些需要输出多通道的板,这些步骤是需要启用多通道输出配置文件:
5. 使用pacmd命令列出可用的卡:
$ pacmd list-cards
列出了可用的声卡和支持的配置文件。
2 card(s) available.
index: 0
name: <alsa_card.platform-sound-cs42888.34>
driver: <module-alsa-card.c>
owner module: 6
properties:
alsa.card = "0"
alsa.card_name = "cs42888-audio"
...
...
profiles:
input:analog-mono: Analog Mono Input (priority 1, available: unknown)
input:analog-stereo: Analog Stereo Input (priority 60, available: unknown)
...
...
active profile: <output:analog-stereo+input:analog-stereo>
...
...
$ pacmd set-card-profile $CARD $PROFILE
$CARD是pacmd list-cards中列出的卡名(例如,上面示例中的alsa_card.platform-sound-cs42888.34), P R O F I L E 是配置文件名称。这些也列在 p a m c d 列表卡上。 ( 例如,上面示例中的输出 : a n a l o g u e − s u r r o u n d − 51 ) 。 3. 设置卡配置文件后,使用 PROFILE是配置文件名称。这些也列在pamcd列表卡上。(例如,上面示例中的输出:analogue -surround-51)。 3.设置卡配置文件后,使用 PROFILE是配置文件名称。这些也列在pamcd列表卡上。(例如,上面示例中的输出:analogue−surround−51)。3.设置卡配置文件后,使用 pactl list sink和$pacmd set-default-sink $sink-number设置默认接收。
7.5在rootfs中安装gstreamer1.0-libav
下面的步骤展示了如何将gstreamer1.0-libav安装到rootfs映像中。
1.在配置文件conf/local.conf中添加以下行。
IMAGE_INSTALL:append = " gstreamer1.0-libav"
LICENSE_FLAGS_WHITELIST = "commercial"
$ bitbake gstreamer1.0-libav
3.构建rootfs映像。
$ bitbake <image_name>
第八章 音频
8.1 DSP支持
具体的i.MX 8QuadXPlus、i.MX 8QuadMax和i.MX 8M Plus SoC提供DSP支持。
8.1.1 HiFi 4 DSP架构
在定制板上支持HiFi 4在i.MX DSP用户指南(IMXDSPUG)中有记录。
8.1.2声音打开固件
Sound Open Firmware是HiFi 4 DSP框架的开源替代方案。对于在自定义板上支持HiFi 4,请参阅SOF项目文档https://thesofproject.github.io在公共领域可用。
关于工具链、支持平台、二进制封装、音频场景快速设置的详细信息,请参见《SOF用户指南(NXP i.MX 8平台)》。
8.2 HDMI eARC支持
在i.MX 8M Plus EVK板上支持eARC。
该过程启用音频,音频通过imxaudioxcvr卡输入,并通过wm8960声卡播放。
确保有耳机插入i.MX 8M Plus EVK音频插孔。步骤如下:
8. 在i.MX 8M Plus EVK上,设置eARC模式。缺省模式为SPDIF:
amixer -c 0 cset numid=1 2
arecord -Dsysdefault:CARD=imxaudioxcvr -c2 -r48000 -fS32_LE -twav | aplay - Dsysdefault:CARD=wm8960audio
—UnitTest
▪clinfo
▪loadstore
▪math
▪threadwalker
▪test_vivante
•functions_and_kernels
•illegal_vector_sizes
•initializers
•multi_dimensional_arrays
•reserved_data_types
•structs_and_enums
•unions
•unsupported_extensions
•fft
•es20:包含对Open GLES 2.0的测试。
—vv_launcher
•coverflow.sh
•vv_launcher
•tiger:一个简单的带有旋转虎头的OpenVG应用程序。这是为了演示OpenVG。
•vdk:包含对OpenGL ES 1.1和OpenGL ES 2.0的健全测试。
tiger和VDK测试显示,正在使用硬件加速。没有它,他们不会跑。
9.4 Qt 6
在Yocto项目环境中,使用bitbake imx-image-full命令将Qt 6内置到Linux映像中。关于Qt启用的更多细节,请查看meta-imx回购中的README和i.MX Yocto项目用户指南(IMXLXYOCTOUG)。
第十章 安全
i.MX平台定义了一系列安全加速子系统。
10.1 CAAM内核驱动
10.1.1介绍
Linux内核包含NXP CAAM安全硬件块的Scatterlist Crypto API驱动程序。它与内核加密用户(如DM-Crypt、Keyctl)无缝集成,任何磁盘加密和密钥管理套件都会自动使用硬件进行加密加速。CAAM硬件在Linux内核中被称为“CAAM”,以其内部块的名称命名:密码加速器和保证模块。
有几个HW接口(“后端”)可以用来与引擎通信(例如,提交请求),它们的可用性取决于SoC:
•注册接口(RI) -在所有soc上可用(尽管DPAA2 soc上限制从内核访问)。
它的主要用途是调试(例如单步通过描述符命令),尽管它也用于RNG初始化。
•作业环接口(JRI) -遗留接口,在所有soc上可用;在大多数soc中有4个环。
请注意:在某些情况下,内核中可访问或可见的环更少,例如,当像Trusted firmware - a (TF-A)这样的固件保留一个环时。
在这些后端之上,还有“前端”——位于Linux Crypto API和后端驱动程序之间的驱动程序。他们的主要任务是:
•注册支持的加密算法。
•处理来自用户的加密请求(通过Linux crypto API),并将它们转换成被使用的后端理解的适当格式。
•将正在使用的后端CAAM引擎响应转发给用户。
要使用特定的实现,可以通过使用特定(unique)来显式地请求它。“驱动程序名称”而不是通用的“算法名称”。请参阅官方Linux Kernel Crypto API文档(Crypto API Cipher References And Priority)。目前,JRI前端的默认优先级是3000。
10.1.2源文件
驱动程序源代码维护在Linux内核源代码树的drivers/crypto/caam下。下面是一个映射到CAAM的非详尽文件列表(有些文件被省略了,因为它们的存在仅由驱动程序逻辑或设计证明)。
表63 源文件
10.1.3加载模块
CAAM后端驱动程序可以内置编译,也可以作为模块编译。前端驱动程序链接到后端驱动程序。模块名称的列表参见节源文件,内核配置是怎样的,以及菜单条目与模块和/或启用功能之间的映射。
10.1.4内核配置
默认情况下,应该在内核中为目标平台配置指定的驱动程序。如果不确定,请检查CONFIG_CRYPTO_DEV_FSL_CAAM,它位于内核配置中的Cryptographic API ->硬件加密设备子菜单中.
样本设备树加密节点
crypto@30000 {
compatible = "fsl,sec-v4.0";
fsl,sec-era = <2>;
#address-cells = <1>;
#size-cells = <1>;
reg = <0x300000 0x10000>;
ranges = <0 0x300000 0x10000>;
interrupt-parent = <&mpic>;
interrupts = <92 2>;
clocks = <&clks IMX6QDL_CLK_CAAM_MEM>,
<&clks IMX6QDL_CLK_CAAM_ACLK>,
<&clks IMX6QDL_CLK_CAAM_IPG>,
<&clks IMX6QDL_CLK_EIM_SLOW>;
clock-names = "mem", "aclk", "ipg", "emi_slow";
};
10.1.5如何测试驱动程序
加密驱动程序可以在两种模式下进行验证:启动时和请求时。要启用加密测试特性,内核需要按照如下方式更新。
指定在何处进行加密测试的引导日志部分(如果引导测试成功通过,则不会报告任何信息。
对于没有可用测试的算法,将打印dmesg中的一行):
[ 4.647985] alg: No test for authenc(hmac(sha224),ecb(cipher_null)) (authenc-hmac-sha224-ecbcipher_null-caam)
[ 4.661181] alg: No test for authenc(hmac(sha256),ecb(cipher_null)) (authenc-hmac-sha256-ecbcipher_null-caam)
[ 4.671345] alg: No test for authenc(hmac(sha384),ecb(cipher_null)) (authenc-hmac-sha384-ecbcipher_null-caam)
[ 4.681486] alg: No test for authenc(hmac(sha512),ecb(cipher_null)) (authenc-hmac-sha512-ecbcipher_null-caam)
[ 4.691608] alg: No test for authenc(hmac(md5),cbc(aes)) (authenc-hmac-md5-cbc-aes-caam)
[ 5.005331] alg: No test for seqiv(authenc(hmac(sha384),rfc3686(ctr(aes)))) (seqiv-authenc-hmacsha384-rfc3686-ctr-aes-caam)
[ 5.016763] alg: No test for seqiv(authenc(hmac(sha512),rfc3686(ctr(aes)))) (seqiv-authenc-hmacsha512-rfc3686-ctr-aes-caam)
[ 5.028023] caam algorithms registered in /proc/crypto
[ 5.157622] caam_jr 31430000.jr2: registering rng-caam
[ 5.206167] caam 31400000.caam: caam pkc algorithms registered in /proc/crypto
10.2加密算法支持
•Linux内核scatterlist Crypto API支持的算法
Linux内核包含Scatterlist Crypto API的各种用户,包括它的IPsec实现,有时称为NETKEY堆栈。在使用Crypto API注册受支持的算法后,驱动程序将用于处理每个包对称加密请求,并将它们转发给CAAM硬件。由于CAAM硬件是异步处理请求的,所以驱动程序使用加密API注册异步算法实现:ahash、skcipher和一个在.cra_flags中设置了CRYPTO_ALG_ASYNC的头部。不同的硬件和驱动程序软件版本的组合支持不同的算法集,因此在所需的目标系统上在/proc/crypto中搜索驱动程序名称将确保正确报告所支持的算法。
•使用关联数据(AEAD)算法进行加密验证
这些算法用于要加密的数据与要验证的数据重叠或部分重叠的应用程序,例如IPsec和TLS协议。这些算法在驱动程序中实现,使得硬件只对输入数据进行一次传递,同时写入加密和身份验证数据。
AEAD算法主要用于IPsec ESP(但也支持TLS (1.x)记录层加密(KTLS支持))。
CAAM驱动程序目前支持卸载以下AEAD算法:
-“缝合”AEAD:所有组合{NULL, CBC-AES, CBC-DES, CBC-3DES-EDE, rfc3686 - ctrl - aes} x HMAC-{MD-5, SHA-1,-224,-256,-384,-512}
—“true”AEAD:通用的GCM-AES, IPsec使用的GCM-AES: RFC4543-GCM-AES和RFC4106-GCM-AES
•加密算法
CAAM驱动程序目前支持卸载以下加密算法。
•验证算法
CAAM驱动程序的哈希支持包括键控(hmac)和非键哈希算法。
•非对称(公钥)算法
目前,CAAM驱动与pkcs1pad (rsa-caam, sha256)驱动一起支持rsa加密和rsa解密。
•CAAM驱动程序支持的算法
root@imx8mqevk:~# cat /proc/crypto | grep caam driver : pkcs1pad(rsa-caam,sha256) driver : rsacaam driver : cmac-aes-caam driver : xcbc-aes-caam driver : md5-caam driver : hmac-md5-caam
driver : sha256-caam driver : hmac-sha256-caam driver : sha224-caam driver : hmac-sha224-caam
driver : sha1-caam driver : hmac-sha1-caam driver : seqiv-authenc-hmac-sha256-rfc3686-ctr-aescaam driver : authenc-hmac-sha256-rfc3686-ctr-aes-caam driver : seqiv-authenc-hmac-sha224-rfc3686-
ctr-aes-caam driver : authenc-hmac-sha224-rfc3686-ctr-aes-caam driver : seqiv-authenc-hmac-sha1-
rfc3686-ctr-aes-caam driver : authenc-hmac-sha1-rfc3686-ctr-aes-caam driver : seqiv-authenc-hmacmd5-rfc3686-ctr-aes-caam driver : authenc-hmac-md5-rfc3686-ctr-aes-caam driver : echainiv-authenchmac-sha256-cbc-des-caam driver : authenc-hmac-sha256-cbc-des-caam driver : echainiv-authenc-hmacsha224-cbc-des-caam driver : authenc-hmac-sha224-cbc-des-caam driver : echainiv-authenc-hmac-sha1-cbc-des-caam driver : authenc-hmac-sha1-cbc-des-caam driver : echainiv-authenc-hmac-md5-cbc-descaam driver : authenc-hmac-md5-cbc-des-caam driver : echainiv-authenc-hmac-sha256-cbc-des3_edecaam driver : authenc-hmac-sha256-cbc-des3_ede-caam driver : echainiv-authenc-hmac-sha224-cbcdes3_ede-caam driver : authenc-hmac-sha224-cbc-des3_ede-caam driver : echainiv-authenc-hmac-sha1-cbc-des3_ede-caam driver : authenc-hmac-sha1-cbc-des3_ede-caam driver : echainiv-authenc-hmacmd5-cbc-des3_ede-caam driver : authenc-hmac-md5-cbc-des3_ede-caam driver : echainiv-authenc-hmacsha256-cbc-aes-caam driver : authenc-hmac-sha256-cbc-aes-caam driver : echainiv-authenc-hmacsha224-cbc-aes-caam driver : authenc-hmac-sha224-cbc-aes-caam driver : echainiv-authenc-hmac-sha1-cbc-aes-caam driver : authenc-hmac-sha1-cbc-aes-caam driver : echainiv-authenc-hmac-md5-cbc-aes-caam driver : authenc-hmac-md5-cbc-aes-caam driver : authenc-hmac-sha256-ecb-cipher_null-caam driver : authenc-hmac-sha224-ecb-cipher_null-caam driver : authenc-hmac-sha1-ecb-cipher_null-caam driver : authenc-hmac-md5-ecb-cipher_null-caam driver : gcm-aes-caam driver : rfc4543-gcm-aescaam driver : rfc4106-gcm-aes-caam driver : ecb-arc4-caam driver : ecb-des3-caam driver : tk-ecbaes-caam driver : ecb-aes-caam driver : ecb-des-caam driver : rfc3686-ctr-aes-caam driver : ctraes-caam driver : cbc-des-caam driver : cbc-3des-caam driver : tk-cbc-aes-caam driver : cbc-aes-caam
root@imx8mqevk:~#