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 ...
随机推荐
- VMware虚拟机安装linux7并设置网络
1.下载VMware虚拟机 https://www.vmware.com/cn/products/workstation/workstation-evaluation.html 永久激活12位序列号: ...
- WTH统计
SELECT t2.MasterName AS '类型',SUM(t1.DailyCount) AS '数量',(CASE T2.MasterName WHEN '电子阅读' THEN '篇' WHE ...
- 公客网beta阶段发布说明
项目 公客 公正客观的课程评价网站 功能说明 评价的增删改 对课程发表评价 限制评价次数(3次),删除与增量修改评价 评价下的讨论与点赞 在评价下添加讨论,支持在讨论中使用@与对方交流想法 为评价点赞 ...
- hdu 5818 Joint Stacks (优先队列)
Joint Stacks Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tota ...
- LeetCode OJ:Generate Parentheses(括号生成)
Given n pairs of parentheses, write a function to generate all combinations of well-formed parenthes ...
- LeetCode OJ:Nim Game(Nim游戏)
You are playing the following Nim Game with your friend: There is a heap of stones on the table, eac ...
- Django中间件(勾子函数)使用
中间件 Django中的中间件是一个轻量级.底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出.中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django ...
- 添加courses模块
startapp courses from django.db import models from datetime import datetime # Create your models her ...
- BASE理论
BASE是Basiclly Available(基本可用),Soft state(软状态),Eventually consistent(最终一致性)三个短语的缩写. BASE是对CAP中一致性和可用性 ...
- Unity3D 海水多线程渲染算法实现
笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解 ...