view src/nucleus/ioce.c @ 78:c632896652ba

mfw/ti1_key.c: properly initialize notified_keys array The code in this ti1_key.c layer needs to call kpd_subscribe() and kpd_define_key_notification() functions in order to register with the KPD driver. The original code passed KPD_NB_PHYSICAL_KEYS in nb_notified_keys - this constant is defined to 24 in kpd_cfg.h on all platforms of interest to us - but it only filled the first 23 slots in the notified_keys array, resulting in stack garbage being passed to KPD API functions. The fix consists of initializing the last missed array slot to KPD_KEY_RECORD, the key ID for the right side button on the D-Sample handset. On our current hw targets this "Record" button exists as the EXTRA button on our Luna keypad board and as the camera button on the Pirelli DP-L10. There is no support whatsoever for this button in current BMI+MFW, we have no plans of doing anything with Pirelli's camera button even if we do get our UI fw running on that phone, and the Mother's dream of building our own FreeCalypso handset with the same button arrangement as D-Sample (including the right side button) is currently very nebulous - but let us nonetheless handle the full set of buttons on the KPD to MFW interface, and let upper layers weed out unsupported buttons.
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 25 Oct 2020 23:41:01 +0000
parents 4e78acac3d88
children
line wrap: on
line source

/*************************************************************************/
/*                                                                       */
/*               Copyright Mentor Graphics Corporation 2002              */
/*                         All Rights Reserved.                          */
/*                                                                       */
/* THIS WORK CONTAINS TRADE SECRET AND PROPRIETARY INFORMATION WHICH IS  */
/* THE PROPERTY OF MENTOR GRAPHICS CORPORATION OR ITS LICENSORS AND IS   */
/* SUBJECT TO LICENSE TERMS.                                             */
/*                                                                       */
/*************************************************************************/

/*************************************************************************/
/*                                                                       */
/* FILE NAME                                               VERSION       */
/*                                                                       */
/*      ioce.c                                         Nucleus PLUS 1.14 */
/*                                                                       */
/* COMPONENT                                                             */
/*                                                                       */
/*      IO - Input/Output Driver Management                              */
/*                                                                       */
/* DESCRIPTION                                                           */
/*                                                                       */
/*      This file contains the error checking routines for the functions */
/*      in the Input/Output Driver component.  This permits easy removal */
/*      of error checking logic when it is not needed.                   */
/*                                                                       */
/* DATA STRUCTURES                                                       */
/*                                                                       */
/*      None                                                             */
/*                                                                       */
/* FUNCTIONS                                                             */
/*                                                                       */
/*      IOCE_Create_Driver                  Create an I/O driver         */
/*      IOCE_Delete_Driver                  Delete an I/O driver         */
/*      IOCE_Request_Driver                 Make an I/O driver request   */
/*      IOCE_Resume_Driver                  Resume a task suspended in   */
/*                                            an I/O driver              */
/*      IOCE_Suspend_Driver                 Suspend a task inside an I/O */
/*                                            driver                     */
/*                                                                       */
/* DEPENDENCIES                                                          */
/*                                                                       */
/*      cs_extr.h                           Common Service functions     */
/*      tc_extr.h                           Thread Control functions     */
/*      io_extr.h                           I/O driver functions         */
/*      hi_extr.h                           History functions            */
/*                                                                       */
/* HISTORY                                                               */
/*                                                                       */
/*         DATE                    REMARKS                               */
/*                                                                       */
/*      03-01-1993      Created initial version 1.0                      */
/*      04-19-1993      Verified version 1.0                             */
/*      03-01-1994      Modified logic that checked task                 */
/*                      status without protection of                     */
/*                      scheduling structures,                           */
/*                      resulting in version 1.0a                        */
/*      03-01-1994      Verified version 1.0a                            */
/*      03-01-1994      Changed name original error                      */
/*                      checking file and changed                        */
/*                      function interfaces, resulting                   */
/*                      in version 1.1                                   */
/*                                                                       */
/*      03-18-1994      Verified version 1.1                             */
/*      04-17-1996      updated to version 1.2                           */
/*      03-24-1998      Released version 1.3                             */
/*      04-17-2002      Released version 1.13m                           */
/*      11-07-2002      Released version 1.14                            */
/*************************************************************************/
#define         NU_SOURCE_FILE


#include        "cs_extr.h"                 /* Common service functions  */
#include        "tc_extr.h"                 /* Thread control functions  */
#include        "io_extr.h"                 /* I/O driver functions      */
#include        "hi_extr.h"                 /* History functions         */


/*************************************************************************/
/*                                                                       */
/* FUNCTION                                                              */
/*                                                                       */
/*      IOCE_Create_Driver                                               */
/*                                                                       */
/* DESCRIPTION                                                           */
/*                                                                       */
/*      This function performs error checking on the parameters supplied */
/*      to the I/O driver create function.                               */
/*                                                                       */
/* CALLED BY                                                             */
/*                                                                       */
/*      Application                                                      */
/*                                                                       */
/* CALLS                                                                 */
/*                                                                       */
/*      IOC_Create_Driver                   Actual create driver routine */
/*                                                                       */
/* INPUTS                                                                */
/*                                                                       */
/*      driver                              Driver control block pointer */
/*      name                                Driver's logical name        */
/*      driver_entry                        Driver's point of entry      */
/*                                                                       */
/* OUTPUTS                                                               */
/*                                                                       */
/*      NU_INVALID_DRIVER                   Indicates driver pointer is  */
/*                                            NULL or is already in use  */
/*      NU_INVALID_POINTER                  Indicates the driver's entry */
/*                                            pointer is NULL            */
/*                                                                       */
/* HISTORY                                                               */
/*                                                                       */
/*         DATE                    REMARKS                               */
/*                                                                       */
/*      03-01-1993      Created initial version 1.0                      */
/*      04-19-1993      Verified version 1.0                             */
/*      03-01-1994      Changed function interface,                      */
/*                                        resulting in version 1.1       */
/*                                                                       */
/*      03-18-1994      Verified version 1.1                             */
/*                                                                       */
/*************************************************************************/
STATUS  IOCE_Create_Driver(NU_DRIVER *driver, CHAR *name, 
                        VOID (*driver_entry)(NU_DRIVER *, NU_DRIVER_REQUEST *))
{

STATUS          status;                     /* Completion status         */


    /* Check for an invalid driver pointer.  */
    if ((driver == NU_NULL) || (driver -> nu_driver_id == IO_DRIVER_ID))
    
        /* Indicate that the driver pointer is invalid.  */
        status =  NU_INVALID_DRIVER;
    
    else if (driver_entry == NU_NULL)
    
        /* Indicate that the driver entry point is invalid.  */
        status =  NU_INVALID_POINTER;
    
    else
    
        /* Parameters are okay, call actual function to create an I/O 
           driver.  */
        status =  IOC_Create_Driver(driver, name, driver_entry);
        
    /* Return completion status.  */
    return(status);
}


/*************************************************************************/
/*                                                                       */
/* FUNCTION                                                              */
/*                                                                       */
/*      IOCE_Delete_Driver                                               */
/*                                                                       */
/* DESCRIPTION                                                           */
/*                                                                       */
/*      This function performs error checking on the parameters supplied */
/*      to the I/O driver delete function.                               */
/*                                                                       */
/* CALLED BY                                                             */
/*                                                                       */
/*      Application                                                      */
/*                                                                       */
/* CALLS                                                                 */
/*                                                                       */
/*      IOC_Delete_Driver                   Actual delete driver routine */
/*                                                                       */
/* INPUTS                                                                */
/*                                                                       */
/*      driver                              Driver control block pointer */
/*                                                                       */
/* OUTPUTS                                                               */
/*                                                                       */
/*      NU_INVALID_DRIVER                   Indicates the driver pointer */
/*                                            is invalid                 */
/*                                                                       */
/* HISTORY                                                               */
/*                                                                       */
/*        DATE                    REMARKS                                */
/*                                                                       */
/*      03-01-1993      Created initial version 1.0                      */
/*      04-19-1993      Verified version 1.0                             */
/*      03-01-1994      Changed function interface,                      */
/*                      resulting in version 1.1                         */
/*                                                                       */
/*      03-18-1994      Verified version 1.1                             */
/*                                                                       */
/*************************************************************************/
STATUS  IOCE_Delete_Driver(NU_DRIVER *driver)
{

STATUS          status;                     /* Completion status         */

    /* Determine if the driver pointer is valid.  */
    if ((driver) && (driver -> nu_driver_id == IO_DRIVER_ID))
    
        /* Driver pointer is valid, call function to delete it.  */
        status =  IOC_Delete_Driver(driver);
        
    else
    
        /* Driver pointer is invalid, indicate in completion status.  */
        status =  NU_INVALID_DRIVER;
        
    /* Return completion status.  */
    return(status);
}


/*************************************************************************/
/*                                                                       */
/* FUNCTION                                                              */
/*                                                                       */
/*      IOCE_Request_Driver                                              */
/*                                                                       */
/* DESCRIPTION                                                           */
/*                                                                       */
/*      This function performs error checking on the parameters supplied */
/*      to the I/O driver request function.                              */
/*                                                                       */
/* CALLED BY                                                             */
/*                                                                       */
/*      Application                                                      */
/*                                                                       */
/* CALLS                                                                 */
/*                                                                       */
/*      IOC_Request_Driver                  Actual request driver routine*/
/*                                                                       */
/* INPUTS                                                                */
/*                                                                       */
/*      driver                              Driver control block pointer */
/*      request                             User's I/O request           */
/*                                                                       */
/* OUTPUTS                                                               */
/*                                                                       */
/*      NU_INVALID_DRIVER                   Indicates the driver pointer */
/*                                            is invalid                 */
/*      NU_INVALID_POINTER                  Indicates the request pointer*/
/*                                            is invalid                 */
/*                                                                       */
/* HISTORY                                                               */
/*                                                                       */
/*        DATE                    REMARKS                                */
/*                                                                       */
/*      03-01-1993      Created initial version 1.0                      */
/*      04-19-1993      Verified version 1.0                             */
/*      03-01-1994      Changed function interface,                      */
/*                      resulting in version 1.1                         */
/*                                                                       */
/*      03-18-1994      Verified version 1.1                             */
/*                                                                       */
/*************************************************************************/
STATUS  IOCE_Request_Driver(NU_DRIVER *driver , NU_DRIVER_REQUEST *request)
{

STATUS          status;                     /* Completion status         */


    /* Determine if driver pointer is invalid.  */
    if (driver == NU_NULL)
    
        /* Driver pointer is invalid, indicate in completion status.  */
        status =  NU_INVALID_DRIVER;

    else if (driver -> nu_driver_id != IO_DRIVER_ID)
    
        /* Driver pointer is invalid, indicate in completion status.  */
        status =  NU_INVALID_DRIVER;

    else if (request == NU_NULL)
    
        /* Request pointer is invalid, indicate in completion status.  */
        status =  NU_INVALID_POINTER;

    else
    
        /* Parameters are valid, call actual function.  */
        status =  IOC_Request_Driver(driver, request);

    /* Return the completion status.  */
    return(status);
}


/*************************************************************************/
/*                                                                       */
/* FUNCTION                                                              */
/*                                                                       */
/*      IOCE_Resume_Driver                                               */
/*                                                                       */
/* DESCRIPTION                                                           */
/*                                                                       */
/*      This function performs error checking on the parameters supplied */
/*      to the I/O driver resume function.                               */
/*                                                                       */
/* CALLED BY                                                             */
/*                                                                       */
/*      Application                                                      */
/*                                                                       */
/* CALLS                                                                 */
/*                                                                       */
/*      TCCE_Validate_Resume                Validate resume driver       */
/*                                            request against actual     */
/*                                            status                     */
/*      IOC_Resume_Driver                   Actual resume driver routine */
/*                                                                       */
/* INPUTS                                                                */
/*                                                                       */
/*      task                                Pointer of task to resume    */
/*                                                                       */
/* OUTPUTS                                                               */
/*                                                                       */
/*      NU_INVALID_TASK                     Indicates the task pointer   */
/*                                            is invalid                 */
/*      NU_INVALID_RESUME                   Indicates the task is not    */
/*                                            suspended                  */
/*                                                                       */
/* HISTORY                                                               */
/*                                                                       */
/*         DATE                    REMARKS                               */
/*                                                                       */
/*      03-01-1993      Created initial version 1.0                      */
/*      04-19-1993      Verified version 1.0                             */
/*      03-01-1994      Modified logic that checked task                 */
/*                      status without protection of                     */
/*                      scheduling structures,                           */
/*                      resulting in version 1.0a                        */
/*      03-01-1994      Verified version 1.0a                            */
/*      03-01-1994      Changed function interface,                      */
/*                      resulting in version 1.1                         */
/*                                                                       */
/*      03-18-1994      Verified version 1.1                             */
/*                                                                       */
/*************************************************************************/
STATUS  IOCE_Resume_Driver(NU_TASK *task)
{

STATUS          status;                     /* Completion status         */


    /* Determine if the task pointer is valid.  */
    if ((task == NU_NULL) || (((TC_TCB *) task) -> tc_id != TC_TASK_ID))
    
        /* Task pointer is invalid.  */
        status =  NU_INVALID_TASK;

    /* Check actual status of task to see if request is valid.  */
    else if (TCCE_Validate_Resume(NU_DRIVER_SUSPEND, task))
    
        /* Task is not suspended in a driver, return error status.  */
        status =  NU_INVALID_RESUME;
        
    else 
    
        /* Call the actual resume service.  */
        status =  IOC_Resume_Driver(task);
        
    /* Return the completion status.  */
    return(status);
}



/*************************************************************************/
/*                                                                       */
/* FUNCTION                                                              */
/*                                                                       */
/*      IOCE_Suspend_Driver                                              */
/*                                                                       */
/* DESCRIPTION                                                           */
/*                                                                       */
/*      This function performs error checking on the parameters supplied */
/*      to the I/O driver suspend function.                              */
/*                                                                       */
/* CALLED BY                                                             */
/*                                                                       */
/*      Application                                                      */
/*                                                                       */
/* CALLS                                                                 */
/*                                                                       */
/*      IOC_Suspend_Driver                  Actual driver suspend routine*/
/*      TCCE_Suspend_Error                  Check for a legal suspension */
/*                                                                       */
/* INPUTS                                                                */
/*                                                                       */
/*      terminate_routine                   Termination/Timeout cleanup  */
/*                                            routine                    */
/*      information                         Information pointer of the   */
/*                                            cleanup routine            */
/*      timeout                             Suspension timeout request   */
/*                                                                       */
/* OUTPUTS                                                               */
/*                                                                       */
/*      NU_INVALID_SUSPEND                  Indicates suspension is not  */
/*                                            legal                      */
/*                                                                       */
/* HISTORY                                                               */
/*                                                                       */
/*        DATE                    REMARKS                                */
/*                                                                       */
/*      03-01-1993      Created initial version 1.0                      */
/*      04-19-1993      Verified version 1.0                             */
/*      03-01-1994      Changed function interface,                      */
/*                      resulting in version 1.1                         */
/*                                                                       */
/*      03-18-1994      Verified version 1.1                             */
/*                                                                       */
/*************************************************************************/
STATUS  IOCE_Suspend_Driver(VOID (*terminate_routine)(VOID *), 
                                        VOID *information, UNSIGNED timeout)
{

STATUS          status;                     /* Completion status         */


    /* Determine if there is a suspension error.  */
    if (TCCE_Suspend_Error())
    
        /* Suspension error, not called from a legal thread.  */
        status =  NU_INVALID_SUSPEND;
        
    else 
    
        /* Call the actual suspend service.  */
        status =  IOC_Suspend_Driver(terminate_routine, information, timeout);
        
    /* Return the completion status.  */
    return(status);
}