• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * tiwlan_loader.c
3  *
4  * Copyright 2001-2009 Texas Instruments, Inc. - http://www.ti.com/
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *     http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  */
18 
19 /**
20  * \file  tiwlan_loader.c
21  * \brief Loader implementation - sends FW image, NVS image and ini file to the driver
22  */
23 
24 
25 #ifdef ANDROID
26 #include <stdio.h>
27 #include <stdlib.h>
28 #include <errno.h>
29 #include <unistd.h>
30 #include <string.h>
31 #include <cutils/properties.h>
32 #include <hardware_legacy/power.h>
33 #define PROGRAM_NAME    "wlan_loader"
34 #endif
35 
36 #include "STADExternalIf.h"
37 #include "cu_osapi.h"
38 #include "ipc_sta.h"
39 #include "WlanDrvCommon.h"
40 
41 #define TIWLAN_DRV_NAME "tiwlan"
42 
43 S8    g_drv_name[IF_NAME_SIZE + 1];
44 
print_usage(VOID)45 S32 print_usage(VOID)
46 {
47     os_error_printf (CU_MSG_INFO1, (PS8)"Usage: ./wlan_loader [driver_name] [options]\n");
48     os_error_printf (CU_MSG_INFO1, (PS8)"   -e <filename>  - eeprom image file name. default=./nvs_map.bin\n");
49     os_error_printf (CU_MSG_INFO1, (PS8)"   -n - no eeprom file\n");
50     os_error_printf (CU_MSG_INFO1, (PS8)"   -i <filename>  - init file name. default=tiwlan.ini\n");
51     os_error_printf (CU_MSG_INFO1, (PS8)"   -f <filename>  - firmware image file name. default=firmware.bin\n");
52     return 1;
53 }
54 
55 /*  Return '0' if success */
init_driver(PS8 adapter_name,PS8 eeprom_file_name,PS8 init_file_name,PS8 firmware_file_name)56 S32 init_driver( PS8 adapter_name, PS8 eeprom_file_name,
57                  PS8 init_file_name, PS8 firmware_file_name )
58 {
59     PVOID f1 = NULL, f2 = NULL, f3 = NULL;
60     S32 eeprom_image_length = 0;
61     S32 init_file_length = 0;
62     S32 firmware_image_length = 0;
63     U32 req_size = 0;
64     TLoaderFilesData *init_info = NULL;
65     S32 rc = -1;
66     THandle hIpcSta;
67 
68     if( !adapter_name || !*adapter_name )
69         return rc;
70 
71     os_error_printf(CU_MSG_INFO1, (PS8)"+---------------------------+\n");
72     os_error_printf(CU_MSG_INFO1, (PS8)"| wlan_loader: initializing |\n");
73     os_error_printf(CU_MSG_INFO1, (PS8)"+---------------------------+\n");
74 
75     hIpcSta = IpcSta_Create(adapter_name);
76     if (hIpcSta == NULL)
77     {
78 	os_error_printf (CU_MSG_ERROR, (PS8)"wlan_loader: cant allocate IpcSta context\n", eeprom_file_name);
79 	goto init_driver_end;
80     }
81 
82     /* Send init request to the driver */
83     if ( (NULL != eeprom_file_name) &&
84          (f1 = os_fopen (eeprom_file_name, OS_FOPEN_READ)) != NULL)
85     {
86         eeprom_image_length = os_getFileSize(f1);
87         if (-1 == eeprom_image_length)
88         {
89             os_error_printf(CU_MSG_ERROR, (PS8)"Cannot get eeprom image file length <%s>\n", eeprom_file_name);
90             goto init_driver_end;
91         }
92     }
93 
94     if ( (NULL != firmware_file_name) &&
95          (f2 = os_fopen (firmware_file_name, OS_FOPEN_READ)) != NULL)
96     {
97         firmware_image_length = os_getFileSize(f2);
98         if (-1 == firmware_image_length)
99         {
100             os_error_printf(CU_MSG_ERROR, (PS8)"Cannot get firmware image file length <%s>\n", firmware_file_name);
101             goto init_driver_end;
102         }
103     }
104 
105     if ( (NULL != init_file_name) &&
106          (f3 = os_fopen (init_file_name, OS_FOPEN_READ)) != NULL)
107     {
108         init_file_length = os_getFileSize(f3);
109         if (-1 == init_file_length)
110         {
111             os_error_printf(CU_MSG_ERROR, (PS8)"Cannot get init file length <%s>\n", init_file_name);
112             goto init_driver_end;
113         }
114     }
115 
116     /* Now when we can calculate the request length. allocate it and read the files */
117     req_size = sizeof(TLoaderFilesData) + eeprom_image_length + (init_file_length+1) + firmware_image_length;
118     init_info = (TLoaderFilesData *)os_MemoryAlloc(req_size);
119     if (!init_info)
120     {
121         os_error_printf(CU_MSG_ERROR, (PS8)"No memory to allocate init request (%d bytes)\n", req_size);
122         goto init_driver_end;
123     }
124     init_info->uNvsFileLength = eeprom_image_length;
125     init_info->uFwFileLength  = firmware_image_length;
126     init_info->uIniFileLength = init_file_length;
127 
128     if (!f1 || (eeprom_image_length &&
129         os_fread(&init_info->data[0], 1, eeprom_image_length, f1)<eeprom_image_length))
130     {
131     } else
132         os_error_printf(CU_MSG_INFO1, (PS8)"****  nvs file found %s **** \n", eeprom_file_name);
133 
134     if (!f2 || (firmware_image_length &&
135         os_fread(&init_info->data[eeprom_image_length], 1, firmware_image_length, f2)<firmware_image_length))
136     {
137         os_error_printf(CU_MSG_ERROR, (PS8)"Error reading firmware image %s - Aborting...\n", firmware_file_name);
138         goto init_driver_end;
139     }
140 
141     if (!f3 || (init_file_length &&
142         os_fread(&init_info->data[eeprom_image_length+firmware_image_length], 1, init_file_length, f3)<init_file_length))
143     {
144         os_error_printf(CU_MSG_ERROR, (PS8)"Warning: Error in reading init_file %s - Using defaults\n", init_file_name);
145     }
146 
147     /* Load driver defaults */
148     if(EOALERR_IPC_STA_ERROR_SENDING_WEXT == IPC_STA_Private_Send(hIpcSta, DRIVER_INIT_PARAM, init_info, req_size, NULL, 0))
149     {
150         os_error_printf(CU_MSG_ERROR, (PS8)"Wlan_loader: Error sending init command (DRIVER_INIT_PARAM) to driver\n");
151         goto init_driver_end;
152     }
153 
154     /* No Error Found */
155     rc = 0;
156 
157 init_driver_end:
158     if (f1)
159         os_fclose(f1);
160     if (f2)
161         os_fclose(f2);
162     if (f3)
163         os_fclose(f3);
164     if (init_info)
165         os_MemoryFree(init_info);
166     if (hIpcSta)
167         IpcSta_Destroy(hIpcSta);
168 
169     return rc;
170 }
171 
172 #ifdef ANDROID
check_and_set_property(char * prop_name,char * prop_val)173 int check_and_set_property(char *prop_name, char *prop_val)
174 {
175     char prop_status[PROPERTY_VALUE_MAX];
176     int count;
177 
178     for(count=4;( count != 0 );count--) {
179         property_set(prop_name, prop_val);
180         if( property_get(prop_name, prop_status, NULL) &&
181             (strcmp(prop_status, prop_val) == 0) )
182 	    break;
183     }
184     if( count ) {
185         os_error_printf(CU_MSG_ERROR, (PS8)"Set property %s = %s - Ok\n", prop_name, prop_val);
186     }
187     else {
188         os_error_printf(CU_MSG_ERROR, (PS8)"Set property %s = %s - Fail\n", prop_name, prop_val);
189     }
190     return( count );
191 }
192 #endif
193 
user_main(S32 argc,PPS8 argv)194 S32 user_main(S32 argc, PPS8 argv)
195 {
196     S32 i;
197     PS8 eeprom_file_name = (PS8)"./nvs_map.bin";
198     PS8 init_file_name = (PS8)"tiwlan.ini";
199     PS8 firmware_file_name = (PS8)"firmware.bin";
200 
201     /* Parse command line parameters */
202     if( argc > 1 )
203     {
204         i=1;
205         if( argv[i][0] != '-' )
206         {
207             os_strcpy( g_drv_name, argv[i++] );
208         }
209         for( ;i < argc; i++ )
210         {
211             if( !os_strcmp(argv[i], (PS8)"-h" ) || !os_strcmp(argv[i], (PS8)"--help") )
212                 return print_usage();
213             else if(!os_strcmp(argv[i], (PS8)"-f" ) )
214             {
215                 firmware_file_name = argv[++i];
216             }
217             else if(!os_strcmp(argv[i], (PS8)"-e") && (i+1<argc))
218             {
219                 eeprom_file_name = argv[++i];
220             }
221             else if(!os_strcmp(argv[i], (PS8)"-i") && (i+1<argc))
222             {
223                 init_file_name = argv[++i];
224             }
225             else if(!os_strcmp(argv[i], (PS8)"-n" ) )
226             {
227                eeprom_file_name = NULL;
228             }
229             else
230             {
231                 os_error_printf (CU_MSG_ERROR, (PS8)"Loader: unknow parameter '%s'\n", argv[i]);
232 #ifdef ANDROID
233                 check_and_set_property("wlan.driver.status", "failed");
234 #endif
235                 return -1;
236             }
237         }
238     }
239 
240     if( !g_drv_name[0] )
241     {
242         os_strcpy(g_drv_name, (PS8)TIWLAN_DRV_NAME "0" );
243     }
244 
245 #ifdef ANDROID
246     acquire_wake_lock(PARTIAL_WAKE_LOCK, PROGRAM_NAME);
247 #endif
248 
249     if (init_driver (g_drv_name, eeprom_file_name, init_file_name, firmware_file_name) != 0)
250     {
251 #ifdef ANDROID
252         check_and_set_property("wlan.driver.status", "failed");
253         release_wake_lock(PROGRAM_NAME);
254 #endif
255         return -1;
256     }
257 #ifdef ANDROID
258     check_and_set_property("wlan.driver.status", "ok");
259     release_wake_lock(PROGRAM_NAME);
260 #endif
261     return 0;
262 }
263