回复
HDF驱动框架探路(四):在HDF框架中操作硬件“点个灯” 原创 精华
Mr_qzk
发布于 2021-11-30 12:11
浏览
7收藏
【本文正在参与优质创作者激励】
老规矩还是将最终希望跑出来的效果放出来。如下:
@TOC
前言
- 本文章是基于HDF驱动框架探路(三)这一篇文章来的,因为在第三篇文章中已经是自己配置了一套HDF框架程序,并且可以从用户态调用到内核态。驱动程序,驱动程序嘛,核心就是要控制硬件,所以这一篇文章就是在上文的基础上添加硬件控制,来实现基于HDF框架的一个完整的驱动示例。
本文框架图
从上框架图可以看出与第三篇的区别就是在硬件层增加了模块,而且这个控制硬件的模块代码会放入内核态代码进行引用。
1.硬件原理图
从hi3516官方所给原理图可以看出对应的主板口为gpio5_1,官方所给硬件原理图我附在附件中。
2.编写操作硬件代码
按照下述代码
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;
}
3.驱动程序放入内核态
- 按照下述代码,修改上一篇内核态驱动程序的talkwebDriverDispatch函数。
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;
}
4.应用态的程序完全把第三篇的拿来直接用就可以
5.编译烧录,验证结果
©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
20210121040312.zip 1.23M 68次下载
已于2021-11-30 12:23:33修改
赞
5
收藏 7
回复
相关推荐