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