OpenHarmony 分為輕量系統(tǒng)、小型系統(tǒng)、標(biāo)準(zhǔn)系統(tǒng),目前對(duì)應(yīng) LiteOS-M、LiteOS-A、Linux 內(nèi)核。但好像并沒(méi)有說(shuō)一定是按照使用內(nèi)核來(lái)劃分。我們這里姑且先這么區(qū)分。
本文使用的是比較新的 OpenHarmony 3.0 LTS 版本,Linux 內(nèi)核,編譯標(biāo)準(zhǔn)系統(tǒng)。
官方文檔已經(jīng)說(shuō)明了,如何使用 DevEco Studio 開(kāi)發(fā) hap 包,并運(yùn)行在開(kāi)發(fā)板,但是 ACE 框架能力有限。
設(shè)備硬件開(kāi)發(fā)還是需要 C,所以這篇文章,將在標(biāo)準(zhǔn)系統(tǒng)下編譯 C 控制 Hi3516 開(kāi)發(fā)板的 LED 閃爍。
環(huán)境準(zhǔn)備
3.0 源碼下載:
repo init -u https://gitee.com/openharmony/manifest.git -b OpenHarmony-3.0-LTS --no-repo-verify
repo sync -c
repo forall -c ‘git lfs pull’
區(qū)別于 2.0 需要安裝 ruby,其他基本都一樣。
sudo apt-get install ruby-full
編譯命令:
build/prebuilts_download.sh
。/build.sh --product-name Hi3516DV300
編寫(xiě) helloworld.c
在 applicationsstandard 目錄下新建一個(gè) app 目錄來(lái)存放 .c 的業(yè)務(wù)代碼。
比如 applicationsstandardapphelloworld.c 內(nèi)容容下:
#include 《stdio.h》int main(){
printf(“Hello world.
”);
return 0;
}
然后在當(dāng)前目錄新建編譯腳本 BUILD.gn 內(nèi)容如下:
import(“//build/ohos.gni”)
import(“//drivers/adapter/uhdf2/uhdf.gni”)
ohos_executable(“helloworld”) {
sources = [
“helloworld.c”
]
subsystem_name = “applications”
part_name = “prebuilt_hap”
}
然后添加到編譯框架 applicationsstandardhapohos.build 增加如下內(nèi)容。
“//applications/standard/app:helloworld”
最后執(zhí)行編譯命令即可,開(kāi)發(fā)板使用的是 Hi3516,在不指定 out 目錄時(shí),缺省生成在 /system/lib64 或 /system/lib 下。
點(diǎn)亮開(kāi)發(fā)板 LED
能打印 helloworld 說(shuō)明環(huán)境是沒(méi)問(wèn)題的,接下來(lái)嘗試點(diǎn)亮開(kāi)發(fā)板的 LED。查看 Hi3516DV300 原理圖:
Hi3516DV300 共有 4 層板,由原理圖可知:最上層板的紅外補(bǔ)光燈接在 GPIO5_1,綠色 LED 指示燈在 GPIO2_3,核心板的紅色 LED 在 GPIO3_4。
接下來(lái)參考 OpenHarmony GPIO 驅(qū)動(dòng)說(shuō)明:
https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/driver/driver-platform-gpio-des.md
確定GPIO管腳號(hào):不同SOC芯片由于其GPIO控制器型號(hào)、參數(shù)、以及控制器驅(qū)動(dòng)的不同,GPIO管腳號(hào)的換算方式不一樣。
①Hi3516DV300:控制器管理 12 組 GPIO 管腳,每組 8 個(gè)。
GPIO 號(hào) = GPIO 組索引 (0~11) * 每組 GPIO 管腳數(shù)(8) + 組內(nèi)偏移
舉例:GPIO10_3 的 GPIO 號(hào) = 10 * 8 + 3 = 83。
②Hi3518EV300:控制器管理 10 組 GPIO 管腳,每組 10 個(gè)。
GPIO 號(hào) = GPIO 組索引 (0~9) * 每組 GPIO 管腳數(shù)(10) + 組內(nèi)偏移
舉例:GPIO7_3 的 GPIO 管腳號(hào) = 7 * 10 + 3 = 73
由此可以得出:
GPIO5_1 = 5 * 8 + 1;
GPIO2_3 = 2 * 8 + 3;
GPIO3_4 = 3 * 8 + 4;
然后新建 applicationsstandardappledtest.c,內(nèi)容如下:
#include 《stdlib.h》 // standard library 標(biāo)準(zhǔn)庫(kù)函數(shù)頭文件#include 《stdio.h》 // standard input output 標(biāo)準(zhǔn)輸入輸出函數(shù)#include 《stdint.h》 // 定義了擴(kuò)展的整數(shù)類型和宏#include 《unistd.h》 // POSIX 系統(tǒng) API 訪問(wèn)功能的頭文件#include 《fcntl.h》 // unix標(biāo)準(zhǔn)中通用的頭文件 define O_WRONLY and O_RDONLY // #include 《string.h》#define GPIO_DIR_IN “in”#define GPIO_DIR_OUT “out”#define GPIO_VAL_LOW 0#define GPIO_VAL_HIGHT 1int32_t GpioSetDir(uint16_t gpio, char* dir){
char path[100] = {0};
sprintf(path,“echo %d 》 /sys/class/gpio/export”,gpio);
system(path);
printf(“info:%s
”,path);
char direction[100] = {0};
sprintf(direction,“echo %s 》 /sys/class/gpio/gpio%d/direction”,dir,gpio);
system(direction);
printf(“info:%s
”,direction);
return 0;
}
int32_t GpioWrite(uint16_t gpio, uint16_t val)
{
char path[100] = {0};
sprintf(path,“echo %d 》 /sys/class/gpio/gpio%d/value”,val,gpio);
system(path);
printf(“info:%s
”,path);
return 0;
}
int main(){
uint16_t GPIO5_1 = 5 * 8 + 1;
uint16_t GPIO2_3 = 2 * 8 + 3;
uint16_t GPIO3_4 = 3 * 8 + 4;
printf(“LED test start
”);
int32_t ret;
// uint16_t val;
ret = GpioSetDir(GPIO5_1,GPIO_DIR_OUT);
if (ret != 0) {
printf(“GpioSerDir: failed, ret %d
”, ret);
return 0;
}
ret = GpioSetDir(GPIO2_3,GPIO_DIR_OUT);
if (ret != 0) {
printf(“GpioSerDir: failed, ret %d
”, ret);
return 0;
}
ret = GpioSetDir(GPIO3_4,GPIO_DIR_OUT);
if (ret != 0) {
printf(“GpioSerDir: failed, ret %d
”, ret);
return 0;
}
while(1)
{
GpioWrite(GPIO5_1, GPIO_VAL_HIGHT);
usleep(1000000);
GpioWrite(GPIO5_1, GPIO_VAL_LOW);
usleep(1000000);
GpioWrite(GPIO2_3, GPIO_VAL_HIGHT);
usleep(1000000);
GpioWrite(GPIO2_3, GPIO_VAL_LOW);
usleep(1000000);
GpioWrite(GPIO3_4, GPIO_VAL_HIGHT);
usleep(1000000);
GpioWrite(GPIO3_4, GPIO_VAL_LOW);
usleep(1000000);
}
return 0;
}
將業(yè)務(wù)代碼添加到 BUILD.gn:
import(“//build/ohos.gni”)
import(“//drivers/adapter/uhdf2/uhdf.gni”)
ohos_executable(“helloworld”) {
sources = [
“helloworld.c”
]
subsystem_name = “applications”
part_name = “prebuilt_hap”
}
ohos_executable(“l(fā)edtest”) {
sources = [
“l(fā)edtest.c”
]
subsystem_name = “applications”
part_name = “prebuilt_hap”
}
applicationsstandardhapohos.build:
“//applications/standard/app:ledtest”
之后將程序燒錄到開(kāi)發(fā)板,執(zhí)行 。/system/bin/ledtest:
就可以看到 LED 閃爍起來(lái)了。
本來(lái)是打算使用鴻蒙的 GPIO 接口來(lái)實(shí)現(xiàn)這個(gè)功能的,不過(guò)調(diào)試了很久也沒(méi)調(diào)通,最后無(wú)奈還是用的 system 自己實(shí)現(xiàn)的 GPIO 函數(shù)。
有沒(méi)使用 OpenHarmony 的 GPIO 成功的小伙伴可以留言一起交流啊。
責(zé)任編輯:haq
-
led
+關(guān)注
關(guān)注
242文章
23252瀏覽量
660575 -
開(kāi)發(fā)板
+關(guān)注
關(guān)注
25文章
5032瀏覽量
97375 -
鴻蒙系統(tǒng)
+關(guān)注
關(guān)注
183文章
2634瀏覽量
66306 -
OpenHarmony
+關(guān)注
關(guān)注
25文章
3713瀏覽量
16255
原文標(biāo)題:OpenHarmony 3.0上點(diǎn)亮開(kāi)發(fā)板LED
文章出處:【微信號(hào):gh_834c4b3d87fe,微信公眾號(hào):OpenHarmony技術(shù)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論