/drivers/net/wireless/tiwlan1251/CUDK/CLI/ipc.c
C | 159 lines | 61 code | 30 blank | 68 comment | 4 complexity | 365d853419328aac66a852329b72407a MD5 | raw file
Possible License(s): AGPL-1.0, GPL-2.0, LGPL-2.0
- /*******************************************************************************
- **+--------------------------------------------------------------------------+**
- **| |**
- **| Copyright 1998-2008 Texas Instruments, Inc. - http://www.ti.com/ |**
- **| |**
- **| Licensed under the Apache License, Version 2.0 (the "License"); |**
- **| you may not use this file except in compliance with the License. |**
- **| You may obtain a copy of the License at |**
- **| |**
- **| http://www.apache.org/licenses/LICENSE-2.0 |**
- **| |**
- **| Unless required by applicable law or agreed to in writing, software |**
- **| distributed under the License is distributed on an "AS IS" BASIS, |**
- **| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |**
- **| See the License for the specific language governing permissions and |**
- **| limitations under the License. |**
- **| |**
- **+--------------------------------------------------------------------------+**
- *******************************************************************************/
- /****************************************************************************************************/
- /* */
- /* MODULE: ipc.c */
- /* PURPOSE: Inter Process Communication utils */
- /* Note: This module is for LINUX compilation only! */
- /* */
- /****************************************************************************************************/
- #include <sys/mman.h>
- #include <sys/ipc.h>
- #include <errno.h>
- #include <fcntl.h>
- #include <signal.h>
- #include <string.h>
- #include <unistd.h>
- #include "console.h"
- #include "ticon.h"
- #include "ipc.h"
- /*********************/
- /* Global variables */
- /*******************/
- int ethernet_wipp_process_pid = 0;
- int ethernet_g_tester_process_pid = 0;
- int ethernet_logger_process_pid = 0;
- int ethernet_wipp_control_pipe[2];
- int ethernet_g_tester_pipe[2];
- int ethernet_logger_pipe[2];
- int ipc_pipe[2];
- void *p_shared_memory;
- /************************************************************************
- * ipc_initialize *
- ************************************************************************
- DESCRIPTION: Initialize the IPC
- CONTEXT: main process only!
- ************************************************************************/
- int ipc_initialize()
- {
- /*****************************/
- /* Create IPC shared memory */
- /***************************/
- if ((p_shared_memory = mmap(0, SHARED_MEMORY_SIZE, PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, -1, 0)) == (void *)-1)
- {
- /* I should use the regular 'printf' function, because the
- 'console_printf_terminal' is not working w/o shared memory */
- printf("IPC Error, can't create shared memory mapping (%s)!\n", strerror(errno));
- return -1;
- }
- SHARED_MEMORY_TERMINAL_OUTPUT_PATH() = OUTPUT_PATH_SIMPLE_UART;
- /************************/
- /* Create the IPC pipe */
- /**********************/
- if (pipe(ipc_pipe) < 0)
- {
- console_printf_terminal("IPC Error, can't create pipe\n");
- return -1;
- }
- /* Close the write direction of the pipe - because i only read information from this pipe. */
- /*close(ipc_pipe[1]);*/
- return 0;
- }
- /************************************************************************
- * ipc_deinitialize *
- ************************************************************************
- DESCRIPTION: Deinitialize the IPC
- CONTEXT: main process only!
- ************************************************************************/
- void ipc_deinitialize()
- {
- /* Close the read direction of the pipe */
- close(ipc_pipe[0]);
- }
- /************************************************************************
- * ipc_send_command_to_main_process *
- ************************************************************************
- DESCRIPTION: Handles the 'SIGUSR1' signal
- CONTEXT: All child process - NOT FROM parent process!!!!
- ************************************************************************/
- void ipc_send_command_to_main_process(int module_index, unsigned char *command, int size)
- {
- int pid = getpid();
- /*********************************************************************/
- /* Flow control */
- /* The pid of the caller process is inserted, so the main process */
- /* will signal it back and release the waiting condition */
- /*****************************************************************/
- command[0] = command[1] = 0xFF;
- switch (module_index)
- {
- case ETHERNET_UTILS_G_TESTER_MODULE_ID:
- command[0] = (pid & 0x00FF);
- command[1] = ((pid & 0xFF00) >> 8);
- command[2] = '-';
- break;
- case ETHERNET_UTILS_WIPP_MODULE_ID:
- case ETHERNET_UTILS_LOGGER_MODULE_ID:
- command[0] = (pid & 0x00FF);
- command[1] = ((pid & 0xFF00) >> 8);
- command[2] = '+';
- break;
- case GENERAL_PROCESS_MODULE_ID:
- command[2] = '!';
- break;
- }
- /* Send the buffer to the main process */
- write(ipc_pipe[1], command, size);
- /* Wait for 300usec (probably the signal will release us earlier) */
- usleep(300);
- }