9 #include <sys/socket.h> 10 #include <arpa/inet.h> 11 #include <netinet/in.h> 14 #include <rtems/rtems_bsdnet.h> 42 splitRtemsBsdnetBootpCmdline(
void)
44 char *cp1, *cp2, *cp3;
46 if ((cp1 = rtems_bsdnet_bootp_cmdline) ==
NULL)
48 if (((cp2 = strchr(cp1,
':')) !=
NULL)
49 && (((cp3 = strchr(cp2+1,
' ')) !=
NULL)
50 || ((cp3 = strchr(cp2+1,
':')) !=
NULL))) {
52 int l2 = cp3 - cp2 - 1;
53 int l3 = strlen(cp3) - 1;
60 rtems_bsdnet_bootp_cmdline = cp2;
69 splitNfsMountPath(
char *nfsString)
73 if (nfsString ==
NULL)
75 if (((cp2 = strchr(nfsString,
':')) !=
NULL)
76 && (((cp3 = strchr(cp2+1,
' ')) !=
NULL)
77 || ((cp3 = strchr(cp2+1,
':')) !=
NULL))) {
78 int l1 = cp2 - nfsString;
79 int l2 = cp3 - cp2 - 1;
80 int l3 = strlen(cp3) - 1;
91 #if defined(HAVE_MOTLOAD) 97 gev(
const char *parm,
volatile char *nvp)
108 while ((c = *nvp++) !=
'\0') {
109 if ((c ==
'=') && (*name ==
'\0')) {
111 while (*nvp++ !=
'\0')
113 ret = malloc(nvp - val);
120 while (*nvp++ !=
'\0')
129 motScriptParm(
const char *mot_script_boot,
char parm)
135 while (*mot_script_boot !=
'\0') {
136 if (isspace(*(
unsigned char *)mot_script_boot)
137 && (*(mot_script_boot+1) ==
'-')
138 && (*(mot_script_boot+2) == parm)) {
139 mot_script_boot += 3;
140 cp = mot_script_boot;
141 while ((*mot_script_boot !=
'\0') &&
142 !isspace(*(
unsigned char *)mot_script_boot))
144 l = mot_script_boot - cp;
161 const char *mot_script_boot;
164 # if defined(BSP_NVRAM_BASE_ADDR) 165 nvp = (
volatile unsigned char *)(BSP_NVRAM_BASE_ADDR+0x70f8);
166 # elif defined(BSP_I2C_VPD_EEPROM_DEV_NAME) 169 if ((fd = open(BSP_I2C_VPD_EEPROM_DEV_NAME, 0)) < 0) {
170 printf(
"Can't open %s: %s\n", BSP_I2C_VPD_EEPROM_DEV_NAME, strerror(errno));
173 lseek(fd, 0x10f8, SEEK_SET);
174 if (
read(fd, gev_buf,
sizeof gev_buf) !=
sizeof gev_buf) {
175 printf(
"Can't read %s: %s\n", BSP_I2C_VPD_EEPROM_DEV_NAME, strerror(errno));
181 # error "No way to read GEV!" 186 mot_script_boot = gev(
"mot-script-boot", nvp);
187 if ((rtems_bsdnet_bootp_server_name = gev(
"mot-/dev/enet0-sipa", nvp)) ==
NULL)
188 rtems_bsdnet_bootp_server_name = motScriptParm(mot_script_boot,
's');
197 cp = gev(
"rtems-dns-domainname", nvp);
207 if ((rtems_bsdnet_bootp_boot_file_name = gev(
"mot-/dev/enet0-file", nvp)) ==
NULL)
208 rtems_bsdnet_bootp_boot_file_name = motScriptParm(mot_script_boot,
'f');
209 rtems_bsdnet_bootp_cmdline = gev(
"epics-script", nvp);
210 splitRtemsBsdnetBootpCmdline();
211 splitNfsMountPath(gev(
"epics-nfsmount", nvp));
215 if ((cp = gev(
"epics-tz", nvp)) !=
NULL)
219 #elif defined(HAVE_PPCBUG) 223 struct ppcbug_nvram {
224 uint32_t PacketVersionIdentifier;
225 uint32_t NodeControlMemoryAddress;
226 uint32_t BootFileLoadAddress;
227 uint32_t BootFileExecutionAddress;
228 uint32_t BootFileExecutionDelay;
229 uint32_t BootFileLength;
230 uint32_t BootFileByteOffset;
231 uint32_t TraceBufferAddress;
232 uint32_t ClientIPAddress;
233 uint32_t ServerIPAddress;
234 uint32_t SubnetIPAddressMask;
235 uint32_t BroadcastIPAddressMask;
236 uint32_t GatewayIPAddress;
237 uint8_t BootpRarpRetry;
238 uint8_t TftpRarpRetry;
239 uint8_t BootpRarpControl;
240 uint8_t UpdateControl;
241 char BootFilenameString[64];
242 char ArgumentFilenameString[64];
245 static char *addr(
char *cbuf, uint32_t addr)
248 if ((a.s_addr = addr) == 0)
250 return (
char *)inet_ntop(AF_INET, &a, cbuf, INET_ADDRSTRLEN);
256 static struct ppcbug_nvram nvram;
257 static char ip_address[INET_ADDRSTRLEN];
258 static char ip_netmask[INET_ADDRSTRLEN];
259 static char server[INET_ADDRSTRLEN];
260 static char gateway[INET_ADDRSTRLEN];
274 #if defined(NVRAM_INDIRECT) 276 volatile char *addrLo = (
volatile char *)0x80000074;
277 volatile char *addrHi = (
volatile char *)0x80000075;
278 volatile char *data = (
volatile char *)0x80000077;
280 char *d = (
char *)&nvram;
282 while (d < ((
char *)&nvram +
sizeof nvram)) {
283 *addrLo = addr & 0xFF;
284 *addrHi = (addr >> 8) & 0xFF;
291 volatile char *s = (
volatile char *)0xFFE81000;
292 char *d = (
char *)&nvram;
294 while (d < ((
char *)&nvram +
sizeof nvram))
303 rtems_bsdnet_bootp_server_name = addr(server, nvram.ServerIPAddress);
304 rtems_bsdnet_bootp_server_address.s_addr = nvram.ServerIPAddress;
314 rtems_bsdnet_bootp_boot_file_name = nvram.BootFilenameString;
315 rtems_bsdnet_bootp_cmdline = nvram.ArgumentFilenameString;
316 splitRtemsBsdnetBootpCmdline();
319 #elif defined(__mcf528x__) 322 env(
const char *parm,
const char *defaultValue)
324 const char *cp = bsp_getbenv(parm);
330 printf (
"%s environment variable missing -- using %s.\n", parm, cp);
345 rtems_bsdnet_bootp_server_name = env(
"SERVER",
"192.168.0.1");
348 cp1 = env(
"DOMAIN",
NULL);
353 rtems_bsdnet_bootp_boot_file_name = env(
"BOOTFILE",
"uC5282App.boot");
354 rtems_bsdnet_bootp_cmdline = env(
"CMDLINE",
"epics/iocBoot/iocNobody/st.cmd");
355 splitNfsMountPath(env(
"NFSMOUNT",
NULL));
356 if ((cp1 = env(
"TZ",
NULL)) !=
NULL)
367 printf(
"SYSTEM HAS NO NON-VOLATILE RAM!\n");
368 printf(
"YOU MUST USE SOME OTHER METHOD TO OBTAIN NETWORK CONFIGURATION\n");
struct rtems_bsdnet_config rtems_bsdnet_config
Routines to get and set EPICS environment parameters.
LIBCOM_API void epicsStdCall epicsEnvSet(const char *name, const char *value)
Set an environment variable's value.
char * epicsStrDup(const char *s)
void setBootConfigFromNVRAM(void)