1# 驱动子系统扩展外设管理模块Changelog 2 3## cl.usbddk.1 SendPipeRequest和SendPipeRequestWithAshmem传入错误参数时,返回值由USB_DDK_SUCCESS变更为USB_DDK_INVALID_PARAMETER 4 5**访问级别** 6 7公开接口 8 9**变更原因** 10 11调用OH_Usb_SendPipeRequest和OH_Usb_SendPipeRequestWithAshmem接口时,如果入参中的devMmap的bufferlen的长度大于设备的MaxPacketSize,会导致接口执行失败,但是之前未将错误上报,开发者无法感知。 12 13**变更影响** 14 15此变更不涉及应用适配。 16 17变更前:调用OH_Usb_SendPipeRequest和OH_Usb_SendPipeRequestWithAshmem接口时,如传参错误导致中断传输失败,不会上报错误信息。 18 19变更后:调用OH_Usb_SendPipeRequest和OH_Usb_SendPipeRequestWithAshmem接口时,如传参错误导致中断传输失败,会上报相关的错误信息,使得开发者获得接口的真实反馈,提升开发体验。 20 21**起始API Level** 22 23SendPipeRequest :API 10。 24 25SendPipeRequestWithAshmem:API 12。 26 27**变更发生版本** 28 29从OpenHarmony 6.0.0.32开始。 30 31**变更的接口/组件** 32 33drivers/external_device_manager: OH_Usb_SendPipeRequest、OH_Usb_SendPipeRequestWithAshmem。 34 35**适配指导** 36 37只要开发者传入正确的参数,接口功能不变,因此无需开发者适配。 38 39OH_Usb_SendPipeRequest和OH_Usb_SendPipeRequestWithAshmem接口开发适配指导: 40 41```C 42 ... 43 static uint8_t g_configIndex = 0; 44 static uint64_t g_interfaceHandle = 0; 45 static std::tuple<bool, uint8_t, uint8_t, uint16_t> FindForEachInterface(const UsbDdkInterface &interface) 46 { 47 struct UsbDdkInterfaceDescriptor *intDesc = interface.altsetting; 48 uint32_t numSetting = interface.numAltsetting; 49 for (uint32_t setIdx = PARAM_0; setIdx < numSetting; ++setIdx) { 50 uint32_t numEp = intDesc[setIdx].interfaceDescriptor.bNumEndpoints; 51 struct UsbDdkEndpointDescriptor *epDesc = intDesc[setIdx].endPoint; 52 for (uint32_t epIdx = PARAM_0; epIdx < numEp; ++epIdx) { 53 if (!IsInterruptInEndpoint(epDesc[epIdx].endpointDescriptor)) { 54 continue; 55 } 56 return { true, intDesc[setIdx].interfaceDescriptor.bInterfaceNumber, 57 epDesc[epIdx].endpointDescriptor.bEndpointAddress, epDesc[epIdx].endpointDescriptor.wMaxPacketSize }; 58 } 59 } 60 return { false, {}, {}, {} }; 61 } 62 63 static std::tuple<bool, uint8_t, uint8_t, uint16_t> GetEndpointInfo(const struct UsbDdkConfigDescriptor *config) 64 { 65 for (uint32_t intIdx = PARAM_0; intIdx < config->configDescriptor.bNumInterfaces; ++intIdx) { 66 auto result = FindForEachInterface(config->interface[intIdx]); 67 if (std::get<0>(result)) { 68 return result; 69 } 70 } 71 return { false, {}, {}, {} }; 72 } 73 74 struct UsbDdkConfigDescriptor *config = nullptr; 75 // deviceId通过ts接口queryDevice获取 76 int32_t ret = OH_Usb_GetConfigDescriptor(deviceId, g_configIndex, &config); 77 if (ret != USB_DDK_SUCCESS) { 78 // 打印错误信息,调用OH_Usb_GetConfigDescriptor失败 79 return; 80 } 81 82 // 通过解析config可以获取设备的maxPktSize 83 auto [result, interface, endpoint, maxPktSize] = GetEndpointInfo(config); 84 if (!result) { 85 // 打印错误信息,调用GetEndpointInfo失败 86 return; 87 } 88 89 ret = OH_Usb_ClaimInterface(deviceId, interface, &g_interfaceHandle); 90 if (ret != USB_DDK_SUCCESS) { 91 // 打印错误信息,调用OH_Usb_ClaimInterface失败 92 return; 93 } 94 95 // 调用OH_Usb_SendPipeRequest 96 struct UsbDeviceMemMap *devMemMap = nullptr; 97 size_t bufferLen = maxPktSize; 98 ret = OH_Usb_CreateDeviceMemMap(deviceId, bufferLen, &devMemMap); 99 if (ret != USB_DDK_SUCCESS) { 100 // 打印错误信息,调用OH_Usb_CreateDeviceMemMap失败 101 return; 102 } 103 struct UsbRequestPipe pipe; 104 pipe.interfaceHandle = g_interfaceHandle; 105 pipe.endpoint = endpoint; 106 pipe.timeout = UINT32_MAX; 107 ret = OH_Usb_SendPipeRequest(&pipe, devMemMap); 108 ... 109 110 // 调用OH_Usb_SendPipeRequestWithAshmem 111 size_t bufferLen = maxPktSize; 112 const uint8_t name[100] = "TestAshmem"; 113 DDK_Ashmem *ashmem = nullptr; 114 int32_t result = OH_DDK_CreateAshmem(name, bufferLen, &ashmem); 115 if (result != USB_DDK_SUCCESS) { 116 // 打印错误信息,调用OH_DDK_CreateAshmem失败 117 return; 118 } 119 const uint8_t ashmemMapType = 0x03; 120 result = OH_DDK_MapAshmem(ashmem, ashmemMapType); 121 if (result != USB_DDK_SUCCESS) { 122 // 打印错误信息,调用OH_DDK_MapAshmem失败 123 return; 124 } 125 struct UsbRequestPipe pipe; 126 pipe.interfaceHandle = g_interfaceHandle; 127 pipe.endpoint = endpoint; 128 pipe.timeout = UINT32_MAX; 129 int32_t returnValue = OH_Usb_SendPipeRequestWithAshmem(&pipe, ashmem); 130 ... 131```