40 #include <sys/types.h>
44 #include <sys/ioctl.h>
48 #include "avrmalloc.h"
59 static int global_pipe_fd = -1;
64 static pid_t global_child_pid = -1;
86 int sram_start,
int eeprom_sz)
95 prog = getenv (
"SIM_DISP_PROG");
107 avr_warning (
"pipe failed: %s\n", strerror (errno));
116 avr_warning (
"fork failed: %s\n", strerror (errno));
125 global_child_pid = pid;
127 global_pipe_fd = pfd[1];
128 return global_pipe_fd;
133 char fl_sz[20], sr_sz[20], sr_start[20], eep_sz[20];
140 snprintf (fl_sz,
sizeof (fl_sz) - 1,
"%d", flash_sz);
141 snprintf (sr_sz,
sizeof (sr_sz) - 1,
"%d", sram_sz);
142 snprintf (sr_start,
sizeof (sr_start) - 1,
"%d", sram_start);
143 snprintf (eep_sz,
sizeof (eep_sz) - 1,
"%d", eeprom_sz);
144 snprintf (spfd,
sizeof (spfd) - 1,
"%d", pfd[0]);
147 snprintf (pfd_env,
sizeof (pfd_env),
"SIM_PIPE_FD=%d", pfd[0]);
160 execlp (prog, prog,
"--pfd", spfd, fl_sz, sr_sz, sr_start, eep_sz,
166 execlp (
"xterm",
"xterm",
"-geom",
"100x50",
"-e", prog,
"--pfd",
167 spfd, fl_sz, sr_sz, sr_start, eep_sz, NULL);
171 avr_warning (
"exec failed: %s\n", strerror (errno));
183 if (global_pipe_fd < 0)
187 close (global_pipe_fd);
190 kill (global_child_pid, SIGINT);
191 waitpid (0, NULL, 0);
197 unsigned char CC = 0;
222 int len = strlen (msg) + 4 + 1;
228 snprintf (enc_msg, len,
"$%s#%02x", msg, checksum (msg));
229 #if defined(DISP_DEBUG_OUTPUT_ON)
230 fprintf (stderr,
"DISP: %s\n", enc_msg);
233 res = write (global_pipe_fd, enc_msg, len);
234 if ((res < 0) && (errno == EINTR))
239 res = write (global_pipe_fd, enc_msg, len);
242 avr_error (
"write failed: %s\n", strerror (errno));
249 static char global_buf[MAX_BUF + 1];
257 if (global_pipe_fd < 0)
260 snprintf (global_buf, MAX_BUF,
"n%x", clock);
261 global_buf[MAX_BUF] =
'\0';
271 if (global_pipe_fd < 0)
274 snprintf (global_buf, MAX_BUF,
"p%x", val);
275 global_buf[MAX_BUF] =
'\0';
286 if (global_pipe_fd < 0)
289 snprintf (global_buf, MAX_BUF,
"r%x:%02x", reg, val);
290 global_buf[MAX_BUF] =
'\0';
301 if (global_pipe_fd < 0)
304 snprintf (global_buf, MAX_BUF,
"i%x:%02x", reg, val);
305 global_buf[MAX_BUF] =
'\0';
318 if (global_pipe_fd < 0)
321 snprintf (global_buf, MAX_BUF,
"I%x:%s", reg, name);
322 global_buf[MAX_BUF] =
'\0';
345 if (global_pipe_fd < 0)
348 bytes = snprintf (global_buf, MAX_BUF,
"f%x,%x:", addr, len);
350 for (i = 0; i < len; i++)
352 if (MAX_BUF - bytes < 0)
356 snprintf (global_buf + bytes, MAX_BUF - bytes,
"%04x", vals[i]);
359 global_buf[MAX_BUF] =
'\0';
377 if (global_pipe_fd < 0)
380 bytes = snprintf (global_buf, MAX_BUF,
"s%x,%x:", addr, len);
382 for (i = 0; i < len; i++)
384 if (MAX_BUF - bytes < 0)
388 snprintf (global_buf + bytes, MAX_BUF - bytes,
"%02x", vals[i]);
391 global_buf[MAX_BUF] =
'\0';
409 if (global_pipe_fd < 0)
412 bytes = snprintf (global_buf, MAX_BUF,
"e%x,%x:", addr, len);
414 for (i = 0; i < len; i++)
416 if (MAX_BUF - bytes < 0)
420 snprintf (global_buf + bytes, MAX_BUF - bytes,
"%02x", vals[i]);
423 global_buf[MAX_BUF] =
'\0';