Android NDK를 사용해서 kernel드라이버 사용하기

kernel의 드라이버를 쓰기 위해서는 driver 장치 파일의 write 권한이 있어야 한다.
기본적으로 장치 파일의 write 권한은 플랫폼 소스에서 부팅시 *.rc파일을 수정해서 변경 가능하다.

여기서는 앱에서 write 권한을 취득하는 것부터 시작한다.

앱이 파일의 접근 권한을 변경하기 위해서는 su권한이 있어야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Process process = null;
DataOutputStream dataOutputStream = null;

try {
process = Runtime.getRuntime().exec("su");
dataOutputStream = new DataOutputStream(process.getOutputStream());
dataOutputStream.writeBytes("chmod 777 /sys/class/tidlp_i2c/i2c_w\n");
dataOutputStream.writeBytes("chmod 777 /sys/class/tidlp_i2c/i2c_r\n");
dataOutputStream.writeBytes("chmod 777 /sys/devices/platform/virmouse/vmevent\n");
dataOutputStream.writeBytes("exit\n");
dataOutputStream.flush();
process.waitFor();
} catch (Exception e) {

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

장치 파일의 write권한을 획득했으면 ndk를 사용해 c/c++ 파일에서 드라이버 관련 함수를 구현한다.

첫번째로 드라이버 장치파일을 open한다.

그 후 write를 통해 드라이버 장치파일에 값을 써주어서 드라이버를 동작한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* Brightness */
extern "C" JNIEXPORT void JNICALL
Java_ckbs_ywjung_btremocon_MainActivity_dlpBr(
JNIEnv *env,
jobject /* this */, jint k) {
static int br = 0;
int fd;
char buf[60];
char send_buff[100];

snprintf(buf, sizeof(buf), "/sys/class/tidlp_i2c/i2c_w");

fd = open(buf, O_RDWR);
if (fd > 0) {
br = k;
sprintf(send_buff, "0x80 0x1 0x%x", br);
write(fd, send_buff, strlen(send_buff));
close(fd);
}
}
공유하기