Android에서 GPIO제어(ROCK64 보드)

GPIO index

ROCK64의 핀은 아래와 같이 구성되어있습니다.
Pi-2 Bus

Pi-P5+ Bus

GPIO의 이름은 bank, pad, number로 이루어져 있습니다.

GPIO(bank)_(pad)(number)

예를 들어 Pi-2 Bus의 16번 핀의 이름은 GPIO3_A5입니다.

이 핀의 bank는 ‘3’ / pad는 ‘A’ / number는 ‘5’입니다.

여기서 index를 구하는 공식은 아래와 같습니다.

1
2
3
4
5
6
7
8
9
index = bank * 32 + pad * 8 + number

GPIO3_A5
^ ^^
| |\_number
| \__pad: A=0, B=1, C=2, D=3
\____bank

3*32+0*8+5 = 96+0+5 = 101 이기때문에 이 gpio의 index는 gpio-101입니다.

Rock64의 핀의 index 정보는 아래와 같습니다.
Rock64의 핀의 index 정보

Rock64의 핀의 index 정보

adb로 GPIO 컨트롤

ROCK64에서 GPIO 컨트롤은 파일을 write해서 제어할 수 있습니다.
기본적으로 adb에서 컨르롤 하기 위해서는 root권한이 필요합니다.
adb root
위 명령어로 root의 권한을 획득합니다.
그 후 shell로 접근하면 root의 권한을 획득한 것을 볼 수 있습니다.

adb shell

serial로 접근시 root 권한은 su로 획득할 수 있습니다.

  • 처음엔 gpio export가 필요합니다. 여기서 GPIO3_A5(index 101)를 export시킬려면 다음과 같습니다.
1
roc_rk3328_cc_box:/ # echo 101 > /sys/class/gpio/export

export를 하면 /sys/class/gpio/gpio101폴더가 생성됩니다.

  • 그 후 in/out을 설정합니다.
1
roc_rk3328_cc_box:/ # echo out > /sys/class/gpio/gpio101/direction
  • 그 후 value의 값을 조정하여 gpio를 제어한다.
1
2
roc_rk3328_cc_box:/ # echo 1 > /sys/class/gpio/gpio101/value
roc_rk3328_cc_box:/ # echo 0 > /sys/class/gpio/gpio101/value

adroid App을 통한 제어

  • app에서 shell 명령어 실행을 실행하려면 아래와 같이 동작한다.
1
Runtime.getRuntime().exec("명령문");
  • 파일 쓰기 권한을 얻기 위해선 아래와 같이 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Process process = null;
DataOutputStream dataOutputStream = null;

try {
process = Runtime.getRuntime().exec("su");
dataOutputStream = new DataOutputStream(process.getOutputStream());
dataOutputStream.writeBytes("chmod 777 /sys/class/gpio/export\n");
dataOutputStream.writeBytes("exit\n");
dataOutputStream.flush();
process.waitFor();
} catch (Exception e) {

} finally {
try {
if (dataOutputStream != null) {
dataOutputStream.close();
}
process.destroy();
} catch (Exception e) {
}
}

앞서 말한것과 같이 gpio를 제어하기 위해서는 value값을 수정해야 한다.
App에서 수정은 NDK를 이용해 수정을 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
JNIEXPORT void JNICALL Java_ckbs_ywjung_gpiotest_MainActivity_gpiorelay
(JNIEnv *env, jobject thiz,jint out)
{
int fd, len;
char buf[60];

len = snprintf(buf, sizeof(buf), "/sys/class/gpio/gpio101/value");

fd = open(buf, O_WRONLY);
if (fd < 0) {
return ;
}

if (out){ write(fd, "1", 1); }
else { write(fd, "0", 1); }

close(fd);

LOGD("GPIO_1 %d ",out);
}
공유하기