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 ...
随机推荐
- 【Error】SSL InsecurePlatform error when using Requests package
使用requests时会出席SSL InsecurePlatform error when using Requests package的错误,一般情况下python2.7.10以下的环境会出现此错误 ...
- 使用wepy框架搭建微信小程序采坑记(一)
1.什么是wepy 这个框架是腾讯内部出的一个类MVVM的小程序开发框架.大体上来说语法是类VUE的,所以如果有VUE开发经验的话迁移成本会低一些.至于具体的怎么使用我就不赘言了,有问题查文档(官方文 ...
- SpringInAction--Spring Web应用之SpringMvc 注解配置
Spring MVC 是当前Web服务器中常用的结构,今天就来学习这相关的知识,首先上图——Spring请求的时候所经历的坎坷之路: (书上原话,算是解释..) 在请求离开浏览器时① ,会带有用户所请 ...
- C++面向对象高级编程(六)转换函数与non-explicit one argument ctor
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 1.conversion function 转换函数 //1.转换函数 //conversion function //只要你认为合理 你可以任 ...
- 【PL/SQL编程】条件语句
1. if...then语句 if <condition_expression> then plsql_sentence; end if; declare -- Local variabl ...
- (转)MapReduce Design Patterns(chapter 1)(一)
翻译的是这本书: Chapter 1.Design Patterns and MapReduce MapReduce 是一种运行于成百上千台机器上的处理数据的框架,目前被google,Hadoop等多 ...
- egg.js源码解析之render()
作为阿里的开源node.js框架,我觉得egg.js是很有前途的,故而学之,github上down了一个项目下来(https://github.com/easy-team/egg-vue-webpac ...
- Android程序员学WEB前端(8)-CSS(3)-盒子内联块级定位浮动-Sublime
转载请注明出处:http://blog.csdn.net/iwanghang/article/details/76618473 觉得博文有用,请点赞,请评论,请关注,谢谢!~ 盒子模型: <!D ...
- Swift 3 点击屏幕任意位置隐藏键盘
func hideKeyboardWhenTappedAround() { let tap: UITapGestureRecognizer = UITapGestureRecognizer(targe ...
- [Python] print中的左右对齐问题
一.数值类型(int.float) # %d.%f是占位符>>> a = 3.1415926>>> print("%d"%a) #%d只 ...