Android研究_Hardware Composer_2 加载HWComposer模块及编译分析

3 篇文章 0 订阅

      上文有提到过,HWComposer本质上就是Android的HAL层,用于提供一些api,使得AndroidFramework可以通过HWComposer接口来对硬件混合模块进行操作。这边,我们主要关注的时候HWComposer的信息,而和HAL相关的知识点,请参考文献【6】。

      在HWComposer的构建函数中,通过调用loadHwcModule()来完成HWC模块的加载。             HWC_HARDWARE_MODULE_ID是HAL中识别hwc的id,定义在/hardware/libhardware/include/hardware/HWComposer.h中:

#defineHWC_HARDWARE_MODULE_ID "HWComposer"。

// Load and prepare the hardware composer module.  Sets mHwc.

void HWComposer::loadHwcModule()

{

    hw_module_t const* module;

 

// 根据HAL加载库的规则,会先从"/vendor/lib/hw",再从"/system/lib/hw"目录下面去寻找HWComposer.”subname”.so,其中“subname”是从如下几个属性值获取的,比如"ro.hardware""ro.product.board" "ro.board.platform""ro.arch"。我们以N5为例子,这个过程加载的so库为:system/lib/hw/HWComposer.msm8974.so

    if (hw_get_module(HWC_HARDWARE_MODULE_ID, &module) != 0) {

        ALOGE("%s module not found", HWC_HARDWARE_MODULE_ID);

        return;

    }

 

// 然后打开HWC_HARDWARE_COMPOSER设备。在实际的代码中,这个主要用于module name的校验。

    int err = hwc_open_1(module, &mHwc);

    if (err) {

        ALOGE("%s device failed to initialize (%s)",

              HWC_HARDWARE_COMPOSER, strerror(-err));

        return;

    }

 

    if (!hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_0) ||

            hwcHeaderVersion(mHwc) < MIN_HWC_HEADER_VERSION ||

            hwcHeaderVersion(mHwc) > HWC_HEADER_VERSION) {

        ALOGE("%s device version %#x unsupported, will not be used",

              HWC_HARDWARE_COMPOSER, mHwc->common.version);

        hwc_close_1(mHwc);

        mHwc = NULL;

        return;

    }

}

HWComposer.msm8974.so源码位置为:hardware/qcom/display/msm8974/libHWComposer。并在编译的时候,通过PRODUCT_PACKAGES完成安装。

@device/tencent/hammerhead/device.mk

PRODUCT_PACKAGES += \

    gralloc.msm8974 \

    libgenlock \

    HWComposer.msm8974 \

    memtrack.msm8974 \

    libqdutils \

    libqdMetaData

 

在该目录下的hwc.cpp中,有对HWComposer module做了详细的定义:

static int hwc_device_open(const struct hw_module_t* module,

                           const char* name,

                           struct hw_device_t** device);

 

static struct hw_module_methods_t hwc_module_methods = {

    open: hwc_device_open

};

 

hwc_module_t HAL_MODULE_INFO_SYM = {

    common: {

        tag: HARDWARE_MODULE_TAG, // HAL规定写死

        version_major: 2,

        version_minor: 0,

        id: HWC_HARDWARE_MODULE_ID,

        name: "Qualcomm Hardware Composer Module",

        author: "CodeAurora Forum",

        methods: &hwc_module_methods,

        dso: 0,

        reserved: {0},

    }

};

从上面的代码中可以知道,err = hwc_open_1(module,&mHwc);最后调用的是hwc_device_open。

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

                           struct hw_device_t** device)

{

    int status = -EINVAL;

 

    if (!strcmp(name, HWC_HARDWARE_COMPOSER)) {

        struct hwc_context_t *dev;

        dev = (hwc_context_t*)malloc(sizeof(*dev));

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

 

        //Initialize hwc context

        initContext(dev);

 

        //Setup HWC methods

        dev->device.common.tag          = HARDWARE_DEVICE_TAG;

        dev->device.common.version      = HWC_DEVICE_API_VERSION_1_3;

        dev->device.common.module       = const_cast<hw_module_t*>(module);

        dev->device.common.close        = hwc_device_close;

        dev->device.prepare             = hwc_prepare;

        dev->device.set                 = hwc_set;

        dev->device.eventControl        = hwc_eventControl;

        dev->device.blank               = hwc_blank;

        dev->device.query               = hwc_query;

        dev->device.registerProcs       = hwc_registerProcs;

        dev->device.dump                = hwc_dump;

        dev->device.getDisplayConfigs   = hwc_getDisplayConfigs;

        dev->device.getDisplayAttributes = hwc_getDisplayAttributes;

        *device = &dev->device.common;

        status = 0;

    }

    return status;

}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值