HDF điều khiển dàn giáo dò đường ( tam ): Căn cứ vào 3516 phối trí một bộ có thể đả thông HDF điều khiển trình tự Nguyên sangTinh hoa

Mr_qzk
Tuyên bố với 2021-11-30 10:05
Xem
8 cất chứa

【 bổn văn đang ở tham dự chất lượng tốt sáng tác giả khích lệ 】
Lão quy củ vẫn là đem cuối cùng hy vọng chạy ra hiệu quả thả ra. Như sau:
HDF驱动框架探路(三):基于3516配置一套可以打通的HDF驱动程序-鸿蒙开发者社区

@toc

Lời mở đầu

  • Đại gia nếu có đọc quá đệ nhị thiên văn chương nói, khả năng phát hiện ở nên văn trung nội hạch thái điều khiển trình tự là trực tiếp trích dẫn nguyên mã trung đã tồn tại một cái HDF điều khiển mô khối. Cho nên bổn văn chính là cường điệu giải quyết vấn đề này, cũng chính là chính mình đi phối trí một cái HDF điều khiển mô khối.
  • Bổn văn là căn cứ vào 3516 loại nhỏ hệ thống đi nghiệm chứng.

Bổn văn dàn giáo đồ

HDF驱动框架探路(三):基于3516配置一套可以打通的HDF驱动程序-鸿蒙开发者社区
Quan sát thượng đồ, kỳ thật bổn văn là đem câu trên lưu trình tiến thêm một bước tế hóa, câu trên trung điều khiển trình tự tế phân thành ba cái bộ phận, phân biệt là: HCS văn kiện phối trí, nội hạch thái số hiệu, liteos_a phối trí biên dịch tiến nội hạch. Này ba cái bộ phận hợp nhau tới chính là chính mình dựng HDF điều khiển trình tự bước đi.

1. HDF phối trí

Nơi này HDF phối trí là dựa theo nguyên mã trung đã tồn tại sample_driver mô khối tới
Mở ra văn kiện vendor/hisilicon/hispark_taurus/hdf_config/hdf_test/hdf_test_manager/device_info.hcs, sau đó gia nhập hạ thuật số hiệu trung device2.

device1:: deviceNode {
policy = 2;
priority = 10;
preload = 0;
permission = 0644;
moduleName = "sample_driver";
serviceName = "sample_service";
}
device2:: deviceNode { // DeviceNode of the sample driver
policy = 2; // Driver service release policy. For details, see section Driver Service Management.
priority= 10; // Driver startup priority (0-200). A larger value indicates a lower priority. The default value 100 is recommended. If the priorities are the same, the device loading sequence is random.
preload = 0; // On-demand loading of the driver. For details, see "NOTE" at the end of this section.
permission = 0664; // Permission for the driver to create device nodes.
moduleName = "talkweb_driver"; // Driver name. The value of this field must be the same as the value of moduleName in the driver entry structure.
serviceName = "talkweb_service"; // Name of the service released by the driver. The name must be unique.
}
}
device_platform_test:: device {
platform_test:: deviceNode {
policy = 1;
priority = 150;
preload = 0;
permission = 0644;
moduleName = "PLATFORM_TEST_DRIVER";
serviceName = "PLATFORM_TEST";
deviceMatchAttr = "platform_test";
}
}

2. liteos_a biên dịch phối trí

Nên bước đi tác dụng là đem bước thứ ba trung điều khiển trình tự biên dịch tiến vào nội hạch.

2.1 ở BUILD.gn văn kiện trung phối trí

Mở ra drivers/adapter/khdf/liteos/test/BUILD.gn văn kiện

--- a/khdf/liteos/test/BUILD.gn
+++ b/khdf/liteos/test/BUILD.gn
@@ -37,6 +37,7 @@ hdf_driver(module_name) {
sources = [
"$HDF_TEST_FRAMWORK_ROOT/common/hdf_main_test.c",
"$HDF_TEST_FRAMWORK_ROOT/manager/sample_driver_test.c",
+ "$HDF_TEST_FRAMWORK_ROOT/talkwebtest/talkweb.c",
"$HDF_TEST_FRAMWORK_ROOT/osal/osal_all_test.c",
"$HDF_TEST_FRAMWORK_ROOT/osal/osal_file_test.c",
"$HDF_TEST_FRAMWORK_ROOT/osal/osal_get_case_test.c",

2.2 ở Makefile trung tiến hành tăng thêm phối trí

drivers/adapter/khdf/liteos/test/Makefile

--- a/khdf/liteos/test/Makefile
+++ b/khdf/liteos/test/Makefile
@@ -34,6 +34,7 @@ HDF_TEST_FRAMWORK_ROOT = $(LITEOSTOPDIR)/../../drivers/framework/test/unittest

LOCAL_SRCS:= $(HDF_TEST_FRAMWORK_ROOT)/common/hdf_main_test.c \
$(HDF_TEST_FRAMWORK_ROOT)/manager/sample_driver_test.c \
+ $(HDF_TEST_FRAMWORK_ROOT)/talkwebtest/talkweb.c \
$(HDF_TEST_FRAMWORK_ROOT)/osal/osal_test_entry.c \
$(HDF_TEST_FRAMWORK_ROOT)/osal/osal_all_test.c \
$(HDF_TEST_FRAMWORK_ROOT)/osal/osal_file_test.c \

3. Điều khiển trình tự

Tiến vào drivers/framework/test/unittest mục lục hạ, tân kiến talkwebtest mục lục

3.1 ở kể trên mục lục hạ tân kiến talkweb.h văn kiện, đem hạ thuật số hiệu để vào

#ifndef HDF_SAMPLE_DRIVER_H
#define HDF_SAMPLE_DRIVER_H

#include "hdf_object.h"

#define SAMPLE_SERVICE "sample_service"

typedef enum {
SAMPLE_DRIVER_REGISTER_DEVICE = 0,
SAMPLE_DRIVER_UNREGISTER_DEVICE,
SAMPLE_DRIVER_SENDEVENT_SINGLE_DEVICE,
SAMPLE_DRIVER_SENDEVENT_BROADCAST_DEVICE,
SAMPLE_DRIVER_PM_STATE_INJECT,
} SAMPLE_DRIVER_CMDID;

struct HdfDeviceObject *GetDeviceObject(void);

#endif // HDF_MAIN_TEST_H

3.2 ở kể trên mục lục hạ tân kiến talkweb.c văn kiện, đem hạ thuật số hiệu để vào

/*
* Copyright (c) 2020-2021 Huawei Device Co., Ltd.
*
* HDF is dual licensed: you can use it either under the terms of
* the GPL, or the BSD license, at your option.
* See the LICENSE file in the root of this repository for complete details.
*/
#include "talkweb.h"
#include "devsvc_manager_clnt.h"
#include "devmgr_service.h"
#include "hdf_log.h"
#include "hdf_device_desc.h"
#include "hdf_pm.h"

#include "device_resource_if.h"
#include "osal_io.h"
#include "osal_mem.h"
#include "gpio_if.h"
#include "osal_irq.h"
#include "osal_time.h"
//#define HDF_LOG_TAG led_driver // đóng dấu nhật ký sở bao hàm nhãn, nếu không định nghĩa tắc dùng cam chịu > định nghĩa HDF_TAG nhãn
#define LED_WRITE_READ 88

#define HDF_LOG_TAG sample_driver_test

#ifndef INT32_MAX
#define INT32_MAX 0x7fffffff
#endif

void HdftalkwebDriverRelease(struct HdfDeviceObject *deviceObject)
{
(void)deviceObject;
return;
}

int32_t talkwebDriverRegisterDevice(struct HdfSBuf *data)
{
const char *moduleName = NULL;
const char *serviceName = NULL;
struct HdfDeviceObject *devObj = NULL;
if (data == NULL) {
return HDF_FAILURE;
}

moduleName = HdfSbufReadString(data);
if (moduleName == NULL) {
return HDF_FAILURE;
}
serviceName = HdfSbufReadString(data);
if (serviceName == NULL) {
return HDF_FAILURE;
}

devObj = HdfRegisterDevice(moduleName, serviceName, NULL);
if (devObj == NULL) {
return HDF_FAILURE;
}
return HDF_SUCCESS;
}

int32_t talkwebDriverUnregisterDevice(struct HdfSBuf *data)
{
const char *moduleName = NULL;
const char *serviceName = NULL;
if (data == NULL) {
return HDF_FAILURE;
}

moduleName = HdfSbufReadString(data);
if (moduleName == NULL) {
return HDF_FAILURE;
}
serviceName = HdfSbufReadString(data);
if (serviceName == NULL) {
return HDF_FAILURE;
}
HdfUnregisterDevice(moduleName, serviceName);
return HDF_SUCCESS;
}

int32_t talkwebDriverSendEvent(struct HdfDeviceIoClient *client, int id, struct HdfSBuf *data, bool broadcast)
{
return broadcast? HdfDeviceSendEvent(client->device, id, data): HdfDeviceSendEventToClient(client, id, data);
}

int32_t talkwebDriverPowerStateInject(uint32_t powerState)
{
int ret;
struct IDevmgrService *devmgrService = DevmgrServiceGetInstance();
if (devmgrService == NULL || devmgrService->PowerStateChange == NULL) {
return HDF_ERR_INVALID_OBJECT;
}
ret = devmgrService->PowerStateChange(devmgrService, powerState);

HDF_LOGI( "%s: inject power state(%d) done, ret = %d", __func__, powerState, ret);
return ret;
}


static int32_t CtlLED(int mode)
{
int32_t ret;
uint16_t valRead;
/* LED GPIO quản chân hào */
uint16_t gpio = 5 * 8 + 1; // hồng ngoại bổ quang đèn
// uint16_t gpio = 2 * 8 + 3; // màu xanh lục đèn chỉ thị
// uint16_t gpio = 3 * 8 + 4; // màu đỏ đèn chỉ thị

/* đem GPIO quản chân phối trí vì phát ra */
ret = GpioSetDir(gpio, GPIO_DIR_OUT);
if (ret!= 0)
{
HDF_LOGE( "GpioSerDir: failed, ret %d\n", ret);
return ret;
}

if (mode == -1)
{
// quay cuồng phát ra khẩu
(void)GpioRead(gpio, &valRead);
ret = GpioWrite(gpio, (valRead == GPIO_VAL_LOW)? GPIO_VAL_HIGH: GPIO_VAL_LOW);
}
else
{
ret = GpioWrite(gpio, mode);
}

if (ret!= 0)
{
HDF_LOGE( "GpioWrite: failed, ret %d\n", ret);
return ret;
}
return ret;
}


int32_t talkwebDriverDispatch(struct HdfDeviceIoClient *client, int cmdId, struct HdfSBuf *data, struct HdfSBuf *reply)
{
HDF_LOGD( "%s::qzk-enter", __func__);
uint32_t powerState = 0;
int32_t ret = HDF_SUCCESS;
if (reply == NULL || client == NULL) {
return HDF_FAILURE;
}
int32_t result = HDF_FAILURE;
switch (cmdId) {
case LED_WRITE_READ:
const char *recv = HdfSbufReadString(data);
if (recv!= NULL)
{
//HDF_LOGI( "recv: %s", recv);
result = CtlLED(-1);
// CtlLED(GPIO_VAL_HIGH);
if (!HdfSbufWriteInt32(reply, result)){
//HDF_LOGE( "replay is fail" );
}
return HdfDeviceSendEvent(client->device, cmdId, data);
}
break;
case SAMPLE_DRIVER_REGISTER_DEVICE: {
ret = talkwebDriverRegisterDevice(data);
HdfSbufWriteInt32(reply, ret);
break;
}
case SAMPLE_DRIVER_UNREGISTER_DEVICE:
ret = talkwebDriverUnregisterDevice(data);
HdfSbufWriteInt32(reply, ret);
break;
case SAMPLE_DRIVER_SENDEVENT_SINGLE_DEVICE:
ret = talkwebDriverSendEvent(client, cmdId, data, false);
HdfSbufWriteInt32(reply, INT32_MAX);
break;
case SAMPLE_DRIVER_SENDEVENT_BROADCAST_DEVICE:
ret = talkwebDriverSendEvent(client, cmdId, data, true);
HdfSbufWriteInt32(reply, INT32_MAX);
break;
case SAMPLE_DRIVER_PM_STATE_INJECT:
HdfSbufReadUint32(data, &powerState);
return talkwebDriverPowerStateInject(powerState);
default:
break;
}

return ret;
}

int HdftalkwebDriverBind(struct HdfDeviceObject *deviceObject)
{
static struct IDeviceIoService testService = {
.Dispatch = talkwebDriverDispatch,
.Open = NULL,
.Release = NULL,
};
HDF_LOGD( "%s::enter", __func__);
if (deviceObject == NULL) {
return HDF_FAILURE;
}

deviceObject->service = &testService;
return HDF_SUCCESS;
}

int HdftalkwebDozeResume(struct HdfDeviceObject *deviceObject)
{
HDF_LOGI( "%s:called", __func__);
return HDF_SUCCESS;
}

int HdftalkwebDozeSuspend(struct HdfDeviceObject *deviceObject)
{
HDF_LOGI( "%s:called", __func__);
return HDF_SUCCESS;
}

int HdftalkwebResume(struct HdfDeviceObject *deviceObject)
{
HDF_LOGI( "%s:called", __func__);
return HDF_SUCCESS;
}

int HdftalkwebSuspend(struct HdfDeviceObject *deviceObject)
{
HDF_LOGI( "%s:called", __func__);
return HDF_SUCCESS;
}

struct talkwebDriverPmListener {
struct IPowerEventListener powerListener;
void *p;
};

int HdftalkwebDriverInit(struct HdfDeviceObject *deviceObject)
{
static struct talkwebDriverPmListener pmListener = {0};
int ret;
HDF_LOGI( "%s::enter!", __func__);
if (deviceObject == NULL) {
HDF_LOGE( "%s::ptr is null!", __func__);
return HDF_FAILURE;
}
HDF_LOGD( "%s:Init success", __func__);

pmListener.powerListener.DozeResume = HdftalkwebDozeResume;
pmListener.powerListener.DozeSuspend = HdftalkwebDozeSuspend;
pmListener.powerListener.Resume = HdftalkwebResume;
pmListener.powerListener.Suspend = HdftalkwebSuspend;

ret = HdfPmRegisterPowerListener(deviceObject, &pmListener.powerListener);
HDF_LOGI( "%s:register power listener, ret = %d", __func__, ret);

return HDF_SUCCESS;
}


struct HdfDriverEntry g_talkwebDriverEntry = {
.moduleVersion = 1,
.moduleName = "talkweb_driver",
.Bind = HdftalkwebDriverBind,
.Init = HdftalkwebDriverInit,
.Release = HdftalkwebDriverRelease,
};

HDF_INIT(g_talkwebDriverEntry);

4. Ứng dụng thái trình tự

Nơi này ứng dụng thái trình tự số hiệu cùng biên dịch phương pháp, trực tiếp có thể chọn dùng câu trên liền có thể.
Nơi này chỉ cần sửa chữa SAMPLE_SERVICE_NAME cái này hoành.

#define SAMPLE_SERVICE_NAME "talkweb_service"

5.hb build -f tiến hành biên dịch thiêu lục

© quyền tác giả về tác giả sở hữu, như cần đăng lại, thỉnh ghi chú rõ xuất xứ, nếu không đem truy cứu pháp luật trách nhiệm
Đã với 2021-11-30 10:05:16 sửa chữa
Tán 10
Cất chứa 8
Hồi phục
Cử báo
Hồi phục
    Tương quan đề cử
    Cái này người dùng thực lười, còn không có cá nhân tóm tắt
    Thiệp
    Video
    Danh vọng
    Fans
    Xã khu tinh hoa nội dung

    Mục lục