当前位置: 首页 > wzjs >正文

网站开发 资质广告联盟怎么加入

网站开发 资质,广告联盟怎么加入,企业级java电商网站开发,做外贸的女生干净吗一、直通式HAL 这里使用一个案例来介绍直通式HAL,选择MTK的NFC HIDL 1.0为例,因为比较简单,代码量也比较小,其源码路径:vendor/hardware/interfaces/nfc/1.0/ 1、NFC HAL的定义 1)NFC HAL数据类型 通常定…

一、直通式HAL

这里使用一个案例来介绍直通式HAL,选择MTK的NFC HIDL 1.0为例,因为比较简单,代码量也比较小,其源码路径:vendor/hardware/interfaces/nfc/1.0/

1、NFC HAL的定义

1)NFC HAL数据类型

通常定义在types.hal里面,其语法和java/c/c++可能不一致,详细参考https://source.android.com/docs/core/architecture/hidl/types?hl=zh-cn

2)NFC HAL回调接口

HAL的回调接口,即通常被定义为IXXXCallback

INfcClientCallback从命名可以知道给客户端的回调接口,即给客户端进程或者framework层提供的回调接口,即hal可以通过该接口向对方回调数据

3)NFC HAL接口定义

HAL的正式接口,同前面的回调接口刚好相反,即

HAL接口:客户端/Framework ------->  HAL进程(HAL进程是被调用者)

CALL接口:HAL进程  ------>客户端/Framework (HAL进程主动发起)

2、NFC HAL的逻辑

NFC HAL 1.0的版本是一个典型的直通式,其源码就nfc.cpp,逻辑相对比较简单

//vendor/hardware/interfaces/nfc/1.0/default/Nfc.h
#ifndef ANDROID_HARDWARE_NFC_V1_0_NFC_H
#define ANDROID_HARDWARE_NFC_V1_0_NFC_H#include <android/hardware/nfc/1.0/INfc.h>
#include <hidl/Status.h>
#include <hardware/hardware.h>
#include <hardware/nfc.h>
namespace android {
namespace hardware {
namespace nfc {
namespace V1_0 {
namespace implementation {using ::android::hardware::nfc::V1_0::INfc;
using ::android::hardware::nfc::V1_0::INfcClientCallback;
using ::android::hardware::Return;
using ::android::hardware::Void;
using ::android::hardware::hidl_vec;
using ::android::hardware::hidl_string;
using ::android::sp;struct Nfc : public INfc, public hidl_death_recipient {Nfc(nfc_nci_device_t* device);::android::hardware::Return<NfcStatus> open(const sp<INfcClientCallback>& clientCallback) override;::android::hardware::Return<uint32_t> write(const hidl_vec<uint8_t>& data) override;::android::hardware::Return<NfcStatus> coreInitialized(const hidl_vec<uint8_t>& data) override;::android::hardware::Return<NfcStatus> prediscover() override;::android::hardware::Return<NfcStatus> close() override;::android::hardware::Return<NfcStatus> controlGranted() override;::android::hardware::Return<NfcStatus> powerCycle() override;static void eventCallback(uint8_t event, uint8_t status) {if (mCallback != nullptr) {auto ret = mCallback->sendEvent((::android::hardware::nfc::V1_0::NfcEvent)event,(::android::hardware::nfc::V1_0::NfcStatus)status);if (!ret.isOk()) {ALOGW("Failed to call back into NFC process.");}}}static void dataCallback(uint16_t data_len, uint8_t* p_data) {hidl_vec<uint8_t> data;data.setToExternal(p_data, data_len);if (mCallback != nullptr) {auto ret = mCallback->sendData(data);if (!ret.isOk()) {ALOGW("Failed to call back into NFC process.");}}}virtual void serviceDied(uint64_t /*cookie*/,const wp<::android::hidl::base::V1_0::IBase>& /*who*/) {close();}private:static sp<INfcClientCallback> mCallback;const nfc_nci_device_t*       mDevice;
};extern "C" INfc* HIDL_FETCH_INfc(const char* name);}  // namespace implementation
}  // namespace V1_0
}  // namespace nfc
}  // namespace hardware
}  // namespace android#endif  // ANDROID_HARDWARE_NFC_V1_0_NFC_H//vendor/hardware/interfaces/nfc/1.0/default/Nfc.cpp
#define LOG_TAG "android.hardware.nfc@1.0-impl"#include <log/log.h>#include <hardware/hardware.h>
#include <hardware/nfc.h>
#include "Nfc.h"namespace android {
namespace hardware {
namespace nfc {
namespace V1_0 {
namespace implementation {sp<INfcClientCallback> Nfc::mCallback = nullptr;Nfc::Nfc(nfc_nci_device_t* device) : mDevice(device) {}// Methods from ::android::hardware::nfc::V1_0::INfc follow.
::android::hardware::Return<NfcStatus> Nfc::open(const sp<INfcClientCallback>& clientCallback)  {mCallback = clientCallback;if (mDevice == nullptr || mCallback == nullptr) {return NfcStatus::FAILED;}mCallback->linkToDeath(this, 0 /*cookie*/);int ret = mDevice->open(mDevice, eventCallback, dataCallback);return ret == 0 ? NfcStatus::OK : NfcStatus::FAILED;
}::android::hardware::Return<uint32_t> Nfc::write(const hidl_vec<uint8_t>& data)  {if (mDevice == nullptr) {return -1;}return mDevice->write(mDevice, data.size(), &data[0]);
}::android::hardware::Return<NfcStatus> Nfc::coreInitialized(const hidl_vec<uint8_t>& data)  {hidl_vec<uint8_t> copy = data;if (mDevice == nullptr || copy.size() == 0) {return NfcStatus::FAILED;}int ret = mDevice->core_initialized(mDevice, &copy[0]);return ret == 0 ? NfcStatus::OK : NfcStatus::FAILED;
}::android::hardware::Return<NfcStatus> Nfc::prediscover()  {if (mDevice == nullptr) {return NfcStatus::FAILED;}return mDevice->pre_discover(mDevice) ? NfcStatus::FAILED : NfcStatus::OK;
}::android::hardware::Return<NfcStatus> Nfc::close()  {if (mDevice == nullptr || mCallback == nullptr) {return NfcStatus::FAILED;}mCallback->unlinkToDeath(this);return mDevice->close(mDevice) ? NfcStatus::FAILED : NfcStatus::OK;
}::android::hardware::Return<NfcStatus> Nfc::controlGranted()  {if (mDevice == nullptr) {return NfcStatus::FAILED;}return mDevice->control_granted(mDevice) ? NfcStatus::FAILED : NfcStatus::OK;
}::android::hardware::Return<NfcStatus> Nfc::powerCycle()  {if (mDevice == nullptr) {return NfcStatus::FAILED;}return mDevice->power_cycle(mDevice) ? NfcStatus::FAILED : NfcStatus::OK;
}INfc* HIDL_FETCH_INfc(const char * /*name*/) {nfc_nci_device_t* nfc_device;int ret = 0;const hw_module_t* hw_module = nullptr;ret = hw_get_module (NFC_NCI_HARDWARE_MODULE_ID, &hw_module);if (ret == 0) {ret = nfc_nci_open (hw_module, &nfc_device);if (ret != 0) {ALOGE ("nfc_nci_open failed: %d", ret);}}elseALOGE ("hw_get_module %s failed: %d", NFC_NCI_HARDWARE_MODULE_ID, ret);if (ret == 0) {return new Nfc(nfc_device);} else {ALOGE("Passthrough failed to load legacy HAL.");return nullptr;}
}} // namespace implementation
}  // namespace V1_0
}  // namespace nfc
}  // namespace hardware
}  // namespace android

1)如何集成了驱动?

首先在nfc.h定义了很关键的成员变量mDevice,熟悉C/C++代码的从命名来看应该是一个驱动关联的句柄:

 const nfc_nci_device_t*       mDevice;

在nfc.cpp代码中可以很明显的看到通过linux和hal的机制去打开nfc驱动设备节点:

因此有理由相信这里的mDevice其实就是nfc驱动设备节点的一个句柄,所以解析来的代码逻辑其实就是对nfc驱动设备节点的文件操作了。

2)客户端如何通过hal调用驱动?

对驱动设备节点的第一个操作就是open,在open之后我们就可以对设备节点进行write或者其他操作,如下几个函数,都是NFC HAL接口的定义,因此HAL进程这里都是作为被动调用的一方,最后通过mDevice->XXX的方式调用驱动代码,驱动代码实现具体功能。

3)驱动阶段如何主动返回数据?

那么如果驱动程序想主动返回数据给到客户端,或者给到系统framework层,那么如何操作呢?

这时需要在看看open函数:

我们来看看函数指针eventCallback和dataCallback如何实现?

3、NFC HAL 流程图

http://www.dtcms.com/wzjs/250479.html

相关文章:

  • 网上做ps赚钱的网站天津优化公司哪家好
  • 中小企业网站模板百度网站名称
  • 自己做个网站要多少钱搜索引擎优化涉及的内容
  • 怎么做网站的界面网站设计模板
  • 易企cms网站模板搜索引擎技术包括哪些
  • 株洲网站建设报价方案昆明新闻头条最新消息
  • 手机在线做ppt的网站百度指数功能模块有哪些
  • 海外vps一键配置WordPress长沙专业seo优化公司
  • 中国保密在线网站培训如何用手机制作网站
  • 怎么给企业制作网站东莞建设企业网站公司
  • 江苏运营网站建设业务优化公司网站排名
  • 官网建设目标seo研究中心怎么样
  • 旅行社网站建设规划的内容广州seo公司品牌
  • 中国空间站机械臂西安seo推广
  • 网站如何做关键词seo优化关键词优化骗局
  • 微信做网站的弊端百度图片搜索引擎
  • 班级网站源代码下载深圳网站关键词优化推广
  • 网站域名实名认证查询目前最新的营销方式有哪些
  • 五莲网站建设西安百度快照优化
  • 做家教网站的资源是什么seo关键词排行优化教程
  • 西安网站建设开发公司广告公司品牌营销推广
  • 网站空间到期时间查询网络优化大师app
  • 互动性的网站网站规划与设计
  • windows搭建php网站百度下载应用
  • 外贸高端网站开发杭州seo推广优化公司
  • 怎样做网站后台运营友情链接平台站长资源
  • 简历怎么写长沙优化科技有限公司正规吗
  • 网站上图怎么用ps做小程序拉新推广平台
  • 贵阳专业做网站公司有哪些seo推广方法
  • 微信公众号文章怎么转wordpress147seo工具