patch-2.4.19 linux-2.4.19/arch/mips/galileo-boards/ev64120/compressed/burner.c
Next file: linux-2.4.19/arch/mips/galileo-boards/ev64120/compressed/doit.c
Previous file: linux-2.4.19/arch/mips/galileo-boards/ev64120/compressed/README
Back to the patch index
Back to the overall index
- Lines: 231
- Date:
Fri Aug 2 17:39:43 2002
- Orig file:
linux-2.4.18/arch/mips/galileo-boards/ev64120/compressed/burner.c
- Orig date:
Wed Dec 31 16:00:00 1969
diff -urN linux-2.4.18/arch/mips/galileo-boards/ev64120/compressed/burner.c linux-2.4.19/arch/mips/galileo-boards/ev64120/compressed/burner.c
@@ -0,0 +1,230 @@
+/*
+ * arch/mips/galileo/compressed/burner.c
+ *
+ * By RidgeRun Inc (Leveraged from Galileo's main.c, misc.c, etc).
+ *
+ * Burn image from ram to flash
+ * For use with Galileo EVB64120A MIPS eval board.
+ */
+#include <asm/types.h>
+#include <asm/byteorder.h>
+#include <asm/galileo-boards/evb64120A/eeprom_param.h>
+#include <asm/galileo-boards/evb64120A/flashdrv.h>
+
+#define IMAGEOFFSET 0x00300000
+
+static void burn_image_from_memory(void);
+static char *sprintf(char *buf, const char *fmt, ...);
+static void printf(const char *fmt, ...);
+
+unsigned int FlashSize;
+
+/******************************
+ Routine:
+ Description:
+ ******************************/
+int main(void)
+{
+ printf("\n");
+ printf("\n");
+ printf("\n");
+ printf("\n");
+ printf(" +--------------------+\n");
+ printf(" | |\n");
+ printf(" | Flash Burn Utility |\n");
+ printf(" | |\n");
+ printf(" +--------------------+\n");
+ printf("\n");
+ printf("Please send your *.srec image to the parallel port\n");
+ printf("\n");
+ printf("Note: The *.srec image should be setup to\n");
+ printf(" load into address 0xa0300000 where\n");
+ printf(" it will then be transferred to flash\n");
+ printf("\n");
+
+ SET_REG_BITS(0x468, BIT20); // Set Flash to be 16 bit wide
+ FlashSize = flashInit(0xbf000000, 2, X16);
+
+ galileo_dl(); // read in the users *.srec image.
+ burn_image_from_memory(); // put it in flash.
+
+ printf("\n");
+ printf("\n");
+ printf("+---------------+\n");
+ printf("| Done |\n");
+ printf("|(please reboot)|\n");
+ printf("+---------------+\n");
+ printf("\n");
+
+ while (1) {
+ }
+ return 0;
+}
+
+/******************************
+ Routine:
+ Description:
+ ******************************/
+static void burn_image_from_memory(void)
+{
+ unsigned int count, delta, temp, temp1;
+ unsigned int to_sector, last_sector;
+
+ /* Find how many sectors needed to be erased */
+ to_sector = flashInWhichSector(FlashSize - 4); // skranz, modified.
+ if (to_sector == 0xffffffff) {
+ printf
+ ("Flash Burning Error - Flash too small - Cannot burn image\n"); // skranz, modified.
+ return;
+ }
+
+ /* Which is the last sector */
+ last_sector = flashInWhichSector(FlashSize - 4);
+ delta = 0;
+ printf("\nErasing first %d sectors\n", to_sector);
+ for (count = 0; count < to_sector + 1; count++) {
+ printf("Erasing sector %d\n", count);
+ flashEraseSector(count);
+ }
+ printf("flash region size = %d\n", FlashSize); // skranz, added
+ printf("Sdram IMAGEOFFSET = %d\n", IMAGEOFFSET); // skranz, added
+
+ printf("Burning from Sdram to %d mark; full burn.\n", FlashSize);
+ for (count = 0; count < (FlashSize - delta); count = count + 4) {
+ flashWriteWord(count,
+ *(unsigned int *) ((count | NONE_CACHEABLE)
+ + IMAGEOFFSET)); // skranz, modified.
+ temp = flashReadWord(count);
+ temp1 = *(unsigned int *) ((count | NONE_CACHEABLE) + IMAGEOFFSET); // skranz, modified.
+ if (((unsigned int) temp) != ((unsigned int) temp1)) {
+ printf
+ ("Burning error at address %X : flash(%X) sdram(%X)\n",
+ count, flashReadWord(count),
+ *(unsigned int *) ((count | NONE_CACHEABLE) + IMAGEOFFSET)); // skranz, modified.
+ printf("Aborting Prematurally.\n");
+ break;
+ }
+ }
+ printf("Finished burning Image\n");
+}
+
+/******************************
+ Routine:
+ Description:
+ Formats:
+ %X - 4 byte ASCII (8 hex digits)
+ %x - 2 byte ASCII (4 hex digits)
+ %b - 1 byte ASCII (2 hex digits)
+ %d - decimal (also %i)
+ %c - ASCII char
+ %s - ASCII string
+ %I - Internet address in x.x.x.x notation
+ ******************************/
+static char hex[] = "0123456789ABCDEF";
+static char *do_printf(char *buf, const char *fmt, const int *dp)
+{
+ register char *p;
+ char tmp[16];
+ while (*fmt) {
+ if (*fmt == '%') { /* switch() uses more space */
+ fmt++;
+
+ if (*fmt == 'X') {
+ const long *lp = (const long *) dp;
+ register long h = *lp++;
+ dp = (const int *) lp;
+ *(buf++) = hex[(h >> 28) & 0x0F];
+ *(buf++) = hex[(h >> 24) & 0x0F];
+ *(buf++) = hex[(h >> 20) & 0x0F];
+ *(buf++) = hex[(h >> 16) & 0x0F];
+ *(buf++) = hex[(h >> 12) & 0x0F];
+ *(buf++) = hex[(h >> 8) & 0x0F];
+ *(buf++) = hex[(h >> 4) & 0x0F];
+ *(buf++) = hex[h & 0x0F];
+ }
+ if (*fmt == 'x') {
+ register int h = *(dp++);
+ *(buf++) = hex[(h >> 12) & 0x0F];
+ *(buf++) = hex[(h >> 8) & 0x0F];
+ *(buf++) = hex[(h >> 4) & 0x0F];
+ *(buf++) = hex[h & 0x0F];
+ }
+ if (*fmt == 'b') {
+ register int h = *(dp++);
+ *(buf++) = hex[(h >> 4) & 0x0F];
+ *(buf++) = hex[h & 0x0F];
+ }
+ if ((*fmt == 'd') || (*fmt == 'i')) {
+ register int dec = *(dp++);
+ p = tmp;
+ if (dec < 0) {
+ *(buf++) = '-';
+ dec = -dec;
+ }
+ do {
+ *(p++) = '0' + (dec % 10);
+ dec = dec / 10;
+ } while (dec);
+ while ((--p) >= tmp)
+ *(buf++) = *p;
+ }
+ if (*fmt == 'I') {
+ union {
+ long l;
+ unsigned char c[4];
+ } u;
+ const long *lp = (const long *) dp;
+ u.l = *lp++;
+ dp = (const int *) lp;
+ buf = sprintf(buf, "%d.%d.%d.%d",
+ u.c[0], u.c[1], u.c[2],
+ u.c[3]);
+ }
+ if (*fmt == 'c')
+ *(buf++) = *(dp++);
+ if (*fmt == 's') {
+ p = (char *) *dp++;
+ while (*p)
+ *(buf++) = *p++;
+ }
+ } else
+ *(buf++) = *fmt;
+ fmt++;
+ }
+ *buf = 0;
+ return (buf);
+}
+
+/******************************
+ Routine:
+ Description:
+ ******************************/
+static char *sprintf(char *buf, const char *fmt, ...)
+{
+ return do_printf(buf, fmt, ((const int *) &fmt) + 1);
+}
+
+/******************************
+ Routine:
+ Description:
+ ******************************/
+void putchar(int c)
+{
+ if (c == '\n') {
+ serial_putc('\r');
+ }
+ serial_putc(c);
+}
+
+/******************************
+ Routine:
+ Description:
+ ******************************/
+static void printf(const char *fmt, ...)
+{
+ char buf[256], *p;
+ p = buf;
+ do_printf(buf, fmt, ((const int *) &fmt) + 1);
+ while (*p)
+ putchar(*p++);
+}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)