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

Attachment: signature.asc
Description: Digital signature

Reply via email to