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

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

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

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

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

1、案例簡(jiǎn)介

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

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

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

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

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

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

2.1、GPIO簡(jiǎn)介

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

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

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

GPIO模塊各分層作用:

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

核心層主要提供GPIO管腳資源匹配,GPIO管腳控制器的添加、移除以及管理的能力,通過(guò)鉤子函數(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)查看全部?jī)?nèi)容)

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

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通過(guò)GPIO管腳號(hào)來(lái)操作指定管腳,使用GPIO的一般流程如下圖所示:

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

3、代碼解析

3.1、準(zhǔn)備工作

查看《凌蒙派-RK3568開(kāi)發(fā)板_排針說(shuō)明表_》(即Git倉(cāng)庫(kù)的//docs/board/凌蒙派-RK3568開(kāi)發(fā)板_排針說(shuō)明表_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)名稱(chēng),必須是linux_adc_adapter,與drivers/hdf_core/adapter/khdf/linux/platform/gpio/gpio_adapter.c對(duì)應(yīng)
          deviceMatchAttr = "";            // 用于配置控制器私有數(shù)據(jù),不定義
        }
      }
    }
  }
}

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

注意:

device_gpio:為配置樹(shù)對(duì)gpio的設(shè)備類(lèi)結(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的讀寫(xiě)(即對(duì)Linux Gpio子系統(tǒng)進(jìn)行操作)。

3.2.3、參與配置樹(shù)編譯

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

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

(左右移動(dòng)查看全部?jī)?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)行寫(xiě)操作。

(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)查看全部?jī)?nèi)容)

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

  // 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)查看全部?jī)?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)查看全部?jī)?nèi)容)

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

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

"b03_platform_device_gpio/app:rk3568_gpio_test",

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

4、編譯說(shuō)明

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

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

(左右移動(dòng)查看全部?jī)?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)查看全部?jī)?nèi)容)

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

審核編輯:湯梓紅

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

    關(guān)注

    3

    文章

    3215

    瀏覽量

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

    關(guān)注

    37

    文章

    3237

    瀏覽量

    57547
  • GPIO
    +關(guān)注

    關(guān)注

    16

    文章

    1188

    瀏覽量

    51832
  • OpenHarmony
    +關(guān)注

    關(guān)注

    25

    文章

    3635

    瀏覽量

    16061

原文標(biāo)題:【開(kāi)源教程】OpenHarmony:如何編寫(xiě)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)五大類(lèi)體系服務(wù)中構(gòu)建應(yīng)用基礎(chǔ)能力的認(rèn)證服務(wù)、云函數(shù)、云數(shù)據(jù)庫(kù),這些能力的應(yīng)用都能夠提升應(yīng)用程序的快速迭代及上線。本次分享
    的頭像 發(fā)表于 02-27 16:27 ?1357次閱讀
    <b class='flag-5'>OpenHarmony</b><b class='flag-5'>應(yīng)用程序</b>集成AGC云存儲(chǔ)

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

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

    OpenHarmony:全流程講解如何編寫(xiě)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)開(kāi)發(fā) ADC應(yīng)用程序開(kāi)發(fā) 2、基礎(chǔ)知識(shí) 2.1、ADC簡(jiǎn)介 A
    發(fā)表于 09-04 16:34

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

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

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

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

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

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

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

    同的功能特性聚合到不同的包中,方便后續(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 開(kāi)發(fā)板中的GPIO 流接口驅(qū)動(dòng)為例,說(shuō)明了驅(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 ?6686次閱讀
    <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:全流程講解如何編寫(xiě)ADC平臺(tái)驅(qū)動(dòng)以及應(yīng)用程序

    1、案例簡(jiǎn)介該程序是基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)編寫(xiě)的基礎(chǔ)外設(shè)類(lèi):ADC驅(qū)動(dòng)。目前該案例已在凌蒙派-RK3568開(kāi)發(fā)板跑通。詳細(xì)資料請(qǐng)參考官網(wǎng):https://gitee.com
    的頭像 發(fā)表于 09-04 16:41 ?1147次閱讀
    <b class='flag-5'>OpenHarmony</b>:全流程講解如何<b class='flag-5'>編寫(xiě)</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)編寫(xiě)平臺(tái)驅(qū)動(dòng)案例:I2C目前已在凌蒙派-
    的頭像 發(fā)表于 09-13 08:27 ?1229次閱讀
    <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)編寫(xiě)平臺(tái)驅(qū)動(dòng)案例:PWM目前已在凌蒙派-
    的頭像 發(fā)表于 09-14 08:24 ?922次閱讀
    <b class='flag-5'>OpenHarmony</b>:如何使用HDF<b class='flag-5'>平臺(tái)</b><b class='flag-5'>驅(qū)動(dòng)</b>控制PWM

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

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

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

    單片機(jī)平臺(tái)編寫(xiě) GPIO程序,以 STM32F103 為例,有三種模式:庫(kù)函數(shù)、HAL庫(kù)、寄存器。 使用庫(kù)函數(shù)的方式操控 GPIO 方式
    的頭像 發(fā)表于 09-28 15:56 ?1172次閱讀