Android 从上层到底层-----hal层
CPU:RK3288
系统:Android 5.1
功能:上层 app 控制 led 亮灭
开发板:Firefly RK3288
led_hal.c
path:hardware/rockchip/firefly/led_hal/led_hal.c
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <hardware/led_hal.h> //日志的标签
#define LOG_TAG "led_hal"
#include <utils/Log.h> static int fd; int led_hal_dev_close(struct hw_device_t *device)
{
if(device != NULL)
{
struct led_hw_device_t *temp = (struct led_hw_device_t *)device;
free(temp);
} close(fd); return ;
} int led_hal_open_dev(void)
{
ALOGD("--%s--", __func__); fd = open("/dev/firefly_leds", O_RDWR);
if(fd < )
{
ALOGE("open failed : %s", strerror(errno));
return fd;
} return ;
} int led_hal_control_dev(int on)
{
ALOGD("--%s--", __func__); int ret; ret = write(fd, &on, );
if(ret < )
{
ALOGE("control failed : %s", strerror(errno));
return ret;
} return ;
} //该函数正确返回0
int led_hal_module_open(const struct hw_module_t *module, const char *id,
struct hw_device_t **device)
{
ALOGD("--%s--", __func__); struct led_hw_device_t *led_dev = NULL; led_dev = (struct led_hw_device_t *)malloc(sizeof(struct led_hw_device_t));
if (led_dev == NULL)
{
ALOGE("malloc failed");
return -;
} ALOGD("malloc success"); //初始化device对象
led_dev->common.tag = HARDWARE_DEVICE_TAG;
led_dev->common.version = ;
led_dev->common.module = module;
led_dev->common.close = led_hal_dev_close; led_dev->open = led_hal_open_dev;
led_dev->control = led_hal_control_dev; //将当前的led_dev传递给jni层
*device = (struct hw_device_t *)led_dev; return ;
} struct hw_module_methods_t led_hal_methods = {
open : led_hal_module_open,
}; //结构体名称必须为HMI
struct led_hw_module_t HMI = {
common : {
tag : HARDWARE_MODULE_TAG,
version_major : ,
version_minor : ,
//id必须与jni层的一致
id : LED_HAL_MODULE_ID,
name : "firefly led hal module",
methods : &led_hal_methods,
},
};
led_hal.h
path:hardware/libhardware/include/hardware/led_hal.h
#ifndef _LED_HAL_H_
#define _LED_HAL_H_ #include <hardware/hardware.h> #define LED_HAL_MODULE_ID "firefly_led_hal" //自定义module对象,一定要继承父类,
//可以扩展
struct led_hw_module_t {
//一定要在结构体第一位,名称必须是common
struct hw_module_t common;
//下面是扩展,用于测试
int test;
}; //自定义device对象,一定要继承父类
//一定要扩展
struct led_hw_device_t {
//一定要在结构体第一位,名称必须是common
struct hw_device_t common;
//下面为扩展
int (*open)(void);
int (*control)(int on);
};
#endif
Android.mk
path:hardware/rockchip/firefly/led_hal/led_hal.c
语法参照 Android.mk语法解析
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := firefly_led_hal.default
LOCAL_SRC_FILES := led_hal.c
LOCAL_LDLIBS := -llog LOCAL_MODULE_TAGS := optional
LOCAL_SHARED_LIBRARIES := liblog libcutils LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw include $(BUILD_SHARED_LIBRARY)
Android 从上层到底层-----kernel层
Android 从上层到底层-----jni层
Android 从上层到底层-----app层
Android 从上层到底层-----hal层的更多相关文章
- Android 从上层到底层-----app层
CPU:RK3288 系统:Android 5.1 功能:上层 app 控制 led 亮灭 开发板:Firefly RK3288 MainActivity.java package com.aaron ...
- Android 从上层到底层-----jni层
CPU:RK3288 系统:Android 5.1 功能:上层 app 控制 led 亮灭 开发板:Firefly RK3288 led_jni.h path:hardware/rockchip/fi ...
- Android 从上层到底层-----kernel层
CPU:RK3288 系统:Android 5.1 功能:上层 app 控制 led 亮灭 开发板:Firefly RK3288 1.在dts文件中增加 led 设备 path:kernel/arch ...
- Android HAL层与Linux Kernel层驱动开发简介
近日稍微对Android中的驱动开发做了一些简要的了解. HAL:Hardware Abstract Layer 硬件抽象层,由于Linux Kernel需要遵循GPL开源协议,硬件厂商为了保护自己硬 ...
- Android Hal层简要分析
Android Hal层简要分析 Android Hal层(即 Hardware Abstraction Layer)是Google开发的Android系统里上层应用对底层硬件操作屏蔽的一个软件层次, ...
- 【Android】Sensor框架HAL层解读
Android sensor构建 Android4.1 系统内置对传感器的支持达13种,他们分别是:加速度传感器(accelerometer).磁力传感器(magnetic field).方向传感器( ...
- 〖Android〗OK6410a的Android HAL层代码编写笔记
一.编写LED灯的Linux驱动程序代码 之所以使用存在HAL层,是为了保护对硬件驱动过程的逻辑与原理: 所以,残留在Linux驱动层的代码,只保留了基本的读写操作,而不含有关键的逻辑思维: 1. l ...
- Android native进程间通信实例-binder篇之——HAL层访问JAVA层的服务
有一天在群里聊天的时候,有人提出一个问题,怎样才能做到HAL层访问JAVA层的接口?刚好我不会,所以做了一点研究. 之前的文章末尾部分说过了service call 可以用来调试系统的binder服务 ...
- Linux、Android系统调用从上层到底层的调用路径浅析
参考: https://blog.csdn.net/liuhangtiant/article/details/85149369 http://blog.sina.com.cn/s/blog_79433 ...
随机推荐
- C#连接Oracle数据库查询数据
C#连接Oracle数据库可以实现许多我们需要的功能,下面介绍的是C#连接Oracle数据库查询数据的方法,如果您对C#连接Oracle数据库方面感兴趣的话,不妨一看. using System; u ...
- [SQL]会引起全表扫描的10种SQL语句
1.模糊查询效率很低: 原因:like本身效率就比较低,应该尽量避免查询条件使用like:对于like ‘%...%’(全模糊)这样的条件,是无法使用索引的,全表扫描自然效率很低:另外,由于匹配算法的 ...
- webapi在IIS发布后报Http 403.14 error
服务器是Windows Server 2008 R2 Enterprise IIS6.1 解决方法,修改web.config文件 1.在<system.webServer>配置 ...
- 快速切题 poj 3026 Borg Maze 最小生成树+bfs prim算法 难度:0
Borg Maze Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8905 Accepted: 2969 Descrip ...
- 【前端安全】 web前端安全编码(模版篇)【转】
在web的开发的开发过程中,前端总是在处理后端打的各种变量,变量可以包含着中的各种各样的字符,如果不对这些字符进行”特殊“处理的话,轻者导 致页面不正常的显示,潜入了其他的东西,亦即页面挂了,或者弹出 ...
- SpringXML方式给bean初始化属性值
可以在Spring容器初始化bean的时候给bean的属性赋初始值,直接在property标签里设置即可 1 2 3 4 5 6 <bean name="user**" cl ...
- JPlayer使用之二,主要函数介绍
上一篇插件搭建的顺序最后一步的页面初始化函数中,就是最重要的一步,就先从这个函数说起吧. $("#jquery_jplayer_1").jPlayer({ ready: funct ...
- New Concept English three(10)
The great ship, Titanic, sailed for New York from Southampton on April 10th, 1912. She was carrying ...
- windows7 下安装python3.6开发环境
所有的软件都放在百度云盘里: 链接: https://pan.baidu.com/s/1rux8sDK9thhbZ1qjwQg6kA 密码: iq4c 1. 安装python3.6.5 安装的时候要把 ...
- 02-C与OC语言的一些小知识
1. #import 跟#include.@class有什么区别?#import<> 跟 #import”"又什么区别? 1> #import和#inclu ...