From 73edce961a2c5c908dffffd68901ad5d36ab0da2 Mon Sep 17 00:00:00 2001 From: jmxl Date: Thu, 18 Mar 2021 15:30:26 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E6=9B=B4=E6=AD=A3=E4=B9=A6=E5=86=99?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- README_zh.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 76110789e..318bf7b25 100644 --- a/README.md +++ b/README.md @@ -98,7 +98,7 @@ int32_t SampleDriverBind(struct HdfDeviceObject *deviceObject) int32_t SampleDriverInit(struct HdfDeviceObject *deviceObject) { // TODO: Init hardware or other resources here. - return HDF_S UCCESS; + return HDF_SUCCESS; } ``` diff --git a/README_zh.md b/README_zh.md index e9d3ef0df..97548d00f 100644 --- a/README_zh.md +++ b/README_zh.md @@ -98,7 +98,7 @@ Init接口描述:当框架完成设备绑定动作后,就开始调用驱动 int32_t SampleDriverInit(struct HdfDeviceObject *deviceObject) { // TODO: Init hardware or other resources here. - return HDF_S UCCESS; + return HDF_SUCCESS; } ``` -- Gitee From 42c168fb8fa9ac3e3109c6255138a794f250d458 Mon Sep 17 00:00:00 2001 From: wangchenyang Date: Mon, 1 Feb 2021 16:36:41 +0800 Subject: [PATCH 2/8] Description:vfs refactoring Feature or Bugfix:Feature Binary Source:Huawei PrivateCode(Yes/No):Yes Change-Id: I175d2648bc6f9078c34de2c0a5c93fda10b86c47 ChangeID:13306380 --- model/input/driver/hdf_input_device_manager.c | 8 ++++---- model/input/driver/hdf_touch.c | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/model/input/driver/hdf_input_device_manager.c b/model/input/driver/hdf_input_device_manager.c index 00bdbb285..f0b0b37a8 100644 --- a/model/input/driver/hdf_input_device_manager.c +++ b/model/input/driver/hdf_input_device_manager.c @@ -35,7 +35,7 @@ uint32_t TouchPoll(struct file *filep, InputDevice *inputDev, poll_table *wait); static int32_t InputDevIoctl(struct file *filep, int32_t cmd, unsigned long arg) { int32_t ret; - InputDevice *inputdev = (InputDevice *)filep->f_inode->i_private; + InputDevice *inputdev = (InputDevice *)((struct drv_data*)filep->f_vnode->data)->priv; if (inputdev == NULL) { return HDF_FAILURE; } @@ -54,7 +54,7 @@ static int32_t InputDevIoctl(struct file *filep, int32_t cmd, unsigned long arg) static int32_t InputDevOpen(struct file *filep) { - InputDevice *inputdev = (InputDevice *)filep->f_inode->i_private; + InputDevice *inputdev = (InputDevice *)((struct drv_data*)filep->f_vnode->data)->priv; if (inputdev == NULL) { HDF_LOGE("%s: filep is null", __func__); return HDF_FAILURE; @@ -64,7 +64,7 @@ static int32_t InputDevOpen(struct file *filep) static int32_t InputDevClose(struct file *filep) { - InputDevice *inputdev = (InputDevice *)filep->f_inode->i_private; + InputDevice *inputdev = (InputDevice *)((struct drv_data*)filep->f_vnode->data)->priv; if (inputdev == NULL) { HDF_LOGE("%s: inputdev is null", __func__); return HDF_FAILURE; @@ -76,7 +76,7 @@ static int32_t InputDevClose(struct file *filep) static int32_t InputDevPoll(struct file *filep, poll_table *wait) { uint32_t pollMask = 0; - InputDevice *inputdev = (InputDevice *)filep->f_inode->i_private; + InputDevice *inputdev = (InputDevice *)((struct drv_data*)filep->f_vnode->data)->priv; switch (inputdev->devType) { case INDEV_TYPE_TOUCH: pollMask = TouchPoll(filep, inputdev, wait); diff --git a/model/input/driver/hdf_touch.c b/model/input/driver/hdf_touch.c index 04daecad1..a78142bd9 100644 --- a/model/input/driver/hdf_touch.c +++ b/model/input/driver/hdf_touch.c @@ -104,7 +104,7 @@ int32_t TouchIoctl(InputDevice *inputdev, int32_t cmd, unsigned long arg) uint32_t TouchPoll(FAR struct file *filep, InputDevice *inputDev, poll_table *wait) { uint32_t pollMask = 0; - InputDevice *inputdev = (InputDevice *)filep->f_inode->i_private; + InputDevice *inputdev = (InputDevice *)((struct drv_data*)filep->f_vnode->data)->priv; if (inputdev == NULL) { HDF_LOGE("%s: inputdev is null", __func__); return pollMask; -- Gitee From 2a179c2e29e3124d3fa02b2e4fa1bc27e4f96983 Mon Sep 17 00:00:00 2001 From: gonghui Date: Fri, 26 Mar 2021 08:55:59 +0800 Subject: [PATCH 3/8] modify HarmonyOS Driver interface to hardware driver interface --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 318bf7b25..cda25ee62 100644 --- a/README.md +++ b/README.md @@ -143,7 +143,7 @@ For details, see [Touchscreen Overview](en-us_topic_0000001052857350.md). ### WLAN -The WLAN module is developed based on the HDF and supports cross-OS migration, component adaptation, and modular assembly and compilation. Based on the unified APIs provided by the WLAN module, driver developers of WLAN vendors can adapt their driver code and developers of the HarmonyOS Driver Interfaces \(HDIs\) are capable of creating, disabling, scanning, and connecting to WLAN hotspots. +The WLAN module is developed based on the HDF and supports cross-OS migration, component adaptation, and modular assembly and compilation. Based on the unified APIs provided by the WLAN module, driver developers of WLAN vendors can adapt their driver code and developers of the Hardware Driver Interfaces \(HDIs\) are capable of creating, disabling, scanning, and connecting to WLAN hotspots. - APIs for implementing WLAN driver module capabilities: Implement the APIs of the WLAN HDI layer and provide capabilities of setting/obtaining the MAC address, obtaining the feature type, and setting the transmit power for upper-layer input services, as well as the capabilities of creating/releasing a **WifiModule**, connecting to/disconnecting from a WLAN hotspot, and applying for/releasing a **NetBuf** for developers. - APIs to be implemented by developers: Based on the provided platform driver, complete the board-level HCS configuration as well as the differentiated WLAN configuration, and offer APIs for initializing, deregistering, enabling, and disabling a network device. -- Gitee From 9217cb6b15df15badb189eb445a91cc2598ef93a Mon Sep 17 00:00:00 2001 From: gonghui Date: Fri, 26 Mar 2021 14:06:00 +0800 Subject: [PATCH 4/8] fix review issue --- include/core/hdf_device_desc.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/core/hdf_device_desc.h b/include/core/hdf_device_desc.h index 9c64aa6f7..9c55e21cc 100644 --- a/include/core/hdf_device_desc.h +++ b/include/core/hdf_device_desc.h @@ -254,7 +254,7 @@ struct HdfDriverEntry { /** * @brief Obtains the driver service object based on a driver service name. * - * @param serviceName Indicates the pointer to the released driver service name. + * @param svcName Indicates the pointer to the released driver service name. * * @return Returns the driver service object if the operation is successful; returns NULL otherwise. * @since 1.0 -- Gitee From 19684058c18e0dad02c925a6462b54bb892d4847 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E9=92=A6=E8=A1=97?= <15390014138@163.com> Date: Sun, 28 Mar 2021 19:23:32 +0800 Subject: [PATCH 5/8] update core/adapter/syscall/src/hdf_syscall_adapter.c. --- .../adapter/syscall/src/hdf_syscall_adapter.c | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/core/adapter/syscall/src/hdf_syscall_adapter.c b/core/adapter/syscall/src/hdf_syscall_adapter.c index cefcaa3e2..2848d39c7 100644 --- a/core/adapter/syscall/src/hdf_syscall_adapter.c +++ b/core/adapter/syscall/src/hdf_syscall_adapter.c @@ -209,6 +209,14 @@ static int32_t AssignPfds(struct HdfDevListenerThread *thread, struct pollfd **p return pfdCount; } +static void HdfDevListenerThreadFree(struct HdfDevListenerThread *thread) +{ + OsalMutexDestroy(&thread->mutex); + OsalMemFree(thread->pfds); + OsalThreadDestroy(&thread->thread); + OsalMemFree(thread); +} + #define POLL_WAIT_TIME_MS 100 static int32_t HdfDevEventListenTask(void *para) { @@ -255,10 +263,7 @@ exit: if (thread->shouldStop) { /* exit due to async exit call, should free thread struct */ - OsalMutexDestroy(&thread->mutex); - OsalThreadDestroy(&thread->thread); - OsalMemFree(thread->pfds); - OsalMemFree(thread); + HdfDevListenerThreadFree(thread); } return HDF_SUCCESS; @@ -575,14 +580,6 @@ static void HdfListenThreadPollDel(struct HdfDevListenerThread *thread, struct OsalMutexUnlock(&thread->mutex); } -static void HdfDevListenerThreadFree(struct HdfDevListenerThread *thread) -{ - OsalMutexDestroy(&thread->mutex); - OsalMemFree(thread->pfds); - OsalThreadDestroy(&thread->thread); - OsalMemFree(thread); -} - static void HdfDevListenerThreadDestroy(struct HdfDevListenerThread *thread) { if (thread == NULL) { -- Gitee From b247c1a1939ca976366e5c050e7506d59408d1e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E9=92=A6=E8=A1=97?= <15390014138@163.com> Date: Mon, 29 Mar 2021 11:57:42 +0800 Subject: [PATCH 6/8] update ability/sbuf/src/hdf_sbuf.c. --- ability/sbuf/src/hdf_sbuf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ability/sbuf/src/hdf_sbuf.c b/ability/sbuf/src/hdf_sbuf.c index 57b4944a3..60341b0da 100644 --- a/ability/sbuf/src/hdf_sbuf.c +++ b/ability/sbuf/src/hdf_sbuf.c @@ -414,7 +414,7 @@ struct HdfSBuf *HdfSBufCopy(const struct HdfSBuf *sbuf) new->capacity = sbuf->capacity; new->readPos = 0; new->writePos = sbuf->writePos; - if (memcpy_s(new->data, new->capacity, sbuf->data, sbuf->capacity) != EOK) { + if (memcpy_s(new->data, new->capacity, sbuf->data, sbuf->writePos) != EOK) { HdfSBufRecycle(new); return NULL; } -- Gitee From de55f86e326510b66c319a32006b04ab232c0ec9 Mon Sep 17 00:00:00 2001 From: yuanbo Date: Thu, 1 Apr 2021 15:56:51 +0800 Subject: [PATCH 7/8] remove unnecessary secure func and add hc-gen binary Change-Id: I522009028ec18fc9110febff70499540d9e94a17 --- core/common/src/hdf_attribute.c | 6 +----- tools/hc-gen/bin/hc-gen | Bin 0 -> 92808 bytes 2 files changed, 1 insertion(+), 5 deletions(-) create mode 100755 tools/hc-gen/bin/hc-gen diff --git a/core/common/src/hdf_attribute.c b/core/common/src/hdf_attribute.c index 715832658..1d696fabc 100644 --- a/core/common/src/hdf_attribute.c +++ b/core/common/src/hdf_attribute.c @@ -323,11 +323,7 @@ bool HdfDeviceListAdd(const char *moduleName, const char *serviceName) if (svcName == NULL) { break; } - if (strcpy_s(svcName, strlen(serviceName) + 1, serviceName) != EOK) { - HDF_LOGE("%s: string copy fail", __func__); - OsalMemFree(svcName); - break; - } + strcpy(svcName, serviceName); deviceNodeInfo->svcName = svcName; HdfSListAdd(hostClnt->deviceInfos, &deviceNodeInfo->node); hostClnt->devCount++; diff --git a/tools/hc-gen/bin/hc-gen b/tools/hc-gen/bin/hc-gen new file mode 100755 index 0000000000000000000000000000000000000000..196de1293733a24442bb4937cf670066b108a76a GIT binary patch literal 92808 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 Date: Fri, 2 Apr 2021 08:48:06 +0800 Subject: [PATCH 8/8] Revert "Description:vfs refactoring" This reverts commit 42c168fb8fa9ac3e3109c6255138a794f250d458. --- model/input/driver/hdf_input_device_manager.c | 8 ++++---- model/input/driver/hdf_touch.c | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/model/input/driver/hdf_input_device_manager.c b/model/input/driver/hdf_input_device_manager.c index f0b0b37a8..00bdbb285 100644 --- a/model/input/driver/hdf_input_device_manager.c +++ b/model/input/driver/hdf_input_device_manager.c @@ -35,7 +35,7 @@ uint32_t TouchPoll(struct file *filep, InputDevice *inputDev, poll_table *wait); static int32_t InputDevIoctl(struct file *filep, int32_t cmd, unsigned long arg) { int32_t ret; - InputDevice *inputdev = (InputDevice *)((struct drv_data*)filep->f_vnode->data)->priv; + InputDevice *inputdev = (InputDevice *)filep->f_inode->i_private; if (inputdev == NULL) { return HDF_FAILURE; } @@ -54,7 +54,7 @@ static int32_t InputDevIoctl(struct file *filep, int32_t cmd, unsigned long arg) static int32_t InputDevOpen(struct file *filep) { - InputDevice *inputdev = (InputDevice *)((struct drv_data*)filep->f_vnode->data)->priv; + InputDevice *inputdev = (InputDevice *)filep->f_inode->i_private; if (inputdev == NULL) { HDF_LOGE("%s: filep is null", __func__); return HDF_FAILURE; @@ -64,7 +64,7 @@ static int32_t InputDevOpen(struct file *filep) static int32_t InputDevClose(struct file *filep) { - InputDevice *inputdev = (InputDevice *)((struct drv_data*)filep->f_vnode->data)->priv; + InputDevice *inputdev = (InputDevice *)filep->f_inode->i_private; if (inputdev == NULL) { HDF_LOGE("%s: inputdev is null", __func__); return HDF_FAILURE; @@ -76,7 +76,7 @@ static int32_t InputDevClose(struct file *filep) static int32_t InputDevPoll(struct file *filep, poll_table *wait) { uint32_t pollMask = 0; - InputDevice *inputdev = (InputDevice *)((struct drv_data*)filep->f_vnode->data)->priv; + InputDevice *inputdev = (InputDevice *)filep->f_inode->i_private; switch (inputdev->devType) { case INDEV_TYPE_TOUCH: pollMask = TouchPoll(filep, inputdev, wait); diff --git a/model/input/driver/hdf_touch.c b/model/input/driver/hdf_touch.c index edb8fcf39..239c711d5 100644 --- a/model/input/driver/hdf_touch.c +++ b/model/input/driver/hdf_touch.c @@ -104,7 +104,7 @@ int32_t TouchIoctl(InputDevice *inputdev, int32_t cmd, unsigned long arg) uint32_t TouchPoll(FAR struct file *filep, InputDevice *inputDev, poll_table *wait) { uint32_t pollMask = 0; - InputDevice *inputdev = (InputDevice *)((struct drv_data*)filep->f_vnode->data)->priv; + InputDevice *inputdev = (InputDevice *)filep->f_inode->i_private; if (inputdev == NULL) { HDF_LOGE("%s: inputdev is null", __func__); return pollMask; -- Gitee