1. 复制一份foundation/arkui/napi/sample/native_module_demo,命名为native_module_gpio

2. 重命名文件:

foundation/arkui/napi/sample/native_module_gpio/gpio_javascript_class.cpp
foundation/arkui/napi/sample/native_module_gpio/gpio_javascript_class.h
foundation/arkui/napi/sample/native_module_gpio/native_module_gpio.cpp

3. 修改gpio_javascript_class.cpp和native_module_gpio.cpp代码

static napi_value GpioCtrl(napi_env env, napi_callback_info info) 
{ 
    HILOG_INFO("========== GpioCtrl Function START ==========");

    size_t requireArgc = 3; 
    size_t argc = 3; 
    napi_value args[3] = { nullptr }; 
    NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, nullptr, nullptr)); 
 
    // 检查参数个数
    NAPI_ASSERT(env, argc >= requireArgc, "Wrong number of arguments"); 
 
    // 参数1: gpio编号
    napi_valuetype valuetype0; 
    NAPI_CALL(env, napi_typeof(env, args[0], &valuetype0)); 

    // 参数2: gpio取值
    napi_valuetype valuetype1; 
    NAPI_CALL(env, napi_typeof(env, args[1], &valuetype1)); 

    // 参数3: gpio方向,out或in,字符串类型
    napi_valuetype valuetype2; 
    NAPI_CALL(env, napi_typeof(env, args[2], &valuetype2)); 
 
    // 检查参数类型
    NAPI_ASSERT(env, valuetype0 == napi_number && valuetype1 == napi_number && valuetype2 == napi_string, "Wrong argument type. [Number, Number, String] expected."); 
 
    // 解析GPIO编号
    uint32_t gpio; 
    NAPI_CALL(env, napi_get_value_uint32(env, args[0], &gpio)); 
 
    // 解析GPIO值
    uint32_t val; 
    NAPI_CALL(env, napi_get_value_uint32(env, args[1], &val)); 

    // 解析方向参数
    char direction_str[20] = {0};
    size_t str_len;
    NAPI_CALL(env, napi_get_value_string_utf8(env, args[2], direction_str, sizeof(direction_str) - 1, &str_len));
 
    // 验证方向参数有效性
    if (strcmp(direction_str, "in") != 0 && strcmp(direction_str, "out") != 0) {
        napi_throw_error(env, nullptr, "Invalid direction. Only 'in' or 'out' allowed.");
        return nullptr;
    }

    // 设置GPIO方向
    char direction_cmd[100];
    snprintf(direction_cmd, sizeof(direction_cmd), 
             "echo %s > /sys/class/gpio/gpio%d/direction 2>/dev/null", 
             direction_str, gpio);
    
    // 设置GPIO值
    char value_cmd[100];
    snprintf(value_cmd, sizeof(value_cmd), 
             "echo %d > /sys/class/gpio/gpio%d/value 2>/dev/null", 
             val, gpio);
    
    // 执行命令并检查结果
    napi_value result;
    int ret_dir = system(direction_cmd);
    int ret_val = system(value_cmd);
    
    // 检查命令执行结果 (0 表示成功)
    bool success = (ret_dir == 0) && (ret_val == 0);
    NAPI_CALL(env, napi_get_boolean(env, success, &result));
    
    return result;
} 

4. 修改foundation/arkui/napi/sample/native_module_gpio/BUILD.gn

import("//build/ohos.gni")

ohos_shared_library("gpio") { # 修改对应的ohos_shared_library为gpio
  include_dirs = []

  sources = [
    "gpio_javascript_class.cpp", # 修改对应的文件名
    "native_module_gpio.cpp", # 修改对应的文件名
  ]

  deps = [ "../..:ace_napi" ]

  if ("${current_os}_${current_cpu}" != "mingw_x86_64" &&
      "${current_os}_${current_cpu}" != "mac_x64") {
    external_deps = [ "hilog:libhilog" ]
  }

  relative_install_dir = "module"

  subsystem_name = "arkui"
  part_name = "napi"
}

5. 修改base/security/selinux_adapter/config/config.enforce

# 设置 SELINUX为permissive, 否则无法向 /sys/class/gpio/写入文件
# SELINUX=enforcing
SELINUX=permissive

6. 修改foundation/arkui/napi/BUILD.gn末尾的代码

group("napi_packages_test") {
    # if (!build_ohos_ndk && !is_arkui_x && !ohos_indep_compiler_enable) {
      testonly = true

      deps = [
        "sample/native_module_calc:calc",
        "sample/native_module_calc:number",
        "sample/native_module_callback:callback",
        "sample/native_module_demo:demo",
        "sample/native_module_gpio:gpio", # 增加native_module_gpio依赖
        "sample/native_module_netserver:netserver",
        "sample/native_module_storage:storage",
        "test/fuzztest:fuzztest",
        "test/unittest:unittest",
      ]
    # }
  }

7. 修改foundation/arkui/napi/bundle.json,找到build属性->group_type->base_group为"//foundation/arkui/napi:napi_packages"这个位置,在inner_kits数组中添加

{
    "header": {
        "header_base": "//foundation/arkui/napi/sample/native_module_gpio",
        "header_files": [
            "gpio_javascript_class.h"
        ]
    },
    "name": "//foundation/arkui/napi/sample/native_module_gpio:gpio"
},

8. 修改device/board/hihope/rk3568/cfg/init.rk3568.cfg

{
    "import" : [
            "init.${ohos.boot.hardware}.usb.cfg"
    ],
    "jobs" : [{
            "name" : "pre-init",
            "cmds" : [
                "write /proc/sys/vm/min_free_kbytes 10240",
                "mount debugfs /sys/kernel/debug /sys/kernel/debug mode=755",
                "write /sys/kernel/debug/hisi_inno_phy/role peripheral"
            ]
        }, {
            "name" : "init",
            "cmds" : [
                "write /proc/1/oom_score_adj -1000",
                "write /proc/sys/kernel/hung_task_timeout_secs 90",
                "write /sys/kernel/hungtask/enable on",
                "write /sys/kernel/hungtask/monitorlist whitelist,init,appspawn",
                "chown system system /sys/kernel/hungtask/userlist",
                "symlink /dev/block/platform/fe310000.sdhci/by-name /dev/block/by-name"
            ]
        }, {
            "name" : "boot",
            "cmds" : [
                "write /sys/block/zram0/disksize 1024M",
                "write /sys/class/gpio/export 13", 
                "write /sys/class/gpio/export 14", 
                "write /sys/class/gpio/export 150", 
                "write /sys/class/gpio/export 114", 
                "write /sys/class/gpio/export 98", 
                "write /sys/class/gpio/gpio14/direction out", 
                "chmod 666 /sys/class/gpio/gpio13/direction", 
                "chmod 666 /sys/class/gpio/gpio13/value",
                "chmod 666 /sys/class/gpio/gpio14/direction", 
                "chmod 666 /sys/class/gpio/gpio14/value",
                "chmod 666 /sys/class/gpio/gpio150/direction", 
                "chmod 666 /sys/class/gpio/gpio150/value",
                "chmod 666 /sys/class/gpio/gpio114/direction", 
                "chmod 666 /sys/class/gpio/gpio114/value",
                "chmod 666 /sys/class/gpio/gpio98/direction", 
                "chmod 666 /sys/class/gpio/gpio98/value",
                "mkswap /dev/block/zram0",
                "swapon /dev/block/zram0",
                "chmod 777 /dev/ttyAMA2",
                "chmod 775 /sys/class/rfkill/rfkill0/state",
                "chown blue_host blue_host /sys/class/rfkill/rfkill0/state",
                "chown blue_host blue_host /dev/ttyS8",
                "chown bluetooth bluetooth /dev/uhid",
                "chmod 777 /dev/tun",
                "chown bluetooth bluetooth /dev/tun",
                "chmod 777 /dev/rtkbt_dev",
                "chmod 660 /dev/ppp",
                "chown net_manager net_manager /dev/ppp",
                "chmod 0440 /proc/interrupts",
                "chmod 0440 /proc/stat",
                "chmod 0640 /dev/xt_qtaguid",
                "chmod 0660 /proc/net/xt_qtaguid/ctrl",
                "chmod 0440 /proc/net/xt_qtaguid/stats",
                "chmod 666 /dev/mali0",
                "chown system graphics /dev/mali0",
                "chmod 666 /dev/dri/card1",
                "chown system graphics /dev/dri/card1",
                "chmod 666 /dev/dri/renderD129",
                "chown system graphics /dev/dri/renderD129",
                "chown system graphics /dev/graphics/fb0",
                "chmod 666 /dev/ion",
                "chown system system /dev/ion",
                "chmod 666 /dev/sched_rtg_ctrl",
                "chown system system /dev/sched_rtg_ctrl",
                "chown update update /dev/block/mmcblk0p2",
                "chown update update /dev/block/mmcblk0p3",
                "chmod 666 /dev/v4l-subdev0",
                "chown ispserver ispserver /dev/v4l-subdev0",
                "chmod 666 /dev/v4l-subdev0",
                "chown ispserver ispserver /dev/v4l-subdev1",
                "chmod 666 /dev/v4l-subdev0",
                "chown ispserver ispserver /dev/v4l-subdev2",
                "chmod 666 /dev/v4l-subdev0",
                "chown ispserver ispserver /dev/v4l-subdev3",
                "chmod 666 /dev/media0",
                "chown ispserver ispserver /dev/media0",
                "start ispserver"
            ]
        }, {
            "name" : "post-fs-data",
            "cmds" : [
                "restorecon",
                "restorecon /data/updater"
            ]
        }
    ],
    "services" : [{
            "name" : "ispserver",
            "path" : ["/vendor/bin/ispserver"],
            "once" : 1,
            "secon" : "u:r:ispserver:s0",
            "uid": "ispserver",
            "gid": [ "ispserver", "camera_host" ]
        }
    ]
}

9. 重新编译和烧录,能够在/root/ohos_6.0/out/rk3568/arkui/napi/下看到libgpio.z.so

10. D:\Huawei\DevEco Studio 5.0\sdk\default\openharmony\ets\api下新增@ohos.gpio.d.ts,代码如下

/**
 *
 *
 * @since 9
 * @syscap SystemCapability.Ability.AbilityRuntime.AbilityCore
 */
declare namespace gpio {
    function gpioCtrl(number: number, value: number, direction: string): boolean;
}
export default gpio;
Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐