Home | History | Annotate | Download | only in HwInit
      1 /****************************************************************************
      2 **+-----------------------------------------------------------------------+**
      3 **|                                                                       |**
      4 **| Copyright(c) 1998 - 2008 Texas Instruments. All rights reserved.      |**
      5 **| All rights reserved.                                                  |**
      6 **|                                                                       |**
      7 **| Redistribution and use in source and binary forms, with or without    |**
      8 **| modification, are permitted provided that the following conditions    |**
      9 **| are met:                                                              |**
     10 **|                                                                       |**
     11 **|  * Redistributions of source code must retain the above copyright     |**
     12 **|    notice, this list of conditions and the following disclaimer.      |**
     13 **|  * Redistributions in binary form must reproduce the above copyright  |**
     14 **|    notice, this list of conditions and the following disclaimer in    |**
     15 **|    the documentation and/or other materials provided with the         |**
     16 **|    distribution.                                                      |**
     17 **|  * Neither the name Texas Instruments nor the names of its            |**
     18 **|    contributors may be used to endorse or promote products derived    |**
     19 **|    from this software without specific prior written permission.      |**
     20 **|                                                                       |**
     21 **| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   |**
     22 **| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     |**
     23 **| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |**
     24 **| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  |**
     25 **| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |**
     26 **| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      |**
     27 **| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |**
     28 **| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |**
     29 **| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   |**
     30 **| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |**
     31 **| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  |**
     32 **|                                                                       |**
     33 **+-----------------------------------------------------------------------+**
     34 ****************************************************************************/
     35 
     36 
     37 /*******************************************************************************/
     38 /*                                                                             */
     39 /*  MODULE:  hwInit.c                                                          */
     40 /*  PURPOSE: HwInit module manages the init process of the TNETW, included     */
     41 /*           firmware download process. It shall perform Hard Reset the chip   */
     42 /*           if possible (this will require a Reset line to be connected to    */
     43 /*           the host); Start InterfaceCtrl; Download NVS and FW               */
     44 /*                                                                             */
     45 /*                                                                             */
     46 /*******************************************************************************/
     47 
     48 #include "paramOut.h"
     49 #include "osApi.h"
     50 #include "report.h"
     51 #include "HwInit.h"
     52 #include "HwInit_api.h"
     53 
     54 #include "whalCommon.h"
     55 #include "whalBus_Api.h"
     56 #include "shmBus.h"
     57 
     58 #include "FwEvent_api.h"
     59 #include "TNETWIF.h"
     60 #include "shmFwCtrl.h"
     61 #include "TNETW_Driver.h"
     62 #include "TNETW_Driver_api.h"
     63 #include "whalHwCtrl.h"
     64 
     65 #include "whalHwAccess.h"
     66 #include "eventMbox_api.h"
     67 
     68 /* static function */
     69 #ifdef USE_RECOVERY
     70 static TI_STATUS InitHw_StartInit(TI_HANDLE hHwCtrl);
     71 #endif /* USE_RECOVERY */
     72 
     73 /*******************************************************************************
     74 *                       PUBLIC  FUNCTIONS  IMPLEMENTATION                      *
     75 ********************************************************************************/
     76 
     77 
     78 /*************************************************************************
     79 *                        hwInit_create                              *
     80 **************************************************************************
     81 * DESCRIPTION:  This function initializes the HwInit module.
     82 *
     83 * INPUT:        hOs - handle to Os Abstraction Layer
     84 *
     85 * RETURN:       Handle to the allocated HwInit module
     86 *************************************************************************/
     87 TI_HANDLE hwInit_create(TI_HANDLE hOs)
     88 {
     89 #ifdef USE_RECOVERY
     90     hwInit_t *hHwInit;
     91 
     92     /* allocate HwInit module */
     93     hHwInit = os_memoryAlloc(hOs, (sizeof(hwInit_t)));
     94 
     95     if(!hHwInit)
     96     {
     97         WLAN_OS_REPORT(("Error allocating the HwInit Module\n"));
     98         return NULL;
     99     }
    100 
    101     /* Reset HwInit module */
    102     os_memoryZero(hOs, hHwInit, (sizeof(hwInit_t)));
    103 
    104     hHwInit->hOs = hOs;
    105 
    106     return(hHwInit);
    107 #else
    108     return NULL;
    109 #endif /* USE_RECOVERY */
    110 } /* hwInit_create */
    111 
    112 
    113 /***************************************************************************
    114 *                           hwInit_config                             *
    115 ****************************************************************************
    116 * DESCRIPTION:  This function configures the hwInit module
    117 *
    118 * RETURNS:      OK - Configuration successful
    119 *               NOK - Configuration unsuccessful
    120 ***************************************************************************/
    121 TI_STATUS hwInit_config(TI_HANDLE hHwInit,
    122                         TI_HANDLE hReport,
    123                         TI_HANDLE hTNETWIF)
    124 {
    125 #ifdef USE_RECOVERY
    126     hwInit_t *pHwInit = (hwInit_t *)hHwInit;
    127 
    128     /* configure modules handles */
    129     pHwInit->hReport = hReport;
    130     pHwInit->hTNETWIF = hTNETWIF;
    131 
    132     pHwInit->smState = HW_INIT_STATE_IDLE;
    133 
    134     WLAN_REPORT_INIT(pHwInit->hReport, HW_INIT_MODULE_LOG,
    135         (".....HwInit configured successfully\n"));
    136 #endif /* USE_RECOVERY */
    137     return OK;
    138 
    139 } /* hwInit_config */
    140 
    141 
    142 /***************************************************************************
    143 *                           hwInit_destroy                            *
    144 ****************************************************************************
    145 * DESCRIPTION:  This function unload the HwInit module.
    146 *
    147 * INPUTS:       hHwInit - the object
    148 *
    149 * OUTPUT:
    150 *
    151 * RETURNS:      OK - Unload succesfull
    152 *               NOK - Unload unsuccesfull
    153 ***************************************************************************/
    154 TI_STATUS hwInit_destroy(TI_HANDLE hHwInit)
    155 {
    156 #ifdef USE_RECOVERY
    157     hwInit_t *pHwInit = (hwInit_t *)hHwInit;
    158 
    159     /* free HwInit Module */
    160     os_memoryFree(pHwInit->hOs, pHwInit, sizeof(hwInit_t));
    161 #endif /* USE_RECOVERY */
    162     return OK;
    163 }
    164 
    165 /***************************************************************************
    166 *                           hwInit_recovery                                *
    167 ****************************************************************************
    168 * DESCRIPTION:  Start HW init process after recovery.
    169 *
    170 * INPUTS:       hHwInit - the object
    171 *
    172 * OUTPUT:
    173 *
    174 * RETURNS:
    175 *    TNETWIF_COMPLETE - if completed, i.e. Synchronous mode.
    176 *    TNETWIF_PENDING  - if pending, i.e. Asynchronous mode (callback function will be called).
    177 ***************************************************************************/
    178 #ifdef USE_RECOVERY
    179 TI_STATUS hwInit_recovery(TI_HANDLE hHwInit, TI_HANDLE hHwCtrl, void *funcCB, TI_HANDLE hRecoveryCtrl)
    180 {
    181     hwInit_t *pHwInit = (hwInit_t *)hHwInit;
    182     HwCtrl_T *pHwCtrl = (HwCtrl_T *)hHwCtrl;
    183 
    184     pHwInit->hHwCtrl = hHwCtrl;
    185     pHwInit->recoveryProcess = TRUE;
    186     pHwInit->hRecoveryCtrl = hRecoveryCtrl;
    187     pHwInit->endOfHwInitCB = (EndOfHwInitCB_t)funcCB;
    188 
    189     eventMbox_Stop(pHwCtrl->hEventMbox);
    190 
    191     TNETWIF_Start (pHwInit->hTNETWIF, HAL_INIT_MODULE_ID, hHwCtrl, (TNETWIF_callback_t)InitHw_StartInit);
    192 
    193     return TNETWIF_PENDING;
    194 }
    195 #endif /* USE_RECOVERY */
    196 
    197 /****************************************************************************
    198  *                      InitHw_FinalizeDownload()
    199  ****************************************************************************
    200  * DESCRIPTION: Different FinalizeDownload for Init and Recovery. (Don't call
    201  *              for "config" functions after recovery).
    202  *
    203  * INPUTS:  hHwInit - the object
    204  *
    205  * OUTPUT:  None
    206  *
    207  * RETURNS: OK or NOK
    208  ****************************************************************************/
    209 TI_STATUS InitHw_FinalizeDownload(TI_HANDLE hHwInit)
    210 {
    211 #ifdef USE_RECOVERY
    212     hwInit_t *pHwInit = (hwInit_t *)hHwInit;
    213     TI_STATUS status;
    214 
    215     status = (TI_STATUS)whal_hwCtrl_ConfigHw(pHwInit->hHwCtrl, (void *)pHwInit->endOfHwInitCB, pHwInit->hRecoveryCtrl, TRUE);
    216     if (status != OK)
    217     {
    218         WLAN_REPORT_INFORMATION (pHwInit->hReport, HW_INIT_MODULE_LOG,
    219             ("InitHw_FinalizeDownload: whal_hwCtrl_ConfigHw failed\n"));
    220         return TNETWIF_ERROR;
    221     }
    222 #endif /* USE_RECOVERY */
    223     return TNETWIF_COMPLETE;
    224 
    225 }
    226 
    227 
    228 /****************************************************************************
    229  *                      InitHw_StartInit()
    230  ****************************************************************************
    231  * DESCRIPTION: start init process for recovery
    232  *
    233  * INPUTS:  hHwInit - the object
    234  *
    235  * OUTPUT:  None
    236  *
    237  * RETURNS: OK or NOK
    238  ****************************************************************************/
    239 #ifdef USE_RECOVERY
    240 static TI_STATUS InitHw_StartInit(TI_HANDLE hHwCtrl)
    241 {
    242     HwCtrl_T *pHwCtrl = (HwCtrl_T *)hHwCtrl;
    243     WlanParams_T *pWlanParams;
    244     BootAttr_T BootAttr;
    245     TI_STATUS retStatus;
    246 
    247     whalBus_T *pWhalBus;
    248     PUINT8  FwBuf, EEpromBuf;
    249     UINT32  FwSize, EEpromSize;
    250     UINT32 *pWLAN_Images[4];
    251 
    252     pWlanParams = whal_ParamsGetWlanParams(pHwCtrl->pWhalParams);
    253 
    254     BootAttr.MacClock          = pWlanParams->MacClock;
    255     BootAttr.ArmClock          = pWlanParams->ArmClock;
    256 
    257     {
    258         /* Get the FW image */
    259         os_getFirmwareImage (pHwCtrl->hOs, &FwBuf, &FwSize, 0);
    260         os_getRadioImage (pHwCtrl->hOs, &EEpromBuf, &EEpromSize, 0);
    261         pWhalBus = (whalBus_T *)pHwCtrl->hWhalBus;
    262         pWLAN_Images[0] = (UINT32 *)FwBuf;
    263         pWLAN_Images[1] = (UINT32 *)FwSize;
    264         pWLAN_Images[2] = (UINT32 *)EEpromBuf;
    265         pWLAN_Images[3] = (UINT32 *)EEpromSize;
    266 
    267         pHwCtrl->uFwBuf = (UINT32)pWLAN_Images[0]; /* Firmware Image ptr */
    268         pHwCtrl->uFwAddr = (UINT32)pWLAN_Images[1]; /* Firmware Image length */
    269         pHwCtrl->uEEEPROMBuf = (UINT32)pWLAN_Images[2]; /* EEPROM Image ptr */
    270         pHwCtrl->uEEEPROMLen = (UINT32)pWLAN_Images[3]; /* EEPROM Image length */
    271     }
    272 
    273     /* Reset the TNETW by the reset line */
    274     WLAN_OS_REPORT(("HARD RESET before\n"));
    275     os_hardResetTnetw ();
    276     WLAN_OS_REPORT(("HARD RESET after\n"));
    277 
    278     pWhalBus->recoveryProcess = TRUE;
    279 
    280     /* SDIO_enumerate */
    281     {
    282         TNETWIF_t *pTNETWIF = (TNETWIF_t *)(pWhalBus->hTNETWIF);
    283         whal_hwAccess_ReConfig(pTNETWIF->hHwAccess); /* SDIO enumerate*/
    284     }
    285     /* set the working partition to its "running" mode offset */
    286 #if (defined(HW_ACCESS_SDIO)|defined(HW_ACCESS_WSPI))
    287 
    288     TNETWIF_SetPartitions (pWhalBus->hTNETWIF, HW_ACCESS_DOWNLOAD, HW_ACCESS_DOWN_PART0_ADDR);
    289 
    290 #endif
    291     TNETWIF_RegSetBitVal(pWhalBus->hTNETWIF,  ACX_REG_ECPU_CONTROL, ECPU_CONTROL_HALT);
    292 
    293     retStatus = whalBus_FwCtrl_Boot (pHwCtrl->hWhalBus, (TI_HANDLE)pHwCtrl, &BootAttr);
    294 
    295     /* release FW and NVS images */
    296     /*
    297      * Note: This is done assuming the boot process is complelty synchronous!!!
    298      * Also, this is not done in GWSI becaues in GWSI these functions are not defined,
    299      * because the load process is different. This has also to be fixed...
    300      */
    301     os_closeFirmwareImage (pHwCtrl->hOs);
    302     os_closeRadioImage (pHwCtrl->hOs);
    303 
    304     return(retStatus);
    305 }
    306 #endif /* USE_RECOVERY */
    307 
    308 
    309