Lorekeeping: allow tpudrv-leonardo.lib on Leonardo/Tango
Back in 2015 the Mother's idea was to produce a FreeCalypso development
board that would be a clone of TI Leonardo, including the original
quadband RFFE; one major additional stipulation was that this board
needed to be able to run original unmodified TCS211-20070608 firmware
with all blobs intact, with only minimal binary patches to main.lib
and tpudrv.lib. The necessary patched libs were produced at that time
in the tcs211-patches repository.
That plan was changed and we produced FCDEV3B instead, with Openmoko's
triband RFFE instead of Leonardo quadband, but when FC Magnetite started
in 2016, a TPUDRV_blob= provision was still made, allowing the possibility
of patching OM's tpudrv.lib for a restored Leonardo RFFE.
Now in 2020 we have FC Tango which is essentially a verbatim clone of
Leonardo core, including the original quadband RFFE. We have also
deblobbed our firmware so much that we have absolutely no real need
for a blob version of tpudrv.lib - but I thought it would be neat to put
the ancient TPUDRV_blob= mechanism (classic config) to its originally
intended use, just for the heck of it.
line source
+ − /**
+ − * @file kpd_api.h
+ − *
+ − * API Definition for keypad driver.
+ − *
+ − * This file gathers all the constants, structure and functions declaration
+ − * useful for a keypad driver user.
+ − *
+ − * @author Laurent Sollier (l-sollier@ti.com)
+ − * @version 0.1
+ − */
+ −
+ − /*
+ − * History:
+ − *
+ − * Date Author Modification
+ − * ----------------------------------------
+ − * 10/10/2001 L Sollier Create
+ − *
+ − *
+ − * (C) Copyright 2001 by Texas Instruments Incorporated, All Rights Reserved
+ − */
+ −
+ − #ifndef _KPD_API_H_
+ − #define _KPD_API_H_
+ −
+ − #include "kpd/kpd_cfg.h"
+ −
+ − #include "rv/rv_general.h"
+ − #include "rvf/rvf_api.h"
+ −
+ − /**
+ − * @name External types
+ − *
+ − * Types used in API.
+ − *
+ − */
+ − /*@{*/
+ −
+ − /** Definition of the subscriber identification. */
+ − typedef void* T_KPD_SUBSCRIBER;
+ −
+ − /** Definition of the virtual key identification. */
+ − typedef UINT8 T_KPD_VIRTUAL_KEY_ID;
+ −
+ − /** Definition of the notification level (First press, long press, infinite repeat, release). */
+ − typedef UINT8 T_KPD_NOTIF_LEVEL;
+ −
+ − /** Definition of a set of keys. */
+ − typedef struct { UINT8 nb_notified_keys;
+ − T_KPD_VIRTUAL_KEY_ID notified_keys[KPD_NB_PHYSICAL_KEYS];
+ − } T_KPD_VIRTUAL_KEY_TABLE;
+ −
+ − /*@}*/
+ −
+ −
+ − /** Allowed values for T_KPD_NOTIF_LEVEL type.
+ − * If a key is defined with KPD_NO_NOTIF, this key will be deleted from the key list
+ − * notified to the client.
+ − * But client will can set later as KPD_RELEASE_NOTIF (for exemple)
+ − * without calling unsubscribe, subscribe functions.
+ − */
+ − #define KPD_NO_NOTIF (0x00)
+ −
+ − /** Allowed values for T_KPD_NOTIF_LEVEL type.
+ − * If a key is defined with KPD_FIRST_PRESS_NOTIF, client will be notified by :
+ − * - The immediate key press
+ − */
+ − #define KPD_FIRST_PRESS_NOTIF (0x01)
+ −
+ − /** Allowed values for T_KPD_NOTIF_LEVEL type.
+ − * If a key is defined with KPD_LONG_PRESS, client will be notified by :
+ − * - The long press if the key is still pressed for a defined time
+ − * (defined in kpd_define_repeat_keys function)
+ − */
+ − #define KPD_LONG_PRESS_NOTIF (0x02)
+ −
+ − /** Allowed values for T_KPD_NOTIF_LEVEL type.
+ − * If a key is defined with KPD_INFINITE_REPEAT_NOTIF, client will be notified by :
+ − * - The long press if the key is still pressed for a defined time
+ − * (defined in kpd_define_repeat_keys function)
+ − * - The key pressed every defined time (defined in kpd_define_repeat_keys function),
+ − * until the key is released
+ − */
+ − #define KPD_INFINITE_REPEAT_NOTIF (0x04)
+ −
+ − /** Allowed values for T_KPD_NOTIF_LEVEL type.
+ − * If a key is defined with KPD_RELEASE_NOTIF, client will be notified by :
+ − * - the key release
+ − */
+ − #define KPD_RELEASE_NOTIF (0x08)
+ −
+ −
+ − /*************************************************************************/
+ − /************************** FUNCTIONS PROTOTYPES *************************/
+ − /*************************************************************************/
+ −
+ − /**
+ − * @name API functions
+ − *
+ − * API functions declarations.
+ − */
+ − /*@{*/
+ −
+ − /**
+ − * function: kpd_subscribe
+ − *
+ − * This function is called by the client before any use of the keypad driver services
+ − * It is called only once.
+ − *
+ − * @param subscriber_p Subscriber identification value (OUT).
+ − * @param mode Mode used by the keypad client.
+ − * @param notified_keys_p Define all the keys the client want to be notified.
+ − * @param return_path Return path for key pressed.
+ − * @return
+ − * - RV_OK if operation is successfull,
+ − * - RV_INTERNAL_ERR if
+ − * - the max of subscriber is reached,
+ − * - the software entity is not started, not yet initialized or initialization has
+ − * failed
+ − * - RV_INVALID_PARAMETER if number of virtual keys is not correct.
+ − * - RV_MEMORY_ERR if memory reach its size limit.
+ − *
+ − * Message returned: KPD_STATUS_MSG with operation = KPD_SUBSCRIBE_OP.
+ − * Available values for status_value are:
+ − * - KPD_PROCESS_OK if asynchronous operation is successfull,
+ − * - KPD_ERR_KEYS_TABLE if at least one key is not available in the requested mode,
+ − * - KPD_ERR_RETURN_PATH_EXISTING if subscriber return path is already defined by
+ − * another subscriber,
+ − * - KPD_ERR_INTERNAL if an internal error occured.
+ − *
+ − * @note
+ − * - If number of notified key is KPD_NB_PHYSICAL_KEYS, client has not to fulfill
+ − * the structure, this will be automatically done by the software entity.
+ − */
+ − T_RV_RET kpd_subscribe(T_KPD_SUBSCRIBER* subscriber_p,
+ − T_KPD_MODE mode,
+ − T_KPD_VIRTUAL_KEY_TABLE* notified_keys_p,
+ − T_RV_RETURN return_path);
+ −
+ − /**
+ − * function: kpd_unsubscribe
+ − *
+ − * This function unsubscribes a client from the keypad driver.
+ − *
+ − * @param subscriber_p Subscriber identification value (IN/OUT).
+ − * @return
+ − * - RV_OK if operation is successfull,
+ − * - RV_INVALID_PARAMETER if subscriber identification is incorrect.
+ − * - RV_MEMORY_ERR if memory reach its size limit.
+ − *
+ − * - Message: No message is returned for asynchronous processing.
+ − */
+ − T_RV_RET kpd_unsubscribe( T_KPD_SUBSCRIBER* subscriber_p);
+ −
+ − /**
+ − * function: kpd_define_key_notification
+ − *
+ − * This function defines notification type for a set of keys.
+ − * By default, all the keys are defined as KPD_RELEASE_NOTIF.
+ − * It's not mandatory that all the key defined in the notif_key_table be
+ − * notified to the subscriber. If at least one key is set in this table but
+ − * is not notified to the subscriber, this will have no effect.
+ − *
+ − * @param subscriber Subscriber identification value.
+ − * @param notif_key_table_p Set of keys for level notification definition.
+ − * @param notif_level Define level of notification is set for all the keys.
+ − * @param long_press_time Time in tenth of seconds before long press time notification (>0).
+ − * @param repeat_time Time in tenth of seconds for key repetition (>0).
+ − * @return
+ − * - RV_OK if operation is successfull
+ − * - RV_INVALID_PARAMETER if :
+ − * - subscriber identification is incorrect,
+ − * - number of virtual keys is incorrect,
+ − * - long_press_time = 0 and repeat_level = KPD_LONG_PRESS_NOTIF or KPD_INFINITE_REPEAT_NOTIF,
+ − * - repeat_time = 0 and repeat_level = KPD_INFINITE_REPEAT_NOTIF.
+ − * - RV_MEMORY_ERR if memory reach its size limit.
+ − *
+ − * Message returned: KPD_STATUS_MSG with operation = KPD_REPEAT_KEYS_OP.
+ − * Available values for status_value are:
+ − * - KPD_PROCESS_OK if asynchronous operation is successfull,
+ − * - KPD_ERR_KEYS_TABLE if at least one key is not available in the subscriber mode.
+ − *
+ − * @note - Values for long_press_time and repeat_time are available for the subscriber but
+ − * for all the keys defined in repeat mode. So, if a subscriber call the function
+ − * twice with different values of long_press_time and repeat_time, only the latest
+ − * values will be taken into account.
+ − * - If number of notified key is KPD_NB_PHYSICAL_KEYS, client has not to fulfill
+ − * the structure, this will be automatically done by the software entity.
+ − * - If the client set a key to KPD_INFINITE_REPEAT_NOTIF, it will be notified of
+ − * the long key pressed and the repeat press.
+ − */
+ − T_RV_RET kpd_define_key_notification(T_KPD_SUBSCRIBER subscriber,
+ − T_KPD_VIRTUAL_KEY_TABLE* notif_key_table_p,
+ − T_KPD_NOTIF_LEVEL notif_level,
+ − UINT16 long_press_time,
+ − UINT16 repeat_time);
+ −
+ − /**
+ − * function: kpd_change_mode
+ − *
+ − * This function changes the mode for the specific client.
+ − *
+ − * @param subscriber Subscriber identification value.
+ − * @param notified_keys_p Define all the keys the client want to be notified in the new mode.
+ − * @param new_mode New mode in which the client want to switch.
+ − * @return
+ − * - RV_OK if operation is successfull
+ − * - RV_INVALID_PARAMETER if :
+ − * - subscriber identification is incorrect,
+ − * - number of virtual keys is incorrect.
+ − * - RV_MEMORY_ERR if memory reach its size limit.
+ − *
+ − * Message returned: KPD_STATUS_MSG with operation = KPD_CHANGE_MODE_OP.
+ − * Available values for status_value are:
+ − * - KPD_PROCESS_OK if asynchronous operation is successfull,
+ − * - KPD_ERR_KEYS_TABLE if at least one key is not available in the new requested mode,
+ − *
+ − * @note - Call to this function cancel, for the subscriber, all the repeat mode defined
+ − * for the all thekeys with the function kpd_define_repeat_keys.
+ − * - If the subscriber was the owner of the keypad, this privilege is cancelled and
+ − * keypad is set in multi-notified mode.
+ − * - If RV_INVALID_PARAMETER is returned, the current mode for the subscriber is
+ − * the old mode and the subscriber is still the keypad owner if it was.
+ − * - If number of notified key is KPD_NB_PHYSICAL_KEYS, client has not to fulfill
+ − * the structure, this will be automatically done by the software entity.
+ − */
+ − T_RV_RET kpd_change_mode( T_KPD_SUBSCRIBER subscriber,
+ − T_KPD_VIRTUAL_KEY_TABLE* notified_keys_p,
+ − T_KPD_MODE new_mode);
+ −
+ − /**
+ − * function: kpd_own_keypad
+ − *
+ − * This function allows a subscriber being the only client to be notified by action
+ − * on keypad (less CPU time used).
+ − * After this call, the keypad is in the "single notified" state.
+ − * This action is cancelled when:
+ − * - The function is called with parameter is_keypad_owner to FALSE,
+ − * - The subscriber (keypad owner) unsubscribe from keypad,
+ − * - The subscriber (keypad owner) changes its mode.
+ − *
+ − * Note that keypad is in the "multi notified" state if there is no subscriber (particularly
+ − * at the keypad initialisation).
+ − *
+ − * @param subscriber Subscriber identification value.
+ − * @param is_keypad_owner Define the state to change.
+ − * TRUE: keypad pass in "single notified" state
+ − * FALSE: keypad pass in "multi notified" state
+ − * @param keys_owner_p Set of keys only notified to the subscriber that call this function.
+ − * This is mandatory a subset of the keys defined at subscription.
+ − * @return
+ − * - RV_OK if operation is successfull
+ − * - RV_INVALID_PARAMETER if :
+ − * - subscriber identification is incorrect,
+ − * - number of virtual keys is incorrect.
+ − * - RV_MEMORY_ERR if memory reach its size limit.
+ − *
+ − * Message returned: KPD_STATUS_MSG with operation = KPD_OWN_KEYPAD_OP.
+ − * Available values for status_value are:
+ − * - KPD_PROCESS_OK if asynchronous operation is successfull,
+ − * - KPD_ERR_KEYS_TABLE if at least one key is not defined in the subscriber mode,
+ − * - KPD_ERR_SN_MODE if keypad driver is already in SN mode,
+ − * - KPD_ERR_ID_OWNER_KEYPAD if the subscriber try to remove own keypad privilege
+ − * whereas it is not the keypad owner.
+ − */
+ − T_RV_RET kpd_own_keypad( T_KPD_SUBSCRIBER subscriber,
+ − BOOL is_keypad_owner,
+ − T_KPD_VIRTUAL_KEY_TABLE* keys_owner_p);
+ −
+ − /**
+ − * function: kpd_set_key_config
+ − *
+ − * This function allows setting dynamically a configuration for new or existing virtual keys.
+ − * The two tables define a mapping between each entry (new_keys[1] is mapped with reference_keys[1],
+ − * new_keys[2] is mapped with reference_keys[2], ...).
+ − * The call of this function doesn't change the mode of the client.
+ − *
+ − * @param subscriber Subscriber identification value.
+ − * @param reference_keys_p Set of keys available on keypad in default mode.
+ − * @param new_keys_p Set of keys which must map with the reference keys.
+ − * @return
+ − * - RV_OK if operation is successfull,
+ − * - RV_INVALID_PARAMETER if :
+ − * - subscriber identification is incorrect,
+ − * - at least one reference key is not defined in the default mode,
+ − * - number of virtual keys is incorrect (in reference keys or new keys table,
+ − * - RV_NOT_SUPPORTED if configurable mode is not supported.
+ − * - RV_MEMORY_ERR if memory reach its size limit.
+ − *
+ − * Message returned: KPD_STATUS_MSG with operation = KPD_SET_CONFIG_MODE_OP.
+ − * Available values for status_value are:
+ − * - KPD_PROCESS_OK if asynchronous operation is successfull,
+ − * - KPD_ERR_CONFIG_MODE_USED if config mode is used by some subscribers.
+ − */
+ − T_RV_RET kpd_set_key_config(T_KPD_SUBSCRIBER subscriber,
+ − T_KPD_VIRTUAL_KEY_TABLE* reference_keys_p,
+ − T_KPD_VIRTUAL_KEY_TABLE* new_keys_p);
+ −
+ − /**
+ − * function: kpd_get_available_keys
+ − *
+ − * This function allows knowing all the available keys in default mode.
+ − *
+ − * @param available_keys_p Set of keys available on keypad in default mode. The structure
+ − * must be declared by the caller, and is filled by the function (OUT).
+ − * @return RV_OK.
+ − */
+ − T_RV_RET kpd_get_available_keys( T_KPD_VIRTUAL_KEY_TABLE* available_keys_p);
+ −
+ − /**
+ − * function: kpd_get_ascii_key_code
+ − *
+ − * This function return associated ASCII value to defined key.
+ − *
+ − * @param key Key identification value.
+ − * @param mode Mode in which is defined the link between "key" and "ascii code".
+ − * @param ascii_code Associated ASCII code to parameter "key" (OUT).
+ − * @return
+ − * - RV_OK if operation is successfull,
+ − * - RV_INVALID_PARAMETER if :
+ − * - mode is different of KPD_DEFAULT_MODE or KPD_ALPHANUMERIC_MODE,
+ − * - the key doesn't exist in the defined mode.
+ − *
+ − * @note If return value is RV_INVALID_PARAMETER, empty string is set in ascii_code_pp variable.
+ − */
+ − T_RV_RET kpd_get_ascii_key_code( T_KPD_VIRTUAL_KEY_ID key,
+ − T_KPD_MODE mode,
+ − char** ascii_code_pp);
+ −
+ − /**
+ − * function: KP_Init
+ − *
+ − * This function is defined for backward compatibility with Condat.
+ − * It register two functions which notify Condat that Power key is long pressed.
+ − * It is used by PWR SWE.
+ − *
+ − * @param pressed Callback function to notify that Power key is long pressed.
+ − * @param released Callback function to notify that Power key is released.
+ − */
+ − void KP_Init( void(pressed(T_KPD_VIRTUAL_KEY_ID)), void(released(void)) );
+ −
+ − /*@}*/
+ −
+ −
+ − /*************************************************************************/
+ − /************************** MESSAGES DEFINITION **************************/
+ − /*************************************************************************/
+ −
+ − /**
+ − * The message offset must differ for each SWE in order to have
+ − * unique msg_id in the system.
+ − */
+ − #define KPD_MESSAGES_OFFSET (0x36 << 10)
+ −
+ −
+ −
+ − /**
+ − * @name KPD_KEY_EVENT_MSG
+ − *
+ − * This message is sent to a subscriber when a key is pressed or released.
+ − *
+ − * Message issued by KPD to a subscriber.
+ − */
+ − /*@{*/
+ −
+ − /** Definition of the key state (pressed or released). */
+ − typedef UINT8 T_KPD_KEY_STATE;
+ −
+ − /** Definition of the key press state (first press, long press, repeat press). */
+ − typedef UINT8 T_KPD_PRESS_STATE;
+ −
+ −
+ − /** Information sent to a client for a key notification. */
+ − typedef struct { T_KPD_VIRTUAL_KEY_ID virtual_key_id;
+ − T_KPD_KEY_STATE state;
+ − T_KPD_PRESS_STATE press_state;
+ − char* ascii_value_p;
+ − } T_KPD_KEY_INFO;
+ −
+ − /** Allowed values for T_KPD_KEY_STATE type. */
+ − #define KPD_KEY_PRESSED (0)
+ − /** Allowed values for T_KPD_KEY_STATE type. */
+ − #define KPD_KEY_RELEASED (1)
+ −
+ − /** Allowed value for T_KPD_PRESS_STATE type. */
+ − #define KPD_FIRST_PRESS (0)
+ − /** Allowed value for T_KPD_PRESS_STATE type. */
+ − #define KPD_LONG_PRESS (1)
+ − /** Allowed value for T_KPD_PRESS_STATE type. */
+ − #define KPD_REPEAT_PRESS (2)
+ − /** Allowed value for T_KPD_PRESS_STATE type (when state==KPD_KEY_RELEASED). */
+ − #define KPD_INSIGNIFICANT_VALUE (0xff)
+ −
+ − /** Message ID. */
+ − #define KPD_KEY_EVENT_MSG (KPD_MESSAGES_OFFSET | 0x001)
+ −
+ − /** Message structure. */
+ − typedef struct
+ − {
+ − /** Message header. */
+ − T_RV_HDR hdr;
+ −
+ − /** Informations about key event. */
+ − T_KPD_KEY_INFO key_info;
+ −
+ − } T_KPD_KEY_EVENT_MSG;
+ − /*@}*/
+ −
+ −
+ − /**
+ − * @name KPD_STATUS_MSG
+ − *
+ − * Status message.
+ − *
+ − * Message issued by KPD to a subscriber.
+ − * This message is used to return the status of an asynchronous process
+ − * requested by a subscriber.
+ − */
+ − /*@{*/
+ −
+ − /* Allowed values for 'operation" field */
+ − #define KPD_SUBSCRIBE_OP 1
+ − #define KPD_REPEAT_KEYS_OP 2
+ − #define KPD_CHANGE_MODE_OP 3
+ − #define KPD_OWN_KEYPAD_OP 4
+ − #define KPD_SET_CONFIG_MODE_OP 5
+ −
+ − /* Available values for "status_value" field */
+ − /* This define value is set when asynchronous process is successfull. */
+ − #define KPD_PROCESS_OK 1
+ − /* This define value is set in a status message (KPD_STATUS_MSG) when a client try to
+ − subscribe whereas keypad is in single-notified mode. Subscription
+ − is so rejected. */
+ − #define KPD_ERR_SN_MODE 2
+ − /* This defined value is set in a status message (KPD_STATUS_MSG) when a client try to
+ − modify configuration mode whereas this mode is already used. */
+ − #define KPD_ERR_CONFIG_MODE_USED 3
+ − /* This defined value is set in a status message (KPD_STATUS_MSG) when a client try to
+ − change keypad state from single-notified to multi-notified whereas it is not
+ − the keypad owner. */
+ − #define KPD_ERR_ID_OWNER_KEYPAD 4
+ − /* This defined value is set in a status message (KPD_STATUS_MSG) when a client
+ − defines a key table which is not correct. */
+ − #define KPD_ERR_KEYS_TABLE 5
+ − /* This defined value is set in a status message (KPD_STATUS_MSG) when a client
+ − try to subscribe to the keypad driver with a return path which is already
+ − defined by another subscriber. */
+ − #define KPD_ERR_RETURN_PATH_EXISTING 6
+ − /* This defined value is set in a status message (KPD_STATUS_MSG) when an internal
+ − error cause the failure of the process. */
+ − #define KPD_ERR_INTERNAL 7
+ −
+ −
+ − /** Message ID. */
+ − #define KPD_STATUS_MSG (KPD_MESSAGES_OFFSET | 0x002)
+ −
+ − /** Message structure. */
+ − typedef struct
+ − {
+ − /** Message header. */
+ − T_RV_HDR hdr;
+ −
+ − /** Operation. */
+ − UINT8 operation;
+ −
+ − /** Return status value. */
+ − UINT8 status_value;
+ −
+ − } T_KPD_STATUS_MSG;
+ − /*@}*/
+ −
+ − #endif /* #ifndef _KPD_API_H_ */