HAL开发全流程(一)

原创 2016年06月02日 11:46:35

本文的源代码地址是:http://download.csdn.net/detail/yongyu_it/9544336


1、流程

1.0  HAL层模块开发-->本地访问模块开发-->系统级Android Service(java)开发-->应用程序开发

1.1  “HAL层模块”与“本地访问模块”交互要点:int hw_get_module(const char *id, const struct hw_module_t **module)(此函数定义在:源代码根/hardware/libhardware/hardware.c)

1.2  “本地访问模块”与“Android Service”交互要点:Jni

1.3  “Android Service”与“应用程序”交互要点:AIDL/Binder/跨进程

2、HAL层模块开发

2.1  HAL层模块命名

Android的HAL层是以模块(动态链接库文件)的形式管理各个硬件访问接口的。这些模块(动态链接库文件)的命名是有规定的。

命名规则如:<module_id>.<model_type>.so

2.2  硬件描述

android源代码为开发者预定义了两个结构体hw_module_t、hw_device_t来描述硬件(详见hardware/libhardware/include/hardware/hardware.h文件),其中HAL层模块用hw_module_t来描述,硬件设备用hw_device_t来描述。

2.3  HAL层开发(假设我们的硬件名称叫joffee)

joffee.h文件

/*
 * Copyright (C) 2008 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#define  LOG_TAG    "libplasma"
#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)

#ifndef __ANDROID_JOFFEE_HW_INTERFACE__
#define __ANDROID_JOFFEE_HW_INTERFACE__

#include <stdint.h>
#include <sys/cdefs.h>
#include <sys/types.h>
#include <hardware/hardware.h>

__BEGIN_DECLS
#define JOFFEE_HARDWARE_MODULE_ID "joffee"
/**
 * The joffee device description structure;
 * First field must be the hw_device_t field;
 * Other fields can be function pointers and othe exported fields
 */
struct joffee_device_t {
  /* Will be used in HAL open method */
  struct hw_device_t common;

  /* Pointers to your HAL functions */
  int (*joffee_function)(void);
};
__END_DECLS
#endif //__ANDROID_JOFFEE_HW_INTERFACE__

joffee.cpp文件

/*
 * Copyright (C) 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

/**
 * @file   joffee.cpp
 * @brief  Implements Joffee's HW abstraction layer
 */
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <cutils/log.h>
#include <hardware/joffee.h>
#define TAG "JOFFEE!"

/**
 * The function(s) exported by this HAL
 */
int joffee_function_impl(){
  ALOGE(TAG, "Hello Android!!\n");
  /* Here you should interface with your HW devices... */

  return 0;
}

/** This is mandatory, and part of hw_device_t */
int close_joffee(hw_device_t* hw_dev) {
  //TODO
  return 0;
}

/**
 * A pointer to this method is stored in
 * hw_module_method_t.open;
 *
 * Once JNI loads the hw_module_method_t symbol, it
 * can call this function and "open" the HAL layer
 * receiving pointers to this module's additional methods
 */
static int open_joffee(const struct hw_module_t *module,
                       char const *name, struct hw_device_t **device) {
  struct joffee_device_t *dev = (struct joffee_device_t *)
    malloc(sizeof(*dev));

  if (NULL == dev) {
    ALOGE(TAG, "Unable to reserve memory for joffee: %s\n",
        strerror(errno));
        return -ENOMEM;
  }

  /* Store pointer to HAL function(s) */
  dev->joffee_function = joffee_function_impl;

  /* Initialize common fields */
  dev->common.tag = HARDWARE_DEVICE_TAG;
  dev->common.version = 0;
  dev->common.module = (struct hw_module_t *)module;
  dev->common.close = close_joffee;

  /* Store this module's structure in the output parameter 'device' */
  /* Remember the first field of your HAL device must be an hw_device_t */
  *device = (struct hw_device_t *)dev;
  return 0;
}
/*
 * The Joffee HAL description
 * Will be loaded using libhardware
 */
static struct hw_module_methods_t joffee_methods =
{
  .open =  open_joffee,
};

struct hw_module_t HAL_MODULE_INFO_SYM =
{
  .tag = HARDWARE_MODULE_TAG,
  .version_major = 0,
  .version_minor = 1,
  .id = JOFFEE_HARDWARE_MODULE_ID,
  .name = "Joffee HAL",
  .author = "Linaro",
  .methods = &joffee_methods,
};

Android.mk文件

# Copyright (C) 2012 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_LDLIBS    := -lm -llog

LOCAL_SRC_FILES := \
	joffee.cpp

LOCAL_MODULE_RELATIVE_PATH := hw

LOCAL_MODULE := joffee.default

LOCAL_MODULE_TAGS := optional

include $(BUILD_SHARED_LIBRARY)


2.4  编译

代码结构:

源代码根/hardware/libhardware--|

                                                           |--include/hardware--|

                                                           |                                     |--joffee.h

                                                           |--modules--|

                                                                                 |--joffee--|

                                                                                                 |--joffee.cpp

                                                                                                 |--Android.mk

在源代码根运行mmm ./hardware/libhardware/modules/joffee/ 即可编译,编译结果位于 根/out/target/product/generic/system/lib/hw/

待续...









版权声明:本文为博主原创文章,未经博主允许不得转载。

LOCAL_MODULE_RELATIVE_PATH

LOCAL_PATH := $(call my-dir) # HAL module implemenation stored in # hw/..so include $(CLEAR_VARS) in...
  • qwaszx523
  • qwaszx523
  • 2016年10月19日 20:28
  • 1396

android 5.0 64bit系统加载库文件失败问题浅析

最近公司的一个项目使用android 5.0 64 bit平台,相对以前版本,除了android 5.0 有很大变动之外,64 bit系统和32 bit系统也存在很多差异性。 目前碰到的问题就是以前在...
  • linuxarm521
  • linuxarm521
  • 2015年02月07日 11:03
  • 11464

自定义android模块不编译的问题

自己添加的android模块不编译的问题 自定义模块需要添加编译指定PRODUCT_PACKAG环境变量 我们在开发中,经常会碰到需要自己添加独立模块的时候,笔者以前也没太关心这个问题,以为写好An...
  • angle_birds
  • angle_birds
  • 2014年02月21日 09:24
  • 5073

android编译系统分析(二)mm编译单个模块

android编译系统分析(二)mm编译单个模块
  • ztguang
  • ztguang
  • 2016年10月31日 15:27
  • 681

android 如何预置APK到 data 和system/app目录

参考 http://blog.csdn.net/sergeycao/article/details/8198205 一、如何将带源码的APK预置进系统? 1)     在 packages/app...
  • newairzhang
  • newairzhang
  • 2016年02月03日 21:53
  • 6913

[笔记]Android中在外部编译kernel module示例

1.Android.mk LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LO...
  • cs0301lm
  • cs0301lm
  • 2015年03月06日 16:07
  • 1323

记录一下最近android7.1.1编译出现的问题

1,模块编译提示错误:  build/core/shared_library.mk:12: *** libsurface_decode: LOCAL_MODULE_PATH for shared li...
  • zhang01
  • zhang01
  • 2017年12月12日 16:26
  • 64

HAL开发全流程(三)

4、实现第3步(即《HAL开发全流程(二)》)中的本地方法——本地访问模块开发 4.1 编写Jni文件 /* * Copyright (C) 2009 The Android Open Source...
  • YongYu_IT
  • YongYu_IT
  • 2016年06月02日 17:24
  • 344

使用HAL库、STM32CubeMX和Keil 5开发入门教程(一):点亮一盏LED灯(NUCLEO-F411RE)

本教程以点亮一盏LED灯为目的为大家演示用STM32CubeMX、Keil、ST-Link开发STM32程序的一般方法。一、学习前的准备工作硬件:一块STM32开发板,一个ST-Link;(我使用的开...
  • CharmingSun
  • CharmingSun
  • 2016年03月04日 14:12
  • 10978

Android架构实例分析之编写hello驱动的HAL层代码

Android架构实例分析之编写hello驱动的HAL层代码摘要:HAL层中文名称又叫硬件抽象层,可以理解我Linux驱动的应用层。本文实现了一个简单的hello HAL的代码,衔接hello驱动和h...
  • seek_0380
  • seek_0380
  • 2016年07月08日 16:20
  • 3024
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HAL开发全流程(一)
举报原因:
原因补充:

(最多只允许输入30个字)