Android底层开发(二)之HAL层

1

HAL程序必须要一个HAL-MODULE-INFO——SYM(hw_module_t)变量,有了这个才能被Android系统调用。类似于(C函数的main()和linux驱动程序的init()函数)

2 HAL编程是三个关键结构体:

struct hw_module_t;                     (HAL模块  中)

struct hw_module_methods_t;  (入口函数 小)

struct hw_device_t;                      (HAL设备  大)

这几个数据结构是在Android工作目录/hardware/libhardware/include/hardware/hardware.h文件中定义.

3 源程序

3.1 leds_hal.h

#include <hardware/hardware.h>

#include <fcntl.h>

#include <cutils/log.h>

struct led_module_t

{

struct hw_module_t hw_module;

};

struct led_control_device_t

{

struct hw_device_t hw_device;

int (*set_on)(struct led_control_device_t *dev, int32_t led);

int (*set_off)(struct led_control_device_t *dev, int32_t led);

};

#define LED_HARDWARE_MODULE_ID "led_hal"

3.2  leds_hal.c

#include "leds_hal.h"

int dev_file = 0;

int led_on(struct led_control_device_t *dev, int32_t led)

{

return ioctl(dev_file, 1, led);

}

int led_off(struct led_control_device_t *dev, int32_t led)

{

return ioctl(dev_file, 0, led);

}

int led_device_close(struct hw_device_t* device)

{

struct led_control_device_t* ctx = (struct led_control_device_t*) device;

if (ctx)

{

free(ctx);

}

close(dev_file);

return 0;

}

static int led_device_open(const struct hw_module_t* module, const char* name,

struct hw_device_t** device)

{

struct led_control_device_t *dev;

dev = (struct led_control_device_t *) malloc(sizeof(*dev));

memset(dev, 0, sizeof(*dev));

dev->hw_device.tag = HARDWARE_DEVICE_TAG;

dev->hw_device.version = 0;

dev->hw_device.module = (struct hw_module_t*) module;

dev->hw_device.close = led_device_close;

dev->set_on = led_on;

dev->set_off = led_off;

//*device = &dev->hw_device;

*device = (hw_device_t*)dev;

dev_file = open("/dev/leds", O_RDWR);

if (dev_file < 0)

{

LOGI("LED Stub: open /dev/leds  fail.");

}

else

{

LOGI("LED Stub: open /dev/leds success .");

}

//leds_init_gpm();

return 0;

}

static struct hw_module_methods_t led_module_methods =

{ open: led_device_open };

struct led_module_t HAL_MODULE_INFO_SYM =

{ hw_module:

{ tag: HARDWARE_MODULE_TAG, version_major: 1, version_minor: 0, id

: LED_HARDWARE_MODULE_ID,

name: "Sample LED HAL Stub",

author: "Lining",

methods: &led_module_methods,

}

};

4 Android.mk文件与分析

第一步:

HAL模块属于android系统的一部分,HAL需要很多的Android的头文件和共享库,采用办法如下:建立链接

ln  -s    /root/drivers/ch09/leds_hal/     /working/android2.3.4_src/hardware/leds_hal

第二步  采用mm命令编译

Android.mk文件如下:

LOCAL_PATH := $(call my-dir)  //返回当前路径

include $(CLEAR_VARS)  //清楚...变量

LOCAL_PRELINK_MODULE := false

LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw

//编译出来的.so文件存放地方

LOCAL_SHARED_LIBRARIES := liblog //本次编译要链接动态库文件liblog.so文件

LOCAL_SRC_FILES := leds_hal.c

LOCAL_MODULE :=led_hal.default //编译生成led_hal.default.so

LOCAL_MODULE_TAGS := eng

include $(BUILD_SHARED_LIBRARY)    //编译器负责

第三步:把生成的led_hal.default.so传入开发板的/system/lib/hw中。

时间: 2024-10-05 17:23:31

Android底层开发(二)之HAL层的相关文章

Android底层开发之Audio HAL

http://blog.csdn.net/kangear/article/details/44939429 Android底层开发之Audio HAL 在Android音频底层调试-基于tinyalsa中以「抛开Android的天生复杂,回归嵌入式Linux的本质」的方式介绍如何调试Linux内核中的音频驱动. 这里向上再伸展一下进入HAL层,看是如何将tinyalsa封装给Frameworks使用的. 基于4.2.2版本源码进行讨论.Android官方教程是Audio Implementing

搭建android底层开发的环境读后感

本章主要介绍如何搭建android底层开发的环境,主要包括android应用程序开发环境.android NDK开发环境个交叉编译环境的搭建. 首先开发.测试和调试linux驱动.HAL程序库需要以下工具: 1.JDK6或以上版本: 2.Eclipse3.4或以上版本: 3.ADT: 4.CDT: 5.Android SDK: 6.Android NDK: 7.交叉编译环境: 8.Linux内核源代码: 9.Android源代码: 10.用于调试开发板的串口工具:minicom. 关于JDK的安

Android底层开发之音频输入通道的软硬件分析

Android底层开发之音频输入通道的软硬件分析 我们都知道耳机Mic集成在一直的那种四段耳机Mic插头是Android设备上比较常用.但是也会有分开的情况,比较如果在普通的PC机中装Android系统,那么就是这种情况.所以就有必要对音频输入通道的软件硬件进行统一的分析一下,接下来分析一个实例. 该设备的硬件连接为:基于3157的模拟开关实现的 通道切换. 设备是完全靠硬件实现的,那么就没有软件的什么工作了.但是这并不是一个理想的实现方法,真下的实现方法应该是所有的Mic都是并行的,每个Mic

CSDN Android客户端开发(二):详解如何基于Java用Jsoup爬虫HTML数据

本文参考链接详细介绍如何使用Jsoup包抓取HTML数据,是一个纯java工程,并将其打包成jar包.希望了解如何用java语言爬虫网页的可以看下. 杂家前文就又介绍用HTTP访问百度主页得到html的string字符串,但html的文本数据如果不经过处理就是个文本字符串没有任何效果的.所谓的浏览器就是负责将文本的html"翻译"成看到的界面.在前文有介绍,这个csdn的客户端app分首页.业界.移动.研发.程序员.云计算五大类.以业界为例,http://news.csdn.net/ 

Android底层开发之字符绘制TextLayoutCache

源:Android底层开发之字符绘制TextLayoutCache

Android底层开发之耳机插拔与音频通道切换实例

Android底层开发之耳机插拔与音频通道切换实例 由于使用的是耳机 麦克分离式的耳机,所以要分别上报事件.在Android系统层耳机插孔的检测是基于/sys/class/switch/h2w/state的值来判断的(以4.4.4_r2为例子位于WiredAccessoryManager.java). 只要在内核中实现一个「或真或假」的基于switch类的h2w开关.Android系统就可以监听到插拔信息. 在播放音乐的时候插入耳机,使用tinymix(参考:Android音频底层调试-基于ti

【转】Android 底层开发的几点

我干了3年Android sdk开发,觉得到了瓶劲没法更进一步,于是花了一年多点时间,大概摸到点门径.根据前辈的经验,Android底层完全入门需要两年. 先说下我的入门过程:第零步,下载源码,我下的4.2的,框架层源码10G,内核2G多,ctags给框架层建的标签文件都有600M,当时让我有点震撼,用的vim+ctags+cscope来阅读,还算不错,架构挺清晰的. 第一步,我找到了一本好书<Android的设计与实现 第一卷>它讲了Android框架层的启动,初始化,服务框架初始化,Bin

搭建Android底层开发环境

为了开发linux驱动方便些,我们一般将linux作为Android的开发环境,那么就需要搭建Android的开发环境,下面是一些搭建Android底层时的心得: (1)安装JDK:除了普遍使用的下载压缩安装配置PATH 方法外,Ubuntu linux还提供了更简单的方法: #vim/etc/apt/sources.list后添加deb http://old-releases.ubuntu.com/ubuntu/ hardy multiverse源 # apt-get update # apt

Android NDK开发(二)——从Hello World学起

转载请注明出处:http://blog.csdn.net/allen315410/article/details/41805719  上篇文章讲述了Android NDK开发的一些基本概念,以及NDK的环境搭建,相信看过的朋友NDK开发环境搭建应该是没有问题了,还没有搭建或者不知道怎么搭建的朋友请点击这里.那么这篇文章,我们跟刚学Java编程语言一样,从世界知名程序"Hello World!"开始,开发出我们的第一个NDK程序. NDK目录简单介绍 在进行NDK开发之前,我们有必须熟悉