
回复
添加资源
添加资源将有机会获得更多曝光,你也可以直接关联已上传资源
去关联
【本文正在参与优质创作者激励】
老规矩还是将最终希望跑出来的效果放出来。如下:
@TOC
从上框架图可以看出与第三篇的区别就是在硬件层增加了模块,而且这个控制硬件的模块代码会放入内核态代码进行引用。
从hi3516官方所给原理图可以看出对应的主板口为gpio5_1,官方所给硬件原理图我附在附件中。
按照下述代码
static int32_t CtlLED(int mode)
{
int32_t ret;
uint16_t valRead;
uint16_t gpio = 5 * 8 + 1; // 红外补光灯
/* 将GPIO管脚配置为输出 */
ret = GpioSetDir(gpio, GPIO_DIR_OUT);
if (ret != 0)
{
HDF_LOGE("GpioSerDir: failed, ret %d\n", ret);
return ret;
}
if (mode == -1)
{
// 翻转输出口
(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)
{
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)
{
result = CtlLED(-1);
if (!HdfSbufWriteInt32(reply, result)){
}
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;
}