You can update preexisting HAL modules to HIDL HAL modules by converting the
header in hardware/libhardware/include/hardware.
Use c2hal
The
c2hal
tool handles most of the conversion work, reducing the number of required manual
changes. For example, to generate a HIDL .hal file for the NFC
HAL:
make c2hal
c2hal -r android.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport -p android.hardware.nfc@1.0 hardware/libhardware/include/hardware/nfc.h
These commands add files in hardware/interfaces/nfc/1.0/. Running
hardware/interfaces/update-makefiles.sh from the $ANDROID_BUILD_TOP
directory also adds the required makefile to the HAL. From here, you can
make manual changes to fully convert the HAL.
c2hal activities
When you run c2hal, everything in the header file is transferred
to .hal files.
c2hal identifies structs that contain function pointers in the
provided header file and converts each struct into a separate interface file.
For example, alloc_device_t is converted to the
IAllocDevice HAL module (in the file
IAllocDevice.hal).
All other data types are copied over into a types.hal file.
Pound-defines are moved into enums, and items not a part of HIDL or not
convertible (such as static-function declarations) are copied into comments
marked with the text "NOTE".
Manual activities
The c2hal tool doesn't know what to do when it encounters
certain constructs. For example, HIDL has no concept of raw pointers; because of
this, when c2hal encounters a pointer in header files, it doesn't
know whether the pointer should be interpreted as an array or as a reference to
another object. Void pointers are also similarly opaque.
Field such as int reserved[7] must be manually removed during
the transition to HIDL. Items such as the name of the return value should be
updated to something more meaningful; for example, converting the return
parameter of methods such as write in NFC from the autogenerated
int32_t write_ret to Status status (where
Status is a new enum containing possible NFC statuses).
Implement the HAL
After you have created .hal files to represent your HAL, you
must generate the makefiles (Make or Soong) that create the language support in
C++ and Java (unless the HAL uses a feature unsupported in Java). The
./hardware/interfaces/update-makefiles.sh script can automatically
generate makefiles for HALs located in the hardware/interfaces
directory (for HALs in other locations, simply update the script).
When the makefiles are up to date, you are ready to generate header files and implement methods. For details on implementing the generated interface, see HIDL C++ (for C++ implementations) or HIDL Java (for Java implementations).