1、前言

Android系统中,应用程序一般是使用Java语言进行开发的,但是通过C语言也可以进行Android中的可执行程序开发,接下来,将简单介绍在Android系统中如何通过C程序来访问内核中sysfs的属性文件,也可以理解为驱动设备节点。

2、添加kernel驱动设备节点

做过Linux内核驱动开发的都知道,内核里面提供了GPIO控制的LED设备驱动子系统,接下来,将通过添加内核配置和设备树节点来添加一个LED设备节点。

首先是内核里面leds-gpio设备驱动的配置选项:

make menuconfig
Device Driver --->
-*- LED Support --->
  <*> LED Support for GPIO connected LEDs

添加完成LED子系统的config配置后,在编译内核的时候,将会该LED驱动模块集成到内核里面。

接下来,添加LED设备的设备树节点,如下所示:

gpio-leds {
compatible = "gpio-leds";
status = "ok";
pinctrl-names = "default";
pinctrl- = <&gpio_led_off>; led-red {
  gpios = <&msm_gpio >;
  label = "led-red";
  linux,default-trigger = "none";
  default-state = "off";
};
};

在定义的设备节点里面,compatible属性的值,是用来和驱动程序进行匹配,gpios属性定义了使用到的GPIO号以及说明了是高电平有效,当引脚电平为高时,LED将会被点亮,关于如何定义LED子系统驱动的设备节点,可以参考下面的内核文档:

Documentation\devicetree\bindings\leds\leds-gpio.txt

将设备节点添加完成后,重新编译Linux内核boot.img,并使用fastboot烧写,便可以在sysfs系统中看到生成的LED设备节点信息了,如下所示:

在该LED设备节点中,brightness为设备的属性文件,表示为LED设备的亮度,当该属性文件的值为0时,LED为熄灭状态,当属性文件的值大于0时,LED为点亮状态,使用cat和echo命令能对该设备的属性文件进行读写,还能控制LED的状态:

# 查看当前LED状态
cat brightness # 点亮LED灯
echo > brightness # 熄灭LED灯
echo > brightness

能对LED的基本控制,就已经完成了内核驱动设备节点的添加了。

3、编写集成C程序

在上面已经完成了设备节点的添加了,那么,在Android系统中如何去集成C程序去访问该LED设备节点呢?

首先,进入到Android源码的external目录,创建一个新的ledctrl目录:

$ cd AOSP/external
$ mkdir ledctrl

然后在该目录下创建led-ctrl.c源文件和Android.mk编译脚本:

ledctrl.c源文件如下所示:

#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h> #define device_path "/sys/class/leds/led-red/brightness" int main(int argc, char *argv[])
{
int i,fd,ret; printf("argc = %d\n", argc);
for (i = ; i < argc; i++)
printf("argv[%d] = %s\n", i, argv[i]); fd = open(device_path, O_RDWR);
if (fd == -) {
printf("open device file failed\n");
return fd;
} if ( == strcmp(argv[i-], "on")) {
ret = write(fd, "", );
printf("led open successfully\n");
}
else if ( == strcmp(argv[i-], "off")) {
write(fd, "", );
printf("led close successfully\n");
}
else
printf("not define led state\n"); close(fd);
return ;
}

该文件主要就是完成对设备文件的读写,接下来是Android.mk文件的内容,如下:

# Android.mk for led-ctrl.c

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := led-ctrl
LOCAL_SRC_FILES := $(call all-subdir-c-files)
include $(BUILD_EXECUTABLE)

最后一行的BUILD_EXECUTABLE表示,该模块将编译为可执行程序。

编译完Android.mk文件后,使用mmm命令编译led-ctrl这个C程序模块:

$ cd AOSP
$ mmm ./external/ledctrl

成功编译后,将会在out/target/product/msm8909/system/bin目录生成所需要的可执行文件led-ctrl。

重新打包Android系统文件system.img,并使用fastboot命令重新烧写镜像文件:

$ make snod

# adb reboot bootloader
# fastboot flash system system.img
# fastboot reboot

4、可执行程序运行测试

先查看内核里面是否已经集成了led-ctrl这个C可执行程序:

# adb root
# adb shell $ cd /system/bin
$ ls -al led*

结果如下:

在上面可以看到,led-ctrl这个执行程序已经集成到了Android系统里面,接下来使用控制LED设备节点的命令即可,如下:

5、小结

本文主要简单介绍了如何在内核里面添加LED子系统驱动的配置,并且添加LED设备树节点,并编写了一个简单的可执行程序来访问该LED驱动设备节点。

 

Android集成C程序访问驱动设备节点的更多相关文章

  1. Linux应用程序访问字符设备驱动详细过程【转】

    本文转载自:http://blog.csdn.net/coding__madman/article/details/51346532 下面先通过一个编写好的内核驱动模块来体验以下字符设备驱动 可以暂时 ...

  2. android——实现跨程序访问数据

    使用之前的SQLite存储的应用程序.首先需要在这个应用程序中创建内容提供器,右击com.example.administrator.exp7包→New→Other→Content Provider, ...

  3. Android 直接通过JNI访问驱动

    package com.yang.jniaccesshardware; import android.os.Bundle; import android.support.v7.app.AppCompa ...

  4. Android和Linux下设备节点的创建笔记

    1. Linux kernel创建的/dev/下的设备节点是不对的, 其实是kernel仅负责在/sys/(基于内存的虚拟文件系统)创建一大堆下目录和文件,而真正的设备节点是在用户空间程序创建的,应该 ...

  5. I.MX6 Android 设备节点权限

    /********************************************************************************** * I.MX6 Android ...

  6. Android应用程序访问linux驱动第一步:实现并测试Linux驱动

    一直都想亲自做一次使用android应用程序访问Linux内核驱动的尝试,但总是没能做到.最近抽出时间,下决心重新尝试一次.尝试的开始当然是先写一个Linux内核驱动了. 我希望写一个简单测驱动程序, ...

  7. linux c 编程 ------ 通过设备节点调用驱动

    驱动程序如下,加载驱动后,会在/dev文件夹下生成一个文件hello_device_node,是此驱动的设备节点 #include <linux/init.h> #include < ...

  8. Linux 内核驱动自动创建设备节点并挂载设备

    *注:本文来自http://blog.csdn.net/lwj103862095/article/details/17470573 一.首先需要在最开始定义两个数据结构: static struct ...

  9. Android udev /dev 设备节点权限

    /************************************************************************* * Android udev /dev 设备节点权 ...

随机推荐

  1. C# word格式转换为pdf

    引用 Microsoft.Office.Interop.Word 这个dll,可以在解决方案浏览器中搜索到并下载. 源码如下: public bool WordToPDF(string sourceP ...

  2. Delphi - Delphi7 调用阿里大于实现短信消息验证

    阿里大于是阿里通信旗下产品,融合了三大运营商的通信能力,提供包括短信.语音.流量直充.私密专线.店铺手机号等个性化服务.每条四分五,价钱还算公道,经老农测试,响应速度非常快,基本上是秒到.官方文档提供 ...

  3. 代码语法高亮踩坑-原理,问题, PRE元素及htmlentity

    语法高亮库基础原理 在研究使用能够在web页面上代码语法高显的解决方案时,发现有很多现成的开源库.比较中意的有prism.js,highlightjs.他们的原理基本上核心就两点: 1. 利用html ...

  4. Mac系统docker初探

    最近把工作环境要切到mac中,由于一直想看看docker是怎么回事,以前在win和linux下面都没有用起来,这次在mac中决定试一把,尝试下新的环境部署方式. 安装docker mac中,直接有类似 ...

  5. 北理工机器人队RM视觉组学习参考汇总(持续更新中)

    欢迎大家有意加入北理工机器人队参与到视觉组的工作中.在大家能够正式作为队员参与到视觉组的准备工作之前,北理机器人队需要对各位进行培训.这篇文章主要面向有志于参加机器人队视觉组的同学.同时,欢迎所有对相 ...

  6. web.xml——安全性框架配置文件

    <?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://w ...

  7. 【开发笔记】- yml中出现特殊字符启动失败的问题

    问题描述: yml配置中出现特殊字符,启动时抛出异常: Caused by: org.yaml.snakeyaml.constructor.ConstructorException: Can't co ...

  8. 解决securecrt连接慢(而xshell秒连)的问题

    打开securecrt的跟踪选项,观察输出信息来诊断 解决方法: 1)首先,将全局设置中,GSSAPI属性由自动改为GSSAPI   2)其次,将不支持的多余的密钥交换去掉   3)最后,可以将服务端 ...

  9. java、python及jmeter操作redis(接口自动化必备)

    redis是nosql数据库之一,其存储结构简单,提供高性能服务,所以在架构中是很常用的. 在做接口自动化测试过程中,有时也会涉及到redis,比如:发送短信验证码,我们做接口自动化测试,如何模拟发送 ...

  10. NOIP 2008 传球游戏

    洛谷 P1057 传球游戏 洛谷传送门 JDOJ 1536: [NOIP2008]传球游戏 T3 JDOJ传送门 Description ​ 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次, ...