硬件平台: 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. css中的background属性

    第一次写博客,我就写写今天在编写网页的过程中,对background的两种运用,一是background中的线性渐变,对背景的渐变我其实是很少使用的,所以今天在写的时候我用css3的帮助手册,back ...

  2. URL-统一资源定位器

    URL - Uniform Resource Locator URL 可以由单词组成,比如 “w3school.com.cn”,或者是因特网协议(IP)地址:192.168.1.253.大多数人在网上 ...

  3. 如何查找SAP的事务代码清单

    SAP系统中,为了省去输入程序名称等繁琐步骤,SAP提供一种命令,称作‘事务代码’,通过执行事务代码达到快速进入相应程序的目的.那么在系统中如何去查找事务代码,事务代码和程序的对应关系如何呢?我们可以 ...

  4. 发布App,赢iPad mini + 美金100$ - Autodesk Exchange 应用程序发布竞赛

    开发牛人们,送你个iPad mini要不要,Autodesk Exchange应用程序发布竞赛开始了. 摘要版: 在2014年9月30日午夜前提交到Autodesk Exchange 应用程序商店上, ...

  5. Sharepoint学习笔记—习题系列--70-576习题解析 -(Q45-Q48)

    Question 45 You are designing a branding strategy for a customer with a new SharePoint 2010 server f ...

  6. sqlite与多线程

    数据库支持三种线程模式 Single-thread. In this mode, all mutexes are disabled and SQLite is unsafe to use in mor ...

  7. Mac OS X 删除文件快捷键

    今天发现自己还不知道怎么快捷的删除文件,网上找了下相关的资料. 原来删除文件的快捷键是:command+delete(把文件放到废纸篓),对于我这种笔记本用户,确实方便很多哈 还有一个命令也挺有用的: ...

  8. webapp设置适应pc和手机的页面宽高以及布局层叠图片文字

    <!DOCTYPE html> <html lang="zh-cn"> <head> <title>我趣旅行网-美剧迷</ti ...

  9. nodejs学习笔记(1)--express安装问题:express不是内部也或者外部的命令解决方案

    "Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具.使用 Express 可以快速地搭建一个完 ...

  10. 编译hadoop2.6.0

    具体情况比较曲折:hadoop2.6.0编译不过 错误如下: 这个kms模块始终编译不过,最后得出结论国内的aliyun maven仓库有问题, 在编译hadoop2.2.0 可以通过,因为这个版本的 ...