前言: 自己一直是板端開發(fā)也就是南向開發(fā),對于北向應(yīng)用端開發(fā)一直是個短板,九聯(lián)提供的開發(fā)板對南北向開發(fā)過程提供了樣例,非常感興趣這一部分,如何實現(xiàn),下面就自己根據(jù)樣例實現(xiàn)開發(fā)板上使用APP控制板端接口來學(xué)習(xí)。下面根據(jù)Openharmony NAPI框架實現(xiàn)GPIO接口。
一、開發(fā)環(huán)境
以上除4部分,其他都在前面的帖子中搭建完成。第4部分自己準備幾根杜邦線和幾個LED燈。
二、NAPI框架簡介
NAPI(Native API)是OpenHarmony標準系統(tǒng)的一種JS API實現(xiàn)機制,適合封裝IO、CPU密集型、OS底層等能力并對外暴露JS接口,實現(xiàn)JS與C/C++代碼互相訪問。
三、實現(xiàn)NAPI擴展庫
1、創(chuàng)建NAPI擴展庫
新增子系統(tǒng)napisubsys在OpenHarmony源碼目錄下創(chuàng)建一個目錄napisubsys作為子系統(tǒng)目錄(子系統(tǒng)可以在OpenHarmony源碼目錄任意位置),目前創(chuàng)建在九聯(lián)開發(fā)板目錄下sample/napi目錄下,具體相對OpenHarmony目錄為vendor/unionman/unionpi_tiger/sample/napi/napisubsys,在創(chuàng)建的目錄下新建ohos.build文件,構(gòu)建時會先讀取這個文件。將新增子系統(tǒng)配置到OpenHarmony目錄下的build/subsystem_config.json文件中參與編譯。subsystem_config.json增加如下代碼:
"napisubsys": {
"path": "vendor/unionman/unionpi_tiger/sample/napi/napisubsys",
"name": "napisubsys"
},
(左右移動查看全部內(nèi)容)
2、新增gpioled_part組件
在子系統(tǒng)napisubsys目錄下創(chuàng)建一個子組件目錄gpioled_part,打開napisubsys目錄下的ohos.build文件,在"parts":中添加下列語句:
"gpioled_part": {
"variants": [
"phone"
],
"module_list": [ "http://vendor/unionman/unionpi_tiger/sample/napi/napisubsys/gpioled_part/gpioled_demo:gpioled"
]
}
(左右移動查看全部內(nèi)容)
3、新增擴展動態(tài)庫
在組件目錄gpioled_part下面新建gpioled_demo目錄,作為NAPI擴展庫的代碼目錄。在gpioled_demo目錄下創(chuàng)建gpioled.cpp和BUILD.gn文件,編寫構(gòu)建配置也即BUILD.gn文件內(nèi)容如下:
import("http://build/ohos.gni")
ohos_shared_library("gpioled") {
include_dirs = [ "http://foundation/ace/napi/interfaces/kits" ]
sources = [
"gpioled.cpp",
"um_gpio.c",
]
deps = [
"http://foundation/ace/napi:ace_napi",
"http://utils/native/base:utils",
]
external_deps = [ "hiviewdfx_hilog_native:libhilog" ]
relative_install_dir = "module"
subsystem_name = "napisubsys"
part_name = "gpioled_part"
}
(左右移動查看全部內(nèi)容)
4、將組件添加到產(chǎn)品定義中
打開vendor/unionman/unionpi_tiger/config.json文件,在“subsystems”:中添加如下語句:
{
"subsystem": "napisubsys",
"components": [
{
"component": "gpioled_part",
"features": []
}
]
},
(左右移動查看全部內(nèi)容)
四、NAPI接口開發(fā)
模塊注冊
1)添加NAPI框架頭文件,引入框架提供的方法。
(左右移動查看全部內(nèi)容)
2)定義模塊。
3)注冊模塊,加載動態(tài)庫時自動調(diào)用注冊。
/*
* 模塊定義
*/
static napi_module gpioled_demoModule = {
.nm_version = 1,
.nm_flags = 0,
.nm_filename = nullptr,
.nm_register_func = registerGpioLed_DemoApis,
.nm_modname = "gpioled_demo", //模塊名
.nm_priv = ((void *) 0),
.reserved = {0},
};
/*
* 注冊模塊
*/
extern "C" __attribute__((constructor)) void RegisterGpioLed_DemoModule(void) {
napi_module_register(&gpioled_demoModule); //接口注冊函數(shù)
}
(左右移動查看全部內(nèi)容)
使用DECLARE_NAPI_FUNCTION("js函數(shù)名", c++實現(xiàn)函數(shù)名)定義接口函數(shù)、DECLARE_NAPI_PROPERTY、 DECLARE_NAPI_STATIC_PROPERTY等定義屬性,再通過napi_define_properties賦給exports對象,最后返回exports對象。
/*
* 注冊接口
*/
static napi_value registerGpioLed_DemoApis(napi_env env, napi_value exports) {
napi_value gpioValHigh = gpioValHigh;
napi_value gpioValLow = nullptr;
napi_create_int32(env, UM_GPIO_HIGH_LEVE, &gpioValHig);
napi_create_int32(env, UM_GPIO_LOW_LEVE, &gpioValLow);
napi_property_descriptor desc[] = {
DECLARE_NAPI_FUNCTION("setLedStatusWithCallback", setLedStatusWithCallback),
DECLARE_NAPI_FUNCTION("getLedStatusWithCallback", getLedStatusWithCallback),
DECLARE_NAPI_FUNCTION("setLedStatusWithPromise", setLedStatusWithPromise),
DECLARE_NAPI_FUNCTION("getLedStatusWithPromise", getLedStatusWithPromise),
DECLARE_NAPI_FUNCTION("setLedStatus", setLedStatus),
DECLARE_NAPI_FUNCTION("getLedStatus", getLedStatus),
DECLARE_NAPI_STATIC_PROPERTY("LED_ON", gpioValHigh),
DECLARE_NAPI_STATIC_PROPERTY("LED_OFF", gpioValLow),
};
NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc));
return exports;
}
(左右移動查看全部內(nèi)容)
具體實現(xiàn)代碼可去代碼倉庫進行下載學(xué)習(xí)。
修改deviceoardunionmanunionpi_tigerconfiginitarminit.A311D.cfg 文件,在cmds中添加相關(guān)命令
"write /sys/class/gpio/export 380",
"write /sys/class/gpio/export 381",
"write /sys/class/gpio/export 382",
"write /sys/class/gpio/export 383",
"write /sys/class/gpio/export 384",
"write /sys/class/gpio/export 385",
"write /sys/class/gpio/export 386",
"write /sys/class/gpio/export 387",
"write /sys/class/gpio/export 388",
"write /sys/class/gpio/export 389",
"chmod 666 /sys/class/gpio/gpio380/direction",
"chmod 666 /sys/class/gpio/gpio381/direction",
"chmod 666 /sys/class/gpio/gpio382/direction",
"chmod 666 /sys/class/gpio/gpio383/direction",
"chmod 666 /sys/class/gpio/gpio384/direction",
"chmod 666 /sys/class/gpio/gpio385/direction",
"chmod 666 /sys/class/gpio/gpio386/direction",
"chmod 666 /sys/class/gpio/gpio387/direction",
"chmod 666 /sys/class/gpio/gpio388/direction",
"chmod 666 /sys/class/gpio/gpio389/direction",
"chmod 666 /sys/class/gpio/gpio380/value",
"chmod 666 /sys/class/gpio/gpio381/value",
"chmod 666 /sys/class/gpio/gpio382/value",
"chmod 666 /sys/class/gpio/gpio383/value",
"chmod 666 /sys/class/gpio/gpio384/value",
"chmod 666 /sys/class/gpio/gpio385/value",
"chmod 666 /sys/class/gpio/gpio386/value",
"chmod 666 /sys/class/gpio/gpio387/value",
"chmod 666 /sys/class/gpio/gpio388/value",
"chmod 666 /sys/class/gpio/gpio389/value"
(左右移動查看全部內(nèi)容)
五、Ubuntu下進行編譯NAPI
將以上文件修改完成后,編譯鏡像文件,前面帖子中已有編譯方法,自行查閱,如有問題帖子留言,我會進行回答。進入到Ubuntu下進行編譯,編譯指令如下:
./build.sh --product-name unionpi_tiger –ccache
(左右移動查看全部內(nèi)容)
編譯完成如下圖所示:
編譯完成后需要,進行對鏡像進行打包,然后進行燒寫。執(zhí)行以下命令固件打包
./device/board/unionman/unionpi_tiger/common/tools/packer-unionpi.sh
(左右移動查看全部內(nèi)容)
打包完成如下圖所示,打包最終燒錄程序目錄為out/unionpi_tiger/packages/phone/images/OpenHarmony.img
打開燒錄工具,使用Micro USB數(shù)據(jù)線連接PC與開發(fā)板OTG口并接通電源,導(dǎo)入燒錄包后開始燒錄即可(可關(guān)閉校驗IMG)。具體如何燒錄可參考我的其他博文。
六、應(yīng)用程序編譯
打開DevEco Studio 3.0.0.993版本的軟件,打開vendor_unionman/unionpi_tiger/sample/app/gpioled_app/gpioled-javascript目錄,如下圖所示程序代碼。
將目錄vendor_unionman/unionpi_tiger/sample/napi/napisubsys下的@ohos.gpioled.d.ts文件拷貝到OpenHarmony的SDK下面,如圖所示具體路徑:
設(shè)置自動簽名,如圖所示:
編譯Hap文件,如下圖所示:
將編譯后的hap文件拷貝到USB中,因SDK中的hdc_std.exe不運行,用USB安裝應(yīng)用程序了,文件如下圖所示,可自行修改文件名。
七、板端安裝應(yīng)用控制LED燈
將USB插入USB3.0接口,串口端顯示如下所示:
掛載/dev/block/sda1到/mnt/usb目錄,如果沒有/mnt/usb目錄進行自建,運行如下命令進行安裝hap,如圖所示:
bm install -p 包名.hap
(左右移動查看全部內(nèi)容)
安裝后屏幕界面如圖所示:
連接GPIO_05到LED的正極,如下圖所示:
打開gpioled的app運行如視頻所示。
弄了hdc_std.exe,但它不運行,有問題。正在查找問題。有了hdc,直接連接板子OTG將hap運行到板子上看app效果,可以看調(diào)試信息,一口兩用。
提示:本文由電子發(fā)燒友社區(qū)發(fā)布,轉(zhuǎn)載請注明以上來源。如需社區(qū)合作及入群交流,請?zhí)砑游⑿臙EFans0806,或者發(fā)郵箱liuyong@huaqiu.com。
更多熱點文章閱讀
- 鴻湖萬聯(lián)產(chǎn)品推薦官招募!啟鴻OpenHarmony開發(fā)板免費體驗
- 小河貍創(chuàng)客格物開發(fā)板體驗:智能升降車
- 全球首家支持OpenHarmony的3D引擎,Cocos Creator 3.6.1社區(qū)版發(fā)布
- ROC-RK3568-PC開發(fā)板體驗:網(wǎng)絡(luò)數(shù)據(jù)傳輸性能測試
- ROC-RK3568-PC開發(fā)板OpenWRT系統(tǒng)初體驗
END
想了解更多開源技術(shù)?后臺留言,立刻安排!就喜歡獎勵一個“”和“在看”唄~
原文標題:基于OpenHarmony NAPI框架控制板端LED
文章出處:【微信公眾號:電子發(fā)燒友開源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
-
led
+關(guān)注
關(guān)注
242文章
23312瀏覽量
661640 -
NAPIT
+關(guān)注
關(guān)注
0文章
2瀏覽量
2141 -
OpenHarmony
+關(guān)注
關(guān)注
25文章
3729瀏覽量
16405
原文標題:基于OpenHarmony NAPI框架控制板端LED
文章出處:【微信號:HarmonyOS_Community,微信公眾號:電子發(fā)燒友開源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論