链路说明
M30机型和其支持的PSDK 3.x版本发布后,USB device链路配置给各个平台的PSDK开发使用带来了一定的困难,PSDK 3.3版本开始针对USB device端的链路进行了优化。
USB使用设计:
1. M300 USB 做device,机载计算机USB做host,USB在M300上分为ACM和BULK通道,代码中BULK通过libusb来传输数据。
2. M30/T,M3E/T链路方案完全一致。飞机端USB做Host,机载设备端USB做device。机载设备端需要打开device 端口的RNDIS或BULK。
主要优化点:
1. 可通过宏定义来选择USB的链路,对应的是外部链路注册模块。
#define CONFIG_HARDWARE_CONNECTION DJI_USE_UART_AND_USB_BULK_DEVICE
2. M300 OSDK端口需要用USB只能选择 bulk通道。
DJI_USE_UART_AND_USB_BULK_DEVICE
M300 PSDK云台端口需要用USB只能选择 Network
DJI_USE_UART_AND_NETWORK_DEVICE
3. M30/T,M3E使用USB,可以任选DJI_USE_UART_AND_NETWORK_DEVICE或 DJI_USE_UART_AND_USB_BULK_DEVICE
注:
1. 不使用USB,选择DJI_USE_ONLY_UART与原功能保持一致。
2. 通道与飞机固件适配,M30/T,M3E/T 飞机固件需要升级至V5固件。
3. 网口支持包括RNDIS,以及常用的USB网卡。
4. 当前发布版本(PSDK 3.3 release)网口和bulk通道适配的功能还存在差异,后续会完善到一样。选择方便开发的一个链路即可,待更新。
5. 当前发布版本(PSDK 3.3 release)使用USB通道时,需要配置启动RNDIS,否则飞机端识别不到USB device端,导致PSDK无法运行。优化中,待更新。
PSDK代码调整
链路配置文件:
dji_sdk_config.h
#define DJI_USE_ONLY_UART (0)
#define DJI_USE_UART_AND_USB_BULK_DEVICE (1)
#define DJI_USE_UART_AND_NETWORK_DEVICE (2)
/*!< Attention: Select your hardware connection mode here.
*/#define CONFIG_HARDWARE_CONNECTION DJI_USE_UART_AND_USB_BULK_DEVICE
说明:
-
差别是不同的链路选择不同的注册接口,对应:
BULK: DjiPlatform_RegHalUsbBulkHandler
Network:DjiPlatform_RegHalNetworkHandler
-
USB RNDIS和USB 网口都对应接口:DjiPlatform_RegHalNetworkHandler
-
M300 OSDK端口只能使用bulk,PSDK云台端口只能使用DjiPlatform_RegHalNetworkHandler
-
M30,M3E上需要使用两个bulk通道,不同功能走的bulk通道存在差异。
-
虽然功能已经区分了RNDIS和BULK通道,但是当前发布版本使用bulk时,必须配置打开RNDIS,否则飞机端可能识别不到device设备,导致无法正常通信。此部分还在进一步优化,待更新。
- M3E版本使用RNDIS时,必须配置打开BULK,否则飞机端可能识别不到Device设备接入,导致无法正常通信。此部分待更新。
因为功能适配的原因,Network和bulk链路支持的功能还不完全一样。功能适配链路可以参考:
https://developer.dji.com/doc/payload-sdk-tutorial/cn/quick-start/porting.html
BULK配置
网卡和RNDIS的配置和使用都比较方便,但是现在的功能bulk最全,也是应用中最优的一个通道选择。所以这里基于之前版本中bulk配置来继续说明PSDK 3.3的变动与修改。
本补充说明,主要针对3.3之前版本已经适配过bulk通道的USB device设备,来增加一个bulk通道。BULK还未配置的可以先参考文章【树莓派4B RNDIS + BULK配置】
在已经配通的情况下,只需修改脚本中的如下部分:
enable_bulk=1
if [ ${enable_bulk}-eq1 ]; then
mkdir-p /dev/usb-ffs
cfg_str="${cfg_str}+BULK1"
mkdir-p /dev/usb-ffs/bulk1
func=functions/ffs.bulk1
mkdir-p"${func}"
ln-sf"${func}""${cfg}"
mount -omode=0777-ouid=2000-ogid=2000-t functionfs bulk1 /dev/usb-ffs/bulk1
/home/kyle/work/DJI/startup_bulk/startup_bulk /dev/usb-ffs/bulk1 &
sleep3
cfg_str="${cfg_str}+BULK2"
mkdir-p /dev/usb-ffs/bulk2
func=functions/ffs.bulk2
mkdir-p"${func}"
ln-sf"${func}""${cfg}"
mount -omode=0777-ouid=2000-ogid=2000-t functionfs bulk2 /dev/usb-ffs/bulk2
/home/kyle/work/DJI/startup_bulk/startup_bulk /dev/usb-ffs/bulk2 &
sleep3
fi
重新启动后,ps -ef | grep bulk 可以看到:
然后将此设备接到ubuntu主机上,通过lsusb -d 0955:7020 -v查看。
新版本已经将bulk通道配置开放出来,不再是写死的通道,可以根据设备端实际配置出来的修改代码即可,可以对比前面只配置一个bulk通道时的节点。
root@ubuntu:~# lsusb -d 0955:7020 -v
Bus 001 Device 002: ID 0955:7020 NVidia Corp.
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 239 Miscellaneous Device
bDeviceSubClass 2 ?
bDeviceProtocol 1 Interface Association
bMaxPacketSize0 64
idVendor 0x0955 NVidia Corp.
idProduct 0x7020
bcdDevice 0.01
iManufacturer 1 raspberry
iProduct 2 PI4
iSerial 3 abcdefg1234567890
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 121
bNumInterfaces 4
bConfigurationValue 1
iConfiguration 4 RNDIS+BULK1+BULK2
bmAttributes 0x80
(Bus Powered)
MaxPower 250mA
Interface Association:
bLength 8
bDescriptorType 11
bFirstInterface 0
bInterfaceCount 2
bFunctionClass 2 Communications
bFunctionSubClass 6 Ethernet Networking
bFunctionProtocol 0
iFunction 7 RNDIS
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 2 Communications
bInterfaceSubClass 2 Abstract (modem)
bInterfaceProtocol 255 Vendor Specific (MSFT RNDIS?)
iInterface 5 RNDIS Communications Control
CDC Header:
bcdCDC 1.10
CDC Call Management:
bmCapabilities 0x00
bDataInterface 1
CDC ACM:
bmCapabilities 0x00
CDC Union:
bMasterInterface 0
bSlaveInterface 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x82 EP 2 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0008 1x 8 bytes
bInterval 9
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 10 CDC Data
bInterfaceSubClass 0 Unused
bInterfaceProtocol 0
iInterface 6 RNDIS Ethernet Data
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x01 EP 1 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 2
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 255 Vendor Specific Class
bInterfaceSubClass 0
bInterfaceProtocol 0
iInterface 9 loop input to output
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x02 EP 2 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 3
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 255 Vendor Specific Class
bInterfaceSubClass 0
bInterfaceProtocol 0
iInterface 10 loop input to output
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x84 EP 4 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x03 EP 3 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Device Qualifier (for other device speed):
bLength 10
bDescriptorType 6
bcdUSB 2.00
bDeviceClass 239 Miscellaneous Device
bDeviceSubClass 2 ?
bDeviceProtocol 1 Interface Association
bMaxPacketSize0 64
bNumConfigurations 1
Device Status: 0x0000
(Bus Powered)
然后对应找到代码文件,与上面生成的节点信息要一致。
bInterfaceNumber 3
bEndpointAddress 0x84 EP 4 IN
bEndpointAddress 0x03 EP 3 OUT
hal_usb_bulk.h
另说明一个,如果之前已经配置好了一个bulk,现在直接跑PSDK 3.3 用到bulk时会报错,也可以修改这里的代码:
需要注意,两个通道我这边测试时修改成用一个是可以用的,但是确认过飞机端的功能是按两个通道发的流,这样只是开发者防止产生错误可以修改,实际使用还是需要配置成两个bulk,否则会出现功能混用后,拉不到数据流的异常现象。这样修改也可以帮助理解bulk配置如何与代码工作对应上。
评论
2 条评论
你好,上面提到优化的SDK新版本发布大概定在什么时候
配置两个bulk会导致写UDC失败,单个bulk没问题,请问你们遇到过这种情况吗
请登录写评论。