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
【 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:
@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 đồ
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"