Hi. Found this thread when googling my name, since i did some of the code this is built on has my name in copyright headers. Has changed work place and has not been working with Android for a year and a half but I did the vendor interface and most of the lower layer (JNI and below) and most of the CG2900 driver and might be able to help with some of the questions raising but please remember it is more than two years since I did the work so I might need time to fresh up. Also note the CG2900 driver is proprietary so I can't show or discuss any of its code (and I don't have access to it any way).
Regarding example to get started Marco Sinigaglia did an (sadly now abandoned) attempt to do a plain V4L2 driver which can be found on https://android-review.googlesource.com/#/c/23522/
Since V4L2 doesn't support things like scan etc he did that in software making it extremely slow but he got some of the basic to work, not sure about the RDS though but I can see there is code to implement it.
To get the driver started for RX you at least need to implement the following methods (see validation in androidFmRadioLoadFmLibrary fmradio/jni/android_fmradio.cpp)
and just set everything else to NULL. Now you can at least make the radio start and check that audio is routing correctly.
There is no need to implement callbacks from the vendor driver to make it work, although it might be nice to implement
to enable the app to detect these things without polling the lower layers.
Of course you would probably like to implement change and get of frequency, scan etc so these methods should also be fairly mandatory
although the framework does not enforce them, the JNI layer will just give a FMRADIO_UNSUPPORTED_OPERATION if higher layers try to use them.
If you just implement RDS Text then callback on_rds_data_found need to be called when new data has arrived. If AF and TA are to be implemented it gets more complicated. a callback on_automatic_switch need to be called when frequency is switch or is switched back after a TA is finished.