• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*******************************************************************************
2 **+--------------------------------------------------------------------------+**
3 **|                                                                          |**
4 **| Copyright 1998-2008 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 
22 /****************************************************************************************************/
23 /*                                                                                                  */
24 /*      MODULE:     ipc.c                                                                           */
25 /*      PURPOSE:    Inter Process Communication utils                                               */
26 /*      Note:	    This module is for LINUX compilation only!										*/
27 /*                                                                                                  */
28 /****************************************************************************************************/
29 
30 #include <sys/mman.h>
31 #include <sys/ipc.h>
32 #include <errno.h>
33 #include <fcntl.h>
34 #include <signal.h>
35 #include <string.h>
36 #include <unistd.h>
37 
38 #include "console.h"
39 #include "ticon.h"
40 #include "ipc.h"
41 
42 	/*********************/
43 	/* Global variables */
44 	/*******************/
45 
46 int ethernet_wipp_process_pid = 0;
47 int ethernet_g_tester_process_pid = 0;
48 int ethernet_logger_process_pid = 0;
49 
50 
51 int ethernet_wipp_control_pipe[2];
52 int ethernet_g_tester_pipe[2];
53 int ethernet_logger_pipe[2];
54 
55 int ipc_pipe[2];
56 
57 void *p_shared_memory;
58 
59 
60 /************************************************************************
61  *                        ipc_initialize				                *
62  ************************************************************************
63 DESCRIPTION: Initialize the IPC
64 
65 CONTEXT:  main process only!
66 ************************************************************************/
ipc_initialize()67 int ipc_initialize()
68 {
69 	/*****************************/
70 	/* Create IPC shared memory */
71 	/***************************/
72 
73 	if ((p_shared_memory = mmap(0, SHARED_MEMORY_SIZE, PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, -1, 0)) == (void *)-1)
74 	{
75 		/* I should use the regular 'printf' function, because the
76 		   'console_printf_terminal' is not working w/o shared memory */
77 		printf("IPC Error, can't create shared memory mapping (%s)!\n", strerror(errno));
78 
79 		return -1;
80 	}
81 
82 	SHARED_MEMORY_TERMINAL_OUTPUT_PATH() = OUTPUT_PATH_SIMPLE_UART;
83 
84 	/************************/
85 	/* Create the IPC pipe */
86 	/**********************/
87 
88 	if (pipe(ipc_pipe) < 0)
89 	{
90 		console_printf_terminal("IPC Error, can't create pipe\n");
91 
92 		return -1;
93 	}
94 
95 	/* Close the write direction of the pipe  - because i only read information from this pipe. */
96 	/*close(ipc_pipe[1]);*/
97 
98 	return 0;
99 }
100 
101 /************************************************************************
102  *                        ipc_deinitialize				                *
103  ************************************************************************
104 DESCRIPTION: Deinitialize the IPC
105 
106 CONTEXT:  main process only!
107 ************************************************************************/
ipc_deinitialize()108 void ipc_deinitialize()
109 {
110 	/* Close the read direction of the pipe */
111 	close(ipc_pipe[0]);
112 }
113 
114 /************************************************************************
115  *                        ipc_send_command_to_main_process              *
116  ************************************************************************
117 DESCRIPTION: Handles the 'SIGUSR1' signal
118 
119 CONTEXT:  All child process - NOT FROM parent process!!!!
120 ************************************************************************/
ipc_send_command_to_main_process(int module_index,unsigned char * command,int size)121 void ipc_send_command_to_main_process(int module_index, unsigned char *command, int size)
122 {
123 	int pid = getpid();
124 
125 	/*********************************************************************/
126 	/* Flow control 													*/
127 	/* The pid of the caller process is inserted, so the main process  */
128 	/* will signal it back and release the waiting condition		  */
129 	/*****************************************************************/
130 
131 	command[0] = command[1] = 0xFF;
132 
133 	switch (module_index)
134 	{
135 	case ETHERNET_UTILS_G_TESTER_MODULE_ID:
136 		command[0] = (pid & 0x00FF);
137 		command[1] = ((pid & 0xFF00) >> 8);
138 		command[2] = '-';
139 		break;
140 
141 	case ETHERNET_UTILS_WIPP_MODULE_ID:
142 	case ETHERNET_UTILS_LOGGER_MODULE_ID:
143 		command[0] = (pid & 0x00FF);
144 		command[1] = ((pid & 0xFF00) >> 8);
145 		command[2] = '+';
146 		break;
147 
148 	case GENERAL_PROCESS_MODULE_ID:
149 		command[2] = '!';
150 		break;
151 	}
152 
153 	/* Send the buffer to the main process */
154 	write(ipc_pipe[1], command, size);
155 
156 	/* Wait for 300usec (probably the signal will release us earlier) */
157 	usleep(300);
158 }
159 
160