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. python 重新修炼之路

    第一篇 基础篇 1.1  打造万能的开发环境-conda  1.2   python的代码规范与vscode配置   1.3 变量 与 关键字   1.4 数据类型     1.4.1 数字      ...

  2. SqlServer 转 Oracle 的几点注意

    (转自:http://www.2cto.com/database/201208/146740.html) 1.字符型的字段相加需要用“||”,如果用“+”的话,会报“无效的数字”的错误.   2.类似 ...

  3. Django WSGI,MVC,MTV,中间件部分,Form初识

    一.什么是WSGI? WEB框架的本质是一个socket服务端接收用户请求,加工数据返回给客户端(Django),但是Django没有自带socket需要使用 别人的 socket配合Django才能 ...

  4. 让nodejs在iis上运行

    node在IIS上运行的好处: Tomasz的回答是我见过最棒的: 使用iisnode模块在IIS中托管node.js应用程序来取代自托管node.exe进程的优势在于: · 进程管理. Iisnod ...

  5. Flask_script扩展调用的方式

    Flask中flask-script扩展的使用 通过使用Flask-Script扩展,我们可以在Flask服务器启动的时候,通过命令行的方式传入参数.而不仅仅通过app.run()方法中传参 Flas ...

  6. 自己定义的Excetpion继承哪个异常有什么讲究?[待解答]

    try catch的地方需要用到一个自定义的DBException,如下: 于是我就自定义了一个DBException,继承Excetpion,以父类Exception构造器创建构造器: DBExce ...

  7. Linux系统在启动过程中grub引导文件丢失的解决方法

    在/boot/grub2目录下有一个grub.cfg文件:该文件主要是用来自动地引导系统启动内核程序和系统的初始化程序. 问题一:当系统在启动的情况下,我们不小心删除/boot/grub2/grub. ...

  8. Shell 命令行批量处理图片文件名

    Shell 命令行批量处理图片文件名 从网上下载了一堆图片,有的是*.jpg的,有的是*.jpeg的.并且文件名有长有短,很是糟心.因此,我想把这些文件给全部整理好,当然是用shell来处理啦! 说干 ...

  9. Caused by: java.lang.AbstractMethodError: org.hibernate.validator.internal.engine.ConfigurationImpl

    1.错误描述 严重: StandardWrapper.Throwable org.springframework.beans.factory.BeanCreationException: Error ...

  10. awk命令结合管道命令对json文件进行统计分析

    json文件内容: $ head file.json {"B": 0.337, "C": 0.663, "name": "xxx& ...