OpenHarmony6.0研究笔记(三):使用napi控制GPIO
·
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;
更多推荐



所有评论(0)