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层的更多相关文章

  1. Android 从上层到底层-----app层

    CPU:RK3288 系统:Android 5.1 功能:上层 app 控制 led 亮灭 开发板:Firefly RK3288 MainActivity.java package com.aaron ...

  2. Android 从上层到底层-----jni层

    CPU:RK3288 系统:Android 5.1 功能:上层 app 控制 led 亮灭 开发板:Firefly RK3288 led_jni.h path:hardware/rockchip/fi ...

  3. Android 从上层到底层-----kernel层

    CPU:RK3288 系统:Android 5.1 功能:上层 app 控制 led 亮灭 开发板:Firefly RK3288 1.在dts文件中增加 led 设备 path:kernel/arch ...

  4. Android HAL层与Linux Kernel层驱动开发简介

    近日稍微对Android中的驱动开发做了一些简要的了解. HAL:Hardware Abstract Layer 硬件抽象层,由于Linux Kernel需要遵循GPL开源协议,硬件厂商为了保护自己硬 ...

  5. Android Hal层简要分析

    Android Hal层简要分析 Android Hal层(即 Hardware Abstraction Layer)是Google开发的Android系统里上层应用对底层硬件操作屏蔽的一个软件层次, ...

  6. 【Android】Sensor框架HAL层解读

    Android sensor构建 Android4.1 系统内置对传感器的支持达13种,他们分别是:加速度传感器(accelerometer).磁力传感器(magnetic field).方向传感器( ...

  7. 〖Android〗OK6410a的Android HAL层代码编写笔记

    一.编写LED灯的Linux驱动程序代码 之所以使用存在HAL层,是为了保护对硬件驱动过程的逻辑与原理: 所以,残留在Linux驱动层的代码,只保留了基本的读写操作,而不含有关键的逻辑思维: 1. l ...

  8. Android native进程间通信实例-binder篇之——HAL层访问JAVA层的服务

    有一天在群里聊天的时候,有人提出一个问题,怎样才能做到HAL层访问JAVA层的接口?刚好我不会,所以做了一点研究. 之前的文章末尾部分说过了service call 可以用来调试系统的binder服务 ...

  9. Linux、Android系统调用从上层到底层的调用路径浅析

    参考: https://blog.csdn.net/liuhangtiant/article/details/85149369 http://blog.sina.com.cn/s/blog_79433 ...

随机推荐

  1. 清华大学 pip 源

    pypi 镜像使用帮助 pypi 镜像每 5 分钟同步一次. 临时使用 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-pac ...

  2. 实现Callable接口创建线程

    创建执行线程有四种方式: 实现implements接口创建线程 继承Thread类创建线程 实现Callable接口,通过FutureTask包装器来创建线程 使用线程池创建线程 下面介绍通过实现Ca ...

  3. zoj3765

    题解: splay维护 注意是gcd 代码: #include<bits/stdc++.h> using namespace std; #define Key_value ch[ch[ro ...

  4. 20165202 2017-2018-2 《Java程序设计》第6周学习总结

    教材学习内容总结 Ch8 String类: 程序可以直接使用,String类不能有子类 - 构造String对象 使用String类声明并创建对象 String s = new String(&quo ...

  5. gcc中关于静态库和动态库使用(转)

    转自:http://blog.chinaunix.net/uid-25871104-id-3069931.html 1,如何生成静态库 静态库只是一堆object对象的集合,使用ar命令可以将.o文件 ...

  6. 【OpenCV入门教程之二】 一览众山小:OpenCV 2.4.8 or OpenCV 2.4.9组件结构全解析

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/19925819 作者:毛星云 ...

  7. open()参数宏的意义 O_TRUNC

    C语言中一些基本函数 int _open(char *pathname,int access)为读或写打开一个文件, 按后按access来确定是读文件还是写文件,access值见下表 ┌──────┬ ...

  8. Python matplotlib 数据分布

    利用plt.hist() import matplotlib.pylab as plt %matplotlib inline plt.figure(figsize=(21, 12)) plt.hist ...

  9. iOS-分组UITableView删除崩溃问题(当删除section中最后一条数据崩溃的情况)

    错误: The number of sections contained in the table view after the update (1) must be equal to the num ...

  10. Linux运行环境搭建(一)——安装JDK

    下载Linux版jdk 官网:http://www.oracle.com/technetwork/java/javase/downloads/index.html 解压并拷贝到指定目录 tar zxv ...