6.4 Android硬件访问服务编写HAL代码

JNI向上提供本地函数,向下加载HAL文件,并调用HAL的函数;

HAL负责访问驱动程序执行硬件操作

JNI和HAL都是用c语言或者C++语言编写的,JNI加载HAL的实质就是使用dlopen加载动态库文件

安多人源代码中第dlopen做了一层封装,在JNI中是通过hw_get_module来加载动态库

external\chromium_org\third_party\hwcplus\src\hardware.c
hw_get_module("led")//分析hw_get_module

  1. 模块名==>文件名
    hw_get_module_by_class("led", NULL)
      name = "led"
        property_get(prop_name,prop,NULL)     prop_name是某个属性,根据属性来获得prop值
        hw_module_exists 判断是否存在led.prop.so
(在运行的Android系统中执行 getprop ro.hardware可以查看这个ro.hardware属性存在么,并打印其值)

  2. 加载
    load
      dlopen(filename)
      dlsym("HMI") 从SO文件中获得名为HMI的hw_module_t结构体
      strcmp(id, hmi->id) 判断名字是否一致(hmi->id, "led")

      如果一致,把找到的hmi结构体传出去

hw_module_exists(char *path, size_t path_len, const char *name,const char *subname)

led.tiny4412.so
led.exynos4.so
led.default.so

它用来判断"name"."subname".so文件是否存在
查找的目录:
a. HAL_LIBRARY_PATH 环境变量
b. /vendor/lib/hw
c. /system/lib/hw    //4412开发板只会去这个目录下去查找,其他几个目录都没设置

 
property_get : 属性系统
属性<键,值> <name, value>

JNI 怎么使用 HAL
a. hw_get_module 获得一个hw_module_t结构体
b. 调用 module->methods->open(module, device_name, &device) //module里面有多个device
  获得一个hw_device_t结构体
  并且把hw_device_t结构体转换为设备自定义的结构体

HAL 怎么写
a. 实现一个名为HMI的hw_module_t结构体
b. 实现一个open函数, 它会根据name返回一个设备自定义的结构体
  这个设备自定义的结构体的第1个成员是 hw_device_t结构体
  还可以定义设备相关的成员

打印信息简介:
a. 有三类打印信息: app, system, radio
程序里使用 ALOGx, SLOGx, RLOGx来打印
b. x表示6种打印级别,有:
V Verbose
D Debug
I Info
W Warn
E Error
F Fatal

比如:
#define LOG_TAG "LedHal"
ALOGI("led_open : %d", fd);

c. 打印出来的格式为:
I/LedHal ( 1987): led_open : 65
(级别) LOG_TAG 进程号 打印信息

d. 使用 logcat 命令查看
logcat LedHal:I *:S

实现led_hal.c

猜你喜欢

转载自www.cnblogs.com/liusiluandzhangkun/p/9125810.html
6.4
今日推荐