硬件平台: FriendlyARM Tiny4412 Cortex-A9

操作系统: UBUNTU 14.04 LTS

时间:2016-09-21  16:15:26

设计HAL硬件抽象层程序,则需要打开Android源代码。

在 Android-5.0.2\hardware\libhardware\modules\目录下都是HAL文件。

创建LED文件夹。在文件夹中创建led.c文件。

#include <cutils/log.h>
#include <fcntl.h>
#include <string.h>
#include <hardware/led.h>  //自己创建的头文件
#include <stdbool.h>
#include <stdint.h>
#include <sys/cdefs.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <hardware/hardware.h> #define LOG_TAG "ledhal" //打印调试信息 方便在查看调试信息时筛选 static int fd; int led_on(struct led_device_t *dev, int no )
{
ioctl( fd, LED_ON, no );
return ;
} int led_off(struct led_device_t *dev, int no )
{
ioctl( fd, LED_OFF, no );
return ;
} static int led_close(hw_device_t *dev) {
struct led_device_t *led = (struct led_device_t *)dev;   //强制转换指针类型 
free(led);          //在这里 在退出程序时释放掉之前的申请的空间 close(fd); return ;
} static struct led_device_t led_dev = {    //此处已经静态分配自己定义的结构体空间
.led_device = {
.tag = HARDWARE_DEVICE_TAG,  //固定格式
.close = led_close,
}, .set_on = led_on,
.set_off = led_off,
}; static int open_led_hal(const hw_module_t* module, const char* name,
hw_device_t** device)
{
*device = &led_dev;            //直接赋值已静态分配的结构体指针
fd = open( "/dev/my_led",O_RDWR );
if( fd< )
{
ALOGD("open device file failed\n"); // logcat -s ledhal
return ;
}
return ;
} static struct hw_module_methods_t led_methods = {
.open = open_led_hal,      //在程序启动时自动执行
};
struct hw_module_t HAL_MODULE_INFO_SYM = { //程序入口 .tag = HARDWARE_MODULE_TAG,
.id = "led",
.methods = &led_methods, //首先调用其中的open函数 };

在 Android-5.0.2\hardware\libhardware\include\hardware\ 下创建头文件led.h

#ifndef _HARDWARE_LED_H
#define _HARDWARE_LED_H #include <hardware/hardware.h> struct led_device_t {      //自己设定的结构体
struct hw_device_t led_device;  //此成员为固定格式
int (*set_on)(struct led_device_t *dev, int no );
int (*set_off)(struct led_device_t *dev, int no ); }; #define LED_ON _IOW('G',0,int)
#define LED_OFF _IOW('G',1,int) #endif

在 Android-5.0.2\hardware\libhardware\modules\ 目录下创建Android.mk文件,这里我是复制其他文件夹中的。

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := led.default    //生成的库名称

# HAL module implementation stored in
# hw/<VIBRATOR_HARDWARE_MODULE_ID>.default.so
LOCAL_MODULE_RELATIVE_PATH := hw
LOCAL_C_INCLUDES := hardware/libhardware
LOCAL_SRC_FILES := led_hal.c  //源文件名称
LOCAL_SHARED_LIBRARIES := liblog
LOCAL_MODULE_TAGS := eng    //这里我选用的是工程模式 include $(BUILD_SHARED_LIBRARY)

上面有注释的代表是需要修改的地方。

然后退到Android源代码的目录。执行命令生成相关文件。

 mmm hardware/libhardware/modules/led/

将在 out/target/product/tiny4412/system/lib/hw/ 目录下生成相关文件。

在执行 ./gen-img.sh  将生成新的system.img文件  重新安装安卓系统,在控制台模式下,可看到在system\lib\hw目录下有相关文件。

Android驱动入门-LED--HAL硬件抽象层程序设计①的更多相关文章

  1. Android驱动入门-Led控制+app+ndk库+底层驱动

    硬件平台: FriendlyARM Tiny4412 Cortex-A9 操作系统: UBUNTU 14.04 LTS 时间:2016-09-20  21:56:48 本次实验使用的是 安卓APP + ...

  2. Android驱动入门-LED--HAL硬件访问服务层②

    硬件平台: FriendlyARM Tiny4412 Cortex-A9 操作系统: UBUNTU 14.04 LTS 时间:2016-09-21  16:58:56 为了避免访问冲突,则创建了硬件访 ...

  3. android驱动学习---led实验

    ======================== 驱动: 内核:android-kernel 2.6.36  (必须对应你的板子上内核,不然会出现insmod错误) 目的:通过android应用层用户 ...

  4. Android驱动入门-LED--测试APP编写③

    硬件平台: FriendlyARM Tiny4412 Cortex-A9 操作系统: UBUNTU 14.04 LTS 时间:2016-09-24  10:47:03 在Android Studio中 ...

  5. Android驱动入门-在Android系统上运行JAVA程序

    在linux上运行java程序,直接用javac编译,再用java运行就行了.但是在Android上,由于虚拟机和pc端的不同,所以操作方法也是不一样的. 如果想在Android上运行Hello wo ...

  6. Android驱动学习-APP操作新硬件的两种方法(支持添加的驱动)

    在给Android添加新的驱动后,app要如何使用呢? 正常的使用一个设备,需要getService.但是像LED等我们自己添加的硬件驱动,Android源代码根本没有我们自己添加的服务. 第一种: ...

  7. 自己动手写最简单的Android驱动---LED驱动的编写【转】

    本文转载自:http://blog.csdn.net/k_linux_man/article/details/7023824 转载注明出处,作者:K_Linux_Man, 薛凯 山东中医药大学,给文章 ...

  8. 深入浅出 - Android系统移植与平台开发(十) - led HAL简单设计案例分析

    作者:唐老师,华清远见嵌入式学院讲师. 通过前两节HAL框架分析和JNI概述,我们对Android提供的Stub HAL有了比较详细的了解了,下面我们来看下led的实例,写驱动点亮led灯,就如同写程 ...

  9. Android驱动学习-app调用内核驱动过程(驱动框架回顾)

    考研已经过去了,android驱动的学习也断了半年多了,现在重新捡起来学习,回顾一下Android驱动的大体框架. Android系统的核心是java,其有一个David虚拟机.Android-app ...

随机推荐

  1. HTML标签的嵌套规则

    我在平时在写html文档的时候,发现不太清楚标签之间的嵌套规则,经常是想到什么标签就用那些,后来发现有些标签嵌套却是错误的.通过网上找资料,了解了html标签的嵌套规则. 一.HTML 标签包括 块级 ...

  2. sharepoint:找不到位于 http://XX.XX.XX.XX 的 Web

    自己写了个sharepoint的webservice,发不到IIS上后报错: System.IO.FileNotFoundException: 找不到位于 http://XX.XX.XX.XX 的 W ...

  3. Quartz2D复习(四) --- 图层CALayer和动画CAAnimation

    1.CALayer 1).在ios中,能看得见摸得着的东西基本上都是UIView, 比如按钮.文本标签.文本输入框.图标等,这些都是UIView 2).UIView之所以能显示在屏幕上,完全是因为它内 ...

  4. JavaSE 和 JavaEE 的关系

    1.javaSe看成是java基础   (Standard Edition(标准版) ) 2.J2EE看成是应用            (Enterprise Edition(企业版)) 3.java ...

  5. 【iOS】环形渐变进度条实现

    之前有人在找渐变进度条的效果,闲来无事就顺手写了一个,然后画了视图层级,方便讲解. 环境信息: Mac OS X 10.10.3 Xcode 6.3.1 iOS 8.3 效果图: 源码下载地址: ht ...

  6. ReactiveCocoa基础知识内容

    本文记录一些关于学习ReactiveCocoa基础知识内容,对于ReactiveCocoa相关的概念如果不了解可以网上搜索:RACSignal有很多方法可以来订阅不同的事件类型,ReactiveCoc ...

  7. MapReduce实例-基于内容的推荐(一)

    环境: Hadoop1.x,CentOS6.5,三台虚拟机搭建的模拟分布式环境 数据:下载的amazon产品共同采购网络元数据(需FQ下载)http://snap.stanford.edu/data/ ...

  8. Java Se :线性表

    Java的集合框架分为两个系列,Collection和Map系列.在大学期间,学习数据结构时,好像学习了线性表.非线性表.树,哎,都给忘了.其实,在Collection系列内部又可以分为线性表.集合两 ...

  9. Javascript之旅——第三站:几个需要注意的运算符

    平时写惯了C#,所以会觉得什么样的运算符就应该做什么样的运算,但是有一天你的习惯被其他语言颠覆了,不知道是不是有一股强大的好奇 心,刚好在js中,我的这种习惯就被颠覆了,下面就看看哪些运算符颠覆了我的 ...

  10. PHP debug 环境配置

    在建立PHP开发调试环境时,经常会遇到xdebug无法成功安装的问题,其实主要原因有两点: 1. xdebug版本和php版本不匹配 2.xdebug和 zend不能同时运行,需要在php.ini中禁 ...