• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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```