正文 字体大小:

Android4.2关于bluetooth在HAL层的分析(1)

(2013-09-10 14:58:58)

标签:

hal

bluedroid

android

jni

分类: Bluetooth
1.一些常用的数据结构

hardware/libhardware/include/hardware.h中
定义了三个重要的结构:
struct hw_module_t; //模块类型
struct hw_module_methods_t;   //模块方法
struct hw_device_t;   //设备类型
 
hw_module_t中包含结构hw_module_methods_t
hw_module_methods_t只有一个唯一的Open方法,如下:
 
int (*open)(const struct hw_module_t* module, const char* id,struct hw_device_t** device);
struct hw_device_t中包含hw_module_t结构和一个close方法如下:
 
int (*close)(struct hw_device_t* device);
这几个结构十分关键,是HAL层向上暴露的接口。
 
2.定义蓝牙HAL层结构
在hardware/libhardware/include/bluetooth.h中定义以下关键结构
首先是定义的蓝牙模块ID
#define BT_HARDWARE_MODULE_ID "bluetooth"
#define BT_STACK_MODULE_ID "bluetooth"
#define BT_STACK_TEST_MODULE_ID "bluetooth_test"
 
其次是定义的蓝牙硬件设备接口
//要求自定义xxx_device_t的第一个成员必须是hw_device_t类型,其次才是其它的一些接口信息.   
typedef struct {
    struct hw_device_t common;
    const bt_interface_t* (*get_bluetooth_interface)();
} bluetooth_device_t;
 
除了这个结构,还必须定义关hw_module_t类型的实例HAL_MODULE_INFO_SYM。这个结构在Bluedroid的bluetooth.c中定义。
//变量名必须为HAL_MODULE_INFO_SYM,这是强制要求的,你要写Android的HAL就得遵循这个游戏规则
struct hw_module_t HAL_MODULE_INFO_SYM = {
    .tag = HARDWARE_MODULE_TAG,
    .version_major = 1,
    .version_minor = 0,
    .id = BT_HARDWARE_MODULE_ID,
    .name = "Bluetooth Stack",
    .author = "The Android Open Source Project",
    .methods = &bt_stack_module_methods 
};
定义的bt_stack_module_methods如下:
static int open_bluetooth_stack (const struct hw_module_t* module, char const* name, struct hw_device_t** abstraction)
{
    bluetooth_device_t *stack = malloc(sizeof(bluetooth_device_t) ); 
    memset(stack, 0, sizeof(bluetooth_device_t) );
    stack->common.tag = HARDWARE_DEVICE_TAG;
    stack->common.version = 0;
    stack->common.module = (struct hw_module_t*)module;
    stack->common.close = close_bluetooth_stack;
    stack->get_bluetooth_interface = bluetooth__get_bluetooth_interface; 
    *abstraction = (struct hw_device_t*)stack;  //GJ:强制转换,bluetooth_device_t的第一个成员为hw_device_t,传到上层
    return 0;
}
static struct hw_module_methods_t bt_stack_module_methods = {
    .open = open_bluetooth_stack,
};
 
在/packages/apps/Bluetooth/jni/com_android_bluetooth_btservice_AdapterService.cpp中实现的是bluetooth的JNI代码,是上层Java与下层Bluedroid的接口。
在static void classInitNative(JNIEnv* env, jclass clazz)函数中有以下部分code:
    char value[PROPERTY_VALUE_MAX];
    property_get("bluetooth.mock_stack", value, ""); //
    const char *id = (strcmp(value, "1")? BT_STACK_MODULE_ID : BT_STACK_TEST_MODULE_ID);
    //JNI获取HAL层模块的通用方式,根据模块ID获得hw_module_t对象
    err = hw_get_module(id, (hw_module_t const**)&module); 
    if (err == 0) 
    {
        hw_device_t* abstraction;
        err = module->methods->open(module, id, &abstraction);
        if (err == 0)
       { 
    //强制转换,bluetooth_module_t的第一个成员为abstraction
            bluetooth_module_t* btStack = (bluetooth_module_t *)abstraction; 
            sBluetoothInterface = btStack->get_bluetooth_interface();  //GJ:JAVA层的sBuletooth获得bluedroid中实现的bluetoothInterface
        } 
 
 
分享:

 

0

喜欢

阅读(363) 评论 (0) 收藏(0) 转载(0) 喜欢 打印举报
已投稿到:

ZT Android4.2关于bluetooth在HAL层的分析(1)的更多相关文章

  1. 51全志R58平台Android4.4下Camera的HAL层修改

    51全志R58平台Android4.4下Camera的HAL层修改 2018/11/7 15:20 版本:V1.0 开发板:SC5806 1.系统编译: (略) 2.全志R58平台Android4.4 ...

  2. Android Hal层简要分析

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

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

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

  4. 如何在 kernel 和 hal 层读取同一个标志

    很多时候我们需要从 HAL 层(Hardware Abstract Layer)传一个标志给 kernel 层.一般这种传递是不能直接通过定义全局变量来实现的. 此时可以通过读写文件来实现该标志. 譬 ...

  5. 高通HAL层之Sensor HAL

    高通的HAL层其实分为两种,一种是直接从kernel这边报数据上来的,由sensor HAL层来监听,另一种是走ADSP的模式,HAL层是通过qmi的形式进行监听的: 走ADSP架构的可以看下面的博客 ...

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

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

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

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

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

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

  9. 深入浅出 - Android系统移植与平台开发(八)- HAL Stub框架分析

    作者:唐老师,华清远见嵌入式学院讲师. 1. HAL Stub框架分析 HAL stub的框架比较简单,三个结构体.两个常量.一个函数,简称321架构,它的定义在:@hardware/libhardw ...

随机推荐

  1. R语言多元素向量

    使用冒号运算带有数值数据(数值的增加为1) # Creating a sequence from 5 to 13. v <- 5:13 print(v) # Creating a sequenc ...

  2. Memcached分布式算法详解--转

    http://xiexiejiao.cn/java/memcached-consistent-hashing.html Memcached分布式算法在网上一搜可以找到一大片了,不过对于Memcache ...

  3. ibatis插入正确但查询不出数据的问题

    现在,使用打印的sql在oracle数据库客户端能查询出结果,但执行ibatis查询语句不行,ibatis插入可以. 解决问题的历程: 1. 去掉sql中的where语句,仍然查找不到,确定不是sql ...

  4. 数据存储之第三方FMDB优化

    最近项目要用到数据库,采用的是第三方FMDB, 之前做C#时用过sqlHelper,自己就按着sqlHelper的思路封装了一下,封装的也比较简单,看到网上有一些根据FMDB封装的ORM框架,但基本都 ...

  5. [转]OData and Authentication – Part 6 – Custom Basic Authentication

    本文转自:https://blogs.msdn.microsoft.com/astoriateam/2010/07/21/odata-and-authentication-part-6-custom- ...

  6. vue-cli 中遇见的问题,记录爬坑日常!

    本片文章我将会记录使用vue-cli 以及一些相关插件遇见的问题和解决方案,另外本文章将会持续更新,本着互联网分享精神,希望我所记录的日常能对大家有所帮助. 1.在img和html文件处于同级阶段,i ...

  7. C# 之程序退出的方法

    1.this.Close();   只是关闭当前窗口,若不是主窗体的话,是无法退出程序的,另外若有托管线程(非主线程),也无法干净地退出: 2.Application.Exit();  强制所有消息中 ...

  8. java.sql.SQLException: Io 异常: Invalid number format for port number

    java.sql.SQLException: Io 异常: Invalid number format for port number   jdbc数据库链接配置没有写端口号 ​ 要检查jdbc的配置 ...

  9. java:模拟队列操作

    import java.util.LinkedList; public class Myqueue { private LinkedList<Object> linkedList; pub ...

  10. MVC 中使用kindEditor 图片上传在IE 上进行上传出现的问题

    在IE 上使用KindEditor 进行单张图片上传的时候会出现一个下载安全警告,这样将会造成图片上传失败,出现的错误页面: