1094332d3Sopenharmony_ci/* 2094332d3Sopenharmony_ci * Copyright (c) 2022-2023 Huawei Device Co., Ltd. 3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4094332d3Sopenharmony_ci * you may not use this file except in compliance with the License. 5094332d3Sopenharmony_ci * You may obtain a copy of the License at 6094332d3Sopenharmony_ci * 7094332d3Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8094332d3Sopenharmony_ci * 9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and 13094332d3Sopenharmony_ci * limitations under the License. 14094332d3Sopenharmony_ci */ 15094332d3Sopenharmony_ci 16094332d3Sopenharmony_ci#include "usbd_dispatcher.h" 17094332d3Sopenharmony_ci#include "hdf_slist.h" 18094332d3Sopenharmony_ci#include "osal_mutex.h" 19094332d3Sopenharmony_ci#include "usb_ddk.h" 20094332d3Sopenharmony_ci#include "usb_impl.h" 21094332d3Sopenharmony_ci#include "usb_interface_pool.h" 22094332d3Sopenharmony_ci#include "v1_0/iusbd_subscriber.h" 23094332d3Sopenharmony_ci#include "usbd_wrapper.h" 24094332d3Sopenharmony_ci 25094332d3Sopenharmony_cinamespace OHOS { 26094332d3Sopenharmony_cinamespace HDI { 27094332d3Sopenharmony_cinamespace Usb { 28094332d3Sopenharmony_cinamespace V1_1 { 29094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdAllocFifo(DataFifo *fifo, uint32_t size) 30094332d3Sopenharmony_ci{ 31094332d3Sopenharmony_ci if (!DataFifoIsInitialized(fifo)) { 32094332d3Sopenharmony_ci void *data = OsalMemAlloc(size); 33094332d3Sopenharmony_ci if (data == nullptr) { 34094332d3Sopenharmony_ci HDF_LOGE("%{public}s:OsalMemAlloc failed", __func__); 35094332d3Sopenharmony_ci return HDF_ERR_MALLOC_FAIL; 36094332d3Sopenharmony_ci } 37094332d3Sopenharmony_ci DataFifoInit(fifo, size, data); 38094332d3Sopenharmony_ci } 39094332d3Sopenharmony_ci return HDF_SUCCESS; 40094332d3Sopenharmony_ci} 41094332d3Sopenharmony_ci 42094332d3Sopenharmony_civoid UsbdDispatcher::UsbdFreeFifo(DataFifo *fifo) 43094332d3Sopenharmony_ci{ 44094332d3Sopenharmony_ci if (fifo == nullptr) { 45094332d3Sopenharmony_ci HDF_LOGE("%{public}s:fifo is nullptr", __func__); 46094332d3Sopenharmony_ci return; 47094332d3Sopenharmony_ci } 48094332d3Sopenharmony_ci 49094332d3Sopenharmony_ci OsalMemFree(fifo->data); 50094332d3Sopenharmony_ci fifo->data = nullptr; 51094332d3Sopenharmony_ci DataFifoInit(fifo, 0, nullptr); 52094332d3Sopenharmony_ci} 53094332d3Sopenharmony_ci 54094332d3Sopenharmony_civoid UsbdDispatcher::UsbdReadCallback(UsbRequest *req) 55094332d3Sopenharmony_ci{ 56094332d3Sopenharmony_ci if (req == nullptr) { 57094332d3Sopenharmony_ci HDF_LOGE("%{public}s:req is nullptr!", __func__); 58094332d3Sopenharmony_ci return; 59094332d3Sopenharmony_ci } 60094332d3Sopenharmony_ci 61094332d3Sopenharmony_ci UsbIfRequest *reqObj = reinterpret_cast<UsbIfRequest *>(req); 62094332d3Sopenharmony_ci UsbdRequestASync *dev = static_cast<UsbdRequestASync *>(req->compInfo.userData); 63094332d3Sopenharmony_ci if (dev == nullptr) { 64094332d3Sopenharmony_ci HDF_LOGE("%{public}s:invalid param dev is nullptr!", __func__); 65094332d3Sopenharmony_ci OsalSemPost(&reqObj->hostRequest->sem); 66094332d3Sopenharmony_ci } 67094332d3Sopenharmony_ci} 68094332d3Sopenharmony_ci 69094332d3Sopenharmony_civoid UsbdDispatcher::UsbdWriteCallback(UsbRequest *req) 70094332d3Sopenharmony_ci{ 71094332d3Sopenharmony_ci if (req == nullptr) { 72094332d3Sopenharmony_ci HDF_LOGE("%{public}s:invalid param req is nullptr!", __func__); 73094332d3Sopenharmony_ci return; 74094332d3Sopenharmony_ci } 75094332d3Sopenharmony_ci 76094332d3Sopenharmony_ci int32_t status = req->compInfo.status; 77094332d3Sopenharmony_ci HDF_LOGI("%{public}s:status is %{public}d!", __func__, status); 78094332d3Sopenharmony_ci} 79094332d3Sopenharmony_ci 80094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbControlSetUp(UsbControlParams *controlParams, UsbControlRequest *controlReq) 81094332d3Sopenharmony_ci{ 82094332d3Sopenharmony_ci if (controlParams == nullptr || controlReq == nullptr) { 83094332d3Sopenharmony_ci HDF_LOGE("%{public}s:controlParams or controlReq is nullptr", __func__); 84094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 85094332d3Sopenharmony_ci } 86094332d3Sopenharmony_ci 87094332d3Sopenharmony_ci controlReq->target = controlParams->target; 88094332d3Sopenharmony_ci controlReq->reqType = controlParams->reqType; 89094332d3Sopenharmony_ci controlReq->directon = controlParams->directon; 90094332d3Sopenharmony_ci controlReq->request = controlParams->request; 91094332d3Sopenharmony_ci controlReq->value = controlParams->value; 92094332d3Sopenharmony_ci controlReq->index = controlParams->index; 93094332d3Sopenharmony_ci controlReq->buffer = controlParams->data; 94094332d3Sopenharmony_ci controlReq->length = static_cast<uint32_t>(controlParams->size); 95094332d3Sopenharmony_ci return HDF_SUCCESS; 96094332d3Sopenharmony_ci} 97094332d3Sopenharmony_ci 98094332d3Sopenharmony_ciUsbInterface *UsbdDispatcher::GetUsbInterfaceById(const HostDevice *dev, uint8_t interfaceIndex) 99094332d3Sopenharmony_ci{ 100094332d3Sopenharmony_ci if (dev == nullptr || dev->service == nullptr) { 101094332d3Sopenharmony_ci HDF_LOGE("%{public}s:idx:%{public}u service is nullptr", __func__, interfaceIndex); 102094332d3Sopenharmony_ci return nullptr; 103094332d3Sopenharmony_ci } 104094332d3Sopenharmony_ci 105094332d3Sopenharmony_ci UsbInterface *tmpIf = UsbClaimInterface(dev->service->session_, dev->busNum, dev->devAddr, interfaceIndex); 106094332d3Sopenharmony_ci if (tmpIf == nullptr) { 107094332d3Sopenharmony_ci HDF_LOGE("%{public}s: UsbClaimInterface failed", __func__); 108094332d3Sopenharmony_ci } 109094332d3Sopenharmony_ci return tmpIf; 110094332d3Sopenharmony_ci} 111094332d3Sopenharmony_ci 112094332d3Sopenharmony_ciint32_t UsbdDispatcher::GetInterfacePipe( 113094332d3Sopenharmony_ci const HostDevice *dev, UsbInterface *interface, uint8_t pipeAddr, UsbPipeInfo *pipe) 114094332d3Sopenharmony_ci{ 115094332d3Sopenharmony_ci UsbPipeInfo pipeTmp; 116094332d3Sopenharmony_ci if (memset_s(&pipeTmp, sizeof(pipeTmp), 0, sizeof(pipeTmp)) != EOK) { 117094332d3Sopenharmony_ci HDF_LOGE("%{public}s:memset_s failed ", __func__); 118094332d3Sopenharmony_ci return HDF_FAILURE; 119094332d3Sopenharmony_ci } 120094332d3Sopenharmony_ci 121094332d3Sopenharmony_ci if (dev == nullptr || interface == nullptr || pipe == nullptr) { 122094332d3Sopenharmony_ci HDF_LOGE("%{public}s:invalid params", __func__); 123094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 124094332d3Sopenharmony_ci } 125094332d3Sopenharmony_ci 126094332d3Sopenharmony_ci UsbInterfaceInfo *info = &interface->info; 127094332d3Sopenharmony_ci if (info == nullptr) { 128094332d3Sopenharmony_ci HDF_LOGE("%{public}s:invalid interface", __func__); 129094332d3Sopenharmony_ci return HDF_FAILURE; 130094332d3Sopenharmony_ci } 131094332d3Sopenharmony_ci 132094332d3Sopenharmony_ci UsbInterfaceHandle *interfaceHandle = UsbImpl::InterfaceIdToHandle(dev, info->interfaceIndex); 133094332d3Sopenharmony_ci if (interfaceHandle == nullptr) { 134094332d3Sopenharmony_ci HDF_LOGE("%{public}s:invalid interface handle", __func__); 135094332d3Sopenharmony_ci return HDF_FAILURE; 136094332d3Sopenharmony_ci } 137094332d3Sopenharmony_ci 138094332d3Sopenharmony_ci int32_t ret = UsbGetPipeInfo(interfaceHandle, info->curAltSetting, pipeAddr, &pipeTmp); 139094332d3Sopenharmony_ci if (ret == HDF_SUCCESS && ((pipeTmp.pipeAddress | static_cast<uint8_t>(pipeTmp.pipeDirection)) == pipeAddr)) { 140094332d3Sopenharmony_ci if (pipe) { 141094332d3Sopenharmony_ci *pipe = pipeTmp; 142094332d3Sopenharmony_ci } 143094332d3Sopenharmony_ci return HDF_SUCCESS; 144094332d3Sopenharmony_ci } 145094332d3Sopenharmony_ci return HDF_FAILURE; 146094332d3Sopenharmony_ci} 147094332d3Sopenharmony_ci 148094332d3Sopenharmony_ciint32_t UsbdDispatcher::GetPipe(const HostDevice *dev, uint8_t interfaceId, uint8_t pipeId, UsbPipeInfo *pipe) 149094332d3Sopenharmony_ci{ 150094332d3Sopenharmony_ci if (dev == nullptr || pipe == nullptr) { 151094332d3Sopenharmony_ci HDF_LOGE("%{public}s:dev or pipe is nullptr, ifId:%{public}u epId:%{public}u", __func__, interfaceId, pipeId); 152094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 153094332d3Sopenharmony_ci } 154094332d3Sopenharmony_ci 155094332d3Sopenharmony_ci if (interfaceId >= USB_MAX_INTERFACES) { 156094332d3Sopenharmony_ci HDF_LOGE("%{public}s:interfaceId invalid, ifId:%{public}u epId:%{public}u", __func__, interfaceId, pipeId); 157094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 158094332d3Sopenharmony_ci } 159094332d3Sopenharmony_ci 160094332d3Sopenharmony_ci UsbInterface *interface = dev->iface[interfaceId]; 161094332d3Sopenharmony_ci if (interface == nullptr) { 162094332d3Sopenharmony_ci HDF_LOGE("%{public}s:interface is nullptr ifId:%{public}u, epId:%{public}u", __func__, interfaceId, pipeId); 163094332d3Sopenharmony_ci return HDF_FAILURE; 164094332d3Sopenharmony_ci } 165094332d3Sopenharmony_ci 166094332d3Sopenharmony_ci int32_t ret = GetInterfacePipe(dev, interface, pipeId, pipe); 167094332d3Sopenharmony_ci return ret; 168094332d3Sopenharmony_ci} 169094332d3Sopenharmony_ci 170094332d3Sopenharmony_civoid UsbdDispatcher::UsbdFreeCtrlPipe(HostDevice *dev) 171094332d3Sopenharmony_ci{ 172094332d3Sopenharmony_ci if (dev == nullptr) { 173094332d3Sopenharmony_ci HDF_LOGE("%{public}s:params dev is nullptr", __func__); 174094332d3Sopenharmony_ci return; 175094332d3Sopenharmony_ci } 176094332d3Sopenharmony_ci 177094332d3Sopenharmony_ci OsalMemFree(dev->ctrPipe); 178094332d3Sopenharmony_ci dev->ctrPipe = nullptr; 179094332d3Sopenharmony_ci} 180094332d3Sopenharmony_ci 181094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdGetCtrlPipe(HostDevice *dev) 182094332d3Sopenharmony_ci{ 183094332d3Sopenharmony_ci UsbPipeInfo *pipe = static_cast<UsbPipeInfo *>(OsalMemCalloc(sizeof(UsbPipeInfo))); 184094332d3Sopenharmony_ci if (pipe == nullptr) { 185094332d3Sopenharmony_ci HDF_LOGE("%{public}s:OsalMemCalloc failed", __func__); 186094332d3Sopenharmony_ci return HDF_ERR_MALLOC_FAIL; 187094332d3Sopenharmony_ci } 188094332d3Sopenharmony_ci 189094332d3Sopenharmony_ci int32_t ret = UsbGetPipeInfo(dev->ctrDevHandle, dev->ctrIface->info.curAltSetting, 0, pipe); 190094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 191094332d3Sopenharmony_ci HDF_LOGE("%{public}s:get pipe failed ret:%{public}d", __func__, ret); 192094332d3Sopenharmony_ci OsalMemFree(pipe); 193094332d3Sopenharmony_ci pipe = nullptr; 194094332d3Sopenharmony_ci return HDF_FAILURE; 195094332d3Sopenharmony_ci } 196094332d3Sopenharmony_ci 197094332d3Sopenharmony_ci dev->ctrPipe = pipe; 198094332d3Sopenharmony_ci return HDF_SUCCESS; 199094332d3Sopenharmony_ci} 200094332d3Sopenharmony_ci 201094332d3Sopenharmony_ciUsbdRequestSync *UsbdDispatcher::UsbdFindRequestSync(HostDevice *port, uint8_t interfaceId, uint8_t pipeAddr) 202094332d3Sopenharmony_ci{ 203094332d3Sopenharmony_ci if (port == nullptr) { 204094332d3Sopenharmony_ci HDF_LOGE("%{public}s:invalid param port is nullptr", __func__); 205094332d3Sopenharmony_ci return nullptr; 206094332d3Sopenharmony_ci } 207094332d3Sopenharmony_ci 208094332d3Sopenharmony_ci UsbdRequestSync *req = nullptr; 209094332d3Sopenharmony_ci HdfSListIterator it; 210094332d3Sopenharmony_ci bool flag = false; 211094332d3Sopenharmony_ci OsalMutexLock(&port->reqSyncLock); 212094332d3Sopenharmony_ci HdfSListIteratorInit(&it, &port->reqSyncList); 213094332d3Sopenharmony_ci while (HdfSListIteratorHasNext(&it)) { 214094332d3Sopenharmony_ci req = reinterpret_cast<UsbdRequestSync *>(HdfSListIteratorNext(&it)); 215094332d3Sopenharmony_ci if (req == nullptr) { 216094332d3Sopenharmony_ci continue; 217094332d3Sopenharmony_ci } 218094332d3Sopenharmony_ci if (req->pipe.interfaceId == interfaceId && ((req->pipe.pipeAddress | req->pipe.pipeDirection) == pipeAddr)) { 219094332d3Sopenharmony_ci flag = true; 220094332d3Sopenharmony_ci break; 221094332d3Sopenharmony_ci } 222094332d3Sopenharmony_ci } 223094332d3Sopenharmony_ci OsalMutexUnlock(&port->reqSyncLock); 224094332d3Sopenharmony_ci 225094332d3Sopenharmony_ci if (flag) { 226094332d3Sopenharmony_ci return req; 227094332d3Sopenharmony_ci } 228094332d3Sopenharmony_ci return nullptr; 229094332d3Sopenharmony_ci} 230094332d3Sopenharmony_ci 231094332d3Sopenharmony_ciUsbdRequestSync *UsbdDispatcher::UsbdRequestSyncAlloc(void) 232094332d3Sopenharmony_ci{ 233094332d3Sopenharmony_ci UsbdRequestSync *req = static_cast<UsbdRequestSync *>(OsalMemCalloc(sizeof(UsbdRequestSync))); 234094332d3Sopenharmony_ci if (req == nullptr) { 235094332d3Sopenharmony_ci HDF_LOGE("%{public}s: OsalMemCalloc failed", __func__); 236094332d3Sopenharmony_ci return req; 237094332d3Sopenharmony_ci } 238094332d3Sopenharmony_ci 239094332d3Sopenharmony_ci req->request = nullptr; 240094332d3Sopenharmony_ci req->endPointAddr = 0; 241094332d3Sopenharmony_ci req->ifHandle = nullptr; 242094332d3Sopenharmony_ci OsalMutexInit(&req->lock); 243094332d3Sopenharmony_ci return req; 244094332d3Sopenharmony_ci} 245094332d3Sopenharmony_ci 246094332d3Sopenharmony_civoid UsbdDispatcher::UsbRequestParamsWSyncInit(UsbRequestParams *params, int32_t timeout, const UsbPipeInfo *pipe) 247094332d3Sopenharmony_ci{ 248094332d3Sopenharmony_ci if (params == nullptr || pipe == nullptr) { 249094332d3Sopenharmony_ci HDF_LOGE("%{public}s: params or pipe is nullptr", __func__); 250094332d3Sopenharmony_ci return; 251094332d3Sopenharmony_ci } 252094332d3Sopenharmony_ci 253094332d3Sopenharmony_ci params->interfaceId = pipe->interfaceId; 254094332d3Sopenharmony_ci params->pipeAddress = pipe->pipeDirection | pipe->pipeAddress; 255094332d3Sopenharmony_ci params->pipeId = pipe->pipeId; 256094332d3Sopenharmony_ci params->requestType = USB_REQUEST_PARAMS_DATA_TYPE; 257094332d3Sopenharmony_ci params->timeout = static_cast<uint32_t>(timeout); 258094332d3Sopenharmony_ci params->dataReq.numIsoPackets = 0; 259094332d3Sopenharmony_ci params->dataReq.directon = static_cast<UsbRequestDirection>((pipe->pipeDirection >> USB_DIR_OFFSET) & 0x1); 260094332d3Sopenharmony_ci params->dataReq.length = pipe->maxPacketSize; 261094332d3Sopenharmony_ci} 262094332d3Sopenharmony_ci 263094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdRequestSyncInit( 264094332d3Sopenharmony_ci HostDevice *port, UsbInterfaceHandle *ifHandle, UsbPipeInfo *pipe, UsbdRequestSync *requestSync) 265094332d3Sopenharmony_ci{ 266094332d3Sopenharmony_ci if (port == nullptr || requestSync == nullptr || ifHandle == nullptr || pipe == nullptr) { 267094332d3Sopenharmony_ci HDF_LOGE("%{public}s:invalid params", __func__); 268094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 269094332d3Sopenharmony_ci } 270094332d3Sopenharmony_ci 271094332d3Sopenharmony_ci int32_t ret = memcpy_s(&requestSync->pipe, sizeof(UsbPipeInfo), pipe, sizeof(UsbPipeInfo)); 272094332d3Sopenharmony_ci if (ret != EOK) { 273094332d3Sopenharmony_ci HDF_LOGE("%{public}s:%{public}d memcpy_s failed", __func__, ret); 274094332d3Sopenharmony_ci return ret; 275094332d3Sopenharmony_ci } 276094332d3Sopenharmony_ci 277094332d3Sopenharmony_ci requestSync->ifHandle = ifHandle; 278094332d3Sopenharmony_ci requestSync->request = UsbAllocRequest(requestSync->ifHandle, 0, requestSync->pipe.maxPacketSize); 279094332d3Sopenharmony_ci if (requestSync->request == nullptr) { 280094332d3Sopenharmony_ci HDF_LOGE("%{public}s:alloc request failed", __func__); 281094332d3Sopenharmony_ci return HDF_ERR_MALLOC_FAIL; 282094332d3Sopenharmony_ci } 283094332d3Sopenharmony_ci UsbRequestParamsWSyncInit(&requestSync->params, USB_CTRL_SET_TIMEOUT, &requestSync->pipe); 284094332d3Sopenharmony_ci requestSync->params.userData = port; 285094332d3Sopenharmony_ci OsalMutexLock(&port->reqSyncLock); 286094332d3Sopenharmony_ci HdfSListAdd(&port->reqSyncList, &requestSync->node); 287094332d3Sopenharmony_ci OsalMutexUnlock(&port->reqSyncLock); 288094332d3Sopenharmony_ci return HDF_SUCCESS; 289094332d3Sopenharmony_ci} 290094332d3Sopenharmony_ci 291094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdRequestSyncInitwithLength(HostDevice *port, UsbInterfaceHandle *ifHandle, 292094332d3Sopenharmony_ci UsbPipeInfo *pipe, int32_t length, UsbdRequestSync *requestSync) 293094332d3Sopenharmony_ci{ 294094332d3Sopenharmony_ci if (port == nullptr || requestSync == nullptr || ifHandle == nullptr || pipe == nullptr) { 295094332d3Sopenharmony_ci HDF_LOGE("%{public}s:invalid params", __func__); 296094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 297094332d3Sopenharmony_ci } 298094332d3Sopenharmony_ci 299094332d3Sopenharmony_ci int32_t ret = memcpy_s(&requestSync->pipe, sizeof(UsbPipeInfo), pipe, sizeof(UsbPipeInfo)); 300094332d3Sopenharmony_ci if (ret != EOK) { 301094332d3Sopenharmony_ci HDF_LOGE("%{public}s:%{public}d memcpy_s failed", __func__, ret); 302094332d3Sopenharmony_ci return ret; 303094332d3Sopenharmony_ci } 304094332d3Sopenharmony_ci 305094332d3Sopenharmony_ci requestSync->ifHandle = ifHandle; 306094332d3Sopenharmony_ci requestSync->request = UsbAllocRequest(requestSync->ifHandle, 0, length); 307094332d3Sopenharmony_ci if (requestSync->request == nullptr) { 308094332d3Sopenharmony_ci HDF_LOGE("%{public}s:alloc request failed", __func__); 309094332d3Sopenharmony_ci return HDF_ERR_MALLOC_FAIL; 310094332d3Sopenharmony_ci } 311094332d3Sopenharmony_ci UsbRequestParamsWSyncInit(&requestSync->params, USB_CTRL_SET_TIMEOUT, &requestSync->pipe); 312094332d3Sopenharmony_ci requestSync->params.userData = port; 313094332d3Sopenharmony_ci OsalMutexLock(&port->reqSyncLock); 314094332d3Sopenharmony_ci HdfSListAdd(&port->reqSyncList, &requestSync->node); 315094332d3Sopenharmony_ci OsalMutexUnlock(&port->reqSyncLock); 316094332d3Sopenharmony_ci return HDF_SUCCESS; 317094332d3Sopenharmony_ci} 318094332d3Sopenharmony_ci 319094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdRequestSyncRelease(UsbdRequestSync *requestSync) 320094332d3Sopenharmony_ci{ 321094332d3Sopenharmony_ci int32_t ret = HDF_SUCCESS; 322094332d3Sopenharmony_ci if (requestSync != nullptr) { 323094332d3Sopenharmony_ci OsalMutexLock(&requestSync->lock); 324094332d3Sopenharmony_ci if (requestSync->request != nullptr) { 325094332d3Sopenharmony_ci ret = UsbFreeRequest(requestSync->request); 326094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 327094332d3Sopenharmony_ci HDF_LOGW("%{public}s:UsbFreeRequest failed", __func__); 328094332d3Sopenharmony_ci } 329094332d3Sopenharmony_ci requestSync->request = nullptr; 330094332d3Sopenharmony_ci } 331094332d3Sopenharmony_ci OsalMutexUnlock(&requestSync->lock); 332094332d3Sopenharmony_ci OsalMemFree(requestSync); 333094332d3Sopenharmony_ci } 334094332d3Sopenharmony_ci return ret; 335094332d3Sopenharmony_ci} 336094332d3Sopenharmony_ci 337094332d3Sopenharmony_civoid UsbdDispatcher::UsbRequestParamsInit(UsbRequestParams *params, int32_t timeout) 338094332d3Sopenharmony_ci{ 339094332d3Sopenharmony_ci if (params == nullptr) { 340094332d3Sopenharmony_ci HDF_LOGE("%{public}s:params is nullptr", __func__); 341094332d3Sopenharmony_ci return; 342094332d3Sopenharmony_ci } 343094332d3Sopenharmony_ci 344094332d3Sopenharmony_ci params->interfaceId = USB_CTRL_INTERFACE_ID; 345094332d3Sopenharmony_ci params->pipeAddress = 0; 346094332d3Sopenharmony_ci params->pipeId = 0; 347094332d3Sopenharmony_ci params->requestType = USB_REQUEST_PARAMS_CTRL_TYPE; 348094332d3Sopenharmony_ci params->timeout = static_cast<uint32_t>(timeout); 349094332d3Sopenharmony_ci} 350094332d3Sopenharmony_ci 351094332d3Sopenharmony_ciint32_t UsbdDispatcher::CtrlTranParamGetReqType(HdfSBuf *data, UsbControlParams *pCtrParams, uint32_t requestType) 352094332d3Sopenharmony_ci{ 353094332d3Sopenharmony_ci if (data == nullptr || pCtrParams == nullptr) { 354094332d3Sopenharmony_ci HDF_LOGE("%{public}s:param failed", __func__); 355094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 356094332d3Sopenharmony_ci } 357094332d3Sopenharmony_ci 358094332d3Sopenharmony_ci uint8_t *buffer = nullptr; 359094332d3Sopenharmony_ci uint32_t length = 0; 360094332d3Sopenharmony_ci int32_t target = requestType & USB_RECIP_MASK; 361094332d3Sopenharmony_ci int32_t direction = (requestType >> DIRECTION_OFFSET_7) & ENDPOINT_DIRECTION_MASK; 362094332d3Sopenharmony_ci int32_t cmdType = (requestType >> CMD_OFFSET_5) & CMD_TYPE_MASK; 363094332d3Sopenharmony_ci if (direction == USB_REQUEST_DIR_TO_DEVICE) { 364094332d3Sopenharmony_ci if (!HdfSbufReadBuffer(data, (const void **)(&buffer), &length)) { 365094332d3Sopenharmony_ci HDF_LOGE("%{public}s:hdf sbuf Read failed", __func__); 366094332d3Sopenharmony_ci return HDF_FAILURE; 367094332d3Sopenharmony_ci } 368094332d3Sopenharmony_ci } else { 369094332d3Sopenharmony_ci length = MAX_CONTROL_BUFF_SIZE; 370094332d3Sopenharmony_ci buffer = static_cast<uint8_t *>(OsalMemCalloc(length)); 371094332d3Sopenharmony_ci if (buffer == nullptr) { 372094332d3Sopenharmony_ci HDF_LOGE("%{public}s:OsalMemCalloc failed length = %{public}u", __func__, length); 373094332d3Sopenharmony_ci return HDF_ERR_MALLOC_FAIL; 374094332d3Sopenharmony_ci } 375094332d3Sopenharmony_ci } 376094332d3Sopenharmony_ci pCtrParams->target = static_cast<UsbRequestTargetType>(target); 377094332d3Sopenharmony_ci pCtrParams->directon = static_cast<UsbRequestDirection>(direction); 378094332d3Sopenharmony_ci pCtrParams->reqType = static_cast<UsbControlRequestType>(cmdType); 379094332d3Sopenharmony_ci pCtrParams->size = length; 380094332d3Sopenharmony_ci pCtrParams->data = buffer; 381094332d3Sopenharmony_ci return HDF_SUCCESS; 382094332d3Sopenharmony_ci} 383094332d3Sopenharmony_ci 384094332d3Sopenharmony_ciint32_t UsbdDispatcher::CtrlTransferParamInit(HdfSBuf *data, UsbControlParams *pCtrParams, int32_t *timeout) 385094332d3Sopenharmony_ci{ 386094332d3Sopenharmony_ci if (data == nullptr || pCtrParams == nullptr) { 387094332d3Sopenharmony_ci HDF_LOGE("%{public}s:data or pCtrParams is nullptr", __func__); 388094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 389094332d3Sopenharmony_ci } 390094332d3Sopenharmony_ci 391094332d3Sopenharmony_ci int32_t requestType; 392094332d3Sopenharmony_ci if (!HdfSbufReadInt32(data, &requestType)) { 393094332d3Sopenharmony_ci HDF_LOGE("%{public}s:failed to read the requestType from data", __func__); 394094332d3Sopenharmony_ci return HDF_ERR_IO; 395094332d3Sopenharmony_ci } 396094332d3Sopenharmony_ci 397094332d3Sopenharmony_ci int32_t requestCmd; 398094332d3Sopenharmony_ci if (!HdfSbufReadInt32(data, &requestCmd)) { 399094332d3Sopenharmony_ci HDF_LOGE("%{public}s:Failed to read the requestCmd from data", __func__); 400094332d3Sopenharmony_ci return HDF_ERR_IO; 401094332d3Sopenharmony_ci } 402094332d3Sopenharmony_ci 403094332d3Sopenharmony_ci int32_t value; 404094332d3Sopenharmony_ci if (!HdfSbufReadInt32(data, &value)) { 405094332d3Sopenharmony_ci HDF_LOGE("%{public}s:Failed to read the value from data", __func__); 406094332d3Sopenharmony_ci return HDF_ERR_IO; 407094332d3Sopenharmony_ci } 408094332d3Sopenharmony_ci 409094332d3Sopenharmony_ci int32_t index; 410094332d3Sopenharmony_ci if (!HdfSbufReadInt32(data, &index)) { 411094332d3Sopenharmony_ci HDF_LOGE("%{public}s:Failed to read the index from data", __func__); 412094332d3Sopenharmony_ci return HDF_ERR_IO; 413094332d3Sopenharmony_ci } 414094332d3Sopenharmony_ci 415094332d3Sopenharmony_ci if (!HdfSbufReadInt32(data, timeout)) { 416094332d3Sopenharmony_ci HDF_LOGE("%{public}s:Failed to read the timeout from data", __func__); 417094332d3Sopenharmony_ci return HDF_ERR_IO; 418094332d3Sopenharmony_ci } 419094332d3Sopenharmony_ci 420094332d3Sopenharmony_ci pCtrParams->request = static_cast<uint8_t>(requestCmd); 421094332d3Sopenharmony_ci pCtrParams->value = value; 422094332d3Sopenharmony_ci pCtrParams->index = index; 423094332d3Sopenharmony_ci int32_t ret = CtrlTranParamGetReqType(data, pCtrParams, requestType); 424094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 425094332d3Sopenharmony_ci HDF_LOGE("%{public}s:CtrlTransferParamInit failed:%{public}d", __func__, ret); 426094332d3Sopenharmony_ci OsalMemFree(pCtrParams->data); 427094332d3Sopenharmony_ci pCtrParams->data = nullptr; 428094332d3Sopenharmony_ci } 429094332d3Sopenharmony_ci return ret; 430094332d3Sopenharmony_ci} 431094332d3Sopenharmony_ci 432094332d3Sopenharmony_civoid UsbdDispatcher::UsbdReleaseInterfaces(HostDevice *dev) 433094332d3Sopenharmony_ci{ 434094332d3Sopenharmony_ci if (dev == nullptr) { 435094332d3Sopenharmony_ci HDF_LOGE("%{public}s: %{public}d invalid param dev is nullptr", __func__, __LINE__); 436094332d3Sopenharmony_ci return; 437094332d3Sopenharmony_ci } 438094332d3Sopenharmony_ci 439094332d3Sopenharmony_ci for (int32_t i = 0; i < USB_MAX_INTERFACES; ++i) { 440094332d3Sopenharmony_ci if (dev->iface[i] != nullptr) { 441094332d3Sopenharmony_ci UsbReleaseInterface(dev->iface[i]); 442094332d3Sopenharmony_ci dev->iface[i] = nullptr; 443094332d3Sopenharmony_ci } 444094332d3Sopenharmony_ci } 445094332d3Sopenharmony_ci if (dev->ctrIface != nullptr) { 446094332d3Sopenharmony_ci UsbReleaseInterface(dev->ctrIface); 447094332d3Sopenharmony_ci dev->ctrIface = nullptr; 448094332d3Sopenharmony_ci } 449094332d3Sopenharmony_ci} 450094332d3Sopenharmony_ci 451094332d3Sopenharmony_civoid UsbdDispatcher::UsbdCloseInterfaces(HostDevice *dev) 452094332d3Sopenharmony_ci{ 453094332d3Sopenharmony_ci if (dev == nullptr) { 454094332d3Sopenharmony_ci HDF_LOGE("%{public}s: %{public}d invalid param dev is nullptr", __func__, __LINE__); 455094332d3Sopenharmony_ci return; 456094332d3Sopenharmony_ci } 457094332d3Sopenharmony_ci 458094332d3Sopenharmony_ci for (int32_t i = 0; i < USB_MAX_INTERFACES; ++i) { 459094332d3Sopenharmony_ci if (dev->devHandle[i] != nullptr) { 460094332d3Sopenharmony_ci UsbCloseInterface(dev->devHandle[i], false); 461094332d3Sopenharmony_ci dev->devHandle[i] = nullptr; 462094332d3Sopenharmony_ci } 463094332d3Sopenharmony_ci } 464094332d3Sopenharmony_ci if (dev->ctrDevHandle != nullptr) { 465094332d3Sopenharmony_ci UsbCloseInterface(dev->ctrDevHandle, false); 466094332d3Sopenharmony_ci dev->ctrDevHandle = nullptr; 467094332d3Sopenharmony_ci } 468094332d3Sopenharmony_ci} 469094332d3Sopenharmony_ci 470094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdOpenInterfaces(HostDevice *dev) 471094332d3Sopenharmony_ci{ 472094332d3Sopenharmony_ci if (dev == nullptr) { 473094332d3Sopenharmony_ci HDF_LOGE("%{public}s: %{public}d invalid param dev is nullptr", __func__, __LINE__); 474094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 475094332d3Sopenharmony_ci } 476094332d3Sopenharmony_ci 477094332d3Sopenharmony_ci int32_t ret = 478094332d3Sopenharmony_ci memset_s(dev->devHandle, sizeof(uint8_t) * USB_MAX_INTERFACES, 0, sizeof(uint8_t) * USB_MAX_INTERFACES); 479094332d3Sopenharmony_ci if (ret != EOK) { 480094332d3Sopenharmony_ci HDF_LOGE("%{public}s:memset_s failed ", __func__); 481094332d3Sopenharmony_ci return HDF_FAILURE; 482094332d3Sopenharmony_ci } 483094332d3Sopenharmony_ci dev->ctrDevHandle = UsbOpenInterface(dev->ctrIface); 484094332d3Sopenharmony_ci if (dev->ctrDevHandle == nullptr) { 485094332d3Sopenharmony_ci HDF_LOGE("%{public}s:ctrDevHandle UsbOpenInterface nullptr", __func__); 486094332d3Sopenharmony_ci UsbdCloseInterfaces(dev); 487094332d3Sopenharmony_ci return HDF_FAILURE; 488094332d3Sopenharmony_ci } 489094332d3Sopenharmony_ci return HDF_SUCCESS; 490094332d3Sopenharmony_ci} 491094332d3Sopenharmony_ci 492094332d3Sopenharmony_civoid UsbdDispatcher::RemoveDevFromService(UsbImpl *service, HostDevice *port) 493094332d3Sopenharmony_ci{ 494094332d3Sopenharmony_ci if (service == nullptr || port == nullptr) { 495094332d3Sopenharmony_ci HDF_LOGE("%{public}s: service or port is nullptr", __func__); 496094332d3Sopenharmony_ci return; 497094332d3Sopenharmony_ci } 498094332d3Sopenharmony_ci 499094332d3Sopenharmony_ci HdfSListIterator it; 500094332d3Sopenharmony_ci HostDevice *tempPort = nullptr; 501094332d3Sopenharmony_ci OsalMutexLock(&service->lock_); 502094332d3Sopenharmony_ci HdfSListIteratorInit(&it, &service->devList_); 503094332d3Sopenharmony_ci while (HdfSListIteratorHasNext(&it)) { 504094332d3Sopenharmony_ci tempPort = reinterpret_cast<HostDevice *>(HdfSListIteratorNext(&it)); 505094332d3Sopenharmony_ci if (tempPort == nullptr) { 506094332d3Sopenharmony_ci continue; 507094332d3Sopenharmony_ci } 508094332d3Sopenharmony_ci if (tempPort->busNum == port->busNum && tempPort->devAddr == port->devAddr) { 509094332d3Sopenharmony_ci HdfSListIteratorRemove(&it); 510094332d3Sopenharmony_ci break; 511094332d3Sopenharmony_ci } 512094332d3Sopenharmony_ci } 513094332d3Sopenharmony_ci OsalMutexUnlock(&service->lock_); 514094332d3Sopenharmony_ci} 515094332d3Sopenharmony_ci 516094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdClaimInterfaces(HostDevice *dev) 517094332d3Sopenharmony_ci{ 518094332d3Sopenharmony_ci if (dev == nullptr) { 519094332d3Sopenharmony_ci HDF_LOGE("%{public}s: %{public}d invalid param dev is nullptr", __func__, __LINE__); 520094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 521094332d3Sopenharmony_ci } 522094332d3Sopenharmony_ci 523094332d3Sopenharmony_ci if (memset_s(dev->iface, sizeof(uint8_t) * USB_MAX_INTERFACES, 0, sizeof(uint8_t) * USB_MAX_INTERFACES) != EOK) { 524094332d3Sopenharmony_ci HDF_LOGE("%{public}s:memset_s failed", __func__); 525094332d3Sopenharmony_ci return HDF_FAILURE; 526094332d3Sopenharmony_ci } 527094332d3Sopenharmony_ci 528094332d3Sopenharmony_ci dev->ctrIface = GetUsbInterfaceById(const_cast<const HostDevice *>(dev), USB_CTRL_INTERFACE_ID); 529094332d3Sopenharmony_ci if (dev->ctrIface == nullptr) { 530094332d3Sopenharmony_ci HDF_LOGE("%{public}s:GetUsbInterfaceById nullptr", __func__); 531094332d3Sopenharmony_ci UsbdReleaseInterfaces(dev); 532094332d3Sopenharmony_ci return HDF_FAILURE; 533094332d3Sopenharmony_ci } 534094332d3Sopenharmony_ci 535094332d3Sopenharmony_ci return HDF_SUCCESS; 536094332d3Sopenharmony_ci} 537094332d3Sopenharmony_ci 538094332d3Sopenharmony_ciint32_t UsbdDispatcher::ReturnGetPipes(int32_t ret, HostDevice *dev) 539094332d3Sopenharmony_ci{ 540094332d3Sopenharmony_ci UsbdCloseInterfaces(dev); 541094332d3Sopenharmony_ci UsbdReleaseInterfaces(dev); 542094332d3Sopenharmony_ci dev->service->session_ = nullptr; 543094332d3Sopenharmony_ci return ret; 544094332d3Sopenharmony_ci} 545094332d3Sopenharmony_ci 546094332d3Sopenharmony_ciint32_t UsbdDispatcher::ReturnOpenInterfaces(int32_t ret, HostDevice *dev) 547094332d3Sopenharmony_ci{ 548094332d3Sopenharmony_ci UsbdReleaseInterfaces(dev); 549094332d3Sopenharmony_ci dev->service->session_ = nullptr; 550094332d3Sopenharmony_ci return ret; 551094332d3Sopenharmony_ci} 552094332d3Sopenharmony_ci 553094332d3Sopenharmony_ciint32_t UsbdDispatcher::ReturnClainInterfaces(int32_t ret, HostDevice *dev) 554094332d3Sopenharmony_ci{ 555094332d3Sopenharmony_ci dev->service->session_ = nullptr; 556094332d3Sopenharmony_ci return ret; 557094332d3Sopenharmony_ci} 558094332d3Sopenharmony_ci 559094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdInit(HostDevice *dev) 560094332d3Sopenharmony_ci{ 561094332d3Sopenharmony_ci if (dev == nullptr) { 562094332d3Sopenharmony_ci HDF_LOGE("%{public}s:invalid param dev", __func__); 563094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 564094332d3Sopenharmony_ci } 565094332d3Sopenharmony_ci 566094332d3Sopenharmony_ci if (dev->initFlag) { 567094332d3Sopenharmony_ci HDF_LOGE("%{public}s:initFlag is true", __func__); 568094332d3Sopenharmony_ci return HDF_SUCCESS; 569094332d3Sopenharmony_ci } 570094332d3Sopenharmony_ci 571094332d3Sopenharmony_ci int32_t ret = UsbInitHostSdk(nullptr); 572094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 573094332d3Sopenharmony_ci HDF_LOGE("%{public}s:UsbInitHostSdk failed", __func__); 574094332d3Sopenharmony_ci return HDF_FAILURE; 575094332d3Sopenharmony_ci } 576094332d3Sopenharmony_ci 577094332d3Sopenharmony_ci if (dev->service == nullptr) { 578094332d3Sopenharmony_ci HDF_LOGE("%{public}s:dev->service is nullptr", __func__); 579094332d3Sopenharmony_ci return HDF_FAILURE; 580094332d3Sopenharmony_ci } 581094332d3Sopenharmony_ci 582094332d3Sopenharmony_ci dev->service->session_ = nullptr; 583094332d3Sopenharmony_ci 584094332d3Sopenharmony_ci ret = UsbdClaimInterfaces(dev); 585094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 586094332d3Sopenharmony_ci HDF_LOGE("%{public}s:UsbdClaimInterfaces failed ret:%{public}d", __func__, ret); 587094332d3Sopenharmony_ci return ReturnClainInterfaces(ret, dev); 588094332d3Sopenharmony_ci } 589094332d3Sopenharmony_ci 590094332d3Sopenharmony_ci ret = UsbdOpenInterfaces(dev); 591094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 592094332d3Sopenharmony_ci HDF_LOGE("%{public}s:UsbdOpenInterfaces failed ret:%{public}d", __func__, ret); 593094332d3Sopenharmony_ci return ReturnOpenInterfaces(ret, dev); 594094332d3Sopenharmony_ci } 595094332d3Sopenharmony_ci 596094332d3Sopenharmony_ci ret = UsbdGetCtrlPipe(dev); 597094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 598094332d3Sopenharmony_ci HDF_LOGE("%{public}s:UsbdGetPipes failed ret:%{public}d", __func__, ret); 599094332d3Sopenharmony_ci return ReturnGetPipes(ret, dev); 600094332d3Sopenharmony_ci } 601094332d3Sopenharmony_ci return HDF_SUCCESS; 602094332d3Sopenharmony_ci} 603094332d3Sopenharmony_ci 604094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdRequestASyncRelease(UsbdRequestASync *request) 605094332d3Sopenharmony_ci{ 606094332d3Sopenharmony_ci if (request == nullptr) { 607094332d3Sopenharmony_ci HDF_LOGE("%{public}s:request is nullptr.", __func__); 608094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 609094332d3Sopenharmony_ci } 610094332d3Sopenharmony_ci 611094332d3Sopenharmony_ci int32_t ret = HDF_SUCCESS; 612094332d3Sopenharmony_ci OsalMutexLock(&request->lock); 613094332d3Sopenharmony_ci UsbImpl::UsbdRequestASyncReleaseData(request); 614094332d3Sopenharmony_ci if (request->reqMsg.request != nullptr) { 615094332d3Sopenharmony_ci ret = UsbFreeRequest(request->reqMsg.request); 616094332d3Sopenharmony_ci request->reqMsg.request = nullptr; 617094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 618094332d3Sopenharmony_ci HDF_LOGE("%{public}s:UsbFreeRequest failed", __func__); 619094332d3Sopenharmony_ci } 620094332d3Sopenharmony_ci } 621094332d3Sopenharmony_ci OsalMutexUnlock(&request->lock); 622094332d3Sopenharmony_ci OsalMemFree(request); 623094332d3Sopenharmony_ci return ret; 624094332d3Sopenharmony_ci} 625094332d3Sopenharmony_ci 626094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdBulkASyncReqRelease(UsbdBulkASyncReqList *list) 627094332d3Sopenharmony_ci{ 628094332d3Sopenharmony_ci for (int32_t i = 0; i < USBD_BULKASYNCREQ_NUM_MAX; ++i) { 629094332d3Sopenharmony_ci UsbFreeRequest(list->node[i].request); 630094332d3Sopenharmony_ci list->node[i].request = nullptr; 631094332d3Sopenharmony_ci } 632094332d3Sopenharmony_ci DListHeadInit(&list->eList); 633094332d3Sopenharmony_ci DListHeadInit(&list->uList); 634094332d3Sopenharmony_ci OsalMutexDestroy(&list->elock); 635094332d3Sopenharmony_ci OsalMutexDestroy(&list->ulock); 636094332d3Sopenharmony_ci return HDF_SUCCESS; 637094332d3Sopenharmony_ci} 638094332d3Sopenharmony_ci 639094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdBulkASyncListRelease(UsbdBulkASyncList *list) 640094332d3Sopenharmony_ci{ 641094332d3Sopenharmony_ci UsbdBulkASyncReqRelease(&list->rList); 642094332d3Sopenharmony_ci OsalMutexDestroy(&list->asmHandle.lock); 643094332d3Sopenharmony_ci OsalMemFree(list); 644094332d3Sopenharmony_ci return HDF_SUCCESS; 645094332d3Sopenharmony_ci} 646094332d3Sopenharmony_ci 647094332d3Sopenharmony_civoid UsbdDispatcher::UsbdRelease(HostDevice *dev) 648094332d3Sopenharmony_ci{ 649094332d3Sopenharmony_ci if (dev == nullptr) { 650094332d3Sopenharmony_ci HDF_LOGE("%{public}s: %{public}d invalid param dev is nullptr", __func__, __LINE__); 651094332d3Sopenharmony_ci return; 652094332d3Sopenharmony_ci } 653094332d3Sopenharmony_ci 654094332d3Sopenharmony_ci UsbdCloseInterfaces(dev); 655094332d3Sopenharmony_ci UsbdReleaseInterfaces(dev); 656094332d3Sopenharmony_ci UsbdFreeCtrlPipe(dev); 657094332d3Sopenharmony_ci UsbImpl::UsbdRequestSyncReleaseList(dev); 658094332d3Sopenharmony_ci UsbImpl::UsbdRequestASyncReleaseList(dev); 659094332d3Sopenharmony_ci UsbImpl::UsbdBulkASyncListReleasePort(dev); 660094332d3Sopenharmony_ci 661094332d3Sopenharmony_ci if (dev->ctrlReq != nullptr) { 662094332d3Sopenharmony_ci UsbFreeRequest(dev->ctrlReq); 663094332d3Sopenharmony_ci dev->ctrlReq = nullptr; 664094332d3Sopenharmony_ci } 665094332d3Sopenharmony_ci UsbExitHostSdk(dev->service->session_); 666094332d3Sopenharmony_ci dev->service->session_ = nullptr; 667094332d3Sopenharmony_ci OsalMutexDestroy(&dev->writeLock); 668094332d3Sopenharmony_ci OsalMutexDestroy(&dev->readLock); 669094332d3Sopenharmony_ci OsalMutexDestroy(&dev->lock); 670094332d3Sopenharmony_ci OsalMutexDestroy(&dev->requestLock); 671094332d3Sopenharmony_ci OsalMutexDestroy(&dev->reqSyncLock); 672094332d3Sopenharmony_ci OsalMutexDestroy(&dev->reqASyncLock); 673094332d3Sopenharmony_ci dev->busNum = 0; 674094332d3Sopenharmony_ci dev->devAddr = 0; 675094332d3Sopenharmony_ci dev->initFlag = false; 676094332d3Sopenharmony_ci} 677094332d3Sopenharmony_ci 678094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdMallocAndFill(uint8_t *&dataAddr, const std::vector<uint8_t> &data) 679094332d3Sopenharmony_ci{ 680094332d3Sopenharmony_ci uint32_t length = sizeof(uint8_t) * data.size(); 681094332d3Sopenharmony_ci if (length == 0) { 682094332d3Sopenharmony_ci HDF_LOGI("%{public}s: data is empty", __func__); 683094332d3Sopenharmony_ci return HDF_SUCCESS; 684094332d3Sopenharmony_ci } 685094332d3Sopenharmony_ci 686094332d3Sopenharmony_ci dataAddr = static_cast<uint8_t *>(OsalMemCalloc(length)); 687094332d3Sopenharmony_ci if (dataAddr == nullptr) { 688094332d3Sopenharmony_ci HDF_LOGE("%{public}s: OsalMemAlloc failed", __func__); 689094332d3Sopenharmony_ci return HDF_FAILURE; 690094332d3Sopenharmony_ci } 691094332d3Sopenharmony_ci 692094332d3Sopenharmony_ci void *dataAddrCovert = static_cast<void *>(dataAddr); 693094332d3Sopenharmony_ci int32_t err = memcpy_s(dataAddrCovert, length, data.data(), length); 694094332d3Sopenharmony_ci if (err != EOK) { 695094332d3Sopenharmony_ci HDF_LOGE("%{public}s: memcpy_s failed", __func__); 696094332d3Sopenharmony_ci OsalMemFree(dataAddr); 697094332d3Sopenharmony_ci dataAddr = nullptr; 698094332d3Sopenharmony_ci return HDF_FAILURE; 699094332d3Sopenharmony_ci } 700094332d3Sopenharmony_ci return HDF_SUCCESS; 701094332d3Sopenharmony_ci} 702094332d3Sopenharmony_ci 703094332d3Sopenharmony_ciint32_t UsbdDispatcher::FillReqAyncParams( 704094332d3Sopenharmony_ci UsbdRequestASync *userData, UsbPipeInfo *pipe, UsbRequestParams *params, const uint8_t *buffer, uint32_t length) 705094332d3Sopenharmony_ci{ 706094332d3Sopenharmony_ci if (userData == nullptr || pipe == nullptr || params == nullptr) { 707094332d3Sopenharmony_ci HDF_LOGE("%{public}s:invalid param", __func__); 708094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 709094332d3Sopenharmony_ci } 710094332d3Sopenharmony_ci 711094332d3Sopenharmony_ci bool bWrite = (pipe->pipeDirection == USB_PIPE_DIRECTION_OUT); 712094332d3Sopenharmony_ci params->interfaceId = pipe->interfaceId; 713094332d3Sopenharmony_ci params->pipeAddress = pipe->pipeDirection | pipe->pipeAddress; 714094332d3Sopenharmony_ci params->pipeId = pipe->pipeId; 715094332d3Sopenharmony_ci params->requestType = USB_REQUEST_PARAMS_DATA_TYPE; 716094332d3Sopenharmony_ci params->timeout = USB_CTRL_SET_TIMEOUT; 717094332d3Sopenharmony_ci params->dataReq.numIsoPackets = 0; 718094332d3Sopenharmony_ci params->userData = static_cast<void *>(userData); 719094332d3Sopenharmony_ci params->dataReq.length = length; 720094332d3Sopenharmony_ci params->dataReq.directon = static_cast<UsbRequestDirection>((pipe->pipeDirection >> USB_PIPE_DIR_OFFSET) & 0x1); 721094332d3Sopenharmony_ci if (bWrite) { 722094332d3Sopenharmony_ci params->callback = UsbdWriteCallback; 723094332d3Sopenharmony_ci params->dataReq.buffer = const_cast<uint8_t *>(buffer); 724094332d3Sopenharmony_ci } else { 725094332d3Sopenharmony_ci params->callback = UsbdReadCallback; 726094332d3Sopenharmony_ci params->dataReq.length = length; 727094332d3Sopenharmony_ci } 728094332d3Sopenharmony_ci return HDF_SUCCESS; 729094332d3Sopenharmony_ci} 730094332d3Sopenharmony_ci 731094332d3Sopenharmony_ciUsbdRequestASync *UsbdDispatcher::UsbdRequestASyncAlloc(void) 732094332d3Sopenharmony_ci{ 733094332d3Sopenharmony_ci UsbdRequestASync *req = static_cast<UsbdRequestASync *>(OsalMemCalloc(sizeof(UsbdRequestASync))); 734094332d3Sopenharmony_ci if (req == nullptr) { 735094332d3Sopenharmony_ci HDF_LOGE("%{public}s: OsalMemCalloc failed", __func__); 736094332d3Sopenharmony_ci return req; 737094332d3Sopenharmony_ci } 738094332d3Sopenharmony_ci 739094332d3Sopenharmony_ci req->reqMsg.request = nullptr; 740094332d3Sopenharmony_ci req->endPointAddr = 0; 741094332d3Sopenharmony_ci req->ifHandle = nullptr; 742094332d3Sopenharmony_ci req->status = 0; 743094332d3Sopenharmony_ci OsalMutexInit(&req->lock); 744094332d3Sopenharmony_ci return req; 745094332d3Sopenharmony_ci} 746094332d3Sopenharmony_ci 747094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdRequestASyncInit( 748094332d3Sopenharmony_ci HostDevice *port, UsbInterfaceHandle *ifHandle, UsbPipeInfo *pipe, UsbdRequestASync *request) 749094332d3Sopenharmony_ci{ 750094332d3Sopenharmony_ci if (port == nullptr || request == nullptr || ifHandle == nullptr || pipe == nullptr) { 751094332d3Sopenharmony_ci HDF_LOGE("%{public}s:invalid param", __func__); 752094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 753094332d3Sopenharmony_ci } 754094332d3Sopenharmony_ci 755094332d3Sopenharmony_ci int32_t ret = memcpy_s(&request->pipe, sizeof(UsbPipeInfo), pipe, sizeof(UsbPipeInfo)); 756094332d3Sopenharmony_ci if (ret != EOK) { 757094332d3Sopenharmony_ci HDF_LOGE("%{public}s:%{public}d memcpy_s failed", __func__, ret); 758094332d3Sopenharmony_ci return ret; 759094332d3Sopenharmony_ci } 760094332d3Sopenharmony_ci 761094332d3Sopenharmony_ci request->ifHandle = ifHandle; 762094332d3Sopenharmony_ci request->reqMsg.request = UsbAllocRequest(request->ifHandle, 0, request->pipe.maxPacketSize); 763094332d3Sopenharmony_ci if (request->reqMsg.request == nullptr) { 764094332d3Sopenharmony_ci HDF_LOGE("%{public}s:alloc request failed", __func__); 765094332d3Sopenharmony_ci return HDF_ERR_MALLOC_FAIL; 766094332d3Sopenharmony_ci } 767094332d3Sopenharmony_ci FillReqAyncParams(request, &request->pipe, &request->params, nullptr, 0); 768094332d3Sopenharmony_ci OsalMutexLock(&port->reqASyncLock); 769094332d3Sopenharmony_ci HdfSListAddTail(&port->reqASyncList, &request->node); 770094332d3Sopenharmony_ci OsalMutexUnlock(&port->reqASyncLock); 771094332d3Sopenharmony_ci return HDF_SUCCESS; 772094332d3Sopenharmony_ci} 773094332d3Sopenharmony_ci 774094332d3Sopenharmony_ciUsbdRequestASync *UsbdDispatcher::UsbdRequestASyncCreatAndInsert( 775094332d3Sopenharmony_ci HostDevice *port, uint8_t interfaceId, uint8_t pipeAddr) 776094332d3Sopenharmony_ci{ 777094332d3Sopenharmony_ci UsbPipeInfo pipe; 778094332d3Sopenharmony_ci if (memset_s(&pipe, sizeof(UsbPipeInfo), 0, sizeof(UsbPipeInfo)) != EOK) { 779094332d3Sopenharmony_ci HDF_LOGE("%{public}s:memset_s failed", __func__); 780094332d3Sopenharmony_ci return nullptr; 781094332d3Sopenharmony_ci } 782094332d3Sopenharmony_ci 783094332d3Sopenharmony_ci int32_t ret = GetPipe(port, interfaceId, pipeAddr, &pipe); 784094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 785094332d3Sopenharmony_ci HDF_LOGE("%{public}s: get pipe info failed interfaceId=%{public}d, pipeAddr=%{public}d", __func__, interfaceId, 786094332d3Sopenharmony_ci pipeAddr); 787094332d3Sopenharmony_ci return nullptr; 788094332d3Sopenharmony_ci } 789094332d3Sopenharmony_ci 790094332d3Sopenharmony_ci UsbInterfaceHandle *ifHandle = UsbImpl::InterfaceIdToHandle(port, interfaceId); 791094332d3Sopenharmony_ci if (ifHandle == nullptr) { 792094332d3Sopenharmony_ci HDF_LOGE("%{public}s:get interface handle failed", __func__); 793094332d3Sopenharmony_ci return nullptr; 794094332d3Sopenharmony_ci } 795094332d3Sopenharmony_ci 796094332d3Sopenharmony_ci UsbdRequestASync *req = UsbdRequestASyncAlloc(); 797094332d3Sopenharmony_ci if (req == nullptr) { 798094332d3Sopenharmony_ci HDF_LOGE("%{public}s: UsbdRequestASyncAlloc failed", __func__); 799094332d3Sopenharmony_ci return req; 800094332d3Sopenharmony_ci } 801094332d3Sopenharmony_ci ret = UsbdRequestASyncInit(port, ifHandle, &pipe, req); 802094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 803094332d3Sopenharmony_ci HDF_LOGE("%{public}s:UsbdRequestASyncInit failed:%{public}d", __func__, ret); 804094332d3Sopenharmony_ci UsbdRequestASyncRelease(req); 805094332d3Sopenharmony_ci req = nullptr; 806094332d3Sopenharmony_ci return req; 807094332d3Sopenharmony_ci } 808094332d3Sopenharmony_ci return req; 809094332d3Sopenharmony_ci} 810094332d3Sopenharmony_ci 811094332d3Sopenharmony_ciint32_t UsbdDispatcher::HostDeviceInit(HostDevice *port) 812094332d3Sopenharmony_ci{ 813094332d3Sopenharmony_ci if (port == nullptr) { 814094332d3Sopenharmony_ci HDF_LOGE("%{public}s:port is nullptr", __func__); 815094332d3Sopenharmony_ci return HDF_ERR_INVALID_OBJECT; 816094332d3Sopenharmony_ci } 817094332d3Sopenharmony_ci 818094332d3Sopenharmony_ci port->busNum = 0; 819094332d3Sopenharmony_ci port->devAddr = 0; 820094332d3Sopenharmony_ci port->initFlag = false; 821094332d3Sopenharmony_ci port->interfaceCnt = 0; 822094332d3Sopenharmony_ci if (OsalMutexInit(&port->lock) != HDF_SUCCESS) { 823094332d3Sopenharmony_ci HDF_LOGE("%{public}s:init lock failed!", __func__); 824094332d3Sopenharmony_ci return HDF_FAILURE; 825094332d3Sopenharmony_ci } 826094332d3Sopenharmony_ci 827094332d3Sopenharmony_ci if (OsalMutexInit(&port->requestLock) != HDF_SUCCESS) { 828094332d3Sopenharmony_ci HDF_LOGE("%{public}s:init requestLock failed!", __func__); 829094332d3Sopenharmony_ci return HDF_FAILURE; 830094332d3Sopenharmony_ci } 831094332d3Sopenharmony_ci 832094332d3Sopenharmony_ci if (OsalMutexInit(&port->writeLock) != HDF_SUCCESS) { 833094332d3Sopenharmony_ci HDF_LOGE("%{public}s:init writeLock failed!", __func__); 834094332d3Sopenharmony_ci return HDF_FAILURE; 835094332d3Sopenharmony_ci } 836094332d3Sopenharmony_ci 837094332d3Sopenharmony_ci if (OsalMutexInit(&port->readLock) != HDF_SUCCESS) { 838094332d3Sopenharmony_ci HDF_LOGE("%{public}s:init readLock failed!", __func__); 839094332d3Sopenharmony_ci return HDF_FAILURE; 840094332d3Sopenharmony_ci } 841094332d3Sopenharmony_ci 842094332d3Sopenharmony_ci if (OsalMutexInit(&port->reqSyncLock) != HDF_SUCCESS) { 843094332d3Sopenharmony_ci HDF_LOGE("%{public}s:init reqSyncLock failed!", __func__); 844094332d3Sopenharmony_ci return HDF_FAILURE; 845094332d3Sopenharmony_ci } 846094332d3Sopenharmony_ci 847094332d3Sopenharmony_ci if (OsalMutexInit(&port->reqASyncLock) != HDF_SUCCESS) { 848094332d3Sopenharmony_ci HDF_LOGE("%{public}s:init reqASyncLock failed!", __func__); 849094332d3Sopenharmony_ci return HDF_FAILURE; 850094332d3Sopenharmony_ci } 851094332d3Sopenharmony_ci 852094332d3Sopenharmony_ci HdfSListInit(&port->requestQueue); 853094332d3Sopenharmony_ci HdfSListInit(&port->reqSyncList); 854094332d3Sopenharmony_ci HdfSListInit(&port->reqASyncList); 855094332d3Sopenharmony_ci return HDF_SUCCESS; 856094332d3Sopenharmony_ci} 857094332d3Sopenharmony_ci 858094332d3Sopenharmony_ciint32_t UsbdDispatcher::HostDeviceCreate(HostDevice **port) 859094332d3Sopenharmony_ci{ 860094332d3Sopenharmony_ci if (port == nullptr) { 861094332d3Sopenharmony_ci HDF_LOGE("%{public}s:invalid param port is nullptr", __func__); 862094332d3Sopenharmony_ci return HDF_ERR_INVALID_OBJECT; 863094332d3Sopenharmony_ci } 864094332d3Sopenharmony_ci 865094332d3Sopenharmony_ci HostDevice *tmp = static_cast<HostDevice *>(OsalMemCalloc(sizeof(HostDevice))); 866094332d3Sopenharmony_ci if (tmp == nullptr) { 867094332d3Sopenharmony_ci HDF_LOGE("%{public}s:OsalMemCalloc failed", __func__); 868094332d3Sopenharmony_ci return HDF_ERR_MALLOC_FAIL; 869094332d3Sopenharmony_ci } 870094332d3Sopenharmony_ci 871094332d3Sopenharmony_ci int32_t ret = HostDeviceInit(tmp); 872094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 873094332d3Sopenharmony_ci HDF_LOGE("%{public}s:HostDeviceInit failed!", __func__); 874094332d3Sopenharmony_ci OsalMemFree(tmp); 875094332d3Sopenharmony_ci tmp = nullptr; 876094332d3Sopenharmony_ci return ret; 877094332d3Sopenharmony_ci } 878094332d3Sopenharmony_ci 879094332d3Sopenharmony_ci tmp->initFlag = false; 880094332d3Sopenharmony_ci *port = tmp; 881094332d3Sopenharmony_ci return HDF_SUCCESS; 882094332d3Sopenharmony_ci} 883094332d3Sopenharmony_ci 884094332d3Sopenharmony_ciint32_t UsbdDispatcher::FunAttachDevice(HostDevice *port, HdfSBuf *data, HdfSBuf *reply) 885094332d3Sopenharmony_ci{ 886094332d3Sopenharmony_ci if (port == nullptr) { 887094332d3Sopenharmony_ci HDF_LOGE("%{public}s:mangf invalid param", __func__); 888094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 889094332d3Sopenharmony_ci } 890094332d3Sopenharmony_ci if (port->initFlag) { 891094332d3Sopenharmony_ci HDF_LOGD("%{public}s:device is already on flag:%{public}d bus:%{public}d dev:%{public}d", __func__, 892094332d3Sopenharmony_ci port->initFlag, port->busNum, port->devAddr); 893094332d3Sopenharmony_ci return HDF_SUCCESS; 894094332d3Sopenharmony_ci } 895094332d3Sopenharmony_ci 896094332d3Sopenharmony_ci int32_t ret = HDF_SUCCESS; 897094332d3Sopenharmony_ci do { 898094332d3Sopenharmony_ci ret = UsbdInit(port); 899094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 900094332d3Sopenharmony_ci HDF_LOGE("%{public}s:UsbInit failed ret:%{public}d", __func__, ret); 901094332d3Sopenharmony_ci RemoveDevFromService(port->service, port); 902094332d3Sopenharmony_ci UsbdRelease(port); 903094332d3Sopenharmony_ci OsalMemFree(port); 904094332d3Sopenharmony_ci return ret; 905094332d3Sopenharmony_ci } 906094332d3Sopenharmony_ci ret = UsbdAllocFifo(&port->readFifo, READ_BUF_SIZE); 907094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 908094332d3Sopenharmony_ci HDF_LOGE("%{public}s:UsbAllocFifo failed ret:%{public}d", __func__, ret); 909094332d3Sopenharmony_ci ret = HDF_ERR_INVALID_PARAM; 910094332d3Sopenharmony_ci break; 911094332d3Sopenharmony_ci } 912094332d3Sopenharmony_ci if (ret == HDF_SUCCESS) { 913094332d3Sopenharmony_ci port->initFlag = true; 914094332d3Sopenharmony_ci HDF_LOGI("%{public}s:UsbOpen success", __func__); 915094332d3Sopenharmony_ci } else { 916094332d3Sopenharmony_ci HDF_LOGE("%{public}s:UsbOpen fail:%{public}d", __func__, ret); 917094332d3Sopenharmony_ci } 918094332d3Sopenharmony_ci return ret; 919094332d3Sopenharmony_ci } while (0); 920094332d3Sopenharmony_ci 921094332d3Sopenharmony_ci UsbdFreeFifo(&port->readFifo); 922094332d3Sopenharmony_ci UsbdRelease(port); 923094332d3Sopenharmony_ci RemoveDevFromService(port->service, port); 924094332d3Sopenharmony_ci OsalMemFree(port); 925094332d3Sopenharmony_ci return ret; 926094332d3Sopenharmony_ci} 927094332d3Sopenharmony_ci 928094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdDeviceCreateAndAttach(const sptr<UsbImpl> &service, uint8_t busNum, uint8_t devAddr) 929094332d3Sopenharmony_ci{ 930094332d3Sopenharmony_ci HostDevice *port = service->FindDevFromService(busNum, devAddr); 931094332d3Sopenharmony_ci if (port != nullptr) { 932094332d3Sopenharmony_ci HDF_LOGI("%{public}s:device already add", __func__); 933094332d3Sopenharmony_ci return HDF_ERR_DEVICE_BUSY; 934094332d3Sopenharmony_ci } 935094332d3Sopenharmony_ci int32_t ret = HostDeviceCreate(&port); 936094332d3Sopenharmony_ci if (ret == HDF_SUCCESS) { 937094332d3Sopenharmony_ci port->busNum = busNum; 938094332d3Sopenharmony_ci port->devAddr = devAddr; 939094332d3Sopenharmony_ci port->service = service; 940094332d3Sopenharmony_ci OsalMutexLock(&service->lock_); 941094332d3Sopenharmony_ci HdfSListAdd(&service->devList_, &port->node); 942094332d3Sopenharmony_ci OsalMutexUnlock(&service->lock_); 943094332d3Sopenharmony_ci ret = FunAttachDevice(port, nullptr, nullptr); 944094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 945094332d3Sopenharmony_ci HDF_LOGW("%{public}s:FunAttachDevice error ret:%{public}d", __func__, ret); 946094332d3Sopenharmony_ci } 947094332d3Sopenharmony_ci port = nullptr; 948094332d3Sopenharmony_ci } else { 949094332d3Sopenharmony_ci HDF_LOGE("%{public}s:createdevice error ret:%{public}d", __func__, ret); 950094332d3Sopenharmony_ci } 951094332d3Sopenharmony_ci return ret; 952094332d3Sopenharmony_ci} 953094332d3Sopenharmony_ci 954094332d3Sopenharmony_ciint32_t UsbdDispatcher::FunDetachDevice(HostDevice *port, HdfSBuf *data) 955094332d3Sopenharmony_ci{ 956094332d3Sopenharmony_ci if (port == nullptr) { 957094332d3Sopenharmony_ci HDF_LOGE("%{public}s:invalid param port", __func__); 958094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 959094332d3Sopenharmony_ci } 960094332d3Sopenharmony_ci 961094332d3Sopenharmony_ci RemoveDevFromService(port->service, port); 962094332d3Sopenharmony_ci UsbdRelease(port); 963094332d3Sopenharmony_ci UsbdFreeFifo(&port->readFifo); 964094332d3Sopenharmony_ci OsalMemFree(port); 965094332d3Sopenharmony_ci return HDF_SUCCESS; 966094332d3Sopenharmony_ci} 967094332d3Sopenharmony_ci 968094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdDeviceDettach(UsbImpl *service, uint8_t busNum, uint8_t devAddr) 969094332d3Sopenharmony_ci{ 970094332d3Sopenharmony_ci if (service == nullptr) { 971094332d3Sopenharmony_ci HDF_LOGE("%{public}s:invalid param service!", __func__); 972094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 973094332d3Sopenharmony_ci } 974094332d3Sopenharmony_ci 975094332d3Sopenharmony_ci HostDevice *port = service->FindDevFromService(busNum, devAddr); 976094332d3Sopenharmony_ci if (port == nullptr) { 977094332d3Sopenharmony_ci HDF_LOGE("%{public}s:FindDevFromService failed", __func__); 978094332d3Sopenharmony_ci return HDF_DEV_ERR_NO_DEVICE; 979094332d3Sopenharmony_ci } 980094332d3Sopenharmony_ci 981094332d3Sopenharmony_ci int32_t ret = FunDetachDevice(port, nullptr); 982094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 983094332d3Sopenharmony_ci HDF_LOGE("%{public}s: %{public}d FunDetachDevice failed", __func__, ret); 984094332d3Sopenharmony_ci return HDF_FAILURE; 985094332d3Sopenharmony_ci } 986094332d3Sopenharmony_ci 987094332d3Sopenharmony_ci return HDF_SUCCESS; 988094332d3Sopenharmony_ci} 989094332d3Sopenharmony_ci 990094332d3Sopenharmony_ciHostDevice *UsbdDispatcher::UsbdFindDevForBusNum(UsbImpl *service, uint8_t busNum) 991094332d3Sopenharmony_ci{ 992094332d3Sopenharmony_ci if (service == nullptr) { 993094332d3Sopenharmony_ci HDF_LOGE("%{public}s: service is nullptr", __func__); 994094332d3Sopenharmony_ci return nullptr; 995094332d3Sopenharmony_ci } 996094332d3Sopenharmony_ci 997094332d3Sopenharmony_ci uint8_t flag = false; 998094332d3Sopenharmony_ci HdfSListIterator it; 999094332d3Sopenharmony_ci HostDevice *tempPort = nullptr; 1000094332d3Sopenharmony_ci OsalMutexLock(&service->lock_); 1001094332d3Sopenharmony_ci HdfSListIteratorInit(&it, &service->devList_); 1002094332d3Sopenharmony_ci while (HdfSListIteratorHasNext(&it)) { 1003094332d3Sopenharmony_ci tempPort = reinterpret_cast<HostDevice *>(HdfSListIteratorNext(&it)); 1004094332d3Sopenharmony_ci if (!tempPort) { 1005094332d3Sopenharmony_ci continue; 1006094332d3Sopenharmony_ci } 1007094332d3Sopenharmony_ci if (tempPort->busNum == busNum) { 1008094332d3Sopenharmony_ci HdfSListIteratorRemove(&it); 1009094332d3Sopenharmony_ci flag = true; 1010094332d3Sopenharmony_ci break; 1011094332d3Sopenharmony_ci } 1012094332d3Sopenharmony_ci } 1013094332d3Sopenharmony_ci OsalMutexUnlock(&service->lock_); 1014094332d3Sopenharmony_ci if (flag) { 1015094332d3Sopenharmony_ci return tempPort; 1016094332d3Sopenharmony_ci } 1017094332d3Sopenharmony_ci return nullptr; 1018094332d3Sopenharmony_ci} 1019094332d3Sopenharmony_ci 1020094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdRemoveBusDev(UsbImpl *service, uint8_t busNum, const sptr<IUsbdSubscriber> &subscriber) 1021094332d3Sopenharmony_ci{ 1022094332d3Sopenharmony_ci HostDevice *tempPort = nullptr; 1023094332d3Sopenharmony_ci USBDeviceInfo info; 1024094332d3Sopenharmony_ci int32_t ret = HDF_FAILURE; 1025094332d3Sopenharmony_ci 1026094332d3Sopenharmony_ci while (1) { 1027094332d3Sopenharmony_ci tempPort = UsbdDispatcher::UsbdFindDevForBusNum(service, busNum); 1028094332d3Sopenharmony_ci if (!tempPort) { 1029094332d3Sopenharmony_ci break; 1030094332d3Sopenharmony_ci } 1031094332d3Sopenharmony_ci info = {ACT_DEVDOWN, tempPort->busNum, tempPort->devAddr}; 1032094332d3Sopenharmony_ci ret = subscriber->DeviceEvent(info); 1033094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1034094332d3Sopenharmony_ci HDF_LOGE("%{public}s failed to notify subscriber, ret: %{public}d", __func__, ret); 1035094332d3Sopenharmony_ci return ret; 1036094332d3Sopenharmony_ci } 1037094332d3Sopenharmony_ci UsbdRelease(tempPort); 1038094332d3Sopenharmony_ci UsbdFreeFifo(&tempPort->readFifo); 1039094332d3Sopenharmony_ci OsalMemFree(tempPort); 1040094332d3Sopenharmony_ci } 1041094332d3Sopenharmony_ci return ret; 1042094332d3Sopenharmony_ci} 1043094332d3Sopenharmony_ci 1044094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdBulkASyncReqInit(UsbdBulkASyncReqList *list, UsbdBulkASyncList *pList) 1045094332d3Sopenharmony_ci{ 1046094332d3Sopenharmony_ci int32_t ret = HDF_SUCCESS; 1047094332d3Sopenharmony_ci int32_t i = 0; 1048094332d3Sopenharmony_ci DListHeadInit(&list->eList); 1049094332d3Sopenharmony_ci DListHeadInit(&list->uList); 1050094332d3Sopenharmony_ci OsalMutexInit(&list->elock); 1051094332d3Sopenharmony_ci OsalMutexInit(&list->ulock); 1052094332d3Sopenharmony_ci for (i = 0; i < USBD_BULKASYNCREQ_NUM_MAX; ++i) { 1053094332d3Sopenharmony_ci list->node[i].request = UsbAllocRequest(pList->ifHandle, 0, pList->pipe.maxPacketSize); 1054094332d3Sopenharmony_ci if (!list->node[i].request) { 1055094332d3Sopenharmony_ci HDF_LOGE("%{public}s:alloc request failed i:%{public}d", __func__, i); 1056094332d3Sopenharmony_ci ret = HDF_ERR_MALLOC_FAIL; 1057094332d3Sopenharmony_ci break; 1058094332d3Sopenharmony_ci } 1059094332d3Sopenharmony_ci list->node[i].list = list; 1060094332d3Sopenharmony_ci list->node[i].id = i; 1061094332d3Sopenharmony_ci DListInsertTail(&list->node[i].node, &list->eList); 1062094332d3Sopenharmony_ci pList->params.userData = static_cast<void *>(&list->node[i]); 1063094332d3Sopenharmony_ci } 1064094332d3Sopenharmony_ci 1065094332d3Sopenharmony_ci if (i != USBD_BULKASYNCREQ_NUM_MAX) { 1066094332d3Sopenharmony_ci for (; i >= 0; --i) { 1067094332d3Sopenharmony_ci UsbFreeRequest(list->node[i].request); 1068094332d3Sopenharmony_ci list->node[i].request = nullptr; 1069094332d3Sopenharmony_ci } 1070094332d3Sopenharmony_ci DListHeadInit(&list->eList); 1071094332d3Sopenharmony_ci DListHeadInit(&list->uList); 1072094332d3Sopenharmony_ci OsalMutexDestroy(&list->elock); 1073094332d3Sopenharmony_ci OsalMutexDestroy(&list->ulock); 1074094332d3Sopenharmony_ci } 1075094332d3Sopenharmony_ci list->pList = pList; 1076094332d3Sopenharmony_ci return ret; 1077094332d3Sopenharmony_ci} 1078094332d3Sopenharmony_ci 1079094332d3Sopenharmony_ciUsbdBulkASyncList *UsbdDispatcher::UsbdBulkASyncListAlloc(HostDevice *port, uint8_t ifId, uint8_t epId) 1080094332d3Sopenharmony_ci{ 1081094332d3Sopenharmony_ci UsbPipeInfo pipe; 1082094332d3Sopenharmony_ci if (memset_s(&pipe, sizeof(UsbPipeInfo), 0, sizeof(UsbPipeInfo)) != EOK) { 1083094332d3Sopenharmony_ci HDF_LOGE("%{public}s:memset_s failed", __func__); 1084094332d3Sopenharmony_ci return nullptr; 1085094332d3Sopenharmony_ci } 1086094332d3Sopenharmony_ci 1087094332d3Sopenharmony_ci int32_t ret = GetPipe(port, ifId, epId, &pipe); 1088094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1089094332d3Sopenharmony_ci HDF_LOGE("%{public}s:GetPipe failed, ret:%{public}d", __func__, ret); 1090094332d3Sopenharmony_ci return nullptr; 1091094332d3Sopenharmony_ci } 1092094332d3Sopenharmony_ci 1093094332d3Sopenharmony_ci UsbInterfaceHandle *ifHandle = UsbImpl::InterfaceIdToHandle(port, ifId); 1094094332d3Sopenharmony_ci if (ifHandle == nullptr) { 1095094332d3Sopenharmony_ci HDF_LOGE("%{public}s:get interface handle failed", __func__); 1096094332d3Sopenharmony_ci return nullptr; 1097094332d3Sopenharmony_ci } 1098094332d3Sopenharmony_ci 1099094332d3Sopenharmony_ci UsbdBulkASyncList *bulkAsyncList = reinterpret_cast<UsbdBulkASyncList *>(OsalMemCalloc(sizeof(UsbdBulkASyncList))); 1100094332d3Sopenharmony_ci if (bulkAsyncList == nullptr) { 1101094332d3Sopenharmony_ci HDF_LOGE("%{public}s:malloc failed!", __func__); 1102094332d3Sopenharmony_ci return nullptr; 1103094332d3Sopenharmony_ci } 1104094332d3Sopenharmony_ci bulkAsyncList->ifId = ifId; 1105094332d3Sopenharmony_ci bulkAsyncList->epId = epId; 1106094332d3Sopenharmony_ci bulkAsyncList->instance = port; 1107094332d3Sopenharmony_ci OsalMutexInit(&bulkAsyncList->asmHandle.lock); 1108094332d3Sopenharmony_ci bulkAsyncList->pipe = pipe; 1109094332d3Sopenharmony_ci bulkAsyncList->ifHandle = ifHandle; 1110094332d3Sopenharmony_ci UsbdBulkASyncReqFillParams(&bulkAsyncList->pipe, &bulkAsyncList->params, nullptr); 1111094332d3Sopenharmony_ci ret = UsbdBulkASyncReqInit(&bulkAsyncList->rList, bulkAsyncList); 1112094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1113094332d3Sopenharmony_ci HDF_LOGE("%{public}s: UsbdBulkASyncReqInit failed ret:%{public}d", __func__, ret); 1114094332d3Sopenharmony_ci UsbdBulkASyncListRelease(bulkAsyncList); 1115094332d3Sopenharmony_ci bulkAsyncList = nullptr; 1116094332d3Sopenharmony_ci return bulkAsyncList; 1117094332d3Sopenharmony_ci } 1118094332d3Sopenharmony_ci 1119094332d3Sopenharmony_ci return bulkAsyncList; 1120094332d3Sopenharmony_ci} 1121094332d3Sopenharmony_ci 1122094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdBulkASyncReqNodeSetNoUse(UsbdBulkASyncReqNode *db) 1123094332d3Sopenharmony_ci{ 1124094332d3Sopenharmony_ci OsalMutexLock(&db->list->elock); 1125094332d3Sopenharmony_ci db->use = USBD_REQNODE_NOUSE; 1126094332d3Sopenharmony_ci DListInsertTail(&db->node, &db->list->eList); 1127094332d3Sopenharmony_ci OsalMutexUnlock(&db->list->elock); 1128094332d3Sopenharmony_ci return HDF_SUCCESS; 1129094332d3Sopenharmony_ci} 1130094332d3Sopenharmony_ci 1131094332d3Sopenharmony_ciUsbdBulkASyncReqNode *UsbdDispatcher::UsbdBulkASyncReqGetENode(UsbdBulkASyncReqList *list) 1132094332d3Sopenharmony_ci{ 1133094332d3Sopenharmony_ci OsalMutexLock(&list->elock); 1134094332d3Sopenharmony_ci if (DListIsEmpty(&list->eList)) { 1135094332d3Sopenharmony_ci OsalMutexUnlock(&list->elock); 1136094332d3Sopenharmony_ci HDF_LOGE("%{public}s:invalid param", __func__); 1137094332d3Sopenharmony_ci return nullptr; 1138094332d3Sopenharmony_ci } 1139094332d3Sopenharmony_ci UsbdBulkASyncReqNode *ptr = DLIST_FIRST_ENTRY(&list->eList, UsbdBulkASyncReqNode, node); 1140094332d3Sopenharmony_ci if (ptr != nullptr) { 1141094332d3Sopenharmony_ci ptr->use = USBD_REQNODE_OTHER; 1142094332d3Sopenharmony_ci DListRemove(&ptr->node); 1143094332d3Sopenharmony_ci } 1144094332d3Sopenharmony_ci OsalMutexUnlock(&list->elock); 1145094332d3Sopenharmony_ci return ptr; 1146094332d3Sopenharmony_ci} 1147094332d3Sopenharmony_ci 1148094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdBulkReadRemoteCallback( 1149094332d3Sopenharmony_ci const sptr<IUsbdBulkCallback> &service, int32_t status, UsbdBufferHandle *handle) 1150094332d3Sopenharmony_ci{ 1151094332d3Sopenharmony_ci if (service == nullptr || handle == nullptr) { 1152094332d3Sopenharmony_ci HDF_LOGE("%{public}s:invalid param", __func__); 1153094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 1154094332d3Sopenharmony_ci } 1155094332d3Sopenharmony_ci 1156094332d3Sopenharmony_ci OsalMutexLock(&handle->lock); 1157094332d3Sopenharmony_ci uint8_t flag = handle->cbflg; 1158094332d3Sopenharmony_ci handle->cbflg = 1; 1159094332d3Sopenharmony_ci int32_t actLength = static_cast<int32_t>(handle->rcur); 1160094332d3Sopenharmony_ci OsalMutexUnlock(&handle->lock); 1161094332d3Sopenharmony_ci if (flag) { 1162094332d3Sopenharmony_ci return HDF_SUCCESS; 1163094332d3Sopenharmony_ci } 1164094332d3Sopenharmony_ci int32_t ret = service->OnBulkReadCallback(status, actLength); 1165094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1166094332d3Sopenharmony_ci HDF_LOGE("%{public}s:OnBulkReadCallback failed, ret=%{public}d", __func__, ret); 1167094332d3Sopenharmony_ci } 1168094332d3Sopenharmony_ci return ret; 1169094332d3Sopenharmony_ci} 1170094332d3Sopenharmony_ci 1171094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdBulkWriteRemoteCallback( 1172094332d3Sopenharmony_ci const sptr<IUsbdBulkCallback> &service, int32_t status, UsbdBufferHandle *handle) 1173094332d3Sopenharmony_ci{ 1174094332d3Sopenharmony_ci if (service == nullptr || handle == nullptr) { 1175094332d3Sopenharmony_ci HDF_LOGE("%{public}s:invalid param", __func__); 1176094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 1177094332d3Sopenharmony_ci } 1178094332d3Sopenharmony_ci 1179094332d3Sopenharmony_ci OsalMutexLock(&handle->lock); 1180094332d3Sopenharmony_ci uint8_t flag = handle->cbflg; 1181094332d3Sopenharmony_ci handle->cbflg = 1; 1182094332d3Sopenharmony_ci int32_t actLength = static_cast<int32_t>(handle->cur); 1183094332d3Sopenharmony_ci OsalMutexUnlock(&handle->lock); 1184094332d3Sopenharmony_ci if (flag) { 1185094332d3Sopenharmony_ci return HDF_SUCCESS; 1186094332d3Sopenharmony_ci } 1187094332d3Sopenharmony_ci 1188094332d3Sopenharmony_ci int32_t ret = service->OnBulkWriteCallback(status, actLength); 1189094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1190094332d3Sopenharmony_ci HDF_LOGE("%{public}s:OnBulkWriteCallback failed, ret=%{public}d", __func__, ret); 1191094332d3Sopenharmony_ci } 1192094332d3Sopenharmony_ci return ret; 1193094332d3Sopenharmony_ci} 1194094332d3Sopenharmony_ci 1195094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdBulkASyncPutAsmData(UsbdBufferHandle *handle, uint8_t *buffer, uint32_t len) 1196094332d3Sopenharmony_ci{ 1197094332d3Sopenharmony_ci if (handle == nullptr || buffer == nullptr || len < 1) { 1198094332d3Sopenharmony_ci HDF_LOGE("%{public}s:invalid param len:%{public}d", __func__, len); 1199094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 1200094332d3Sopenharmony_ci } 1201094332d3Sopenharmony_ci 1202094332d3Sopenharmony_ci int32_t ret = HDF_SUCCESS; 1203094332d3Sopenharmony_ci OsalMutexLock(&handle->lock); 1204094332d3Sopenharmony_ci do { 1205094332d3Sopenharmony_ci if (handle->fd < 1) { 1206094332d3Sopenharmony_ci HDF_LOGE("%{public}s:fd error, handle->fd:%{public}d", __func__, handle->fd); 1207094332d3Sopenharmony_ci ret = HDF_ERR_BAD_FD; 1208094332d3Sopenharmony_ci break; 1209094332d3Sopenharmony_ci } 1210094332d3Sopenharmony_ci uint32_t tlen = (handle->size > handle->rcur) ? (handle->size - handle->rcur) : 0; 1211094332d3Sopenharmony_ci tlen = tlen < len ? tlen : len; 1212094332d3Sopenharmony_ci if (tlen > 0) { 1213094332d3Sopenharmony_ci ret = memcpy_s(handle->starAddr + handle->rcur, tlen, buffer, len); 1214094332d3Sopenharmony_ci if (ret != EOK) { 1215094332d3Sopenharmony_ci HDF_LOGE("%{public}s:%{public}d memcpy_s failed", __func__, ret); 1216094332d3Sopenharmony_ci OsalMutexUnlock(&handle->lock); 1217094332d3Sopenharmony_ci return ret; 1218094332d3Sopenharmony_ci } 1219094332d3Sopenharmony_ci 1220094332d3Sopenharmony_ci handle->rcur += tlen; 1221094332d3Sopenharmony_ci } 1222094332d3Sopenharmony_ci } while (0); 1223094332d3Sopenharmony_ci OsalMutexUnlock(&handle->lock); 1224094332d3Sopenharmony_ci return ret; 1225094332d3Sopenharmony_ci} 1226094332d3Sopenharmony_ci 1227094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdBulkAsyncGetAsmData( 1228094332d3Sopenharmony_ci UsbdBufferHandle *handle, UsbRequestParams *params, uint16_t maxPacketSize) 1229094332d3Sopenharmony_ci{ 1230094332d3Sopenharmony_ci if (handle == nullptr || params == nullptr || handle->size < 1 || maxPacketSize < 1) { 1231094332d3Sopenharmony_ci HDF_LOGE("%{public}s:invalid param", __func__); 1232094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 1233094332d3Sopenharmony_ci } 1234094332d3Sopenharmony_ci 1235094332d3Sopenharmony_ci int32_t ret = HDF_ERR_INVALID_PARAM; 1236094332d3Sopenharmony_ci OsalMutexLock(&handle->lock); 1237094332d3Sopenharmony_ci if (handle->cur < handle->size) { 1238094332d3Sopenharmony_ci params->dataReq.length = 1239094332d3Sopenharmony_ci (handle->size - handle->cur) < maxPacketSize ? (handle->size - handle->cur) : maxPacketSize; 1240094332d3Sopenharmony_ci params->dataReq.buffer = handle->starAddr + handle->cur; 1241094332d3Sopenharmony_ci handle->cur += params->dataReq.length; 1242094332d3Sopenharmony_ci ret = HDF_SUCCESS; 1243094332d3Sopenharmony_ci } else { 1244094332d3Sopenharmony_ci params->dataReq.length = 0; 1245094332d3Sopenharmony_ci params->dataReq.buffer = nullptr; 1246094332d3Sopenharmony_ci HDF_LOGE("%{public}s:invalid param", __func__); 1247094332d3Sopenharmony_ci ret = HDF_DEV_ERR_NODATA; 1248094332d3Sopenharmony_ci } 1249094332d3Sopenharmony_ci OsalMutexUnlock(&handle->lock); 1250094332d3Sopenharmony_ci return ret; 1251094332d3Sopenharmony_ci} 1252094332d3Sopenharmony_ci 1253094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdBulkAsyncGetAsmReqLen(UsbdBufferHandle *handle, uint32_t *reqLen, uint16_t maxPacketSize) 1254094332d3Sopenharmony_ci{ 1255094332d3Sopenharmony_ci if (handle == nullptr || reqLen == nullptr || handle->size < 1 || maxPacketSize < 1) { 1256094332d3Sopenharmony_ci HDF_LOGE("%{public}s:%{public}d invalid param", __func__, __LINE__); 1257094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 1258094332d3Sopenharmony_ci } 1259094332d3Sopenharmony_ci 1260094332d3Sopenharmony_ci uint32_t tlen = 0; 1261094332d3Sopenharmony_ci OsalMutexLock(&handle->lock); 1262094332d3Sopenharmony_ci if (handle->cur < handle->size) { 1263094332d3Sopenharmony_ci tlen = handle->size - handle->cur; 1264094332d3Sopenharmony_ci tlen = tlen < maxPacketSize ? tlen : maxPacketSize; 1265094332d3Sopenharmony_ci handle->cur += tlen; 1266094332d3Sopenharmony_ci } 1267094332d3Sopenharmony_ci OsalMutexUnlock(&handle->lock); 1268094332d3Sopenharmony_ci *reqLen = tlen; 1269094332d3Sopenharmony_ci return HDF_SUCCESS; 1270094332d3Sopenharmony_ci} 1271094332d3Sopenharmony_ci 1272094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdBulkASyncReqWriteAutoSubmit(UsbRequest *request) 1273094332d3Sopenharmony_ci{ 1274094332d3Sopenharmony_ci UsbRequestParams params; 1275094332d3Sopenharmony_ci UsbdBulkASyncReqNode *db = static_cast<UsbdBulkASyncReqNode *>(request->compInfo.userData); 1276094332d3Sopenharmony_ci int32_t ret = memcpy_s(¶ms, sizeof(params), &db->list->pList->params, sizeof(params)); 1277094332d3Sopenharmony_ci if (ret != EOK) { 1278094332d3Sopenharmony_ci HDF_LOGE("%{public}s:%{public}d memcpy_s failed", __func__, ret); 1279094332d3Sopenharmony_ci return ret; 1280094332d3Sopenharmony_ci } 1281094332d3Sopenharmony_ci 1282094332d3Sopenharmony_ci params.userData = static_cast<void *>(db); 1283094332d3Sopenharmony_ci ret = UsbdBulkAsyncGetAsmData(&db->list->pList->asmHandle, ¶ms, db->list->pList->pipe.maxPacketSize); 1284094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1285094332d3Sopenharmony_ci UsbdBulkASyncReqNodeSetNoUse(db); 1286094332d3Sopenharmony_ci return ret; 1287094332d3Sopenharmony_ci } 1288094332d3Sopenharmony_ci db->request->compInfo.status = USB_REQUEST_COMPLETED; 1289094332d3Sopenharmony_ci ret = UsbFillRequest(request, db->list->pList->ifHandle, ¶ms); 1290094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1291094332d3Sopenharmony_ci UsbdBulkASyncReqNodeSetNoUse(db); 1292094332d3Sopenharmony_ci HDF_LOGE("%{public}s:UsbFillRequest ret:%{public}d", __func__, ret); 1293094332d3Sopenharmony_ci return ret; 1294094332d3Sopenharmony_ci } 1295094332d3Sopenharmony_ci ret = UsbSubmitRequestAsync(request); 1296094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1297094332d3Sopenharmony_ci UsbdBulkASyncReqNodeSetNoUse(db); 1298094332d3Sopenharmony_ci HDF_LOGE("%{public}s:UsbSubmitRequestAsync ret:%{public}d", __func__, ret); 1299094332d3Sopenharmony_ci } 1300094332d3Sopenharmony_ci return ret; 1301094332d3Sopenharmony_ci} 1302094332d3Sopenharmony_ci 1303094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdBulkASyncReqReadAutoSubmit(UsbRequest *request) 1304094332d3Sopenharmony_ci{ 1305094332d3Sopenharmony_ci uint32_t readLen = 0; 1306094332d3Sopenharmony_ci UsbdBulkASyncReqNode *db = static_cast<UsbdBulkASyncReqNode *>(request->compInfo.userData); 1307094332d3Sopenharmony_ci int32_t ret = 1308094332d3Sopenharmony_ci UsbdBulkASyncPutAsmData(&db->list->pList->asmHandle, request->compInfo.buffer, request->compInfo.actualLength); 1309094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1310094332d3Sopenharmony_ci HDF_LOGE("%{public}s:%{public}d UsbdBulkASyncPutAsmData error size:%{public}d ret:%{public}d", __func__, 1311094332d3Sopenharmony_ci __LINE__, request->compInfo.actualLength, ret); 1312094332d3Sopenharmony_ci UsbdBulkASyncReqNodeSetNoUse(db); 1313094332d3Sopenharmony_ci return ret; 1314094332d3Sopenharmony_ci } 1315094332d3Sopenharmony_ci 1316094332d3Sopenharmony_ci ret = UsbdBulkAsyncGetAsmReqLen(&db->list->pList->asmHandle, &readLen, db->list->pList->pipe.maxPacketSize); 1317094332d3Sopenharmony_ci if (ret != HDF_SUCCESS || readLen < 1) { 1318094332d3Sopenharmony_ci UsbdBulkASyncReqNodeSetNoUse(db); 1319094332d3Sopenharmony_ci HDF_LOGE("%{public}s:invalid param", __func__); 1320094332d3Sopenharmony_ci return HDF_DEV_ERR_NODATA; 1321094332d3Sopenharmony_ci } 1322094332d3Sopenharmony_ci db->request->compInfo.status = USB_REQUEST_COMPLETED; 1323094332d3Sopenharmony_ci UsbHostRequest *hostRequest = reinterpret_cast<UsbIfRequest *>(request)->hostRequest; 1324094332d3Sopenharmony_ci if (readLen != static_cast<uint32_t>(hostRequest->length)) { 1325094332d3Sopenharmony_ci UsbRequestParams params; 1326094332d3Sopenharmony_ci ret = memcpy_s(¶ms, sizeof(params), &db->list->pList->params, sizeof(params)); 1327094332d3Sopenharmony_ci if (ret != EOK) { 1328094332d3Sopenharmony_ci HDF_LOGE("%{public}s: %{public}d memcpy_s failed", __func__, ret); 1329094332d3Sopenharmony_ci return ret; 1330094332d3Sopenharmony_ci } 1331094332d3Sopenharmony_ci 1332094332d3Sopenharmony_ci params.dataReq.length = readLen; 1333094332d3Sopenharmony_ci params.userData = static_cast<void *>(db); 1334094332d3Sopenharmony_ci ret = UsbFillRequest(request, db->list->pList->ifHandle, ¶ms); 1335094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1336094332d3Sopenharmony_ci UsbdBulkASyncReqNodeSetNoUse(db); 1337094332d3Sopenharmony_ci HDF_LOGE("%{public}s:UsbFillRequest ret:%{public}d ", __func__, ret); 1338094332d3Sopenharmony_ci return ret; 1339094332d3Sopenharmony_ci } 1340094332d3Sopenharmony_ci } 1341094332d3Sopenharmony_ci ret = UsbSubmitRequestAsync(request); 1342094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1343094332d3Sopenharmony_ci UsbdBulkASyncReqNodeSetNoUse(db); 1344094332d3Sopenharmony_ci HDF_LOGE("%{public}s:UsbSubmitRequestAsync ret:%{public}d ", __func__, ret); 1345094332d3Sopenharmony_ci } 1346094332d3Sopenharmony_ci return ret; 1347094332d3Sopenharmony_ci} 1348094332d3Sopenharmony_ci 1349094332d3Sopenharmony_civoid UsbdDispatcher::UsbdBulkASyncWriteCallbackAutoSubmit(UsbRequest *request) 1350094332d3Sopenharmony_ci{ 1351094332d3Sopenharmony_ci if (request == nullptr) { 1352094332d3Sopenharmony_ci HDF_LOGE("%{public}s: %{public}d request is nullptr", __func__, __LINE__); 1353094332d3Sopenharmony_ci return; 1354094332d3Sopenharmony_ci } 1355094332d3Sopenharmony_ci 1356094332d3Sopenharmony_ci int32_t ret = HDF_SUCCESS; 1357094332d3Sopenharmony_ci UsbdBulkASyncReqNode *node = static_cast<UsbdBulkASyncReqNode *>(request->compInfo.userData); 1358094332d3Sopenharmony_ci int32_t status = request->compInfo.status; 1359094332d3Sopenharmony_ci if (status != 0) { 1360094332d3Sopenharmony_ci UsbdBulkASyncReqNodeSetNoUse(node); 1361094332d3Sopenharmony_ci ret = UsbdBulkWriteRemoteCallback(node->list->pList->cb, status, &node->list->pList->asmHandle); 1362094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1363094332d3Sopenharmony_ci HDF_LOGE("%{public}s:%{public}d UsbdBulkWriteRemoteCallback failed, ret:%{public}d" 1364094332d3Sopenharmony_ci "id:%{public}d status:%{public}d", __func__, __LINE__, ret, node->id, status); 1365094332d3Sopenharmony_ci } 1366094332d3Sopenharmony_ci return; 1367094332d3Sopenharmony_ci } 1368094332d3Sopenharmony_ci 1369094332d3Sopenharmony_ci ret = UsbdBulkASyncReqWriteAutoSubmit(request); 1370094332d3Sopenharmony_ci if (ret == HDF_DEV_ERR_NODATA) { 1371094332d3Sopenharmony_ci int32_t count = DListGetCount(&node->list->eList); 1372094332d3Sopenharmony_ci if (count >= USBD_BULKASYNCREQ_NUM_MAX) { 1373094332d3Sopenharmony_ci ret = UsbdBulkWriteRemoteCallback(node->list->pList->cb, HDF_SUCCESS, &node->list->pList->asmHandle); 1374094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1375094332d3Sopenharmony_ci HDF_LOGE("%{public}s: %{public}d UsbdBulkWriteRemoteCallback failed", __func__, __LINE__); 1376094332d3Sopenharmony_ci } 1377094332d3Sopenharmony_ci return; 1378094332d3Sopenharmony_ci } 1379094332d3Sopenharmony_ci } else if (ret != HDF_SUCCESS) { 1380094332d3Sopenharmony_ci ret = UsbdBulkWriteRemoteCallback(node->list->pList->cb, ret, &node->list->pList->asmHandle); 1381094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1382094332d3Sopenharmony_ci HDF_LOGE( 1383094332d3Sopenharmony_ci "%{public}s:%{public}d UsbdBulkWriteRemoteCallback failed ret:%{public}d id:%{public}d", 1384094332d3Sopenharmony_ci __func__, __LINE__, ret, node->id); 1385094332d3Sopenharmony_ci } 1386094332d3Sopenharmony_ci return; 1387094332d3Sopenharmony_ci } 1388094332d3Sopenharmony_ci} 1389094332d3Sopenharmony_ci 1390094332d3Sopenharmony_civoid UsbdDispatcher::UsbdBulkASyncReadCallbackAutoSubmit(UsbRequest *request) 1391094332d3Sopenharmony_ci{ 1392094332d3Sopenharmony_ci if (request == nullptr) { 1393094332d3Sopenharmony_ci HDF_LOGE("%{public}s: %{public}d request is nullptr", __func__, __LINE__); 1394094332d3Sopenharmony_ci return; 1395094332d3Sopenharmony_ci } 1396094332d3Sopenharmony_ci 1397094332d3Sopenharmony_ci int32_t ret = HDF_SUCCESS; 1398094332d3Sopenharmony_ci UsbdBulkASyncReqNode *node = static_cast<UsbdBulkASyncReqNode *>(request->compInfo.userData); 1399094332d3Sopenharmony_ci int32_t status = request->compInfo.status; 1400094332d3Sopenharmony_ci if (status != 0) { 1401094332d3Sopenharmony_ci UsbdBulkASyncReqNodeSetNoUse(node); 1402094332d3Sopenharmony_ci ret = UsbdBulkReadRemoteCallback(node->list->pList->cb, status, &node->list->pList->asmHandle); 1403094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1404094332d3Sopenharmony_ci HDF_LOGE("%{public}s:%{public}d UsbdBulkReadRemoteCallback failed, ret:%{public}d" 1405094332d3Sopenharmony_ci "id:%{public}d status:%{public}d", __func__, __LINE__, ret, node->id, status); 1406094332d3Sopenharmony_ci } 1407094332d3Sopenharmony_ci return; 1408094332d3Sopenharmony_ci } 1409094332d3Sopenharmony_ci 1410094332d3Sopenharmony_ci ret = UsbdBulkASyncReqReadAutoSubmit(request); 1411094332d3Sopenharmony_ci if (ret == HDF_DEV_ERR_NODATA) { 1412094332d3Sopenharmony_ci int32_t count = DListGetCount(&node->list->eList); 1413094332d3Sopenharmony_ci if (count >= USBD_BULKASYNCREQ_NUM_MAX) { 1414094332d3Sopenharmony_ci ret = UsbdBulkReadRemoteCallback(node->list->pList->cb, HDF_SUCCESS, &node->list->pList->asmHandle); 1415094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1416094332d3Sopenharmony_ci HDF_LOGE("%{public}s: %{public}d UsbdBulkReadRemoteCallback failed", __func__, __LINE__); 1417094332d3Sopenharmony_ci } 1418094332d3Sopenharmony_ci return; 1419094332d3Sopenharmony_ci } 1420094332d3Sopenharmony_ci } else if (ret != HDF_SUCCESS) { 1421094332d3Sopenharmony_ci ret = UsbdBulkReadRemoteCallback(node->list->pList->cb, ret, &node->list->pList->asmHandle); 1422094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1423094332d3Sopenharmony_ci HDF_LOGE( 1424094332d3Sopenharmony_ci "%{public}s:%{public}d UsbdBulkReadRemoteCallback failed ret:%{public}d id:%{public}d", 1425094332d3Sopenharmony_ci __func__, __LINE__, ret, node->id); 1426094332d3Sopenharmony_ci } 1427094332d3Sopenharmony_ci return; 1428094332d3Sopenharmony_ci } 1429094332d3Sopenharmony_ci} 1430094332d3Sopenharmony_ci 1431094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdBulkASyncReqFillParams(UsbPipeInfo *pipe, UsbRequestParams *params, uint8_t *buffer) 1432094332d3Sopenharmony_ci{ 1433094332d3Sopenharmony_ci params->interfaceId = pipe->interfaceId; 1434094332d3Sopenharmony_ci params->pipeAddress = pipe->pipeDirection | pipe->pipeAddress; 1435094332d3Sopenharmony_ci params->pipeId = pipe->pipeId; 1436094332d3Sopenharmony_ci params->requestType = USB_REQUEST_PARAMS_DATA_TYPE; 1437094332d3Sopenharmony_ci params->timeout = USB_CTRL_SET_TIMEOUT; 1438094332d3Sopenharmony_ci params->dataReq.numIsoPackets = 0; 1439094332d3Sopenharmony_ci params->dataReq.directon = static_cast<UsbRequestDirection>((pipe->pipeDirection >> USB_PIPE_DIR_OFFSET) & 0x1); 1440094332d3Sopenharmony_ci params->dataReq.length = pipe->maxPacketSize; 1441094332d3Sopenharmony_ci 1442094332d3Sopenharmony_ci if (pipe->pipeDirection == USB_PIPE_DIRECTION_OUT) { 1443094332d3Sopenharmony_ci params->callback = UsbdBulkASyncWriteCallbackAutoSubmit; 1444094332d3Sopenharmony_ci params->dataReq.buffer = buffer; 1445094332d3Sopenharmony_ci } else { 1446094332d3Sopenharmony_ci params->callback = UsbdBulkASyncReadCallbackAutoSubmit; 1447094332d3Sopenharmony_ci } 1448094332d3Sopenharmony_ci return HDF_SUCCESS; 1449094332d3Sopenharmony_ci} 1450094332d3Sopenharmony_ci 1451094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdBulkASyncReqWriteSubmit(UsbdBulkASyncReqNode *req) 1452094332d3Sopenharmony_ci{ 1453094332d3Sopenharmony_ci UsbRequestParams params; 1454094332d3Sopenharmony_ci int32_t ret = memcpy_s(¶ms, sizeof(params), &req->list->pList->params, sizeof(params)); 1455094332d3Sopenharmony_ci if (ret != EOK) { 1456094332d3Sopenharmony_ci HDF_LOGE("%{public}s:%{public}d memcpy_s failed", __func__, ret); 1457094332d3Sopenharmony_ci return ret; 1458094332d3Sopenharmony_ci } 1459094332d3Sopenharmony_ci 1460094332d3Sopenharmony_ci params.userData = static_cast<void *>(req); 1461094332d3Sopenharmony_ci ret = UsbdBulkAsyncGetAsmData(&req->list->pList->asmHandle, ¶ms, req->list->pList->pipe.maxPacketSize); 1462094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1463094332d3Sopenharmony_ci UsbdBulkASyncReqNodeSetNoUse(req); 1464094332d3Sopenharmony_ci HDF_LOGE("%{public}s:UsbdBulkAsyncGetAsmData ret:%{public}d", __func__, ret); 1465094332d3Sopenharmony_ci return ret; 1466094332d3Sopenharmony_ci } 1467094332d3Sopenharmony_ci req->request->compInfo.status = USB_REQUEST_COMPLETED; 1468094332d3Sopenharmony_ci ret = UsbFillRequest(req->request, req->list->pList->ifHandle, ¶ms); 1469094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1470094332d3Sopenharmony_ci UsbdBulkASyncReqNodeSetNoUse(req); 1471094332d3Sopenharmony_ci HDF_LOGE("%{public}s:UsbFillRequest ret:%{public}d", __func__, ret); 1472094332d3Sopenharmony_ci return ret; 1473094332d3Sopenharmony_ci } 1474094332d3Sopenharmony_ci ret = UsbSubmitRequestAsync(req->request); 1475094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1476094332d3Sopenharmony_ci UsbdBulkASyncReqNodeSetNoUse(req); 1477094332d3Sopenharmony_ci HDF_LOGE("%{public}s:UsbSubmitRequestAsync ret:%{public}d", __func__, ret); 1478094332d3Sopenharmony_ci } 1479094332d3Sopenharmony_ci return ret; 1480094332d3Sopenharmony_ci} 1481094332d3Sopenharmony_ci 1482094332d3Sopenharmony_ciint32_t UsbdDispatcher::UsbdBulkASyncReqReadSubmit(UsbdBulkASyncReqNode *db) 1483094332d3Sopenharmony_ci{ 1484094332d3Sopenharmony_ci uint32_t readLen = 0; 1485094332d3Sopenharmony_ci int32_t ret = UsbdBulkAsyncGetAsmReqLen(&db->list->pList->asmHandle, &readLen, db->list->pList->pipe.maxPacketSize); 1486094332d3Sopenharmony_ci if (ret != HDF_SUCCESS || readLen == 0) { 1487094332d3Sopenharmony_ci UsbdBulkASyncReqNodeSetNoUse(db); 1488094332d3Sopenharmony_ci HDF_LOGE("%{public}s:UsbdBulkAsyncGetAsmReqLen failed, readLen:%{public}u", __func__, readLen); 1489094332d3Sopenharmony_ci return HDF_DEV_ERR_NODATA; 1490094332d3Sopenharmony_ci } 1491094332d3Sopenharmony_ci 1492094332d3Sopenharmony_ci db->request->compInfo.status = USB_REQUEST_COMPLETED; 1493094332d3Sopenharmony_ci UsbRequestParams params; 1494094332d3Sopenharmony_ci ret = memcpy_s(¶ms, sizeof(params), &db->list->pList->params, sizeof(params)); 1495094332d3Sopenharmony_ci if (ret != EOK) { 1496094332d3Sopenharmony_ci HDF_LOGE("%{public}s:%{public}d memcpy_s failed", __func__, ret); 1497094332d3Sopenharmony_ci return ret; 1498094332d3Sopenharmony_ci } 1499094332d3Sopenharmony_ci 1500094332d3Sopenharmony_ci params.dataReq.length = readLen; 1501094332d3Sopenharmony_ci params.userData = static_cast<void *>(db); 1502094332d3Sopenharmony_ci ret = UsbFillRequest(db->request, db->list->pList->ifHandle, ¶ms); 1503094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1504094332d3Sopenharmony_ci HDF_LOGE("%{public}s:UsbFillRequest failed", __func__); 1505094332d3Sopenharmony_ci UsbdBulkASyncReqNodeSetNoUse(db); 1506094332d3Sopenharmony_ci return ret; 1507094332d3Sopenharmony_ci } 1508094332d3Sopenharmony_ci 1509094332d3Sopenharmony_ci ret = UsbSubmitRequestAsync(db->request); 1510094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1511094332d3Sopenharmony_ci HDF_LOGE("%{public}s:UsbSubmitRequestAsync failed", __func__); 1512094332d3Sopenharmony_ci UsbdBulkASyncReqNodeSetNoUse(db); 1513094332d3Sopenharmony_ci } 1514094332d3Sopenharmony_ci return ret; 1515094332d3Sopenharmony_ci} 1516094332d3Sopenharmony_ci} // namespace V1_1 1517094332d3Sopenharmony_ci} // namespace Usb 1518094332d3Sopenharmony_ci} // namespace HDI 1519094332d3Sopenharmony_ci} // namespace OHOS 1520