]> rtime.felk.cvut.cz Git - sysless.git/blobdiff - arch/h8300/generic/libs/boot/boot_fn.c
h8300: Make bloader work with ELF toolchain
[sysless.git] / arch / h8300 / generic / libs / boot / boot_fn.c
index 71507f1c9c320c90f13f02628cc753e66fc434cd..f46f3af4352b5aa2deef1d5daad1dbfa987d00a9 100644 (file)
@@ -55,16 +55,6 @@ void wdg_clear()
 
 #define TO_TEXT __attribute__ ((section (".text")))
 
-#define PIC_ADR(_ptr,_var) \
-       { \
-         __asm__ ( \
-           "bsr 1f\n" \
-           "1:\tmov.l @sp+,%0\n" \
-           "\tadd.l %1-1b,%0\n" \
-           : "=r" (_ptr) : "i" (&(_var)) : "cc" \
-         ); \
-       }
-
 static const unsigned long
   flash_blocks[] TO_TEXT =
        {0x00000,0x01000,0x02000,0x03000,0x04000,0x05000,0x06000,0x07000,
@@ -91,7 +81,7 @@ __asm__ (
 ".global _FlWait\n"
 "_FlWait:\n"
 #if (CPU_SYS_HZ>16000000)
-"      shll.l  er0"
+"      shll.l  er0\n"
 #endif
 "      mov.w   #1,r1\n"
 "      bra     2f:8\n"
@@ -110,7 +100,7 @@ int FlAdr2Blk(unsigned long adr)
 {
   int bl=0;
   unsigned long *blocks;
-  PIC_ADR(blocks,flash_blocks[0]);
+  blocks = &flash_blocks[0];
 
   if(adr<blocks[0]) return -1;
   while(blocks[bl+1]){
@@ -125,7 +115,7 @@ int FlTest(int bl)
 {
   __u16 *p, *pe;
   unsigned long *blocks;
-  PIC_ADR(blocks,flash_blocks[0]);
+  blocks = &flash_blocks[0];
   
   if(bl>=flash_block_count) return -2;
   if(bl<0) return -2;
@@ -148,12 +138,12 @@ int FlTest(int bl)
 int FlErase(int bl)
 {
   int n=100; /*N*/
-  if(bl>=flash_block_count) return -4;
-  if(bl<0) return -5;
+  if(bl>=flash_block_count) return -EBOOT_BLNUM_HIGH;
+  if(bl<0) return -EBOOT_BLNUM_LOW;
 
   if(FlTest(bl)==0) return 0;
 
-  if((*FLM_FLMCR1 & FLMCR1_FWEm)==0) return -1;
+  if((*FLM_FLMCR1 & FLMCR1_FWEm)==0) return -EBOOT_NO_FWE;
 
   *FLM_FLMCR1=FLMCR1_SWE1m;
   FlWait(1);           /*x*/
@@ -191,11 +181,11 @@ int FlErase(int bl)
   }
   *FLM_FLMCR1=0;
   FlWait(100);                 /*x1*/
-  return -2;
+  return -EBOOT_ERASE_FAILURE;
   
  fls_error:
   *FLM_FLMCR1=0;
-  return -3;
+  return -EBOOT_FLASH_ERROR;
 }
 
 void FlProgPulse(int time_zx)
@@ -221,8 +211,8 @@ int FlProgRow(__u8 *adr, __u8 *data)
   int n;
   __u8 *x;
   __u8 c,d;
-  if((unsigned long)adr & (FLASH_ROW-1)) return -6;
-  if((*FLM_FLMCR1 & FLMCR1_FWEm)==0 ) return -5;
+  if((unsigned long)adr & (FLASH_ROW-1)) return -EBOOT_ROW_BEGIN;
+  if((*FLM_FLMCR1 & FLMCR1_FWEm)==0 ) return -EBOOT_NO_FWE;
  #ifdef WITH_EXTERNAL_FLASH
   if(((__u32)adr>=EXTERNAL_FLASH_START)&&
      ((__u32)adr<=EXTERNAL_FLASH_END)){
@@ -232,7 +222,7 @@ int FlProgRow(__u8 *adr, __u8 *data)
 
   x=adr;
   for(i=FLASH_ROW;i--;x++){
-    if(*x!=0xff) return -4;
+    if(*x!=0xff) return -EBOOT_ROW_NOT_ERASED;
   }
   x=data;
   for(i=0;i<FLASH_ROW;i++,x++) prog_data[i]=*x;
@@ -250,6 +240,7 @@ int FlProgRow(__u8 *adr, __u8 *data)
     
     FlProgPulse(n>6?150:25);   /*z0<30 or z2<200 if n>N1*/
 
+    /* Program-Verify Mode */
     *FLM_FLMCR1|=FLMCR1_PV1m;
     FlWait(4);                 /*gamma*/
     i=0;
@@ -268,7 +259,7 @@ int FlProgRow(__u8 *adr, __u8 *data)
        d=data[i];
        if((~c&d)&0xff) goto fls_error;
        if(c!=d) {
-         m=1;
+         m=1;       /* Reprogram needed */
           /* DEB_BLOG(0xEE000000+(long)x); */
           /* DEB_BLOG(0xEF000000+(__u16)(c<<8)+(__u8)d); */
        }
@@ -282,7 +273,7 @@ int FlProgRow(__u8 *adr, __u8 *data)
       for(i=0;i<FLASH_ROW;i++){
         c=prog_data[i]; 
        d=data[i];
-       if(c!=d) m=1;
+       if(c!=d) m=1; /* Reprogram needed */
        if((~c&d)&0xff) goto fls_error;
        prog_data[i]=d|~c;
       }
@@ -296,11 +287,11 @@ int FlProgRow(__u8 *adr, __u8 *data)
   }
   *FLM_FLMCR1=0;
   FlWait(100);                 /*x1*/
-  return -1;
+  return -EBOOT_PROG_FAILURE;
 
  fls_error:
   *FLM_FLMCR1=0;
-  return -3;
+  return -EBOOT_FLASH_VERIFY;
 }
 
 int FlPrepBlk(unsigned long badr, unsigned long len)
@@ -308,7 +299,7 @@ int FlPrepBlk(unsigned long badr, unsigned long len)
   int bl, blend, res;
   bl=FlAdr2Blk(badr);
   blend=FlAdr2Blk(badr+len-1);
-  if((bl<0)||(blend<0)) return -8;
+  if((bl<0)||(blend<0)) return -EBOOT_BLOCKADDR;
   for(;bl<=blend;bl++){
     if(FlTest(bl)){
       res=FlErase(bl);
@@ -521,7 +512,7 @@ int ExtFlProgRow(__u8 *addr, __u8 *data)
     /* reset */
     FLASH_WR16(a,EXTFL_cmd_reset);
     FlWait(2);
-    if(FLASH_RD16(addr)!=val) return -3;
+    if(FLASH_RD16(addr)!=val) return -EBOOT_EXT_FLASH_VERIFY;
     ((__u16*)addr)++;
   }
   return 0;