HDF驱动框架探路(四):在HDF框架中操作硬件“点个灯” 原创 精华

Mr_qzk
发布于 2021-11-30 12:11
浏览
7收藏

【本文正在参与优质创作者激励】
老规矩还是将最终希望跑出来的效果放出来。如下:
HDF驱动框架探路(四):在HDF框架中操作硬件“点个灯”-鸿蒙开发者社区

@TOC

前言

  • 本文章是基于HDF驱动框架探路(三)这一篇文章来的,因为在第三篇文章中已经是自己配置了一套HDF框架程序,并且可以从用户态调用到内核态。驱动程序,驱动程序嘛,核心就是要控制硬件,所以这一篇文章就是在上文的基础上添加硬件控制,来实现基于HDF框架的一个完整的驱动示例。

本文框架图

HDF驱动框架探路(四):在HDF框架中操作硬件“点个灯”-鸿蒙开发者社区
从上框架图可以看出与第三篇的区别就是在硬件层增加了模块,而且这个控制硬件的模块代码会放入内核态代码进行引用。

1.硬件原理图

HDF驱动框架探路(四):在HDF框架中操作硬件“点个灯”-鸿蒙开发者社区
从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
回复
举报
回复
    相关推荐