C空间增加可执行程序访问硬件驱动

上一章我们学习了如何在内核中写驱动程序,我们创建了三种不同的文件节点供用户来访问,分别是传统设备/dev/hello、proc文件系统/proc/hello和devfs系统属性访问/sys/class/hello/hello/val。但是我们没有去真正的验证程序的有效性,这一章我们一起来学习一下,如何在用户C空间写一个C的程序来访问hello驱动。

用户C空间的进程都被放在/system/bin中,例如我们常用的logcat、logd、rild等进程都能在其中找到。
Tianger:~ getianger$ adb shell
root@android:/ # cd system/bin
root@android:/system/bin # ls

接下来开始来实现这个C的进程,我们把这个进程取名为hello。

1.进入到external目录,创建hello目录

Tianger:Android root# cd external/
Tianger:external root# mkdir hello

2.进入到hello目录,新建hello.c:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>

#define DEVICE_NAME "/dev/hello"
int main(int argc, char** argv)
{

int fd = -1;
int val = 0;
/*通过传统的设备访问来操作,打开/dev/hello,得到文件句柄fd*/
fd = open(DEVICE_NAME, O_RDWR);
if(fd == -1) {
printf("Failed to open device %s.\n", DEVICE_NAME);
return -1;
}

printf("Read original value:\n");
/*调用read方法,触发到hello驱动中的hello_read,读取寄存器val的值*/
read(fd, &val, sizeof(val));
printf("%d.\n\n", val);
/*寄存器重新赋值为5*/
val = 5;
printf("Write value %d to %s.\n\n", val, DEVICE_NAME);
/*调用write方法,出发到hello驱动中的hello_write,写入寄存器val的值*/
write(fd, &val, sizeof(val));

printf("Read the value again:\n");
/*验证写入的寄存器值是否写成功*/
read(fd, &val, sizeof(val));
printf("%d.\n\n", val);
/*关闭文件句柄,释放驱动调用*/
close(fd);
return 0;
}

该hello.c程序,主要作用:通过传统设备访问方法,打开/dev/hello,读取寄存器val的值,然后重新赋值寄存器值为5,并把新的寄存器值写入到hello驱动中,再去验证是否写入成功。

3.编译环境:

在hello目录中创建Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := hello
LOCAL_SRC_FILES := $(call all-subdir-c-files)
include $(BUILD_EXECUTABLE)

注:LOCAL_MODULE表示我们要编译的模块名称,BUILD_EXECUTABLE表示我们编译的是可执行程序.

4.编译:

mmm ./external/hello
编译成功后,可以在out/target/product/gerneric/system/bin目录下看到hello了.

5.启动模拟器

adb shell
cd /system/bin
./hello

输出结果:

Read the original value:
0.
Write value 5 to /dev/hello.
Read the value again:
5.

到这里我们一个最普通的C的进程访问驱动程序就完成了。

注:kernel这边的程序,主要是参考老罗的Android之旅来完成。

Tianger Ge wechat
如果您喜欢这篇文章,欢迎扫一扫我的微信公众号!