Android 驱动之旅: 第二章 -- 在Android 系统中增加C 可执行程序来访问硬件驱动程序

在第一篇文章中,我们介绍了如何在Ubuntu 上为Android 系统编写Linux内核驱动程序。在这个名为hello 的Linux 内核驱动程序中,创建三个不同的文件节点来供用户空间访问,分别是传统的设备文件/dev/hello、proc 系统文件/proc/hello 和devfs 系统属性文件/sys/class/hello/hello/val。进一步,还通过cat 命令来直接访问/proc/hello 和/sys/class/hello/hello/val 文件来,以验证驱动程序的正确性。在这一篇文章里,我们将通过自己编写的C 可执行程序来访问设备文件/dev/hello。可能读者会觉得奇怪,怎么能在Android 系统中用C 语言来编写应用程序呢?Android 系统上的应用程序不都是Java 应用程序吗?其实是可以的,读者不妨用adb shell 命令连上Android 模拟器,在/system/bin 目录下可以看到很多C 可执行程序,如cat 命令。今天,我们就来学习一下怎么在Android 系统中添加用C 语言编写的可执行程序吧。

一. 进入到Android 源代码工程的external 目录,创建hello 目录:

linuxidc@www.linuxidc.com:~/Android$ cd external

linuxidc@www.linuxidc.com:~/Android/external$ mkdir hello_test

二. 在hello 目录中新建hello_test.c和Android.mk 文件:

hello_test.c

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>

#define DEVICE_NAME "/dev/hello"

int main(int argc, char** argv)
{
  int fd = -1;
  int val = 0;
  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(fd, &val, sizeof(val));
  printf("%d.\n\n", val);
  val = 5;
  
  printf("Write value %d to %s.\n\n", val, DEVICE_NAME);
  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;
}

Android.mk

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

 

这个程序的作用中,打开/dev/hello 文件,然后先读出/dev/hello 文件中的值,接着写入值5 到/dev/hello 中去,最后再

次读出/dev/hello 文件中的值,看看是否是我们刚才写入的值5。从/dev/hello 文件读写的值实际上就是我们虚拟的硬件的寄

存器val 的值。

三、编译

.参照如何单独编译Android 源代码中的模块一文,使用mm 命令进行编译:

  cd external/hello

  mm

编译成功后,就可以在out/target/product/gerneric/system/bin 目录下,看到可执行文件hello 了。

四、测试运行

root@Android:/system/bin # ./hello

Read the original value:

0.

Write value 5 to /dev/hello.

Read the value again:

5.

看到这个结果,就说我们编写的C 可执行程序可以访问我们编写的Linux 内核驱动程序了。

介绍完了如何使用C 语言编写的可执行程序来访问我们的Linux 内核驱动程序,读者可能会问,能不能在Android 的

Application Frameworks 提供Java 接口来访问Linux 内核驱动程序呢?可以的,接下来的几篇文章中,我们将介绍如何在Android

的Application Frameworks 中,增加Java 接口来访问Linux 内核驱动程序,敬请期待。

posted @ 2013-05-22 15:28  老z的博客  阅读(2788)  评论(0编辑  收藏  举报