GPIO(General-Purpose Input/Output) 是通用输入/输出端口的简称,是一种允许微控制器或芯片组与外部逻辑电路或其他设备(如传感器、执行器、LED灯等)进行通信的接口。GPIO 引脚可以配置为输入或输出模式,以便微控制器可以读取外部设备的状态或向外部设备发送控制信号。
GPIO 通常具有以下特点:
- 通用性:GPIO 引脚是通用的,可以根据需要配置为输入或输出模式。
- 可编程性:GPIO 引脚的状态(输入/输出、高电平/低电平)可以通过编程进行控制。
- 简单性:GPIO 接口相对简单,容易理解和使用。
- 灵活性:GPIO 引脚可以用于各种应用,如控制LED灯、读取按钮状态、与传感器通信等。
在嵌入式系统、微控制器和许多其他类型的电子设备中,GPIO 引脚是非常常见的接口。通过编程控制 GPIO 引脚,可以实现与外部设备的交互,从而扩展微控制器的功能。
点灯是每个嵌入式系统入门的必修课,本文主要介绍在DAYU800开发板上实现在openharmony3.2系统上进行点灯的代码案例。
一、DAYU800开发板硬件接口介绍
如图所示DAYU800开发板有一组20pin 的GPIO
板载 2x10pin 插针,其中有 16 个原生 IO,包括 4个普通 IO,4 对串口,一个 SPI。另外有2个GND,一个5V,一个3.3V。
查阅资料,TH1520 SOC 具有4个GPIO bank,每个bank最大有32个IO,分别如以下:
Bank | Address | kernel io num |
GPIO0 | 0xffec005000 | 456-487 |
GPIO1 | 0xffec006000 | 424-455 |
GPIO2 | 0xffe7f34000 | 392-423 |
GPIO3 | 0xffe7f38000 | 360-391 |
AO_GPIO | 0xfffff41000 | 328-359 |
AO_GPIO4 | 0xfffff52000 | 296-327 |
AUDIO_GPIO | 0xffcb013000 | - |
以俯视底板正面为视角,TOP为左侧,BOTTOM为右侧,GPIO对应关系如下:
从以上可以看出板载20pin插针中,4个普通GPIO对应的数字分别如下表
IO | kernel io num |
IO1_3 | 427 |
IO1_4 | 428 |
IO1_5 | 429 |
IO1_6 | 430 |
了解了DAYU800开发板的GPIO接口后我们就可以进一步操作了。
二、搭建点灯环境
为了测试点灯,我们需要给GPIO接个灯。手头上有一片HiSpark_WiFi_IoT_SSL_VER.A红绿灯板,如下图
LED控制原理图如下
将红绿灯板和DAYU800开发版按以下方式接线
红绿灯板 | DAYU800 |
GND | GND |
3.3V | 3.3V |
Yellow | IO1_4 |
Red | IO1_5 |
Green | IO1_6 |
没有HiSpark_WiFi_IoT_SSL_VER.A可按照自己的需求简单接个灯也可实验,或者直接用万用表测试输出。
三、 使用指令测试GPIO
通过前面的分析,我们可以得到黄灯、红灯、绿灯对应的kernel io num如下:
红绿灯板 | DAYU800 | kernel io num |
Yellow | IO1_4 | 428 |
Red | IO1_5 | 429 |
Green | IO1_6 | 420 |
可以使用以下指令对GPIO进行相应的操作
黄灯
echo 428 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio428/direction
echo 1 > /sys/class/gpio/gpio428/value
echo 0 > /sys/class/gpio/gpio428/value
红灯
echo 429 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio429/direction
echo 1 > /sys/class/gpio/gpio429/value
echo 0 > /sys/class/gpio/gpio429/value
绿灯
echo 430 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio430/direction
echo 1 > /sys/class/gpio/gpio430/value
echo 0 > /sys/class/gpio/gpio430/value
通过测试我们可以发现IO能正确的控制到相应的灯,那接下去我们来看下如何编写代码。
四、编写代码
4.1代码目录结构
在vendor/hihope/dayu800下面新建sample目录用于存放相关代码。代码目录结构如下
4.2修改dayu800目录下的ohos.build
开始修改代码首先编辑vendor/hihope/dayu800/ohos.build在module_list中添加"//vendor/hihope/dayu800/sample:dayu800_sample"修改后文件内容如下:
{
"parts": {
"product_dayu800": {
"module_list": [
"//vendor/hihope/dayu800/default_app_config:default_app_config",
"//vendor/hihope/dayu800/image_conf:custom_image_conf",
"//vendor/hihope/dayu800/preinstall-config:preinstall-config",
"//vendor/hihope/dayu800/resourceschedule:resourceschedule",
"//vendor/hihope/dayu800/etc:product_etc_conf",
"//vendor/hihope/dayu800/audio:audio_policy_config",
"//vendor/hihope/dayu800/sample:dayu800_sample"
]
}
},
"subsystem": "product_hihope"
}
模块目录//vendor/hihope/dayu800/sample
模块名称dayu800_sample
这样就能编译到sample目录了
4.3新增sample目录下的BUILD.gn
添加vendor/hihope/dayu800/sample/BUILD.gn文件,并输入以下内容。
import("//build/ohos.gni")
group("dayu800_sample") {
deps = [
"hardware:hardware"
]
}
创建了一个名为"dayu800_sample"的group。group的作用是将多个target(可以是源文件、库文件或可执行文件等)组织在一起,方便进行编译和管理。在这个group中,依赖了一个名为"hardware:hardware"的target。这个依赖关系意味着在编译"dayu800_sample"时,需要先编译并链接"hardware:hardware"这个target。通过使用group,可以更方便地管理项目的编译和构建过程。
4.4新增sample/hardware目录下的BUILD.gn
新建hardware目录,并添加vendor/hihope/dayu800/sample/hardware/BUILD.gn文件,输入以下内容。
import("//build/ohos.gni")
group("hardware") {
deps = [
"gpio:gpio_dayu800"
]
}
创建了一个名为"hardware"的组(group)。该组依赖于名为"gpio:gpio_dayu800"的依赖项。这个函数的作用是将"hardware"组与"gpio:gpio_dayu800"依赖项相关联。
4.5新增sample/hardware/gpio目录下的BUILD.gn
新建gpio目录,并添加vendor/hihope/dayu800/sample/hardware/gpio/BUILD.gn文件,输入以下内容。
import("//build/ohos.gni")
import("//build/ohos/ndk/ndk.gni")
ohos_executable("gpio_dayu800") {
sources = [
"main.c",
"gpio_dayu800.c"
]
include_dirs = [ "//commonlibrary/c_utils/base/include" ]
external_deps = [
"c_utils:utils",
"hilog_native:libhilog",
]
install_images = [ "system" ]
part_name = "product_dayu800"
}
以上定义了一个名为gpio_dayu800的可执行文件目标。该目标包含了两个源文件main.c和gpio_dayu800.c,并指定了包含目录//commonlibrary/c_utils/base/include。该目标依赖于外部库c_utils:utils和hilog_native:libhilog。最后,它指定了将生成的可执行文件安装到system镜像,并将该目标归属于product_dayu800部分。
4.6新增sample/hardware/gpio目录下的gpio_dayu800.c和gpio_dayu800.h
创建vendor/hihope/dayu800/sample/hardware/gpio/gpio_dayu800.c文件,内容如下
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include "hilog/log.h"
#include "securec.h"
#include "gpio_dayu800.h"
int DAYU800_GPIO_Export(int gpioNum, int bExport)
{
int ret = -1;
char buffer[256] = {0};
if (bExport) {
(void) snprintf_s(buffer, sizeof(buffer), sizeof(buffer), "echo %d > %s", gpioNum, DAYU800_GPIO_EXPORT);
} else {
(void) snprintf_s(buffer, sizeof(buffer), sizeof(buffer), "echo %d > %s", gpioNum, DAYU800_GPIO_UNEXPORT);
}
sighandler_t old_handler;
old_handler = signal(SIGCHLD, SIG_DFL);
ret = system(buffer);
if (ret < 0) {
HILOG_ERROR(LOG_CORE, "set gpio%{public}d %{public}s failed", gpioNum, bExport == 1 ? "export" : "unexport");
return DAYU800_GPIO_ERR;
}
(void) signal(SIGCHLD, old_handler);
return ret;
}
int DAYU800_GPIO_SetDirection(int gpioNum, int direction)
{
int ret_sprintf_s = -1;
// check gpio export or not
char gpio_file_name[128];
(void) memset_s(gpio_file_name, sizeof(gpio_file_name), 0, sizeof(gpio_file_name));
ret_sprintf_s = snprintf_s(gpio_file_name, sizeof(gpio_file_name), sizeof(gpio_file_name), "%s%d/direction",
DAYU800_GPIO_PEX, gpioNum);
if (ret_sprintf_s != 0) {
}
if (access(gpio_file_name, F_OK) != 0) {
HILOG_ERROR(LOG_CORE, "gpio%{public}d not export", gpioNum);
return DAYU800_GPIO_NOT_EXPROT_ERROR;
}
// set gpio direction
FILE *fp = NULL;
fp = fopen(gpio_file_name, "r+");
if (fp == NULL) {
HILOG_ERROR(LOG_CORE, "open %{public}s%{public}d/direction failed", DAYU800_GPIO_PEX, gpioNum);
return DAYU800_GPIO_ERR;
}
if (direction == DAYU800_GPIO_DIRECTION_IN) {
fprintf(fp, "%s", "in");
} else if (direction == DAYU800_GPIO_DIRECTION_OUT) {
fprintf(fp, "%s", "out");
}
(void) fclose(fp);
fp = NULL;
return 0;
}
int DAYU800_GPIO_SetValue(int gpioNum, int value)
{
int ret_sprintf_s = -1;
// check gpio export or not
char gpio_file_name[128];
(void) memset_s(gpio_file_name, sizeof(gpio_file_name), 0, sizeof(gpio_file_name));
ret_sprintf_s = snprintf_s(gpio_file_name, sizeof(gpio_file_name), sizeof(gpio_file_name), "%s%d/value",
DAYU800_GPIO_PEX, gpioNum);
if (ret_sprintf_s != 0) {
}
if (access(gpio_file_name, F_OK) != 0) {
HILOG_ERROR(LOG_CORE, "gpio%{public}d not export", gpioNum);
return DAYU800_GPIO_NOT_EXPROT_ERROR;
}
// set gpio value
FILE *fp = NULL;
fp = fopen(gpio_file_name, "r+");
if (fp == NULL) {
HILOG_ERROR(LOG_CORE, "open %{public}s%{public}d/value failed", DAYU800_GPIO_PEX, gpioNum);
return DAYU800_GPIO_ERR;
}
if (value == DAYU800_GPIO_LOW_LEVE) {
fprintf(fp, "%s", "0");
} else if (value == DAYU800_GPIO_HIGH_LEVE) {
fprintf(fp, "%s", "1");
}
(void) fclose(fp);
fp = NULL;
return 0;
}
int DAYU800_GPIO_IsExport(int gpioNum, int *value)
{
int ret_sprintf_s = -1;
if (value == NULL) {
return DAYU800_GPIO_ERR;
}
// check gpio export or not
char gpio_file_name[128];
(void) memset_s(gpio_file_name, sizeof(gpio_file_name), 0, sizeof(gpio_file_name));
ret_sprintf_s = snprintf_s(gpio_file_name, sizeof(gpio_file_name), sizeof(gpio_file_name), "%s%d/value",
DAYU800_GPIO_PEX, gpioNum);
if (ret_sprintf_s != 0) {
}
if (access(gpio_file_name, F_OK) != 0) {
HILOG_INFO(LOG_CORE, "gpio%{public}d not export", gpioNum);
*value = DAYU800_GPIO_NOT_EXPORT;
} else {
*value = DAYU800_GPIO_EXPORTED;
}
return 0;
}
int DAYU800_GPIO_GetDirection(int gpioNum, int *value)
{
int ret = 0;
int ret_sprintf_s = -1;
if (value == NULL) {
return DAYU800_GPIO_ERR;
}
// check gpio export or not
char gpio_file_name[128];
(void) memset_s(gpio_file_name, sizeof(gpio_file_name), 0, sizeof(gpio_file_name));
ret_sprintf_s = snprintf_s(gpio_file_name, sizeof(gpio_file_name), sizeof(gpio_file_name), "%s%d/direction",
DAYU800_GPIO_PEX, gpioNum);
if (ret_sprintf_s != 0) {
}
if (access(gpio_file_name, F_OK) != 0) {
HILOG_ERROR(LOG_CORE, "gpio%{public}d not export", gpioNum);
return DAYU800_GPIO_NOT_EXPROT_ERROR;
}
// get gpio direction
FILE *fp = NULL;
char buffer[20] = {0};
fp = fopen(gpio_file_name, "r");
if (fp == NULL) {
HILOG_ERROR(LOG_CORE, "read %{public}s%{public}d/direction failed", DAYU800_GPIO_PEX, gpioNum);
return DAYU800_GPIO_ERR;
}
(void) fread(buffer, sizeof(buffer), 1, fp);
(void) fclose(fp);
fp = NULL;
if (strstr(buffer, "out") != NULL) {
*value = DAYU800_GPIO_DIRECTION_OUT;
} else if (strstr(buffer, "in") != NULL) {
*value = DAYU800_GPIO_DIRECTION_IN;
} else {
ret = DAYU800_GPIO_ERR;
}
return ret;
}
int DAYU800_GPIO_GetValue(int gpioNum, int *value)
{
int ret = 0;
int ret_sprintf_s = -1;
if (value == NULL) {
return DAYU800_GPIO_ERR;
}
// check gpio export or not
char gpio_file_name[128];
(void) memset_s(gpio_file_name, sizeof(gpio_file_name), 0, sizeof(gpio_file_name));
ret_sprintf_s = snprintf_s(gpio_file_name, sizeof(gpio_file_name), sizeof(gpio_file_name), "%s%d/value",
DAYU800_GPIO_PEX, gpioNum);
if (ret_sprintf_s != 0) {
}
if (access(gpio_file_name, F_OK) != 0) {
HILOG_ERROR(LOG_CORE, "gpio%{public}d not export", gpioNum);
return DAYU800_GPIO_NOT_EXPROT_ERROR;
}
// get gpio value
FILE *fp = NULL;
char buffer[20] = {0};
fp = fopen(gpio_file_name, "r");
if (fp == NULL) {
HILOG_ERROR(LOG_CORE, "read %{public}s%{public}d/value failed", DAYU800_GPIO_PEX, gpioNum);
return DAYU800_GPIO_ERR;
}
(void) fread(buffer, sizeof(buffer), 1, fp);
(void) fclose(fp);
fp = NULL;
if (strstr(buffer, "0") != NULL) {
*value = DAYU800_GPIO_LOW_LEVE;
} else if (strstr(buffer, "1") != NULL) {
*value = DAYU800_GPIO_HIGH_LEVE;
} else {
ret = DAYU800_GPIO_ERR;
}
return ret;
}
创建vendor/hihope/dayu800/sample/hardware/gpio/gpio_dayu800.h文件,内容如下
#ifndef __DAYU800_GPIO_H__
#define __DAYU800_GPIO_H__
#define DAYU800_GPIO_EXPORT "/sys/class/gpio/export"
#define DAYU800_GPIO_UNEXPORT "/sys/class/gpio/unexport"
#define DAYU800_GPIO_PEX "/sys/class/gpio/gpio"
// hilog
#undef LOG_DOMAIN
#undef LOG_TAG
#define LOG_DOMAIN 0
#define LOG_TAG "GPIO_DAYU800"
// gpios
#define DAYU800_GPI0_1_3 427 /* IO1_3 */
#define DAYU800_GPI0_1_4 428 /* IO1_4 */
#define DAYU800_GPI0_1_5 429 /* IO1_5 */
#define DAYU800_GPI0_1_6 430 /* IO1_6 */
// direction
#define DAYU800_GPIO_DIRECTION_IN 0
#define DAYU800_GPIO_DIRECTION_OUT 1
// is export
#define DAYU800_GPIO_NOT_EXPORT 0
#define DAYU800_GPIO_EXPORTED 1
// errno
#define DAYU800_GPIO_ERR (-1)
#define DAYU800_GPIO_NOT_EXPROT_ERROR (-2)
// value high - low level
#define DAYU800_GPIO_LOW_LEVE 0
#define DAYU800_GPIO_HIGH_LEVE 1
/**
* set gpio export
* @param gpioNum gpioNum
* @param bExport export,0:not export 1:export
*/
int DAYU800_GPIO_Export(int gpioNum, int bExport);
/**
* set gpio direction
* @param gpioNum gpioNum
* @param direction direction,0:in 1:out
*/
int DAYU800_GPIO_SetDirection(int gpioNum, int direction);
/**
* set gpio value
* @param gpioNum gpioNum
* @param value value,0:low 1:high
*/
int DAYU800_GPIO_SetValue(int gpioNum, int value);
/**
* check gpio export or not
* @param gpioNum gpioNum
* @param *value export,0:not export 1:exported
*/
int DAYU800_GPIO_IsExport(int gpioNum, int *value);
/**
* get gpio direction
* @param gpioNum gpioNum
* @param *value direction,0:in 1:out
*/
int DAYU800_GPIO_GetDirection(int gpioNum, int *value);
/**
* get gpio value
* @param gpioNum gpioNum
* @param *value value,0:low 1:high
*/
int DAYU800_GPIO_GetValue(int gpioNum, int *value);
#endif /* __DAYU800_GPIO_H__ */
以上函数提供了对Dayu800开发板GPIO的控制,包括导出、设置方向、设置值、检查导出状态、获取方向和获取值等操作。用于管理Dayu800GPIO的C函数库。以下是每个函数的功能解释:
1、DAYU800_GPIO_Export 函数用于导出或取消导出GPIO。根据输入的bExport参数,函数将构建一个命令行字符串来执行导出或取消导出操作。如果操作成功,函数返回0,否则返回错误代码。
2、DAYU800_GPIO_SetDirection 函数用于设置GPIO的方向。首先,函数检查GPIO是否已导出。然后,它打开GPIO的方向文件,并根据输入的direction参数设置为输入或输出。
3、DAYU800_GPIO_SetValue 函数用于设置GPIO的值。首先,函数检查GPIO是否已导出。然后,它打开GPIO的值文件,并根据输入的value参数设置为低电平或高电平。
4、DAYU800_GPIO_IsExport 函数用于检查GPIO是否已导出。它构建GPIO的值文件路径并检查该文件是否存在。根据检查结果,函数通过value参数返回导出状态。
5、DAYU800_GPIO_GetDirection 函数用于获取GPIO的方向。首先,函数检查GPIO是否已导出。然后,它打开GPIO的方向文件并读取方向值。根据读取的结果,函数通过value参数返回方向值。
6、DAYU800_GPIO_GetValue 函数用于获取GPIO的值。首先,函数检查GPIO是否已导出。然后,它打开GPIO的值文件并读取值。根据读取的结果,函数通过value参数返回值。
4.7新增sample/hardware/gpio目录下的main.c
创建vendor/hihope/dayu800/sample/hardware/gpio/main.c文件,输入以下内容
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include "gpio_dayu800.h"
int main(int argc, char **argv)
{
int gpioNum = DAYU800_GPI0_1_3;
int bExport = DAYU800_GPIO_EXPORTED;
int direction = DAYU800_GPIO_DIRECTION_OUT;
int value = DAYU800_GPIO_HIGH_LEVE;
int getValue = -1;
// 检查参数数量以确保至少提供了预期的参数数量
if (argc < 2) {
printf("Usage 1: %s <gpioNum> \n", argv[0]);
printf("Usage 2: %s <gpioNum> <value>\n", argv[0]);
printf("Usage 3: %s <gpioNum> <value> <direction>\n", argv[0]);
return DAYU800_GPIO_ERR;
}
// 判断是否有输入参数,如有,则赋值指定gpio口
if (argv[1] != NULL) {
getValue = atoi(argv[1]);
if (getValue >= DAYU800_GPI0_1_3 && getValue <= DAYU800_GPI0_1_6) {
gpioNum = getValue;
} else {
printf("please input the gpioNum between 427 and 430.\n");
return DAYU800_GPIO_ERR;
}
}
// 判断gpio口是否已经导出,如未导出则执行对应函数
DAYU800_GPIO_IsExport(gpioNum, &getValue);
if (getValue == DAYU800_GPIO_NOT_EXPORT) {
DAYU800_GPIO_Export(gpioNum, bExport);
}
if (argc == 2) {
// 设置gpio口值取反
DAYU800_GPIO_GetValue(gpioNum, &getValue);
if(getValue == DAYU800_GPIO_LOW_LEVE){
value = DAYU800_GPIO_HIGH_LEVE;
}else{
value = DAYU800_GPIO_LOW_LEVE;
}
printf("gpioNum:[%d], curvalue:[%d] setvalue:[%d]\n", gpioNum, getValue,value);
}
if (argc >=3 && argc <= 4) {
if (argv[2] != NULL) {
//读取GPIO口设定值
getValue = atoi(argv[2]);
if (getValue >= DAYU800_GPIO_LOW_LEVE && getValue <= DAYU800_GPIO_HIGH_LEVE) {
value = getValue;
} else {
printf("please input the gpio value 0 (low)or 1 (high).\n");
return DAYU800_GPIO_ERR;
}
}
}
if (argc == 4) {
if (argv[3] != NULL) {
//读取GPIO口输入或输出设定
getValue = atoi(argv[3]);
if (getValue >= DAYU800_GPIO_DIRECTION_IN && getValue <= DAYU800_GPIO_DIRECTION_OUT) {
direction = getValue;
} else {
printf("please input the gpio direction 0 (in)or 1 (out).\n");
return DAYU800_GPIO_ERR;
}
}
}
// 设置gpio口为输入或输出模式
DAYU800_GPIO_SetDirection(gpioNum, direction);
// 设置gpio口电平高低
DAYU800_GPIO_SetValue(gpioNum, value);
// 获取对应gpio口的模式并打印
DAYU800_GPIO_GetDirection(gpioNum, &getValue);
printf("gpioNum:[%d], direction:[%d]\n", gpioNum, getValue);
// 获取对应gpio口的电平值并打印
DAYU800_GPIO_GetValue(gpioNum, &getValue);
printf("gpioNum:[%d], Value:[%d]\n", gpioNum, getValue);
return 0;
}
以上函数实现了是用指令对Dayu800开发板的GPIO引脚的操作,根据输入参数的数量和值,函数执行不同的操作,并在终端打印出相应的信息。支持的指令格式如下:
Usage 1: gpio_dayu800 <gpioNum>
Usage 2: gpio_dayu800 <gpioNum> <value>
Usage 3: gpio_dayu800 <gpioNum> <value> <direction>
五、编译代码
5.1全量编译
如果之前未编译过需要用全编译指令,指令如下
./build.sh --product-name dayu800 --gn-args full_mini_debug=false --ccache
编译完成后可以直接烧录out/dayu800/packages/phone/images下生成的档案。
5.2单模块编译
前提是之前已全量编译过才可以使用单模块编译指令,指令如下
./build.sh --product-name dayu800 --ccache --build-target product_dayu800
单模块编译后生成bin文件在out/dayu800/product_dayu800/product_dayu800/目录下的gpio_dayu800
六、验证测试
烧录完整镜像的方式不再重复介绍,可以参考上篇文章,此处介绍用单模块替换验证方式。
6.1 获取hdc工具
除了烧录完整镜像文件,我们还可以通过hdc工具替换,Windows下可以通过安装DevEco Studio工具后下载SDK来获取hdc工具。
下载完成后会安装在用户目录如C:\Users\soonl\AppData\Local\OpenHarmony\Sdk\9\toolchains下面。
当然也可以从每日构建中获取hdc工具,从每日构建 | OpenHarmony CI中下载ohos-sdk全量包,然后找到hdc和libusb_shared.so放到环境变量中即可
cp version-Daily_Version-ohos-sdk-20230523_020127-ohos-sdk.tar.gz ~/Download
tar -xvf version-Daily_Version-ohos-sdk-20230523_020127-ohos-sdk.tar.gz
cd ohos-sdk/linux
unzip toolchains-linux-x64-4.0.7.3-Beta1.zip
cd toolchains
cp hdc libusb_shared.so ~/bin
6.2将 gpio_dayu800推送到开发板
进入hdc工具所在目录,将编译生成的gpio_dayu800拷贝到hdc所在目录,开发板通过Type-C数据线连接到电脑,运行windows自带的“命令提示符”(cmd)窗口
使用以下指令重新挂载DAYU800开发板的文件系统(以读写权限挂载)
hdc shell mount -o remount,rw /
使用一下指令推送到DAYU800开发板/system/bin/目录
hdc file send gpio_dayu800 /system/bin/
操作截图如以下:
6.3 在DAYU800开发板上运行测试程序
使用hdc shell指令进入到开发板终端
hdc shell
接着运行测试指令如
gpio_dayu800 428
gpio_dayu800 429
gpio_dayu800 430
gpio_dayu800 428 0 1
gpio_dayu800 428 1 1
运行结果如图
点灯成功