国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

OpenHarmony:如何使用HDF驅動控制LED燈

系統 OpenHarmony
RGB LED燈整體硬件電路如下圖所示,硬件電路中包含了三個GPIO控制管腳控制RGB LED燈,低電平點亮LED燈,高電平熄滅LED燈。電路簡單,這邊不對此進行多余的說明。

想了解更多關于開源的內容,請訪問:

51CTO 開源基礎軟件社區

https://ost.51cto.com

一、程序簡介

該程序是基于OpenHarmony標準系統編寫的基礎外設類:RGB LED。

目前已在凌蒙派-RK3568開發板跑通。詳細資料請參考官網:https://gitee.com/Lockzhiner-Electronics/lockzhiner-rk3568-openharmony/tree/master/samples/b02_hdf_rgb_led。

詳細資料請參考OpenHarmony官網:

  • GPIO平臺驅動開發
  • GPIO應用程序開發

二、硬件設計

RGB LED燈整體硬件電路如下圖所示,硬件電路中包含了三個GPIO控制管腳控制RGB LED燈,低電平點亮LED燈,高電平熄滅LED燈。電路簡單,這邊不對此進行多余的說明。

三、程序解析

1、目錄結構

b02_hdf_rgb_led
├── config              # HDF資源配置文件目錄
    ├── config.hcs      # 接口IO配置文件
    ├── device_info.hcs # 設備信息配置文件
├── drivers             # 內核HDF驅動程序目錄
    ├── rgb_led_drv.c   # 內核HDF驅動程序
    ├── Makefile        # 內核HDF驅動編譯腳本
├── figures             # MD文檔圖片
├── BUILD.gn            # GN文件
├── rgb_led.c           # 應用層控制程序

2、內核HDF驅動程序

(1)接口函數

  • 函數名:HdfRgbLedDriverInit.
  • 功能說明:HDF初始化注冊,讀取HDF資源配置文件,獲取三色燈控制GPIO管腳。
int32_t HdfRgbLedDriverInit(struct HdfDeviceObject *deviceObject)
{
    if (deviceObject == NULL) {
        HDF_LOGE("g_rgbLedDriverEntry: %s failed", __func__);
        return HDF_ERR_INVALID_OBJECT;
    }
    struct DeviceResourceIface *CfgOps = NULL;
    CfgOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE);
    if (CfgOps == NULL || CfgOps->GetUint32 == NULL) {
        HDF_LOGE("%s: DeviceResourceGetIfaceInstance failed", __func__);
        return HDF_FAILURE;
    }
    if (CfgOps->GetUint32(deviceObject->property, "rgb_led_version", &g_rgbLedCfg.rgb_led_version, 0) != HDF_SUCCESS) {
        HDF_LOGE("%s: read rgb_led_version failed", __func__);
        return HDF_FAILURE;
    }
    if (CfgOps->GetUint32(deviceObject->property, "rgb_led_red", &g_rgbLedCfg.rgb_led_red, 0) != HDF_SUCCESS) {
        g_rgbLedCfg.rgb_led_version = 0;
        HDF_LOGE("%s: read rgb_led_red failed", __func__);
        return HDF_FAILURE;
    }
    if (CfgOps->GetUint32(deviceObject->property, "rgb_led_green", &g_rgbLedCfg.rgb_led_green, 0) != HDF_SUCCESS) {
        g_rgbLedCfg.rgb_led_version = 0;
        HDF_LOGE("%s: read rgb_led_green failed", __func__);
        return HDF_FAILURE;
    }
    if (CfgOps->GetUint32(deviceObject->property, "rgb_led_blue", &g_rgbLedCfg.rgb_led_blue, 0) != HDF_SUCCESS) {
        g_rgbLedCfg.rgb_led_version = 0;
        HDF_LOGE("%s: read rgb_led_blue failed", __func__);
        return HDF_FAILURE;
    }
    HDF_LOGI("g_rgbLedDriverEntry: %s success", __func__);
    return HDF_SUCCESS;
}
  • 函數名:HdfRgbLedDriverRelease。
  • 功能說明:HDF去注冊。
void HdfRgbLedDriverRelease(struct HdfDeviceObject *deviceObject)
{
    if (deviceObject == NULL) {
        HDF_LOGE("g_rgbLedDriverEntry: %s failed", __func__);
        return;
    }
    HDF_LOGI("g_rgbLedDriverEntry: %s success", __func__);
    return;
}
  • 函數名:HdfRgbLedDriverBind。
  • 功能說明:HDF綁定解析函數。
int32_t HdfRgbLedDriverBind(struct HdfDeviceObject *deviceObject)
{
    if (deviceObject == NULL) {
        HDF_LOGE("g_rgbLedDriverEntry: %s failed", __func__);
        return HDF_ERR_INVALID_OBJECT;
    }
    static struct IDeviceIoService ledDriverServ = {
        .Dispatch = rgbLedDriverDispatch,
    };
    deviceObject->service = (struct IDeviceIoService *)(&ledDriverServ);
    HDF_LOGI("g_rgbLedDriverEntry: %s success NodeName[%s]", __func__,
        deviceObject->property->name);
    return HDF_SUCCESS;
}
  • 函數名:rgbLedDriverDispatch。
  • 功能說明:解析函數,解析應用層下發的命令,執行命令對應操作,RGB_LED_WRITE控制三色燈亮滅。
int32_t rgbLedDriverDispatch(struct HdfDeviceIoClient *client, int32_t cmdId,
    struct HdfSBuf *dataBuf, struct HdfSBuf *replyBuf)
{
    int32_t result = HDF_FAILURE;
    int32_t rgbLedMode = 0;

    if (client == NULL || client->device == NULL) {
        HDF_LOGE("driver device is NULL");
        return HDF_ERR_INVALID_OBJECT;
    }
    if (g_rgbLedCfg.rgb_led_version != RGB_LED_VERSION) {
        HDF_LOGE("driver rgb_led_version not match");
        return HDF_FAILURE;
    }
    switch (cmdId) {
        case RGB_LED_WRITE:
            result = HdfSbufReadInt32(dataBuf, &rgbLedMode);
            if (result) {
                HDF_LOGI("%s: mode:[0x%X][%s%s%s]", __func__, rgbLedMode,
                    (rgbLedMode&RGB_LED_RED_BIT)?"R":"-",
                    (rgbLedMode&RGB_LED_GREEN_BIT)?"G":"-",
                    (rgbLedMode&RGB_LED_BLUE_BIT)?"B":"-");

                LedGpioCtrl(g_rgbLedCfg.rgb_led_red, (rgbLedMode&RGB_LED_RED_BIT)?LED_ON:LED_OFF);
                LedGpioCtrl(g_rgbLedCfg.rgb_led_green, (rgbLedMode&RGB_LED_GREEN_BIT)?LED_ON:LED_OFF);
                LedGpioCtrl(g_rgbLedCfg.rgb_led_blue, (rgbLedMode&RGB_LED_BLUE_BIT)?LED_ON:LED_OFF);
            }
            break;
        default:
            HDF_LOGE("%s: receiving unknown command", __func__);
            break;
    }
    return result;
}
  • 函數名:LedGpioCtrl。
  • 功能說明:LED GPIO控制函數,低電平點亮LED,高電平熄滅LED。
static int32_t LedGpioCtrl(uint16_t gpio, int32_t mode)
{
    uint16_t level = GPIO_VAL_HIGH;

    if (HDF_SUCCESS != GpioSetDir(gpio, GPIO_DIR_OUT)) {
        HDF_LOGE("%s: GpioSetDir failed", __func__);
        return HDF_FAILURE;
    }

    if (mode == LED_ON) {
        level = GPIO_VAL_LOW;
    } else if (mode == LED_OFF) {
        level = GPIO_VAL_HIGH;
    }

    if (HDF_SUCCESS != GpioWrite(gpio, level)) {
        HDF_LOGE("%s: GpioWrite failed", __func__);
        return HDF_FAILURE;
    }
    return HDF_SUCCESS;
}

3、應用層程序

(1)應用層代碼分析

程序啟動后獲取命令行參數,如果命令行不帶參數,RGB三色燈運行跑馬燈;如果命令行帶參數,根據傳入的參數的低三位映射點亮對應的紅燈、綠燈和藍燈;通過HdfIoServiceBind綁定RGB三色燈HDF服務,獲取HDF空間緩沖區,向緩沖區寫入需要控制的RGB三色燈低三位數據,通過RGB_LED_WRITE命令下發到HDF驅動中,從而控制RGB三色燈亮滅。程序運行結束,回收HDF空間緩沖區和HDF服務。

int main(int argc, char* argv[])
{
    int ret = HDF_SUCCESS;
    int32_t mode = -1;
    if (argc == ARGS_NUM) {
        mode = atoi(argv[1]);
        /*low-3bits*/
        mode &= 0x7;
        HILOG_INFO(LOG_APP, "[%s] main enter: mode[%s%s%s][0x%X]",
            LOG_TAG,
            (mode&RGB_LED_BLUE_BIT)?"B":"-",
            (mode&RGB_LED_GREEN_BIT)?"G":"-",
            (mode&RGB_LED_RED_BIT)?"R":"-",
            mode);
        printf("RGB mode[%s%s%s][0x%X]\n",
            (mode&RGB_LED_BLUE_BIT)?"B":"-",
            (mode&RGB_LED_GREEN_BIT)?"G":"-",
            (mode&RGB_LED_RED_BIT)?"R":"-",
            mode);
    } else {
        HILOG_INFO(LOG_APP, "[%s] main enter: auto test RGB LED", LOG_TAG);
        printf("auto test RGB LED\n");
    }

    struct HdfIoService *serv = HdfIoServiceBind(RGB_LED_SERVICE_NAME);
    if (serv == NULL) {
        HILOG_ERROR(LOG_APP, "get service %s failed", RGB_LED_SERVICE_NAME);
        return -1;
    }
    struct HdfSBuf *data = HdfSbufObtainDefaultSize();
    if (data == NULL) {
        HILOG_ERROR(LOG_APP, "obtain data failed");
        return -1;
    }

    if (mode == -1) {
        mode = 0x8;
        while (mode) {
            HdfSbufFlush(data);
            if (!HdfSbufWriteInt32(data, --mode)) {
                HILOG_ERROR(LOG_APP, "write data failed");
                return -1;
            }
            ret = serv->dispatcher->Dispatch(&serv->object, RGB_LED_WRITE, data, NULL);
            sleep(1);
        }
    } else {
        if (!HdfSbufWriteInt32(data, mode)) {
            HILOG_ERROR(LOG_APP, "write data failed");
            return -1;
        }
        ret = serv->dispatcher->Dispatch(&serv->object, RGB_LED_WRITE, data, NULL);
    }

    HdfSbufRecycle(data);
    HdfIoServiceRecycle(serv);
    HILOG_INFO(LOG_APP, "[%s] main exit.", LOG_TAG);

    return ret;
}

四、運行程序

系統啟動后,命令行運行命令:

rgb_led

五、運行結果

運行結果:

# rgb_led
auto test RGB LED

# rgb_led 1
RGB mode[--R][0x1]
# rgb_led 2
RGB mode[-G-][0x2]
# rgb_led 3
RGB mode[-GR][0x3]
# rgb_led 4
RGB mode[B--][0x4]
# rgb_led 5
RGB mode[B-R][0x5]
# rgb_led 6
RGB mode[BG-][0x6]
# rgb_led 7
RGB mode[BGR][0x7]

想了解更多關于開源的內容,請訪問:

51CTO 開源基礎軟件社區

https://ost.51cto.com

責任編輯:jianghua 來源: 51CTO 開源基礎軟件社區
相關推薦

2023-09-14 15:49:42

PWM鴻蒙

2023-09-13 15:33:57

I2C鴻蒙

2021-09-10 15:12:04

鴻蒙HarmonyOS應用

2022-01-07 09:56:16

鴻蒙HarmonyOS應用

2022-08-05 19:37:59

鴻蒙Api框架

2021-09-07 15:48:28

鴻蒙HarmonyOS應用

2018-12-25 13:45:54

Fedora IoT樹莓派Linux

2022-08-10 15:58:54

LED燈鴻蒙

2021-01-21 13:27:37

鴻蒙HarmonyOS應用開發

2023-03-20 16:05:49

HDF傳感器驅動開發

2022-04-20 20:28:40

HDF 驅動框架鴻蒙操作系統

2021-09-08 15:09:29

鴻蒙HarmonyOS應用

2021-09-10 15:10:50

鴻蒙HarmonyOS應用

2022-02-16 15:55:21

驅動調用操作系統鴻蒙

2022-02-14 14:28:57

驅動開發鴻蒙系統

2022-11-04 15:10:31

JS應用LED燈

2022-08-08 19:35:37

HDF驅動開發鴻蒙

2023-03-21 18:06:49

ADC數字轉換器

2022-05-16 11:50:45

HDF驅動框架

2021-11-26 15:34:27

鴻蒙HarmonyOS應用
點贊
收藏

51CTO技術棧公眾號

成人爽a毛片一区二区免费| 久久久久久久有限公司| 欧美激情精品久久久久久小说| 欧美福利网址| 国产一区二区三区视频| 中文字幕一二三区在线观看 | 久久人人爽人人爽人人片亚洲| 成人黄色91| 日本少妇精品亚洲第一区| 久久av老司机精品网站导航| 亚洲欧美激情一区| 欧美三级一级片| 成年美女黄网站色大片不卡| 极品少妇一区二区| 国产免费一区二区视频| 麻豆一区二区99久久久久| 亚洲国产精品久久久久久女王| 99综合视频| 粉嫩av一区二区三区天美传媒| 久久精品九九| 欧美一级欧美一级| 亚洲欧洲另类国产综合| 成年人视频在线网站| www.日韩大片| 最新黄色av网站| 鲁大师影院一区二区三区| 45www国产精品网站| 日本三级福利片| 捆绑调教美女网站视频一区| 亚洲电影网站| 琪琪一区二区三区| 91精品国产高清久久久久久91裸体| 瑟瑟视频在线看| www.xxxx欧美| 九九在线精品视频| 国产精品国产三级国产aⅴ9色| 视频在线这里都是精品| 久久亚洲精品国产亚洲老地址| 欧美日一区二区| 在线日韩第一页| 99热自拍偷拍| 久久91视频| 亚洲精品国产成人| 在线精品国产| 亚洲小说欧美另类激情| 国产精品国产精品国产专区不蜜 | 亚洲国产婷婷| 精品一二三四五区| 欧美系列在线观看| 久久悠悠精品综合网| 中文字幕中文字幕在线中心一区| 国产亚洲短视频| 精品99在线视频| 中文字幕+乱码+中文字幕一区| 校园春色综合| 欧美www视频| 久草视频在线看| 亚洲精品自拍偷拍| 美国一区二区| 热re99久久精品国99热蜜月| 免费欧美一区| 日韩av电影中文字幕| 亚洲成人av| 神马欧美一区二区| 久久久久久9999| 中文在线天堂库| 精品视频在线播放| 欧美一区自拍| 精品久久久久久一区| 成人精品高清在线| 久草在线资源视频在线观看| 欧美tk丨vk视频| 日本免费一区二区三区等视频| 成人午夜小视频| 国产一区免费电影| 最近中文字幕在线中文视频| 欧美精品一区二区精品网| 风间由美性色一区二区三区四区| 国产精品视频免费观看| 久久日一线二线三线suv| 国产福利片在线| 色系列之999| 好吊一区二区三区| 天堂av在线网站| 日韩精品一区二区三区在线| 噜噜噜狠狠夜夜躁精品仙踪林| 日本一区免费看| 午夜视黄欧洲亚洲| 少妇高潮一区二区三区99| 精品久久久久久一区二区里番| 国产精品欧美经典| 亚洲天堂av在线| 亚洲xxxx在线| 国产精品伦一区| 中文字幕在线免费观看视频| 91香蕉电影院| 国产精品v亚洲精品v日韩精品 | 九九热在线免费| 亚洲精品国产电影| 国产视频一区在线播放| 欧美视频官网| 91高清在线观看视频| 久久国产精品网站| 99爱在线视频| 欧美大尺度在线观看| 精品一区二区三区免费毛片爱| 欧美free嫩15| 在线看小视频| 欧美日韩中文字幕在线播放 | 免费在线成人av电影| 色吧影院999| 欧美日韩成人在线| 欧美国产欧美综合| 国产乱人伦精品一区二区在线观看 | 中文字幕在线二区| 九九热最新视频//这里只有精品 | 国产精品色在线观看| 51精品国产| 中文字幕免费在线不卡| 国产一区二区三区日韩精品 | 亚洲一区二区电影| 日本福利视频网站| 精品国产一区二区三区av性色| 欧美一区高清| 污污网址在线观看| 欧美又大又粗又长| 日本一区二区三区国色天香 | 欧美激情91| 香蕉视频在线免费| 欧洲精品久久久| 亚洲欧洲www| 久久久伦理片| 99热热99| 欧美在线日韩在线| 亚洲综合久久久| 日韩精品导航| 能在线观看av网站| 国产精品欧美日韩| 黄色成人av网| 91精品啪在线观看国产18| 欧美色图另类| 国产精品裸体一区二区三区| 欧美午夜宅男影院| 国产亚洲亚洲| 暧暧视频在线免费观看| 中文字幕av久久| 亚洲午夜色婷婷在线| 91天堂素人约啪| 少妇一区二区三区| 污视频在线看操| 国产日韩一区二区| 欧美一级片在线| 免费人成网站在线观看欧美高清| 鲁鲁在线中文| 91黄色在线看| 欧美人在线视频| 亚洲午夜精品网| 亚洲国产专区| 91福利区在线观看| 久久久久久久激情| 国产精品人成电影在线观看| 欧美在线观看一区| 寂寞少妇一区二区三区| 精品久久毛片| 日本视频一二区| 精品免费二区三区三区高中清不卡| 亚洲精品99999| 国产女同互慰高潮91漫画| 欧美videofree性高清杂交| 欧美精品一区二区三区蜜桃| 亚洲免费看黄网站| 啊v视频在线| 亚洲视频欧美在线| 伊是香蕉大人久久| 亚洲麻豆国产自偷在线| 国产综合久久| 99re66热这里只有精品4| 亚洲久久中文字幕| 成人在线视频网址| 国产一区二区日韩精品欧美精品| 国产精品久久午夜| 亚洲久久在线| 婷婷精品久久久久久久久久不卡| 国产一级性片| 精品一卡二卡三卡四卡日本乱码 | 无码粉嫩虎白一线天在线观看| 国内偷自视频区视频综合| 日韩欧美国产成人| 国产在线精品视频| 亚洲三级精品| 国内小视频在线看| 亚洲欧美另类动漫| 久久大香伊蕉在人线观看热2| 久久艳片www.17c.com| 欧美性高清videossexo| 成人av电影免费观看| 欧美精品一卡| 91精品丝袜国产高跟在线| 日本中文字幕在线视频| 午夜久久久精品|