一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

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

電子發(fā)燒友論壇 ? 來源:凌智電子 ? 2023-09-12 10:04 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1、案例簡介

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

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

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

GPIO平臺驅(qū)動開發(fā)

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

2、基礎(chǔ)知識

2.1、GPIO簡介

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

2.2、GPIO平臺驅(qū)動

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

GPIO模塊各分層作用:

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

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

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

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

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

為了保證上層在調(diào)用GPIO接口時能夠正確的操作GPIO管腳,核心層在//drivers/hdf_core/framework/support/platform/include/gpio/gpio_core.h中定義了以下鉤子函數(shù),驅(qū)動適配者需要在適配層實現(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);
  }

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

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

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

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

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

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

GPIO標(biāo)準(zhǔn)API通過GPIO管腳號來操作指定管腳,使用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ū)動設(shè)備描述,具體內(nèi)容如下:

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

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

注意:

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

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

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

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"

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

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

3.4、應(yīng)用程序

3.4.1、gpio_test.c

gpio_test.c主要分為兩個部分:

對gpio引腳進行讀操作。

對gpio引腳進行寫操作。

(1)對gpio引腳進行讀操作

  // 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;
  }

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

(2)對gpio引腳進行寫操作

  // 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);

(左右移動查看全部內(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
  }

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

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

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

"b03_platform_device_gpio/app:rk3568_gpio_test",

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

4、編譯說明

建議使用docker編譯方法,運行如下:

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

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

5、運行結(jié)果

該程序運行結(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
  #

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

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

審核編輯:湯梓紅

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

    關(guān)注

    3

    文章

    3695

    瀏覽量

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

    關(guān)注

    38

    文章

    3337

    瀏覽量

    59050
  • GPIO
    +關(guān)注

    關(guān)注

    16

    文章

    1280

    瀏覽量

    54140
  • OpenHarmony
    +關(guān)注

    關(guān)注

    29

    文章

    3856

    瀏覽量

    18654

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

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

    在之前的文章中筆者分享了在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 ?1890次閱讀
    <b class='flag-5'>OpenHarmony</b><b class='flag-5'>應(yīng)用程序</b>集成AGC云存儲

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

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

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

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

    OpenHarmony:全流程講解如何編寫GPIO平臺驅(qū)動以及應(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平臺驅(qū)動以及應(yīng)用程序

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

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

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

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

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

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

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

    OpenHarmony HDF平臺驅(qū)動框架及驅(qū)動適配介紹

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

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

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

    OpenHarmony:如何使用HDF平臺驅(qū)動控制I2C

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

    OpenHarmony:如何使用HDF平臺驅(qū)動控制PWM

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

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

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

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

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

    如何從單片機平臺編寫GPIO程序

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