├── ReadMe ├── hardware └── interfaces │ └── led │ └── 1.0 │ ├── ILed.hal │ ├── default │ ├── Android.bp │ ├── android.hardware.led@1.0-service.rc │ ├── ledImpl.cpp │ ├── ledImpl.h │ └── service.cpp │ └── types.hal ├── led_client ├── Android.bp ├── led_client.cpp └── led_client.java └── push.bat /ReadMe: -------------------------------------------------------------------------------- 1 | hidl demo 2 | 1. 以控制LED为例进行demo的编写 3 | 1.1 编写led.hal 和types.hal 4 | 1.2 执行update-makefiles.sh 编译文件 5 | 新建defalut文件夹 6 | 7 | 1.3 实现android.hardware.led@1.0-impl和android.hardware.led@1.0-service 8 | 编写android.bp 9 | cc_library_shared { 10 | name: "android.hardware.led@1.0-impl", 11 | defaults: ["hidl_defaults"], 12 | relative_install_path: "hw", 13 | proprietary: true, 14 | srcs: ["Consumerled.cpp"], 15 | shared_libs: [ 16 | "libhidlbase", 17 | "libhidltransport", 18 | "libhardware", 19 | "liblog", 20 | "libutils", 21 | "android.hardware.led@1.0", 22 | ], 23 | } 24 | 25 | cc_binary { 26 | relative_install_path: "hw", 27 | defaults: ["hidl_defaults"], 28 | name: "android.hardware.led@1.0-service", 29 | proprietary: true, 30 | init_rc: ["android.hardware.led@1.0-service.rc"], 31 | srcs: ["service.cpp"], 32 | 33 | shared_libs: [ 34 | "liblog", 35 | "libhardware", 36 | "libhidlbase", 37 | "libhidltransport", 38 | "libutils", 39 | "android.hardware.led@1.0", 40 | ], 41 | 42 | } 43 | 44 | 接下来,使用相应功能填写存根并设置守护进程。守护进程代码(支持直通)示例: 45 | 46 | #include 47 | 48 | int main(int /* argc */, char* /* argv */ []) { 49 | return defaultPassthroughServiceImplementation("nfc"); 50 | } 51 | defaultPassthroughServiceImplementation 将对提供的 -impl 库执行 dlopen() 操作,并将其作为绑定式服务提供。守护进程代码(对于纯绑定式服务)示例: 52 | 53 | int main(int /* argc */, char* /* argv */ []) { 54 | sp nfc = new Nfc(); 55 | const status_t status = nfc->registerAsService(); 56 | if (status != ::android::OK) { 57 | return 1; // or handle error 58 | } 59 | // join pool or do other things 60 | } 61 | 62 | 63 | add the code to the manifest.xm 以至于hwservicemanager 查找到指定的hidl service 64 | About HIDL configures 65 | device/linaro/hikey/manifest.xml 66 | 67 | android.hardware.led 68 | hwbinder 69 | 1.0 70 | 71 | ILed 72 | default 73 | 74 | 75 | 76 | 77 | 2. 实现java调用hidl service的例子 78 | 2.1 添加库: 79 | 将以下内容添加到 Android.mk 中: 80 | LOCAL_JAVA_LIBRARIES += android.hardware.foo-V1.0-java 81 | 或 82 | 将以下内容添加到 Android.bp 中: 83 | shared_libs: [ 84 | /* … */ 85 | "android.hardware.foo-V1.0-java", 86 | ], 87 | 该库还存在静态版:android.hardware.foo-V1.0-java-static。 88 | 2.2 将以下内容添加到您的 Java 文件中: 89 | import android.hardware.foo.V1_0.IFoo; 90 | ... 91 | // retry to wait until the service starts up if it is in the manifest 92 | IFoo server = IFoo.getService(true /* retry */); // throws NoSuchElementException if not available 93 | IFoo anotherServer = IFoo.getService("second_impl", true /* retry */); 94 | server.doSomething(…); 95 | 96 | 97 | 3. 实现C++ 调用hidl service的例子 98 | 首先将 HAL 库添加到 makefile 中: 99 | Make:LOCAL_SHARED_LIBRARIES += android.hardware.nfc@1.0 100 | Soong:shared_libs: [ …, android.hardware.nfc@1.0 ] 101 | 接下来,添加 HAL 头文件: 102 | #include 103 | … 104 | // in code: 105 | sp client = IFoo::getService(); 106 | client->doThing(); 107 | 108 | 109 | 4. 编写LED驱动 110 | 111 | 112 | -------------------------------------------------------------------------------- /hardware/interfaces/led/1.0/ILed.hal: -------------------------------------------------------------------------------- 1 | 2 | package android.hardware.led@1.0; 3 | 4 | interface ILed 5 | { 6 | //get led status 7 | get() generates (LedStatus result); 8 | 9 | 10 | //set led status 11 | set(LedStatus val) generates(int32_t ret); 12 | 13 | getBrightnessRange() generates(bool ret,BrightnessRange range); 14 | 15 | setBrightnessValue(vec range) generates(bool ret); 16 | 17 | on() ; 18 | 19 | off() ; 20 | 21 | }; -------------------------------------------------------------------------------- /hardware/interfaces/led/1.0/default/Android.bp: -------------------------------------------------------------------------------- 1 | cc_library_shared { 2 | name: "android.hardware.led@1.0-impl", 3 | defaults: ["hidl_defaults"], 4 | srcs: ["ledImpl.cpp"], 5 | shared_libs: [ 6 | "libhidlbase", 7 | "libhidltransport", 8 | "libhardware", 9 | "liblog", 10 | "libutils", 11 | "android.hardware.led@1.0", 12 | ], 13 | } 14 | 15 | cc_binary { 16 | name: "android.hardware.led@1.0-service", 17 | srcs: ["service.cpp", 18 | "ledImpl.cpp"], 19 | 20 | shared_libs: [ 21 | "liblog", 22 | "libhardware", 23 | "libhidlbase", 24 | "libhidltransport", 25 | "libutils", 26 | "android.hardware.led@1.0", 27 | ], 28 | 29 | } 30 | -------------------------------------------------------------------------------- /hardware/interfaces/led/1.0/default/android.hardware.led@1.0-service.rc: -------------------------------------------------------------------------------- 1 | service led-hal-1-0 /vendor/bin/hw/android.hardware.led@1.0-service 2 | class hal 3 | user system 4 | group system -------------------------------------------------------------------------------- /hardware/interfaces/led/1.0/default/ledImpl.cpp: -------------------------------------------------------------------------------- 1 | #define LOG_TAG "LedService" 2 | 3 | #include 4 | #include "ledImpl.h" 5 | 6 | namespace android { 7 | namespace hardware { 8 | namespace led { 9 | namespace V1_0 { 10 | namespace implementation { 11 | 12 | ledImpl::ledImpl() { 13 | state = LedStatus::LED_BAD_VALUE; 14 | ALOGE("ledImpl Init status:%d", state); 15 | } 16 | 17 | Return ledImpl::on() { 18 | state = LedStatus::LED_ON; 19 | ALOGE("ledImpl on status:%d", state); 20 | return Void(); 21 | } 22 | 23 | Return ledImpl::off() { 24 | state = LedStatus::LED_OFF; 25 | ALOGE("ledImpl off status:%d", state); 26 | return Void(); 27 | } 28 | 29 | Return ledImpl::get() { 30 | return state; 31 | } 32 | Return ledImpl::set(LedStatus val) { 33 | if(val == LedStatus::LED_OFF || val == LedStatus::LED_ON) 34 | state = val; 35 | else 36 | return -1; 37 | return 0; 38 | } 39 | 40 | Return ledImpl::getBrightnessRange(getBrightnessRange_cb _hidl_cb) 41 | { 42 | ALOGE("ledImpl getBrightnessRange "); 43 | BrightnessRange range; 44 | range.max = 100; 45 | range.min = 1; 46 | _hidl_cb(true,range); 47 | return Void(); 48 | 49 | } 50 | 51 | Return ledImpl::setBrightnessValue(const hidl_vec& range) 52 | { 53 | ALOGE("ledImpl getBrightnessValue "); 54 | auto iter = range.begin(); 55 | ALOGE("ledImpl getBrightnessValue range.begin: %d",*iter); 56 | iter = range.end(); 57 | ALOGE("ledImpl getBrightnessValue range.end: %d",*iter); 58 | ALOGE("ledImpl getBrightnessValue range.size: %zu",range.size()); 59 | return true; 60 | } 61 | 62 | ILed* HIDL_FETCH_ILed(const char * /*name*/) { 63 | ALOGE("ledImpl HIDL_FETCH_ILed "); 64 | return new ledImpl(); 65 | } 66 | 67 | } // namespace implementation 68 | } // namespace V1_0 69 | } // namespace led 70 | } // namespace hardware 71 | } // namespace android -------------------------------------------------------------------------------- /hardware/interfaces/led/1.0/default/ledImpl.h: -------------------------------------------------------------------------------- 1 | #ifndef ANDROID_HARDWARE_LED_V1_0_LED_H 2 | #define ANDROID_HARDWARE_LED_V1_0_LED_H 3 | #include 4 | 5 | #include 6 | 7 | #include 8 | 9 | 10 | 11 | 12 | namespace android { 13 | namespace hardware { 14 | namespace led { 15 | namespace V1_0 { 16 | namespace implementation { 17 | 18 | using ::android::hardware::led::V1_0::LedStatus; 19 | using ::android::hardware::led::V1_0::BrightnessRange; 20 | using ::android::hardware::led::V1_0::ILed; 21 | using ::android::hardware::hidl_array; 22 | using ::android::hardware::hidl_string; 23 | using ::android::hardware::hidl_vec; 24 | using ::android::hardware::Return; 25 | using ::android::hardware::Void; 26 | using ::android::sp; 27 | 28 | 29 | struct ledImpl : public ILed { 30 | public: 31 | ledImpl(); 32 | Return get() override ; 33 | Return set(LedStatus val) override; 34 | Return on() override; 35 | Return off() override; 36 | Return getBrightnessRange(getBrightnessRange_cb _hidl_cb) override; 37 | Return setBrightnessValue(const hidl_vec& range) override; 38 | private: 39 | LedStatus state; 40 | }; 41 | 42 | extern "C" ILed* HIDL_FETCH_ILed(const char* name); 43 | } // namespace implementation 44 | } // namespace V1_0 45 | } // namespace led 46 | } // namespace hardware 47 | } // namespace android 48 | 49 | #endif //ANDROID_HARDWARE_LED_V1_0_LED_H 50 | -------------------------------------------------------------------------------- /hardware/interfaces/led/1.0/default/service.cpp: -------------------------------------------------------------------------------- 1 | #define LOG_TAG "android.hardware.led@1.0-service" 2 | 3 | #include 4 | #include 5 | #include "ledImpl.h" 6 | using android::hardware::led::V1_0::ILed; 7 | using android::hardware::led::V1_0::implementation::ledImpl; 8 | using android::hardware::defaultPassthroughServiceImplementation; 9 | using android::hardware::configureRpcThreadpool; 10 | using android::hardware::joinRpcThreadpool; 11 | using android::sp; 12 | 13 | 14 | int main() { 15 | #if 0 16 | // Passthrough dlopen so方式 17 | return defaultPassthroughServiceImplementation(); 18 | #else 19 | // Binder 方式 20 | sp service = new ledImpl(); 21 | configureRpcThreadpool(1, true /*callerWillJoin*/); 22 | if(android::OK != service->registerAsService()) 23 | return 1; 24 | joinRpcThreadpool(); 25 | #endif 26 | } 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /hardware/interfaces/led/1.0/types.hal: -------------------------------------------------------------------------------- 1 | package android.hardware.led@1.0; 2 | 3 | 4 | enum LedStatus : uint32_t { 5 | LED_ON, 6 | LED_OFF, 7 | LED_BAD_VALUE, 8 | }; 9 | 10 | 11 | struct BrightnessRange { 12 | uint32_t min; 13 | 14 | uint32_t max; 15 | }; -------------------------------------------------------------------------------- /led_client/Android.bp: -------------------------------------------------------------------------------- 1 | 2 | cc_binary { 3 | relative_install_path: "hw", 4 | defaults: ["hidl_defaults"], 5 | name: "led_client", 6 | proprietary: true, 7 | srcs: ["led_client.cpp"], 8 | 9 | shared_libs: [ 10 | "liblog", 11 | "libhardware", 12 | "libhidlbase", 13 | "libhidltransport", 14 | "libutils", 15 | "android.hardware.led@1.0", 16 | ], 17 | 18 | } 19 | -------------------------------------------------------------------------------- /led_client/led_client.cpp: -------------------------------------------------------------------------------- 1 | 2 | #define LOG_TAG "LED_CLINET" 3 | #include 4 | #include 5 | 6 | using android::hardware::led::V1_0::ILed; 7 | using android::hardware::led::V1_0::LedStatus; 8 | using android::hardware::led::V1_0::BrightnessRange; 9 | using android::hardware::hidl_vec; 10 | using android::sp; 11 | 12 | 13 | int main(){ 14 | // BrightnessRange range; 15 | sp service = ILed::getService(); 16 | if( service == nullptr ){ 17 | ALOGE("Can't find ILed service..."); 18 | return -1; 19 | } 20 | ALOGE("ILed ON"); 21 | service->on(); 22 | 23 | ALOGE("ILed OFF"); 24 | service->off(); 25 | 26 | ALOGE("ILed set"); 27 | service->set(LedStatus::LED_ON); 28 | 29 | ALOGE("ILed get"); 30 | LedStatus ret = service->get(); 31 | ALOGE("ILed get: %d",ret); 32 | 33 | service->getBrightnessRange([](bool ret1,BrightnessRange range){ 34 | ALOGE("ILed getBrightnessRange ret: %d",ret1); 35 | ALOGE("ILed getBrightnessRange Max: %d",range.max); 36 | ALOGE("ILed getBrightnessRange Min: %d",range.min); 37 | }); 38 | int32_t array[] = {5, 6, 7}; 39 | hidl_vec hv1 = std::vector(array, array + 3); 40 | bool ret2 = service->setBrightnessValue(hv1); 41 | ALOGE("ILed getBrightnessValue bool: %d",ret2); 42 | return 0; 43 | } 44 | -------------------------------------------------------------------------------- /led_client/led_client.java: -------------------------------------------------------------------------------- 1 | package com.android.led.client; 2 | import android.util.Slog; 3 | import android.hardware.led.V1_0.ILed; 4 | 5 | public class LedClinet { 6 | public static void main(String args[]){ 7 | 8 | ILed service = ILed.getService(true); 9 | 10 | service.on(); 11 | service.off(); 12 | 13 | } 14 | 15 | 16 | } -------------------------------------------------------------------------------- /push.bat: -------------------------------------------------------------------------------- 1 | adb root 2 | adb remount 3 | adb shell mkdir /data/hidl/ 4 | adb push led_client /data/hidl/ 5 | adb push android.hardware.led@1.0-service /data/hidl/ 6 | adb push hidl_java.java /data/hidl/ 7 | adb push android.hardware.led@1.0-impl.so /vendor/lib64/hw/ 8 | REM adb push android.hardware.led@1.0.so /system/lib64/hw/ 9 | adb push android.hardware.led@1.0.so /vendor/lib64/hw/ 10 | adb push manifest.xml /vendor/ 11 | adb shell chmod 755 /data/hidl/* 12 | 13 | REM adb shell export LD_LIBRARY_PATH=/vendor/lib64/hw:$LD_LIBRARY_PATH 14 | pause --------------------------------------------------------------------------------