On Tue, Oct 19, 2004 at 07:00:44PM +0200, Jan-Benedict Glaw wrote: > On Tue, 2004-10-19 00:22:32 +0200, Peter 'p2' De Schrijver <[EMAIL PROTECTED]> > wrote in message <[EMAIL PROTECTED]>: > > That's why I wanted to load a program in memory using DEPOSIT commands > > and run the program using the START command. This program would then > > download a new firmware image and flash it. > > So you want to shift the whole flashing program plus the new ROM > contents through the serial link into your alpha and START it? >
Basically yes, although I want to do it in 2 stages. stage 1 : small program which does XMODEM. stage 2 : load the firmware and flash. stage 1 loader would be loaded using DEPOSIT. > In this case, maybe it's the easiest thing to just squeeze the firmware > update MOP image into it and start it. It should basically be a PIC > image, so that should work. > Good idea ! I guess the tftp image should work as well, at least I don't see why it would not. > If it fscks up your box, we can still take the soldering iron. > > > > http://cvs.sourceforge.net/viewcvs.py/linux-vax/usr/firmware_dumper/) > > > > Good idea. > Ok. > Send me the patch once it's done:-) > See attachement. It probably needs more testing though :) Cheers, Peter (p2).
diff -uN usr/firmware_dumper/backend_alpha.c
firmware_dumper.alpha/backend_alpha.c
--- usr/firmware_dumper/backend_alpha.c 1970-01-01 01:00:00.000000000 +0100
+++ firmware_dumper.alpha/backend_alpha.c 2004-10-19 00:16:29.000000000
+0200
@@ -0,0 +1,97 @@
+#include <stdio.h>
+#include <string.h>
+#include "main.h"
+#include <unistd.h>
+#include "serial.h"
+
+int
+alpha_init (int fd)
+{
+ unsigned char one_byte;
+ int ret;
+
+ serial_send_break (fd, 0);
+ do {
+ ret = serial_read_byte (fd, &one_byte, 1, 0);
+ } while (ret == 0);
+ sleep (3);
+ do {
+ ret = serial_read_byte (fd, &one_byte, 1, 0);
+ } while (ret == 0);
+
+ return 0;
+}
+
+int
+alpha_get_byte (int fd, unsigned char *output, unsigned long long int address)
+{
+ unsigned char output_buffer[100];
+ unsigned char input_buffer[200];
+ unsigned char *ptr;
+ int ret;
+ int input_len = 0;
+
+ sprintf (output_buffer, "EXAMINE -B -PM -U %016llx\r\n", address);
+ serial_write (fd, output_buffer, strlen (output_buffer));
+
+ bzero (input_buffer, sizeof (input_buffer));
+ do {
+ ret = serial_read_byte (fd, &input_buffer[input_len], 1, 0);
+ if (ret == 0)
+ input_len++;
+ } while (ret == 0 && input_len < sizeof (input_buffer) && !strstr
(input_buffer, ">>> "));
+
+ if (ret)
+ return -1;
+
+ ptr = input_buffer;
+ /* Over-read first line */
+ while (*ptr != '\n' && *ptr != '\r')
+ ptr++;
+ while (*ptr == '\n' || *ptr == '\r')
+ ptr++;
+ ptr++;
+
+ /* Strip leading spaces of second line */
+ while (*ptr == ' ')
+ ptr++;
+
+ /* Over-read 'P' */
+ ptr+=5;
+
+ /* Strip leading spaces of second line */
+ while (*ptr == ' ')
+ ptr++;
+
+ /* Strip address */
+ while ( ((*ptr >= '0') && (*ptr <= '9'))
+ || ((*ptr >= 'a') && (*ptr <= 'z'))
+ || ((*ptr >= 'A') && (*ptr <= 'Z'))
+ || (*ptr == '.'))
+ *ptr++;
+
+ /* Strip leading spaces */
+ while (*ptr == ' ')
+ ptr++;
+
+ /* Now get the byte */
+ if (*ptr >= 'A' && *ptr <= 'Z')
+ *ptr = *ptr - 'A' + 'a';
+ if (*ptr >= '0' && *ptr <= '9')
+ *output = *ptr - '0';
+ else
+ *output = *ptr - 'a' + 10;
+
+ *output <<= 4;
+ ptr++;
+
+ if (*ptr >= 'A' && *ptr <= 'Z')
+ *ptr = *ptr - 'A' + 'a';
+ if (*ptr >= '0' && *ptr <= '9')
+ *output |= *ptr - '0';
+ else
+ *output |= *ptr - 'a' + 10;
+
+ return 0;
+}
+
diff -uN usr/firmware_dumper/main.c firmware_dumper.alpha/main.c
--- usr/firmware_dumper/main.c 2004-10-05 13:49:52.000000000 +0200
+++ firmware_dumper.alpha/main.c 2004-10-19 00:01:37.000000000 +0200
@@ -43,6 +43,12 @@
.init = &vax_init,
.get_byte = &vax_get_byte,
},
+ {
+ .name = "alpha",
+ .wordsize = 64,
+ .init = &alpha_init,
+ .get_byte = &alpha_get_byte,
+ },
};
diff -uN usr/firmware_dumper/main.h firmware_dumper.alpha/main.h
--- usr/firmware_dumper/main.h 2004-07-23 19:44:47.000000000 +0200
+++ firmware_dumper.alpha/main.h 2004-10-19 00:02:09.000000000 +0200
@@ -5,4 +5,7 @@
extern int vax_get_byte (int fd, unsigned char *output, unsigned long long int
address);
extern int vax_fini (int fd);
+extern int alpha_init (int fd);
+extern int alpha_get_byte (int fd, unsigned char *output, unsigned long long
int address);
+
#endif /* _MAIN_H */
diff -uN usr/firmware_dumper/Makefile firmware_dumper.alpha/Makefile
--- usr/firmware_dumper/Makefile 2004-07-23 19:44:47.000000000 +0200
+++ firmware_dumper.alpha/Makefile 2004-10-19 00:00:29.000000000 +0200
@@ -2,6 +2,7 @@
OBJECTS= main.o \
backend_vax.o \
+ backend_alpha.o \
serial.o
all: dumper
signature.asc
Description: Digital signature

