view src/cs/drivers/drv_app/kpd/kpd_api.h @ 303:f76436d19a7a default tip

!GPRS config: fix long-standing AT+COPS chance hanging bug There has been a long-standing bug in FreeCalypso going back years: sometimes in the AT command bring-up sequence of an ACI-only MS, the AT+COPS command would produce only a power scan followed by cessation of protocol stack activity (only L1 ADC traces), instead of the expected network search sequence. This behaviour was seen in different FC firmware versions going back to Citrine, and seemed to follow some law of chance, not reliably repeatable. This bug has been tracked down and found to be specific to !GPRS configuration, stemming from our TCS2/TCS3 hybrid and reconstruction of !GPRS support that was bitrotten in TCS3.2/LoCosto version. ACI module psa_mms.c, needed only for !GPRS, was missing in the TCS3 version and had to be pulled from TCS2 - but as it turns out, there is a new field in the MMR_REG_REQ primitive that needs to be set correctly, and that psa_mms.c module is the place where this initialization needed to be added.
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 08 Jun 2023 08:23:37 +0000
parents 4e78acac3d88
children
line wrap: on
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_ */