/* * Copyright (c) 2021 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "sample_driver.h" #include #include "hdf_log.h" #include "hdf_base.h" #include "hdf_device_desc.h" #define HDF_LOG_TAG sample_driver #ifndef INT32_MAX #define INT32_MAX 0x7fffffff #endif void HdfSampleDriverRelease(struct HdfDeviceObject *deviceObject) { (void)deviceObject; return; } int32_t SampleDriverRegisteDevice(struct HdfSBuf *data) { if (data == NULL) { return HDF_FAILURE; } const char *moduleName = HdfSbufReadString(data); if (moduleName == NULL) { return HDF_FAILURE; } const char *serviceName = HdfSbufReadString(data); if (serviceName == NULL) { return HDF_FAILURE; } struct HdfDeviceObject *devObj = HdfRegisteDevice(moduleName, serviceName); if (devObj == NULL) { return HDF_FAILURE; } return HDF_SUCCESS; } int32_t SampleDriverUnregisteDevice(struct HdfSBuf *data) { if (data == NULL) { return HDF_FAILURE; } const char *moduleName = HdfSbufReadString(data); if (moduleName == NULL) { return HDF_FAILURE; } const char *serviceName = HdfSbufReadString(data); if (serviceName == NULL) { return HDF_FAILURE; } HdfUnregisteDevice(moduleName, serviceName); return HDF_SUCCESS; } int32_t SampleDriverSendEvent(struct HdfDeviceIoClient *client, int id, struct HdfSBuf *data, bool broadcast) { int32_t ret = broadcast ? HdfDeviceSendEvent(client->device, id, data) : HdfDeviceSendEventToClient(client, id, data); HDF_LOGI("%{public}s:report event done, broadcast = %{public}d", __func__, broadcast); return ret; } int32_t SampleDriverDispatch(struct HdfDeviceIoClient *client, int cmdId, struct HdfSBuf *data, struct HdfSBuf *reply) { int32_t ret = HDF_SUCCESS; if (reply == NULL || client == NULL) { return HDF_FAILURE; } HDF_LOGI("%{public}s:cmdId = %{public}d", __func__, cmdId); switch (cmdId) { case SAMPLE_DRIVER_REGISTE_DEVICE: { ret = SampleDriverRegisteDevice(data); HdfSbufWriteInt32(reply, ret); break; } case SAMPLE_DRIVER_UNREGISTE_DEVICE: ret = SampleDriverUnregisteDevice(data); HdfSbufWriteInt32(reply, ret); break; case SAMPLE_DRIVER_SENDEVENT_SINGLE_DEVICE: ret = SampleDriverSendEvent(client, cmdId, data, false); HdfSbufWriteInt32(reply, INT32_MAX); break; case SAMPLE_DRIVER_SENDEVENT_BROADCAST_DEVICE: ret = SampleDriverSendEvent(client, cmdId, data, true); HdfSbufWriteInt32(reply, INT32_MAX); break; default: break; } return ret; } int HdfSampleDriverBind(struct HdfDeviceObject *deviceObject) { HDF_LOGD("%{public}s::enter!, deviceObject=%{public}p", __func__, deviceObject); if (deviceObject == NULL) { return HDF_FAILURE; } static struct IDeviceIoService testService = { .Dispatch = SampleDriverDispatch, .Open = NULL, .Release = NULL, }; deviceObject->service = &testService; return HDF_SUCCESS; } int HdfSampleDriverInit(struct HdfDeviceObject *deviceObject) { HDF_LOGD("%{public}s::enter!, deviceObject=%{public}p", __func__, deviceObject); if (deviceObject == NULL) { HDF_LOGE("%{public}s::ptr is null!", __func__); return HDF_FAILURE; } HDF_LOGD("%{public}s:Init success", __func__); return HDF_SUCCESS; } struct HdfDriverEntry g_sampleDriverEntry = { .moduleVersion = 1, .moduleName = "sample_driver", .Bind = HdfSampleDriverBind, .Init = HdfSampleDriverInit, .Release = HdfSampleDriverRelease, }; HDF_INIT(g_sampleDriverEntry);