硬件平台: 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. 【Bootstrap】2.作品展示站点

    假设我们已经想好了要给自己的作品弄一个在线站点.一如既往,时间紧迫.我们需要快一点,但作品展示效果又必须专业.当然,站点还得是响应式的,能够在各种设备上正常浏览,因为这是我们向目标客户推销时的卖点.这 ...

  2. SharePoint2013 错误

    英文错误信息: This operation can be performed only on a computer that is joined to a server farm by users ...

  3. The specified file or folder name is too long

    You receive a "The specified file or folder name is too long" error message when you creat ...

  4. 更新CocoaPods碰到的问题及知识点

    1:解决CocoaPods安装时报的问题,http://ruby.taobao.org/latest_specs.4.8.gz 报404 解决 bad response Not Found 404 ( ...

  5. sleep() 和 wait() 的区别

    好多面经上都出现了,有必要好好熟悉一下 区别: 1.wait() 可以指定时间,也可以不指定(等五分钟你进来,或者是不叫你一直等着):sleep()必须指定时间(不能一睡不起) 2.wait()是Ob ...

  6. 【代码笔记】iOS-获得现在的时间

    一,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. ...

  7. request对象详解

    先来了解一下Request的主要方法: setAttribute(String name,Object):设置名字为name的request的参数值getAttribute(String name): ...

  8. Linux下NDK编译FFMPEG包含neon参数

    FFMPEG编译成Android库已经有很多案例了,编译优化neon的也很多,以下是我通过实践成功的案例,这里主要讲编译的配置文件,其他设置可结合Linux下使用NDK编译FFMPEG(libstag ...

  9. 查看Android支持的硬解码信息

    通过/system/etc/media_codecs.xml可以确定当前设备支持哪些硬解码.通过/system/etc/media_profiles.xml可以知道设备支持的具体profile和lev ...

  10. vmware 10 e1000e e1000e_cyclecounter_read 挂机解法

    http://ehc.ac/p/e1000/mailman/message/34100875/In the e1000e_cyclecounter_read function, if incvalue ...