#include <cpu_def.h>
#include <system_def.h>
//#include <h8s2633h.h>
-#include <h8s2638h.h>
+#include <mcu_regs.h>
#include "boot_fn.h"
#undef WITH_EXTERNAL_FLASH
#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,
".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"
{
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]){
{
__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;
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*/
}
*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)
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)){
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;
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;
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); */
}
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;
}
}
*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)
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);
/* 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;
unsigned long badr;
unsigned long len;
unsigned char *adr;
+ int ret;
DEB_BLOG_INIT;
if(baud) SCIInit(baud);
while(i++<len){
if(SCIReceive(&c,0)<0){
e=0xfd;
+ j=0;
break;
}
buf[j++]=c;
if(j==FLASH_ROW){
DEB_WR_HEX((long)adr,6); /*!!!*/
- if((j=FlProgRow(adr,buf))!=0) e=0xff;
+ if((ret=FlProgRow(adr,buf))!=0) {
+ e=-ret;
+ j=0;
+ break;
+ }
DEB_BLOG(0xEA000000|(__u32)adr|((__u8)j&0x7f));
DEB_WR_HEX(j,2); /*!!!*/
adr+=FLASH_ROW;
}
if(j/*&&!(e&0x80)*/){
while(j<FLASH_ROW) buf[j++]=0xff;
- if(FlProgRow(adr,buf)!=0) e=0xff;
+ if((ret=FlProgRow(adr,buf))!=0) e=-ret;
}
SCISend(e);
}else if (cmd==4){