⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 burn.c

📁 arm s3c44b0x 的程序源码
💻 C
字号:

//***************************************************************************
#define U32 unsigned int
#define U16 unsigned short
#define S32 int
#define S16 short int
#define U8  unsigned char
#define	S8  char

extern char Uart_GetKey(U8 ch);
extern void Uart_Printf(U8 ch,char *fmt,...);

typedef int  uint; 

static uint SecData[] = {
  0x29160, 0x000,
  0x04000, 0x001,
  0x02000, 0x002,
  0x08000, 0x001,
  0x10000, 0x01F,

  0x39160, 0x000,
  0x01000, 0x200,

  0x00000, 0x000
};

#define type 0x39160

uint  GetSecAddr(uint index)
{
  uint i;
  uint sec;
  uint addr;
  
  addr = 0;
  i    = 0;
  sec  = 0;
  while (SecData[i]) {
    if (SecData[i]==type && SecData[i+1]==0) {
      i += 2;
	    while (SecData[i+1]) {
		    sec += SecData[i+1];
		    addr+= (SecData[i] * SecData[i+1]);
		    if (sec > index) {
			    addr -= (SecData[i] * (sec - index));
			    return addr;
		    }
		    i += 2;
	    }
	    return 0;
	  } else {
	    i += 2;
	    continue;
  	}
  }
  return 0;
}

#define FLASHBASEADDR 0
uint WriteSector(int index,char *data_buffer)
{
	volatile unsigned short *Dest;
	volatile unsigned short *Org;
	uint     len=0,i;
	
	Uart_Printf(0,"Burning Flash sector %02d... ", index); 
	
	len       = GetSecAddr(index+1)-GetSecAddr(index);
	Org       = (volatile unsigned short *)data_buffer;
	Dest      = (volatile unsigned short *)(FLASHBASEADDR+GetSecAddr(index));
	
	*(volatile unsigned short *)(0x0000AAAA)=0xAAAA;
	*(volatile unsigned short *)(0x00005554)=0x5555;
	*(volatile unsigned short *)(0x0000AAAA)=0x8080;
	*(volatile unsigned short *)(0x0000AAAA)=0xAAAA;
	*(volatile unsigned short *)(0x00005554)=0x5555;
	*Dest                 =0x3030;
	while ((*Dest)!=0xFFFF);
	
	if (!data_buffer) return 0;
	
	for (i=0;i<len/2;i++)
	{
	  *(volatile unsigned  short *)(0x0000AAAA)=0xAAAA;
	  *(volatile unsigned  short *)(0x00005554)=0x5555;
	  *(volatile unsigned  short *)(0x0000AAAA)=0xA0A0;
		*(Dest+i)=*(Org+i);
		while ((*(Dest+i))!=(*(Org+i)));
	}
	
  for (i=0;i<len/2;i++)
  {
   	if ((*(Dest+i))!=(*(Org+i))) 
   	{
   		Uart_Printf(0,"BAD!\n");
   		return 0;
   	}
  }
	
	Uart_Printf(0,"OK!\n");
	return len;	
}

uint GetIndex(uint offset)
{
  if (type == 0x39160) {
    return ((offset)/(0x1000));
  } else {
    if (offset < 0x4000)
      return 0;
    else if (offset < 0x6000)
      return 1;
    else if (offset < 0x8000)
      return 2;
    else if (offset < 0x10000) 
      return 3;  
    else {
      return ((offset - 0x10000)/0x10000) + 4;
    }
  }
  return 0;
}
  
uint Burn(void)
{
  char c;
  uint len,wlen,slen;
  uint index, offset;
  char *buf = (char *)(0x0C700000);
  
  while (Uart_GetKey(0));
  
  c = 0;
  while (c<1 || c>3) {
    Uart_Printf(0,"\n1. Burn boot loader!\n");
    Uart_Printf(0,"2. Burn linux core!\n");
    Uart_Printf(0,"3. Burn romfs!\n");
    Uart_Printf(0,"Please choose:");
    
    do {
      c = Uart_GetKey(0);
      if (!c)  c = Uart_GetKey(1);
    } while (!c) ;
    
    Uart_Printf(0,"%c\n\n",c);
    c -= '0';
  }
  
  Uart_Printf(0,"Ready for burning Flash...\n");
  
  c--;
  switch(c) {
    case 0:
      offset = 0x000000;
      len    = 0x010000;
      break;
    case 1:
      offset = 0x040000;
      len    = 0x080000;
      break;
    case 2:
      offset = 0x100000;
      len    = 0x0A0000;
      break;
  }

  index = GetIndex(offset);
  
  slen = 0;
  wlen = 0;
  while (1) { 
    slen = WriteSector(index,buf);
    wlen += slen;
    if (wlen >= len) break;
    buf += slen;
    index ++;
  }
  Uart_Printf(0,"Finished programming!\n\n");
  Uart_Printf(0,"Please reset your system!\n\n");
  while(1);
  return 1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -