吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于OpenHarmony編寫GPIO平臺(tái)驅(qū)動(dòng)和應(yīng)用程序

電子發(fā)燒友論壇 ? 來源:凌智電子 ? 2023-09-12 10:04 ? 次閱讀

1、案例簡介

該程序是基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)編寫的基礎(chǔ)外設(shè)類:GPIO驅(qū)動(dòng)。

目前已在凌蒙派-RK3568開發(fā)板跑通。詳細(xì)資料請(qǐng)參考官網(wǎng)

詳細(xì)資料請(qǐng)參考OpenHarmony官網(wǎng):

GPIO平臺(tái)驅(qū)動(dòng)開發(fā)

GPIO應(yīng)用程序開發(fā)

2、基礎(chǔ)知識(shí)

2.1、GPIO簡介

GPIO(General-purpose input/output)即通用型輸入輸出。通常,GPIO控制器通過分組的方式管理所有GPIO管腳,每組GPIO有一個(gè)或多個(gè)寄存器與之關(guān)聯(lián),通過讀寫寄存器完成對(duì)GPIO管腳的操作。

2.2、GPIO平臺(tái)驅(qū)動(dòng)

GPIO(General-purpose input/output)即通用型輸入輸出。通常,GPIO控制器通過分組的方式管理所有GPIO管腳,每組GPIO有一個(gè)或多個(gè)寄存器與之關(guān)聯(lián),通過讀寫寄存器完成對(duì)GPIO管腳的操作。

GPIO模塊各分層作用:

接口層提供操作GPIO管腳的標(biāo)準(zhǔn)方法。

核心層主要提供GPIO管腳資源匹配,GPIO管腳控制器的添加、移除以及管理的能力,通過鉤子函數(shù)與適配層交互,供芯片廠家快速接入HDF框架。

適配層主要是將鉤子函數(shù)的功能實(shí)例化,實(shí)現(xiàn)具體的功能。

GPIO統(tǒng)一服務(wù)模式結(jié)構(gòu)圖:

0ab84610-5100-11ee-a25d-92fbcf53809c.png

為了保證上層在調(diào)用GPIO接口時(shí)能夠正確的操作GPIO管腳,核心層在//drivers/hdf_core/framework/support/platform/include/gpio/gpio_core.h中定義了以下鉤子函數(shù),驅(qū)動(dòng)適配者需要在適配層實(shí)現(xiàn)這些函數(shù)的具體功能,并與鉤子函數(shù)掛接,從而完成適配層與核心層的交互。

GpioMethod定義:

  struct GpioMethod {
    int32_t (*request)(struct GpioCntlr *cntlr, uint16_t local);         // 【預(yù)留】
    int32_t (*release)(struct GpioCntlr *cntlr, uint16_t local);         // 【預(yù)留】
    int32_t (*write)(struct GpioCntlr *cntlr, uint16_t local, uint16_t val);
    int32_t (*read)(struct GpioCntlr *cntlr, uint16_t local, uint16_t *val);
    int32_t (*setDir)(struct GpioCntlr *cntlr, uint16_t local, uint16_t dir);
    int32_t (*getDir)(struct GpioCntlr *cntlr, uint16_t local, uint16_t *dir);
    int32_t (*toIrq)(struct GpioCntlr *cntlr, uint16_t local, uint16_t *irq);  // 【預(yù)留】
    int32_t (*setirq)(struct GpioCntlr *cntlr, uint16_t local, uint16_t mode, GpioIrqFunc func, void *arg);
    int32_t (*unsetIrq)(struct GpioCntlr *cntlr, uint16_t local);
    int32_t (*enableIrq)(struct GpioCntlr *cntlr, uint16_t local);
    int32_t (*disableIrq)(struct GpioCntlr *cntlr, uint16_t local);
  }

(左右移動(dòng)查看全部內(nèi)容)

GpioMethod結(jié)構(gòu)體成員的鉤子函數(shù)功能說明:

0ac8b78e-5100-11ee-a25d-92fbcf53809c.png

2.3、GPIO應(yīng)用程序

GPIO驅(qū)動(dòng)API接口功能:

0b204cd8-5100-11ee-a25d-92fbcf53809c.png

GPIO標(biāo)準(zhǔn)API通過GPIO管腳號(hào)來操作指定管腳,使用GPIO的一般流程如下圖所示:

0b49443a-5100-11ee-a25d-92fbcf53809c.png

3、代碼解析

3.1、準(zhǔn)備工作

查看《凌蒙派-RK3568開發(fā)板_排針說明表_》(即Git倉庫的//docs/board/凌蒙派-RK3568開發(fā)板_排針說明表_v1.0.xlsx),選中0_B5(即GPIO0_B5)。

3.2、配置文件

3.2.1、device_info.hcs

創(chuàng)建config/device_info.hcs,用于GPIO驅(qū)動(dòng)設(shè)備描述,具體內(nèi)容如下:

root {
  device_info {
    platform :: host {
      device_gpio :: device {
        device0 :: deviceNode {             // GPIO控制器信息描述
          policy = 2;                 // 對(duì)外發(fā)布服務(wù),必須為2,用于定義GPIO管理器的服務(wù)
          priority = 50;
          permission = 0644;
          moduleName = "HDF_PLATFORM_GPIO_MANAGER";  // 這與drivers/hdf_core/framework/support/platform/src/gpio/gpio_service.c的g_gpioServiceEntry.moduleName對(duì)應(yīng),它主要負(fù)責(zé)GPIO引腳的管理
          serviceName = "HDF_PLATFORM_GPIO_MANAGER";
        }
        device1 :: deviceNode {
          policy = 0;                 // 等于0,不需要發(fā)布服務(wù)
          priority = 55;               // 驅(qū)動(dòng)驅(qū)動(dòng)優(yōu)先級(jí)
          permission = 0644;             // 驅(qū)動(dòng)創(chuàng)建設(shè)備節(jié)點(diǎn)權(quán)限
          moduleName = "linux_gpio_adapter";     // 用于指定驅(qū)動(dòng)名稱,必須是linux_adc_adapter,與drivers/hdf_core/adapter/khdf/linux/platform/gpio/gpio_adapter.c對(duì)應(yīng)
          deviceMatchAttr = "";            // 用于配置控制器私有數(shù)據(jù),不定義
        }
      }
    }
  }
}

(左右移動(dòng)查看全部內(nèi)容)

注意:

device_gpio:為配置樹對(duì)gpio的設(shè)備類結(jié)點(diǎn)。

device0:是用于啟用HDF_PLATFORM_GPIO_MANAGER驅(qū)動(dòng)的,它負(fù)責(zé)對(duì)GPIO進(jìn)行對(duì)外接口管理。

device1:是用于啟用linux_gpio_adapter驅(qū)動(dòng)的,它負(fù)責(zé)對(duì)Linux GPIO的讀寫(即對(duì)Linux Gpio子系統(tǒng)進(jìn)行操作)。

3.2.3、參與配置樹編譯

編輯//vendor/lockzhiner/rk3568/hdf_config/khdf/hdf.hcs,將device_info.hcs添加配置樹中。具體內(nèi)容如下所示:

#include "../../samples/b03_platform_device_gpio/config/device_info.hcs"

(左右移動(dòng)查看全部內(nèi)容)

3.3、HDF驅(qū)動(dòng)//drivers/hdf_core/adapter/khdf/linux/platform/gpio/gpio_adapter.c已對(duì)Linux Gpio子系統(tǒng)進(jìn)行規(guī)范化操作。因此,我們不需要額外的GPIO寄存器操作。

3.4、應(yīng)用程序

3.4.1、gpio_test.c

gpio_test.c主要分為兩個(gè)部分:

對(duì)gpio引腳進(jìn)行讀操作。

對(duì)gpio引腳進(jìn)行寫操作。

(1)對(duì)gpio引腳進(jìn)行讀操作

  // GPIO設(shè)置為輸出
  ret = GpioSetDir(m_gpio_id, GPIO_DIR_OUT);
  if (ret != 0) {
    PRINT_ERROR("GpioSetDir failed and ret = %d
", ret);
    return -1;
  }
  // GPIO輸出電平
  ret = GpioWrite(m_gpio_id, m_gpio_value);
  if (ret != 0) {
    PRINT_ERROR("GpioWrite failed and ret = %d
", ret);
    return -1;
  }

(左右移動(dòng)查看全部內(nèi)容)

(2)對(duì)gpio引腳進(jìn)行寫操作

  // GPIO設(shè)置為輸出
  ret = GpioSetDir(m_gpio_id, GPIO_DIR_IN);
  if (ret != 0) {
    PRINT_ERROR("GpioSetDir failed and ret = %d
", ret);
    return -1;
  }
  // 讀取GPIO引腳的電平
  ret = GpioRead(m_gpio_id, &m_gpio_value);
  if (ret != 0) {
    PRINT_ERROR("GpioRead failed and ret = %d
", ret);
    return -1;
  }
  printf("GPIO Read Successful and GPIO = %d, value = %d
", m_gpio_id, m_gpio_value);

(左右移動(dòng)查看全部內(nèi)容)

3.4.2、BUILD.gn

  import("http://build/ohos.gni")
  import("http://drivers/hdf_core/adapter/uhdf2/uhdf.gni")
  ohos_executable("rk3568_gpio_test") {
   sources = [ "gpio_test.c" ]
   include_dirs = [
    "$hdf_framework_path/include",
    "$hdf_framework_path/include/core",
    "$hdf_framework_path/include/osal",
    "$hdf_framework_path/include/platform",
    "$hdf_framework_path/include/utils",
    "$hdf_uhdf_path/osal/include",
    "$hdf_uhdf_path/ipc/include",
    "http://base/hiviewdfx/hilog/interfaces/native/kits/include",
    "http://third_party/bounds_checking_function/include",
   ]
   deps = [
    "$hdf_uhdf_path/platform:libhdf_platform",
    "$hdf_uhdf_path/utils:libhdf_utils",
    "http://base/hiviewdfx/hilog/interfaces/native/innerkits:libhilog",
   ]
   cflags = [
    "-Wall",
    "-Wextra",
    "-Werror",
    "-Wno-format",
    "-Wno-format-extra-args",
   ]
   part_name = "product_rk3568"
   install_enable = true
  }

(左右移動(dòng)查看全部內(nèi)容)

3.4.3、參與應(yīng)用程序編譯

編輯//vendor/lockzhiner/rk3568/samples/BUILD.gn,開啟sample編譯。具體如下:

"b03_platform_device_gpio/app:rk3568_gpio_test",

(左右移動(dòng)查看全部內(nèi)容)

4、編譯說明

建議使用docker編譯方法,運(yùn)行如下:

  hb set -root .
  hb set
  #選擇lockzhiner下的rk3568編譯分支。
  hb build -f

(左右移動(dòng)查看全部內(nèi)容)

5、運(yùn)行結(jié)果

該程序運(yùn)行結(jié)果如下所示:

  # rk3568_gpio_test -g 13 -i
  gpio id: 13
  gpio dir: in
  gpio value: 0
  GPIO Read Successful and GPIO = 13, value = 1
  #
  #
  # rk3568_gpio_test -g 13 -o
  gpio id: 13
  gpio dir: out
  gpio value: 0
  #

(左右移動(dòng)查看全部內(nèi)容)

可將GPIO引腳接入排針中的GND或3V3引腳,查看GPIO輸出結(jié)果。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 開源
    +關(guān)注

    關(guān)注

    3

    文章

    3402

    瀏覽量

    42711
  • 應(yīng)用程序
    +關(guān)注

    關(guān)注

    38

    文章

    3292

    瀏覽量

    57911
  • GPIO
    +關(guān)注

    關(guān)注

    16

    文章

    1216

    瀏覽量

    52376
  • OpenHarmony
    +關(guān)注

    關(guān)注

    25

    文章

    3744

    瀏覽量

    16574

原文標(biāo)題:【開源教程】OpenHarmony:如何編寫GPIO平臺(tái)驅(qū)動(dòng)及應(yīng)用程序

文章出處:【微信號(hào):gh_9b9470648b3c,微信公眾號(hào):電子發(fā)燒友論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    OpenHarmony應(yīng)用程序集成AGC云存儲(chǔ)

    在之前的文章中筆者分享了在OpenHarmony應(yīng)用程序中集成AppGallery Connect(AGC)五大類體系服務(wù)中構(gòu)建應(yīng)用基礎(chǔ)能力的認(rèn)證服務(wù)、云函數(shù)、云數(shù)據(jù)庫,這些能力的應(yīng)用都能夠提升應(yīng)用程序的快速迭代及上線。本次分享
    的頭像 發(fā)表于 02-27 16:27 ?1521次閱讀
    <b class='flag-5'>OpenHarmony</b><b class='flag-5'>應(yīng)用程序</b>集成AGC云存儲(chǔ)

    想通過應(yīng)用程序控制GPIO驅(qū)動(dòng)

    A:我有個(gè)問題,是這樣的,利用開發(fā)平臺(tái)現(xiàn)有的驅(qū)動(dòng)及其它的。假如我現(xiàn)在想通過應(yīng)用程序控制GPIO驅(qū)動(dòng)平臺(tái)
    發(fā)表于 03-22 15:15

    OpenHarmony:全流程講解如何編寫ADC平臺(tái)驅(qū)動(dòng)以及應(yīng)用程序

    /samples/b04_platform_device_adc詳細(xì)資料請(qǐng)參考OpenHarmony官網(wǎng): ADC平臺(tái)驅(qū)動(dòng)開發(fā) ADC應(yīng)用程序開發(fā) 2、基礎(chǔ)知識(shí) 2.1、ADC簡介 A
    發(fā)表于 09-04 16:34

    OpenHarmony:全流程講解如何編寫GPIO平臺(tái)驅(qū)動(dòng)以及應(yīng)用程序

    本帖最后由 xxl1925 于 2023-9-7 10:09 編輯 1、案例簡介該程序是基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)編寫的基礎(chǔ)外設(shè)類:GPIO
    發(fā)表于 09-05 11:51

    OpenHarmony:全流程講解如何編寫RTC平臺(tái)驅(qū)動(dòng)以及應(yīng)用程序

    本帖最后由 xxl1925 于 2023-9-19 13:45 編輯 1、程序介紹本程序是基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)編寫平臺(tái)
    發(fā)表于 09-18 15:45

    OpenHarmony:全流程講解如何編寫Watchdog平臺(tái)驅(qū)動(dòng)以及應(yīng)用程序

    1、程序介紹 本程序是基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)編寫平臺(tái)驅(qū)動(dòng)案例:Watchdog 目
    發(fā)表于 09-19 11:43

    OpenHarmony應(yīng)用程序包整體說明

    同的功能特性聚合到不同的包中,方便后續(xù)的維護(hù)與擴(kuò)展。 應(yīng)用軟件涉及的芯片平臺(tái)多種多樣,有x86、ARM等,還有32位、64位之分,OpenHarmony應(yīng)用程序包屏蔽了芯片平臺(tái)的差異
    發(fā)表于 09-20 15:34

    Windows CE下GPIO驅(qū)動(dòng)程序的設(shè)計(jì)與應(yīng)用

    Windows CE 流接口設(shè)備驅(qū)動(dòng)程序是一種基本的設(shè)備驅(qū)動(dòng)程序。本文以S3C2410 開發(fā)板中的GPIO 流接口驅(qū)動(dòng)為例,說明了驅(qū)動(dòng)程序
    發(fā)表于 01-06 16:02 ?48次下載

    OpenHarmony HDF平臺(tái)驅(qū)動(dòng)框架及驅(qū)動(dòng)適配介紹

    驅(qū)動(dòng)平臺(tái)設(shè)備(PlatformDevice),為系統(tǒng)及外設(shè)驅(qū)動(dòng)提供訪接口。這里的平臺(tái)設(shè)備,泛指I2C/UART等總線、以及GPIO/RTC
    的頭像 發(fā)表于 09-24 11:16 ?7002次閱讀
    <b class='flag-5'>OpenHarmony</b> HDF<b class='flag-5'>平臺(tái)</b><b class='flag-5'>驅(qū)動(dòng)</b>框架及<b class='flag-5'>驅(qū)動(dòng)</b>適配介紹

    OpenHarmony:全流程講解如何編寫ADC平臺(tái)驅(qū)動(dòng)以及應(yīng)用程序

    1、案例簡介該程序是基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)編寫的基礎(chǔ)外設(shè)類:ADC驅(qū)動(dòng)。目前該案例已在凌蒙派-RK3568開發(fā)板跑通。詳細(xì)資料請(qǐng)參考官網(wǎng):https://gitee.com
    的頭像 發(fā)表于 09-04 16:41 ?1369次閱讀
    <b class='flag-5'>OpenHarmony</b>:全流程講解如何<b class='flag-5'>編寫</b>ADC<b class='flag-5'>平臺(tái)</b><b class='flag-5'>驅(qū)動(dòng)</b>以及<b class='flag-5'>應(yīng)用程序</b>

    OpenHarmony:如何使用HDF平臺(tái)驅(qū)動(dòng)控制I2C

    1、程序介紹本程序是基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)編寫平臺(tái)驅(qū)動(dòng)案例:I2C目前已在凌蒙派-
    的頭像 發(fā)表于 09-13 08:27 ?1434次閱讀
    <b class='flag-5'>OpenHarmony</b>:如何使用HDF<b class='flag-5'>平臺(tái)</b><b class='flag-5'>驅(qū)動(dòng)</b>控制I2C

    OpenHarmony:如何使用HDF平臺(tái)驅(qū)動(dòng)控制PWM

    1、程序介紹本程序是基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)編寫平臺(tái)驅(qū)動(dòng)案例:PWM目前已在凌蒙派-
    的頭像 發(fā)表于 09-14 08:24 ?1121次閱讀
    <b class='flag-5'>OpenHarmony</b>:如何使用HDF<b class='flag-5'>平臺(tái)</b><b class='flag-5'>驅(qū)動(dòng)</b>控制PWM

    OpenHarmony:全流程講解如何編寫RTC平臺(tái)驅(qū)動(dòng)以及應(yīng)用程序

    1、程序介紹本程序是基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)編寫平臺(tái)驅(qū)動(dòng)案例:RTC目前已在凌蒙派-
    的頭像 發(fā)表于 09-19 10:14 ?1175次閱讀
    <b class='flag-5'>OpenHarmony</b>:全流程講解如何<b class='flag-5'>編寫</b>RTC<b class='flag-5'>平臺(tái)</b><b class='flag-5'>驅(qū)動(dòng)</b>以及<b class='flag-5'>應(yīng)用程序</b>

    OpenHarmony:全流程講解如何編寫Watchdog平臺(tái)驅(qū)動(dòng)以及應(yīng)用程序

    1、程序介紹本程序是基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)編寫平臺(tái)驅(qū)動(dòng)案例:Watchdog目前已
    的頭像 發(fā)表于 09-19 10:54 ?1739次閱讀
    <b class='flag-5'>OpenHarmony</b>:全流程講解如何<b class='flag-5'>編寫</b>Watchdog<b class='flag-5'>平臺(tái)</b><b class='flag-5'>驅(qū)動(dòng)</b>以及<b class='flag-5'>應(yīng)用程序</b>

    如何從單片機(jī)平臺(tái)編寫GPIO程序

    單片機(jī)平臺(tái)編寫 GPIO程序,以 STM32F103 為例,有三種模式:庫函數(shù)、HAL庫、寄存器。 使用庫函數(shù)的方式操控 GPIO 方式
    的頭像 發(fā)表于 09-28 15:56 ?1277次閱讀
    百家乐注册平台排名| 网上百家乐官网赌钱| 百家乐游戏怎么刷钱| 菲律宾百家乐官网游戏| 百家乐桌布无纺布| 网络百家乐官网的玩法技巧和规则| 新葡京娱乐城网站| 百家乐翻天qvod| 百家乐官网香港六合彩| 大发888提款怎么提| 六十甲子24山吉凶| 百家乐官网高手投注法| 大发888官方免费下载| 真人百家乐来博| 澳门百家乐官网如何算牌| 大发888问题缺少组件| 百家乐会骗人吗| 什么百家乐官网平注法| 大发888注册送钱| 澳门百家乐文章| 百家乐官网9点直赢| 皇冠现金网是真的吗| gt百家乐平台假吗| 百家乐官网平7s88| 泰盈娱乐城| 金花百家乐的玩法技巧和规则| 新锦江百家乐官网的玩法技巧和规则| 巴林右旗| 玩百家乐澳门368娱乐城| 百家乐官网玩揽法大全| 乐陵市| 大发888娱乐城大发888大发网| 百家乐技术秘籍| 历史百家乐官网路单图| 皇冠备用网址| 二八杠筒子| 百家乐波音平台导航网| 金樽百家乐官网的玩法技巧和规则 | 如何玩百家乐游戏| 真人百家乐官网娱乐场开户注册 | 百家乐官网高手技巧|