【RT摩拳擦掌】如何构建RT AVB switch&endpoint平台
一,文档简介
之前讲过一篇文章是如何使用单点的RT1170作为talker,单点的RT1170作为listener,两块板子直连实现AVB的端点测试。但是实际使用中,很多是多点对多点的应用,不过需要使用到AVB switch。所以本篇文章在之前文章的基础上,多加了一个listener端点和AVB switch,去实现一个talker,两个listener的AVB 平台情况。
AVB switch可以是第三方的成品AVB switch,当然也可以考虑使用NXP的RT即将推出的新产品RT1180,这款芯片是带有AVB/TSN switch功能的,并且我们的RT1180 配套的stack也已经发布。
二,平台构建
本文将会使用两种AVB switch去做AVB测试:一种使用NXP官方的MIMXRT1180-EVK作为AVB switch,另外一种使用第三方产品MOTU的AVB switch。端点使用的是3块NXP MIMXRT1170-EVK板子,一块做talker配置,另外两块做listener配置。
对于RT1170作为端点,也就是talker和listener的配置,可以参考之前的文章:
【经验分享】RT1170 AVB初体验
这里可以直接快速启动,拿stack里面做好的avb_app.bin直接烧录到MIMXRT1170-EVK做talker和listener配置,当然,如果有自定义的一些功能修改了源码,也可以参考上面的文章重新做编译,生成avb_app.bin文件再烧录。
2.1 软硬件情况
硬件:
MOTU AVB SWITCH(switch)
MIMXRT1180-EVK1(switch)
MIMXRT1170-EVK3(1: talker, 2: listener),硬件需要改动,参考初体验文章。
软件:
RT1170 AVB/TSN stack:
genavb_tsn-mcuxpresso-SDK_2_13_0-5_6_1: https://mcuxpresso.nxp.com/download/52643189c4d74a7b26b8e096ab28df0e
RT1180 AVB/TSN stack:
genavb_tsn-mcuxpresso-SDK_2_15_0-6_0_0 :
https://mcuxpresso.nxp.com/download/c584c33a8d4f55c29b5505b9be8f537a
2.2 配置RT1170 AVB端点
直接烧录avbstack里面的文件:
genavb_tsn-mcuxpresso-SDK_2_13_0-5_6_1\binaries\genavb-avb_audio_app-evaluation-freertos_rt1176-5_6_1.tar\genavb-avb_audio_app-evaluation-freertos_rt1176-5_6_1\release\avb_app.bin
到3块MIMXRT1170-EVK开发板中,可以进入serial download模式烧录:
三块板子做同样的代码烧录,烧录之后,进入internal boot模式,通过串口进行talker和listener的配置,代码烧录成功后,板载的串口会一直发log信息,只需要键盘输入INSERT就可以进入到shell命令行状态。
2.2.1 1块MIMXRT1170开发板做talker配置
cd ..
ls
mkdir avb_app
write avb_app/mclock_role 0
mkdir avdecc
write avdecc/btb_mode 0
mkdir fgptp
write fgptp/gmCapable 1
mkdir port0
write port0/hw_addr 00:22:33:44:55:66
2.2.2 2块MIMXRT1170开发板做listener配置
cd ..
ls
mkdir avb_app
write avb_app/mclock_role 1
mkdir avdecc
write avdecc/btb_mode 1
write avdecc/talker_id 0x00049f4455660000
2.3 AVB Switch 配置
下面分别给出两种SWITCH的配置连接情况:
2.3.1 MOTU AVB Switch
使用MOTU AVB switch的连接框图如下:
实物连接情况如下:
对于专用的AVB switch,无需具体配置,因为你可以把它理解为一个带有AVB功能的交换机,可以实现AVB数据的转发功能。只需要把1个talker的1G网口,和2个listener的1G网口分别接入到MOTU AVB SWITCH的网口中皆可。然后只要talker,和listener的功能能够正常,整个音频传输就可以正常,talker负责收集麦克风的音频数据信息,然后转发到两个listener实现播放。当然,两个listener需要分别接音箱。
2.3.2 RT1180 AVB switch
对于RT1180 AVB switch的配置,也分为快速上手和自行编译两种方法。如果源码没有任何改动的情况下,可以直接使用stack自带的bin文件,这里需要注意,选择正确的bin文件。RT1180有两个内核:CM33和CM7内核。CM33的image是支持TSN/AVB bridge功能的,也就是switch,CM7 image是支持TSN endpoint功能的。
MIMXRT1180-EVK带有多个网口,具体情况如下:
所以在使用AVB switch网口的时候,需要注意使用ENET0,1,2,3口。
使用MIMXRT1180-EVK做AVB switch网口的连接示意图如下:
实际连接图下:
要想实现RT1180的代码工作,需要下载RT1180 M33的TSN bridge代码到MIMXRT1180-EVK板子中,如果本身的AVB/TSN stack带的源码不需要改动,可以使用现成的bin文件测试:
genavb_tsn-mcuxpresso-SDK_2_15_0-6_0_0\binaries\genavb-tsn_app-evaluation-freertos_rt1189_cm33-6_0_0\release\tsn_app.bin
烧录方法有很多,可以使用工具,或者命令行方式。工具可以是MCUBootutility或者官方的SEC工具,这里选择使用MCUBootutility工具,下载连接:
https://github.com/JayHeng/NXP-MCUBootUtility/releases/tag/v6.2.0
如果使用SEC工具下载,可以参考stack的文档:
genavb_tsn-mcuxpresso-SDK_2_15_0-6_0_0\doc\ NXP_GenAVB_TSN_MCUXpresso_User_s_Guide_6_0_rev0.pdf, chapter 11 Flash Image booting.
使用MCUBootutility工具需要做一个改动:
\NXP-MCUBootUtility-6.2.0\src\targets\MIMXRT1189 \MIMXRT1189\bltargetconfig.py
修改:
#flexspiNorMemBase0 = 0x38000000 # CM33 Secure
#flexspiNorMemBase0Ns = 0x28000000 # CM33 Non-Secure
为:
flexspiNorMemBase0 = 0x28000000 # CM33 Non-Secure
flexspiNorMemBase0Ns = 0x38000000 # CM33 Secure
把tsn_app.bin烧录到0x2800b000。
MIMXRT1180-EVK进入serial download mode,SW5:1-OFF,2-OFF,3-OFF,4-ON.然后找一根USB线连接J33实现烧录。烧录完成后,需要进入internal boot 模式QSPI启动,即:SW5:1-OFF,2-ON,3-OFF,4-OFF.
这样就完成了带有AVB switch功能的app烧录,这个代码不需要像RT1170那样,还需要进入shell配置filesystem,对于RT1180 bridge代码,烧录之后,重新启动就自带switch功能了。
当然如果需要重新编译自己的工程,可以直接参考stack的文档NXP_GenAVB_TSN_MCUXpresso_User_s_Guide_6_0_rev0.pdf, 如果使用linux系统编译,方法和RT1170一样,三步走:
(1) 给RT1180 SDK打位于AVB stack的patch
(2) 给RT1180 AVB stack加上两个软链接,一个是板子SDK的,还有一个是AVB SDK源码链接,构架是这样的:
(3) 最后,直接编译./ build_release.sh
\genavb_tsn-mcuxpresso-SDK_2_15_0-6_0_0\genavb-apps-freertos-6_0_0.tar\genavb-apps-freertos-6_0_0\boards\evkmimxrt1180\demo_apps\avb_tsn\tsn_app\cm33\armgcc\ build_release.sh
这样就可以生成对应的tsn_app.bin文件。
三,AVB网络数据包分析
一直都想查看AVB网络数据包,于是想了如下的办法去做,又找了一个通用的网络交换机,可以把其中的某些网口打包到具体网口的方法,这里使用这种方法也只是想查看下基本包,从原理上讲,通用交换器是不带有AVB物理层功能的,所以应该是会对同步功能有所影响,不过本文在此,由于设备的限制,也只是基本了解下AVB数据包结构情况。
准备带有端口mirror功能的交换器:NETGERA plus switch ProSAFE GS105E。
然后对交换器做一个配置,把端口2,3的数据mirror到端口1:
然后整个AVB系统连接框图如下:
实物连接图这样的:
打开整个系统平台,让系统功能跑起来,也就是talker端点声音输入,2个listener端点的功放有输出的情况,在PC端打开wireshark软件,抓包,抓出来的情况是这样的:
可以看到,有很多的AVTP数据包,而且目标地址也有两个。
要想分析AVTP数据包,首先得知道标准的AVTP数据包情况是怎么样的,标准数据包是这样的结构:
下面打开wireshark软件,配置好要抓的网口,抓到数据包情况来对比一下:
可以看到,整个包的情况,基本还是抓出来了,但是对于细节部分,比如VLAN tag,IEC 61883 header,这些没有体现出来,应该是和普通交换机物理层无法支持AVB的原因有关,但是可以看到,上面的音频数据还是能看到的,而且确实是双通道,但是数据只传了一个通道,所以对于RT1170 listener这边,虽然接了双通道的扬声器,两个喇叭对应左右声道,但是听下来,只有一个喇叭通道有声音,另一个没有声音,这点和抓到的数据包是吻合的,这点的源头是stack代码麦采集就用了一个通道,然后虽然音频配置了2个通道,但是实际只有一个通道有数据。
到目前为止,实现了AVB switch&endpoint平台的构架与测试。
测试效果查看视频情况。
avb test result_cn