summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohan Palmaeus <johan.xj.palmaeus@stericsson.com>2011-01-12 11:13:22 +0100
committerAlin Jerpelea <jerpelea@gmail.com>2013-01-21 18:39:39 +0200
commitf67c5b45f973c6c0cffef32bf37035fbb80aacc3 (patch)
treed79791846da2757f9efa0f1c2af3547c19e3e6dc
parent07af9b902495e174248d5a3fb2157d5d186c2770 (diff)
downloadhardware_libhardware-f67c5b45f973c6c0cffef32bf37035fbb80aacc3.zip
hardware_libhardware-f67c5b45f973c6c0cffef32bf37035fbb80aacc3.tar.gz
hardware_libhardware-f67c5b45f973c6c0cffef32bf37035fbb80aacc3.tar.bz2
FM Radio: Add support for FM Radio in Android
Creating interface and framework for using FM Radio RX and TX from different vendors. Change-Id: I1a71aed01bfffdddfabf1cdfbfa3707cb1ed016b Signed-off-by: Benn Porscke <benn.porscke@stericsson.com>
-rw-r--r--include/hardware/fmradio.h172
1 files changed, 172 insertions, 0 deletions
diff --git a/include/hardware/fmradio.h b/include/hardware/fmradio.h
new file mode 100644
index 0000000..49b3ded
--- /dev/null
+++ b/include/hardware/fmradio.h
@@ -0,0 +1,172 @@
+/*
+ * Copyright (C) ST-Ericsson SA 2010
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Author: johan.xj.palmaeus@stericsson.com for ST-Ericsson
+ */
+
+/*
+ * Interface file between the vendor specific drivers and the fmradio
+ * jni layer. The vendor driver need to define register function with
+ * name defined by FMRADIO_REGISTER_FUNC of type fmradio_reg_func_t that
+ * will return a pointer to a signature (FMRADIO_SIGNATURE) to make sure
+ * it executed correctly and fill struct fmradio_vendor_methods with
+ * functions implementing functions (or NULL if not supported).
+ */
+
+#ifndef ANDROID_FMRADIO_INTERFACE_H
+#define ANDROID_FMRADIO_INTERFACE_H
+
+__BEGIN_DECLS
+
+#define FMRADIO_REGISTER_FUNC "register_fmradio_functions"
+
+#define FMRADIO_SIGNATURE 0xDEADBABE
+
+#define FMRADIO_CAPABILITY_RECEIVER 0x0001
+#define FMRADIO_CAPABILITY_TRANSMITTER 0x0002
+#define FMRADIO_CAPABILITY_TUNER_WRAP_AROUND 0x0004
+#define FMRADIO_CAPABILITY_RDS_SUPPORTED 0x0008
+
+/*
+ * return values. Not defined as enum since some functions either
+ * return a positive value or these codes, like getFrequency.
+ */
+#define FMRADIO_OK 0
+#define FMRADIO_INVALID_STATE -1 /* internally in jni layer */
+#define FMRADIO_UNSUPPORTED_OPERATION -2
+#define FMRADIO_IO_ERROR -3
+#define FMRADIO_INVALID_PARAMETER -4
+#define FMRADIO_FORCED_RESET -5
+
+/* RDS */
+#define RDS_MAX_AFS 25
+#define RDS_PSN_MAX_LENGTH 8
+#define RDS_RT_MAX_LENGTH 64
+#define RDS_CT_MAX_LENGTH 14
+#define RDS_PTYN_MAX_LENGTH 8
+#define RDS_NUMBER_OF_TMC 3
+
+enum fmradio_band_t {
+ FMRADIO_BAND_US,
+ FMRADIO_BAND_EU,
+ FMRADIO_BAND_JAPAN,
+ FMRADIO_BAND_CHINA
+};
+
+enum fmradio_seek_direction_t {
+ FMRADIO_SEEK_DOWN,
+ FMRADIO_SEEK_UP
+};
+
+enum fmradio_reset_reason_t {
+ FMRADIO_RESET_NON_CRITICAL = 0,
+ FMRADIO_RESET_CRITICAL,
+ FMRADIO_RESET_OTHER_IN_USE, /* internally in jni layer */
+ FMRADIO_RESET_RADIO_FORBIDDEN, /* internally in java layer */
+};
+
+enum fmradio_extra_command_type_t {
+ FMRADIO_TYPE_INT,
+ FMRADIO_TYPE_STRING
+};
+
+enum fmradio_switch_reason_t {
+ FMRADIO_SWITCH_AF,
+ FMRADIO_SWITCH_TA,
+ FMRADIO_SWITCH_TA_END
+};
+
+union fmradio_extra_data_t {
+ int int_value;
+ char *string_value;
+};
+
+struct fmradio_rds_bundle_t {
+ unsigned short pi;
+ short tp;
+ short pty;
+ short ta;
+ short ms;
+ short num_afs;
+ int af[RDS_MAX_AFS];
+ char psn[RDS_PSN_MAX_LENGTH + 1];
+ char rt[RDS_RT_MAX_LENGTH + 1];
+ char ct[RDS_CT_MAX_LENGTH + 1];
+ char ptyn[RDS_PTYN_MAX_LENGTH + 1];
+ short tmc[RDS_NUMBER_OF_TMC];
+ int taf;
+};
+
+struct fmradio_extra_command_ret_item_t {
+ char *key;
+ enum fmradio_extra_command_type_t type;
+ union fmradio_extra_data_t data;
+};
+
+/* vendor callbacks only for RX */
+struct fmradio_vendor_callbacks_t {
+ void (*on_playing_in_stereo_changed) (int is_stereo);
+ void (*on_rds_data_found) (struct fmradio_rds_bundle_t * rds_bundle,
+ int frequency);
+ void (*on_signal_strength_changed) (int new_level);
+ void (*on_automatic_switch) (int new_freq,
+ enum fmradio_switch_reason_t reason);
+ void (*on_forced_reset) (enum fmradio_reset_reason_t reason);
+};
+
+struct fmradio_vendor_methods_t {
+ int (*rx_start) (void ** session_data,
+ const struct fmradio_vendor_callbacks_t * callbacks,
+ int low_freq, int high_freq, int default_freq, int grid);
+ int (*tx_start) (void ** session_data,
+ const struct fmradio_vendor_callbacks_t * callbacks,
+ int low_freq, int high_freq, int default_freq, int grid);
+ int (*pause) (void ** session_data);
+ int (*resume) (void ** session_data);
+ int (*reset) (void ** session_data);
+ int (*set_frequency) (void ** session_data, int frequency);
+ int (*get_frequency) (void ** session_data);
+ int (*stop_scan) (void ** session_data);
+ int (*send_extra_command) (void ** session_data, const char * command,
+ char ** parameters,
+ struct fmradio_extra_command_ret_item_t ** out_parameters);
+ /* rx only */
+ int (*scan) (void ** session_data, enum fmradio_seek_direction_t direction);
+
+ int (*full_scan) (void ** session_data, int ** found_freqs,
+ int ** signal_strenghts);
+ int (*get_signal_strength) (void ** session_data);
+ int (*is_playing_in_stereo) (void ** session_data);
+ int (*is_rds_data_supported) (void ** session_data);
+ int (*is_tuned_to_valid_channel) (void ** session_data);
+ int (*set_automatic_af_switching) (void ** session_data, int automatic);
+ int (*set_automatic_ta_switching) (void ** session_data, int automatic);
+ int (*set_force_mono) (void ** session_data, int force_mono);
+ int (*get_threshold) (void ** session_data);
+ int (*set_threshold) (void ** session_data, int threshold);
+ int (*set_rds_reception) (void ** session_data, int use_rds);
+ /* tx only */
+ int (*block_scan) (void ** session_data, int low_freq, int high_freq,
+ int ** found_freqs, int ** signal_strenghts);
+ int (*set_rds_data) (void ** session_data, char * key, void * value);
+};
+
+typedef int (*fmradio_reg_func_t) (unsigned int * signature_p,
+ struct fmradio_vendor_methods_t * vendor_funcs_p);
+
+__END_DECLS
+
+#endif // ANDROID_FMRADIO_INTERFACE_H