Home | History | Annotate | Download | only in src
      1 /*
      2  * osapi.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 *
     21 *   MODULE:  osapi.c
     22 *
     23 *   PURPOSE:
     24 *
     25 *   DESCRIPTION:
     26 *   ============
     27 *   OS Memory API for user mode application (CUDK)
     28 *
     29 ****************************************************************************/
     30 
     31 /* includes */
     32 /************/
     33 #include <stdarg.h>
     34 #include <stdio.h>
     35 #include <string.h>
     36 #include <stdlib.h>
     37 #include <ctype.h>
     38 #include <unistd.h>
     39 #include <signal.h>
     40 #include <errno.h>
     41 #include "cu_os.h"
     42 #include "cu_osapi.h"
     43 
     44 /* defines */
     45 /***********/
     46 #define MAX_HOST_MESSAGE_SIZE   512
     47 
     48 S32 ipc_pipe[2];
     49 
     50 extern S32 user_main (S32 argc, PPS8 argv);
     51 
     52 /**
     53  * \fn     main
     54  * \brief  Main entry point to a user-mode program
     55  *
     56  * This is the main() function for a user mode program, or the entry point
     57  * called by the OS, This calls an OS-abstracted main function
     58  *
     59  * \param  argc - command line argument count
     60  * \param  argv - command line arguments
     61  * \return 0 on success, any other value indicates error
     62  * \sa     user_main
     63  */
     64 int main (int argc, char** argv)
     65 {
     66     return user_main (argc, (PPS8)argv);
     67 }
     68 
     69 /****************************************************************************************
     70  *                        os_error_printf()
     71  ****************************************************************************************
     72 DESCRIPTION:    This function prints a debug message
     73 
     74 ARGUMENTS:      OsContext   -   our adapter context.
     75                 arg_list - string to output with arguments
     76 
     77 RETURN:         None
     78 *****************************************************************************************/
     79 VOID os_error_printf(S32 debug_level, const PS8 arg_list ,...)
     80 {
     81     static int g_debug_level = CU_MSG_ERROR; /* TODO ronen: create debug logic for CLI */
     82     S8 msg[MAX_HOST_MESSAGE_SIZE];
     83     va_list ap;
     84 #ifdef OS_CLI_LOG_TO_FILE
     85     char file_name[30]="/cli.log";
     86     FILE *ftmp;
     87 #endif
     88 
     89     if (debug_level < g_debug_level)
     90         return;
     91 
     92     /* Format the message */
     93     va_start(ap, arg_list);
     94     vsprintf((char *)msg, (char *)arg_list, ap);
     95     va_end(ap);
     96 
     97     /* print the message */
     98     fprintf(stderr, (char *)msg);
     99 
    100 #ifdef OS_CLI_LOG_TO_FILE
    101     ftmp = fopen(file_name, "a");
    102     if (ftmp != NULL) {
    103         fprintf(ftmp,(char *)msg);
    104         fclose(ftmp);
    105     }
    106 #endif
    107 }
    108 
    109 /****************************************************************************************
    110  *                        os_strcpy()
    111  ****************************************************************************************
    112 DESCRIPTION:    wrapper to the OS strcpy fucntion
    113 
    114 ARGUMENTS:
    115 
    116 RETURN:
    117 *****************************************************************************************/
    118 inline PS8 os_strcpy(PS8 dest, const PS8 src)
    119 {
    120     return (PS8)strcpy((char*)dest, (char*)src);
    121 }
    122 
    123 /****************************************************************************************
    124  *                        os_strncpy()
    125  ****************************************************************************************
    126 DESCRIPTION:    wrapper to the OS strncpy fucntion
    127 
    128 ARGUMENTS:
    129 
    130 RETURN:
    131 *****************************************************************************************/
    132 PS8 os_strncpy(PS8 dest, const PS8 src, S32 n)
    133 {
    134     return (PS8)strncpy((char*)dest, (char*)src, n);
    135 }
    136 
    137 /****************************************************************************************
    138  *                        os_sprintf()
    139  ****************************************************************************************
    140 DESCRIPTION:    wrapper to the OS sprintf fucntion
    141 
    142 ARGUMENTS:
    143 
    144 RETURN:
    145 *****************************************************************************************/
    146 S32 os_sprintf(PS8 str, const PS8 arg_list, ...)
    147 {
    148     va_list ap;
    149     S8 msg[MAX_HOST_MESSAGE_SIZE];
    150 
    151     va_start(ap, arg_list);
    152     vsprintf((char*)msg, (char*)arg_list, ap);
    153     va_end(ap);
    154 
    155     return sprintf((char*)str, (char*)msg);
    156 }
    157 
    158 /****************************************************************************************
    159  *                        os_Printf()
    160  ****************************************************************************************
    161 DESCRIPTION:    wrapper to the OS printf fucntion
    162 
    163 ARGUMENTS:
    164 
    165 RETURN:
    166 *****************************************************************************************/
    167 S32 os_Printf(const PS8 buffer)
    168 {
    169     return printf((char*)buffer);
    170 }
    171 
    172 
    173 /****************************************************************************************
    174  *                        os_strcat()
    175  ****************************************************************************************
    176 DESCRIPTION:    wrapper to the OS strcat fucntion
    177 
    178 ARGUMENTS:
    179 
    180 RETURN:
    181 *****************************************************************************************/
    182 PS8 os_strcat(PS8 dest, const PS8 src)
    183 {
    184     return (PS8)strcat((char*)dest, (char*)src);
    185 }
    186 
    187 /****************************************************************************************
    188  *                        os_strlen()
    189  ****************************************************************************************
    190 DESCRIPTION:    wrapper to the OS strlen fucntion
    191 
    192 ARGUMENTS:
    193 
    194 RETURN:
    195 *****************************************************************************************/
    196 U32 os_strlen(const PS8 s)
    197 {
    198     return strlen((char*)s);
    199 }
    200 
    201 /****************************************************************************************
    202  *                        os_memoryCAlloc()
    203  ****************************************************************************************
    204 DESCRIPTION:    Allocates an array in memory with elements initialized to 0.
    205 
    206 ARGUMENTS:      OsContext   -   our adapter context.
    207                 Number      -   Number of elements
    208                 Size        -   Length in bytes of each element
    209 
    210 RETURN:         Pointer to the allocated memory.
    211 *****************************************************************************************/
    212 PVOID os_MemoryCAlloc(U32 Number, U32 Size)
    213 {
    214     return calloc(Number, Size);
    215 }
    216 
    217 /****************************************************************************************
    218  *                        os_memoryAlloc()
    219  ****************************************************************************************
    220 DESCRIPTION:    Allocates resident (nonpaged) system-space memory.
    221 
    222 ARGUMENTS:      OsContext   - our adapter context.
    223                 Size        - Specifies the size, in bytes, to be allocated.
    224 
    225 RETURN:         Pointer to the allocated memory.
    226 *****************************************************************************************/
    227 PVOID os_MemoryAlloc(U32 Size)
    228 {
    229     return malloc(Size);
    230 }
    231 
    232 /****************************************************************************************
    233  *                        os_memoryFree()
    234  ****************************************************************************************
    235 DESCRIPTION:    This function releases a block of memory previously allocated with the
    236                 os_memoryAlloc function.
    237 
    238 
    239 ARGUMENTS:      OsContext   -   our adapter context.
    240                 pMemPtr     -   Pointer to the base virtual address of the allocated memory.
    241                                 This address was returned by the os_memoryAlloc function.
    242                 Size        -   Redundant, needed only for kernel mode.
    243 
    244 RETURN:         None
    245 *****************************************************************************************/
    246 VOID os_MemoryFree(PVOID pMemPtr)
    247 {
    248      free(pMemPtr);
    249 }
    250 
    251 /****************************************************************************************
    252  *                        os_memset()
    253  ****************************************************************************************
    254 DESCRIPTION:    wrapper to the OS memset fucntion
    255 
    256 ARGUMENTS:
    257 
    258 RETURN:
    259 *****************************************************************************************/
    260 PVOID os_memset(PVOID s, U8 c, U32 n)
    261 {
    262     return memset(s, c, n);
    263 }
    264 
    265 /****************************************************************************************
    266  *                        os_memcpy()
    267  ****************************************************************************************
    268 DESCRIPTION:    wrapper to the OS memcpy fucntion
    269 
    270 ARGUMENTS:
    271 
    272 RETURN:
    273 *****************************************************************************************/
    274 PVOID os_memcpy(PVOID dest, const PVOID src, U32 n)
    275 {
    276     return memcpy(dest, src, n);
    277 }
    278 
    279 /****************************************************************************************
    280  *                        os_memcmp()
    281  ****************************************************************************************
    282 DESCRIPTION:    wrapper to the OS memcmp fucntion
    283 
    284 ARGUMENTS:
    285 
    286 RETURN:
    287 *****************************************************************************************/
    288 S32 os_memcmp(const PVOID s1, const PVOID s2, S32 n)
    289 {
    290     return memcmp(s1, s2, n);
    291 }
    292 
    293 /************************************************************************
    294  *                        os_strcmp                     *
    295  ************************************************************************
    296 DESCRIPTION: wrapper to the OS strcmp fucntion
    297 
    298 CONTEXT:
    299 ************************************************************************/
    300 S32 os_strcmp(const PS8 s1, const PS8 s2)
    301 {
    302     return strcmp((char*)s1,(char*)s2);
    303 }
    304 
    305 
    306 /************************************************************************
    307  *                        os_strncmp                        *
    308  ************************************************************************
    309 DESCRIPTION: wrapper to the OS strcmp fucntion
    310 
    311 CONTEXT:
    312 ************************************************************************/
    313 S32 os_strncmp(const PS8 s1, const PS8 s2, U32 n)
    314 {
    315     return strncmp((char*)s1,(char*)s2,n);
    316 }
    317 
    318 /************************************************************************
    319  *                        os_sscanf                     *
    320  ************************************************************************
    321 DESCRIPTION: wrapper to the OS sscanf fucntion
    322 
    323 CONTEXT:
    324 ************************************************************************/
    325 S32 os_sscanf(const PS8 str, const PS8 arg_list, ...)
    326 {
    327     va_list ap;
    328     S8 msg[MAX_HOST_MESSAGE_SIZE];
    329 
    330     va_start(ap, arg_list);
    331     vsprintf((char*)msg, (char*)arg_list, ap);
    332     va_end(ap);
    333 
    334     return sscanf((char*)str, (char*)msg);
    335 }
    336 
    337 /************************************************************************
    338  *                        os_strchr                     *
    339  ************************************************************************
    340 DESCRIPTION: wrapper to the OS strchr fucntion
    341 
    342 CONTEXT:
    343 ************************************************************************/
    344 PS8 os_strchr(const PS8 s, S32 c)
    345 {
    346     return (PS8)strchr((char*)s,c);
    347 }
    348 
    349 /************************************************************************
    350  *                        os_strtol                     *
    351  ************************************************************************
    352 DESCRIPTION: wrapper to the OS strtol fucntion
    353 
    354 CONTEXT:
    355 ************************************************************************/
    356 S32 os_strtol(const PS8 nptr, PPS8 endptr, S32 base)
    357 {
    358     return strtol((char*)nptr, (char**)endptr, base);
    359 }
    360 
    361 /************************************************************************
    362  *                        os_strtoul                        *
    363  ************************************************************************
    364 DESCRIPTION: wrapper to the OS strtoul fucntion
    365 
    366 CONTEXT:
    367 ************************************************************************/
    368 U32 os_strtoul(const PS8 nptr, PPS8 endptr, S32 base)
    369 {
    370     return strtoul((char*)nptr, (char**)endptr, base);
    371 }
    372 
    373 /************************************************************************
    374  *                        os_tolower                        *
    375  ************************************************************************
    376 DESCRIPTION: wrapper to the OS tolower fucntion
    377 
    378 CONTEXT:
    379 ************************************************************************/
    380 S32 os_tolower(S32 c)
    381 {
    382     return tolower(c);
    383 }
    384 
    385 /************************************************************************
    386  *                        os_tolower                        *
    387  ************************************************************************
    388 DESCRIPTION: wrapper to the OS tolower fucntion
    389 
    390 CONTEXT:
    391 ************************************************************************/
    392 S32 os_isupper(S32 c)
    393 {
    394     return isupper(c);
    395 }
    396 
    397 /************************************************************************
    398  *                        os_tolower                        *
    399  ************************************************************************
    400 DESCRIPTION: wrapper to the OS tolower fucntion
    401 
    402 CONTEXT:
    403 ************************************************************************/
    404 S32 os_toupper(S32 c)
    405 {
    406     return toupper(c);
    407 
    408 }
    409 
    410 /************************************************************************
    411  *                        os_atoi                        *
    412  ************************************************************************
    413 DESCRIPTION: wrapper to the OS atoi fucntion
    414 
    415 CONTEXT:
    416 ************************************************************************/
    417 S32 os_atoi(const PS8 str)
    418 {
    419 	return (S32)atoi(str);
    420 }
    421 
    422 /************************************************************************
    423  *                        os_fopen                      *
    424  ************************************************************************
    425 DESCRIPTION: wrapper to the OS fopen fucntion
    426 
    427 CONTEXT:
    428 ************************************************************************/
    429 PVOID os_fopen(const PS8 path, os_fopen_mode_e mode)
    430 {
    431     switch(mode)
    432     {
    433         case OS_FOPEN_READ:
    434             return fopen((char*)path, "r");
    435 		case OS_FOPEN_READ_BINARY:
    436 			return fopen((char*)path, "rb");
    437 		case OS_FOPEN_WRITE:
    438 			return fopen(path, "w");
    439 		case OS_FOPEN_WRITE_BINARY:
    440 			return fopen(path, "wb");
    441 
    442 
    443         default:
    444             return NULL;
    445     }
    446 }
    447 
    448 /************************************************************************
    449  *                        os_getFileSize                      *
    450  ************************************************************************
    451 DESCRIPTION: wrapper to the OS fopen fucntion
    452 
    453 CONTEXT:
    454 ************************************************************************/
    455 S32 os_getFileSize (PVOID file)
    456 {
    457     S32 size;
    458 
    459     if (fseek(file, 0, SEEK_END))
    460     {
    461         os_error_printf (CU_MSG_ERROR, (PS8)"Cannot seek file to end\n");
    462         return -1;
    463     }
    464     size = ftell(file);
    465     rewind(file);
    466     return size;
    467 }
    468 
    469 /************************************************************************
    470  *                        os_fgets                      *
    471  ************************************************************************
    472 DESCRIPTION: wrapper to the OS fgets fucntion
    473 
    474 CONTEXT:
    475 ************************************************************************/
    476 inline PS8 os_fgets(PS8 s, S32 size, PVOID stream)
    477 {
    478     return (PS8)fgets((char*)s, size, stream);
    479 }
    480 
    481 /************************************************************************
    482  *                        os_fread                      *
    483  ************************************************************************
    484 DESCRIPTION: wrapper to the OS fread fucntion
    485 
    486 CONTEXT:
    487 ************************************************************************/
    488 inline S32 os_fread (PVOID ptr, S32 size, S32 nmemb, PVOID stream)
    489 {
    490     return fread (ptr, size, nmemb, stream);
    491 }
    492 
    493 /************************************************************************
    494  *                        os_fwrite                      *
    495  ************************************************************************
    496 DESCRIPTION: wrapper to the OS fwrite fucntion
    497 
    498 CONTEXT:
    499 ************************************************************************/
    500 S32 os_fwrite (PVOID ptr, S32 size, S32 nmemb, PVOID stream)
    501 {
    502     return fwrite (ptr, size, nmemb, stream);
    503 }
    504 
    505 /************************************************************************
    506  *                        os_fclose                     *
    507  ************************************************************************
    508 DESCRIPTION: wrapper to the OS fclose fucntion
    509 
    510 CONTEXT:
    511 ************************************************************************/
    512 inline S32 os_fclose(PVOID stream)
    513 {
    514     return fclose(stream);
    515 }
    516 
    517 /************************************************************************
    518  *                        os_getInputString                     *
    519  ************************************************************************
    520 DESCRIPTION: get the input string for the console from the appropiate inputs
    521 
    522 CONTEXT:
    523 ************************************************************************/
    524 S32 os_getInputString(PS8 inbuf, S32 len)
    525 {
    526     fd_set read_set;
    527     S32 max_fd_index;
    528     S32 result;
    529     S32 pid;
    530 
    531     /*
    532      * Wait for one of two external events:
    533      * -----------------------------------
    534      *
    535      * 1. Data received from STDIN
    536      * 2. Data received from the event process
    537      */
    538 
    539     /* Prepare the read set fields */
    540     FD_ZERO(&read_set);
    541     FD_SET(0, &read_set);
    542     FD_SET(ipc_pipe[0], &read_set);
    543 
    544     /* Determine the maximum index of the file descriptor */
    545     max_fd_index = max(0, ipc_pipe[0]) + 1;
    546 
    547     /* Wait for event - blocking */
    548     result = select(max_fd_index, &read_set, NULL, NULL, NULL);
    549 
    550     if (result > 0)
    551     {
    552         if (FD_ISSET(0, &read_set))
    553         {
    554             /* Data received from STDIN */
    555             if ( fgets( (char*)inbuf, len, stdin ) == NULL )
    556                 return FALSE;
    557             else
    558                 return TRUE;
    559         }
    560 
    561         if (FD_ISSET(ipc_pipe[0], &read_set))
    562         {
    563             /**********************************/
    564             /* Data received from TCP client */
    565             /********************************/
    566             result = read(ipc_pipe[0], inbuf, len);
    567 
    568             /* Get the pid of the calling process */
    569             pid = *(inbuf + 0) | (*(inbuf + 1) << 8);
    570 
    571             /*
    572             Signal the calling process (tell him that we have
    573             received the command, and he can send us another one
    574             */
    575             if (pid != 0xFFFF)
    576             {
    577                 kill(pid, SIGUSR1);
    578             }
    579 
    580             if ( result <= 0 )
    581                 return FALSE;
    582             else
    583                 return TRUE;
    584         }
    585     }
    586 
    587     /* Error */
    588     os_error_printf(CU_MSG_ERROR, (PS8)"Input selection mismatch (0x%x)...\n", read_set);
    589     return FALSE;
    590 }
    591 
    592 /************************************************************************
    593  *                        os_Catch_CtrlC_Signal                     *
    594  ************************************************************************
    595 DESCRIPTION: register to catch the Ctrl+C signal
    596 
    597 CONTEXT:
    598 ************************************************************************/
    599 VOID os_Catch_CtrlC_Signal(PVOID SignalCB)
    600 {
    601     if(signal(SIGINT, SignalCB) == SIG_ERR)
    602         os_error_printf(CU_MSG_ERROR, (PS8)"ERROR - os_Catch_CtrlC_Signal - cant catch Ctrl+C signal\n");
    603 }
    604 
    605 
    606 VOID os_OsSpecificCmdParams(S32 argc, PS8* argv)
    607 {
    608 }
    609 
    610 VOID os_InitOsSpecificModules(VOID)
    611 {
    612 }
    613 
    614 VOID os_DeInitOsSpecificModules(VOID)
    615 {
    616 }
    617 
    618 TI_SIZE_T os_get_last_error()
    619 {
    620 	return errno;
    621 }
    622