亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? flash.c

?? uboot for K9 AT91RM9200 學習板
?? C
字號:
/***=====================================================================**** Copyright (C) 2000, 2001, 2002, 2003** The LEOX team <team@leox.org>, http://www.leox.org**** LEOX.org is about the development of free hardware and software resources**   for system on chip.**** Description: U-Boot port on the LEOX's ELPT860 CPU board** ~~~~~~~~~~~****=====================================================================**** This program is free software; you can redistribute it and/or** modify it under the terms of the GNU General Public License as** published by the Free Software Foundation; either version 2 of** the License, or (at your option) any later version.**** This program is distributed in the hope that it will be useful,** but WITHOUT ANY WARRANTY; without even the implied warranty of** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the** GNU General Public License for more details.**** You should have received a copy of the GNU General Public License** along with this program; if not, write to the Free Software** Foundation, Inc., 59 Temple Place, Suite 330, Boston,** MA 02111-1307 USA****=====================================================================*//*** Note 1: In this file, you have to provide the following variable:** ------**              flash_info_t    flash_info[CFG_MAX_FLASH_BANKS]** 'flash_info_t' structure is defined into 'include/flash.h'** and defined as extern into 'common/cmd_flash.c'**** Note 2: In this file, you have to provide the following functions:** ------**              unsigned long   flash_init(void)** called from 'board_init_r()' into 'common/board.c'****              void            flash_print_info(flash_info_t *info)** called from 'do_flinfo()' into 'common/cmd_flash.c'****              int             flash_erase(flash_info_t *info,**                                          int           s_first,**                                          int           s_last)** called from 'do_flerase()' & 'flash_sect_erase()' into 'common/cmd_flash.c'****              int             write_buff (flash_info_t *info,**                                          uchar        *src,**                                          ulong         addr,**                                          ulong         cnt)** called from 'flash_write()' into 'common/cmd_flash.c'*/#include <common.h>#include <mpc8xx.h>#ifndef	CFG_ENV_ADDR#  define CFG_ENV_ADDR	(CFG_FLASH_BASE + CFG_ENV_OFFSET)#endifflash_info_t	flash_info[CFG_MAX_FLASH_BANKS]; /* info for FLASH chips *//*----------------------------------------------------------------------- * Internal Functions */static void   flash_get_offsets (ulong base, flash_info_t *info);static ulong  flash_get_size (volatile unsigned char *addr, flash_info_t *info);static int write_word (flash_info_t *info, ulong dest, ulong data);static int write_byte (flash_info_t *info, ulong dest, uchar data);/*----------------------------------------------------------------------- */unsigned longflash_init (void){  volatile immap_t     *immap  = (immap_t *)CFG_IMMR;  volatile memctl8xx_t *memctl = &immap->im_memctl;  unsigned long         size_b0;  int i;  /* Init: no FLASHes known */  for (i=0; i<CFG_MAX_FLASH_BANKS; ++i)    {      flash_info[i].flash_id = FLASH_UNKNOWN;    }  /* Static FLASH Bank configuration here - FIXME XXX */  size_b0 = flash_get_size ((volatile unsigned char *)FLASH_BASE0_PRELIM,			    &flash_info[0]);  if ( flash_info[0].flash_id == FLASH_UNKNOWN )    {      printf ("## Unknown FLASH on Bank 0 - Size = 0x%08lx = %ld MB\n",	      size_b0, size_b0<<20);    }  /* Remap FLASH according to real size */  memctl->memc_or0 = CFG_OR_TIMING_FLASH | (-size_b0 & OR_AM_MSK);  memctl->memc_br0 = (CFG_FLASH_BASE & BR_BA_MSK) | BR_MS_GPCM | BR_PS_8 | BR_V;  /* Re-do sizing to get full correct info */  size_b0 = flash_get_size ((volatile unsigned char *)CFG_FLASH_BASE,			    &flash_info[0]);  flash_get_offsets (CFG_FLASH_BASE, &flash_info[0]);#if CFG_MONITOR_BASE >= CFG_FLASH_BASE  /* monitor protection ON by default */  flash_protect (FLAG_PROTECT_SET,		 CFG_MONITOR_BASE,		 CFG_MONITOR_BASE + monitor_flash_len-1,		 &flash_info[0]);#endif#ifdef	CFG_ENV_IS_IN_FLASH  /* ENV protection ON by default */  flash_protect(FLAG_PROTECT_SET,		CFG_ENV_ADDR,		CFG_ENV_ADDR + CFG_ENV_SIZE-1,		&flash_info[0]);#endif  flash_info[0].size = size_b0;  return (size_b0);}/*----------------------------------------------------------------------- */static voidflash_get_offsets (ulong          base,		   flash_info_t  *info){  int i;#define SECTOR_64KB    0x00010000  /* set up sector start adress table */  for (i = 0; i < info->sector_count; i++)    {      info->start[i] = base + (i * SECTOR_64KB);    }}/*----------------------------------------------------------------------- */voidflash_print_info (flash_info_t *info){  int i;  if ( info->flash_id == FLASH_UNKNOWN )    {      printf ("missing or unknown FLASH type\n");      return;    }  switch ( info->flash_id & FLASH_VENDMASK )    {    case FLASH_MAN_AMD:	printf ("AMD ");		break;    case FLASH_MAN_FUJ:	printf ("FUJITSU ");		break;    case FLASH_MAN_STM: printf ("STM (Thomson) ");      break;    default:		printf ("Unknown Vendor ");	break;    }  switch ( info->flash_id & FLASH_TYPEMASK )    {    case FLASH_AM040:   printf ("AM29F040   (4 Mbits)\n");      break;    default:	        printf ("Unknown Chip Type\n");      break;    }  printf ("  Size: %ld KB in %d Sectors\n",	  info->size >> 10, info->sector_count);  printf ("  Sector Start Addresses:");  for (i=0; i<info->sector_count; ++i)    {      if ((i % 5) == 0)	printf ("\n   ");      printf (" %08lX%s",	      info->start[i],	      info->protect[i] ? " (RO)" : "     "	      );    }  printf ("\n");  return;}/*----------------------------------------------------------------------- *//*----------------------------------------------------------------------- *//* * The following code cannot be run from FLASH! */static ulongflash_get_size (volatile unsigned char *addr,		flash_info_t           *info){  short i;  uchar value;  ulong base = (ulong)addr;  /* Write auto select command: read Manufacturer ID */  addr[0x0555] = 0xAA;  addr[0x02AA] = 0x55;  addr[0x0555] = 0x90;  value = addr[0];  switch ( value )    {      /*    case AMD_MANUFACT: */    case 0x01:      info->flash_id = FLASH_MAN_AMD;      break;      /*    case FUJ_MANUFACT: */    case 0x04:      info->flash_id = FLASH_MAN_FUJ;      break;      /*    case STM_MANUFACT: */    case 0x20:      info->flash_id = FLASH_MAN_STM;      break;    default:      info->flash_id = FLASH_UNKNOWN;      info->sector_count = 0;      info->size = 0;      return (0);			/* no or unknown flash	*/    }  value = addr[1];			/* device ID		*/  switch ( value )    {    case STM_ID_F040B:    case AMD_ID_F040B:      info->flash_id += FLASH_AM040;    /* 4 Mbits = 512k * 8  */      info->sector_count = 8;      info->size = 0x00080000;      break;    default:      info->flash_id = FLASH_UNKNOWN;      return (0);			/* => no or unknown flash */    }  /* set up sector start adress table */  for (i = 0; i < info->sector_count; i++)    {      info->start[i] = base + (i * 0x00010000);    }  /* check for protected sectors */  for (i = 0; i < info->sector_count; i++)    {      /* read sector protection at sector address, (A7 .. A0) = 0x02 */      /* D0 = 1 if protected */      addr = (volatile unsigned char *)(info->start[i]);      info->protect[i] = addr[2] & 1;    }  /*   * Prevent writes to uninitialized FLASH.   */  if ( info->flash_id != FLASH_UNKNOWN )    {      addr = (volatile unsigned char *)info->start[0];      *addr = 0xF0;	/* reset bank */    }  return (info->size);}/*----------------------------------------------------------------------- */intflash_erase (flash_info_t  *info,	     int            s_first,	     int            s_last){  volatile unsigned char *addr = (volatile unsigned char *)(info->start[0]);  int flag, prot, sect, l_sect;  ulong start, now, last;  if ( (s_first < 0) || (s_first > s_last) )    {      if ( info->flash_id == FLASH_UNKNOWN )	{	  printf ("- missing\n");	}      else	{	  printf ("- no sectors to erase\n");	}      return ( 1 );    }  if ( (info->flash_id == FLASH_UNKNOWN) ||       (info->flash_id > FLASH_AMD_COMP) )    {      printf ("Can't erase unknown flash type %08lx - aborted\n",	      info->flash_id);      return ( 1 );    }  prot = 0;  for (sect=s_first; sect<=s_last; ++sect)    {      if ( info->protect[sect] )	{	  prot++;	}    }  if ( prot )    {      printf ("- Warning: %d protected sectors will not be erased!\n", prot);    }  else    {      printf ("\n");    }  l_sect = -1;  /* Disable interrupts which might cause a timeout here */  flag = disable_interrupts();  addr[0x0555] = 0xAA;  addr[0x02AA] = 0x55;  addr[0x0555] = 0x80;  addr[0x0555] = 0xAA;  addr[0x02AA] = 0x55;  /* Start erase on unprotected sectors */  for (sect = s_first; sect<=s_last; sect++)    {      if (info->protect[sect] == 0)    /* not protected */	{	  addr = (volatile unsigned char *)(info->start[sect]);	  addr[0] = 0x30;	  l_sect = sect;	}    }  /* re-enable interrupts if necessary */  if ( flag )    enable_interrupts();  /* wait at least 80us - let's wait 1 ms */  udelay (1000);  /*   * We wait for the last triggered sector   */  if ( l_sect < 0 )    goto DONE;  start = get_timer (0);  last  = start;  addr = (volatile unsigned char *)(info->start[l_sect]);  while ( (addr[0] & 0x80) != 0x80 )    {      if ( (now = get_timer(start)) > CFG_FLASH_ERASE_TOUT )	{	  printf ("Timeout\n");	  return ( 1 );	}      /* show that we're waiting */      if ( (now - last) > 1000 )     /* every second */	{	  putc ('.');	  last = now;	}    }DONE:  /* reset to read mode */  addr = (volatile unsigned char *)info->start[0];  addr[0] = 0xF0;	/* reset bank */  printf (" done\n");  return ( 0 );}/*----------------------------------------------------------------------- * Copy memory to flash, returns: * 0 - OK * 1 - write timeout * 2 - Flash not erased */intwrite_buff (flash_info_t  *info,	    uchar         *src,	    ulong          addr,	    ulong          cnt){  ulong cp, wp, data;  uchar bdata;  int i, l, rc;  if ( (info->flash_id & FLASH_TYPEMASK) == FLASH_AM040 )    {      /* Width of the data bus: 8 bits */      wp = addr;      while ( cnt )	{	  bdata = *src++;	  if ( (rc = write_byte(info, wp, bdata)) != 0 )	    {	      return (rc);	    }	  ++wp;	  --cnt;	}      return ( 0 );    }  else    {      /* Width of the data bus: 32 bits */      wp = (addr & ~3);	/* get lower word aligned address */      /*       * handle unaligned start bytes       */      if ( (l = addr - wp) != 0 )	{	  data = 0;	  for (i=0, cp=wp; i<l; ++i, ++cp)	    {	      data = (data << 8) | (*(uchar *)cp);	    }	  for (; i<4 && cnt>0; ++i)	    {	      data = (data << 8) | *src++;	      --cnt;	      ++cp;	    }	  for (; cnt==0 && i<4; ++i, ++cp)	    {	      data = (data << 8) | (*(uchar *)cp);	    }	  if ( (rc = write_word(info, wp, data)) != 0 )	    {	      return (rc);	    }	  wp += 4;	}      /*       * handle word aligned part       */      while ( cnt >= 4 )	{	  data = 0;	  for (i=0; i<4; ++i)	    {	      data = (data << 8) | *src++;	    }	  if ( (rc = write_word(info, wp, data)) != 0 )	    {	      return (rc);	    }	  wp  += 4;	  cnt -= 4;	}      if ( cnt == 0 )	{	  return (0);	}      /*       * handle unaligned tail bytes       */      data = 0;      for (i=0, cp=wp; i<4 && cnt>0; ++i, ++cp)	{	  data = (data << 8) | *src++;	  --cnt;	}      for (; i<4; ++i, ++cp)	{	  data = (data << 8) | (*(uchar *)cp);	}      return (write_word(info, wp, data));    }}/*----------------------------------------------------------------------- * Write a word to Flash, returns: * 0 - OK * 1 - write timeout * 2 - Flash not erased */static intwrite_word (flash_info_t  *info,	    ulong          dest,	    ulong          data){  vu_long *addr = (vu_long*)(info->start[0]);  ulong start;  int flag;  /* Check if Flash is (sufficiently) erased */  if ( (*((vu_long *)dest) & data) != data )    {      return (2);    }  /* Disable interrupts which might cause a timeout here */  flag = disable_interrupts();  addr[0x0555] = 0x00AA00AA;  addr[0x02AA] = 0x00550055;  addr[0x0555] = 0x00A000A0;  *((vu_long *)dest) = data;  /* re-enable interrupts if necessary */  if ( flag )    enable_interrupts();  /* data polling for D7 */  start = get_timer (0);  while ( (*((vu_long *)dest) & 0x00800080) != (data & 0x00800080) )    {      if ( get_timer(start) > CFG_FLASH_WRITE_TOUT )	{	  return (1);	}    }  return (0);}/*----------------------------------------------------------------------- * Write a byte to Flash, returns: * 0 - OK * 1 - write timeout * 2 - Flash not erased */static intwrite_byte (flash_info_t  *info,	    ulong          dest,	    uchar          data){  volatile unsigned char *addr = (volatile unsigned char *)(info->start[0]);  ulong  start;  int    flag;  /* Check if Flash is (sufficiently) erased */  if ( (*((volatile unsigned char *)dest) & data) != data )    {      return (2);    }  /* Disable interrupts which might cause a timeout here */  flag = disable_interrupts();  addr[0x0555] = 0xAA;  addr[0x02AA] = 0x55;  addr[0x0555] = 0xA0;  *((volatile unsigned char *)dest) = data;  /* re-enable interrupts if necessary */  if ( flag )    enable_interrupts();  /* data polling for D7 */  start = get_timer (0);  while ( (*((volatile unsigned char *)dest) & 0x80) != (data & 0x80) )    {      if ( get_timer(start) > CFG_FLASH_WRITE_TOUT )	{	  return (1);	}    }  return (0);}/*----------------------------------------------------------------------- */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美国产禁国产网站cc| ww亚洲ww在线观看国产| 不卡视频在线看| 国产美女主播视频一区| 精品一区二区三区在线视频| 日韩精品1区2区3区| 日韩电影在线观看网站| 全国精品久久少妇| 久久99久久99| 国产毛片精品视频| 波多野结衣中文字幕一区二区三区 | 91在线丨porny丨国产| 国产成人av电影在线观看| 丁香另类激情小说| 97精品电影院| 91精品国产综合久久精品图片 | 韩国理伦片一区二区三区在线播放| 奇米色777欧美一区二区| 麻豆精品新av中文字幕| 国产精品资源网| 99久久99久久精品免费看蜜桃| 欧美成人在线直播| 国产精品萝li| 亚洲成人黄色小说| 狠狠色丁香婷婷综合| 波多野结衣在线一区| 欧美午夜电影网| 精品国产露脸精彩对白| 亚洲欧洲一区二区在线播放| 亚洲国产欧美在线| 久久se精品一区二区| 97se狠狠狠综合亚洲狠狠| 91精品国产aⅴ一区二区| 欧美激情艳妇裸体舞| 亚洲第一电影网| 成人精品免费看| 337p亚洲精品色噜噜狠狠| 国产日韩av一区| 视频一区视频二区中文字幕| 丰满少妇在线播放bd日韩电影| 欧美日韩在线不卡| 国产精品麻豆欧美日韩ww| 久久国内精品自在自线400部| 白白色 亚洲乱淫| 日韩欧美一二三| 亚洲专区一二三| 成人精品一区二区三区中文字幕| 欧美一区二区日韩| 亚洲一区二区在线视频| 国产91丝袜在线18| 精品国产成人系列| 日韩av一区二区在线影视| 91在线视频播放地址| 欧美国产国产综合| 久久99久久99精品免视看婷婷 | 91丨九色丨蝌蚪丨老版| 精品久久久三级丝袜| 亚洲国产综合在线| 91黄视频在线观看| 亚洲日本一区二区| jvid福利写真一区二区三区| 国产三区在线成人av| 精彩视频一区二区| 欧美电视剧免费全集观看 | 91精品国产丝袜白色高跟鞋| 亚洲三级小视频| 成+人+亚洲+综合天堂| 久久精品人人做人人爽人人| 狠狠色丁香婷婷综合| 欧美大黄免费观看| 久久电影网电视剧免费观看| 欧美一级二级在线观看| 青娱乐精品在线视频| 欧美一区二区免费观在线| 亚洲不卡在线观看| 欧美日韩国产影片| 亚洲成a人v欧美综合天堂下载| 色美美综合视频| 亚洲电影激情视频网站| 欧美美女喷水视频| 另类欧美日韩国产在线| 精品国产污网站| 国产激情精品久久久第一区二区 | 91麻豆精品91久久久久同性| 天天综合网天天综合色| 91精品国产91热久久久做人人| 视频一区在线视频| 久久久久亚洲蜜桃| www.久久久久久久久| 亚洲一区二区av在线| 日韩午夜小视频| 国产成人免费在线观看不卡| 亚洲欧洲在线观看av| 欧美日韩视频在线观看一区二区三区 | 大陆成人av片| 亚洲伦理在线精品| 91麻豆精品91久久久久同性| 精品一区二区久久| 综合久久久久久| 欧美精品日日鲁夜夜添| 国产一区二区三区黄视频 | 欧美videos大乳护士334| 国产一区在线不卡| 亚洲三级免费电影| 日韩精品一区二区三区老鸭窝| 成人午夜av在线| 首页国产欧美久久| 中文在线资源观看网站视频免费不卡 | 91日韩精品一区| 奇米影视7777精品一区二区| 国产精品全国免费观看高清| 欧美视频一二三区| 国产精品12区| 亚洲二区视频在线| 国产精品久久久久久久久晋中| 欧美日韩精品福利| 不卡av电影在线播放| 老司机精品视频在线| 一区二区三区在线观看欧美| 久久亚区不卡日本| 欧美日韩极品在线观看一区| 国产91对白在线观看九色| 五月婷婷色综合| 成人免费在线视频| 久久久噜噜噜久噜久久综合| 国产精品女主播av| 日韩一区二区三区视频| 色呦呦国产精品| 国产成人精品免费| 日本成人在线电影网| 亚洲综合成人在线| 1区2区3区欧美| 日本一区二区三区久久久久久久久不| 欧美人妖巨大在线| 欧美色视频在线观看| 99r国产精品| 北岛玲一区二区三区四区| 国产一区二区福利| 麻豆国产精品一区二区三区| 婷婷综合在线观看| 天天色图综合网| 亚洲国产精品天堂| 亚洲成人在线网站| 亚洲综合视频网| 一区二区在线电影| 亚洲美女屁股眼交| 亚洲美女淫视频| 一区二区视频免费在线观看| 日韩理论在线观看| 亚洲女同女同女同女同女同69| 中文在线资源观看网站视频免费不卡 | 欧美精品精品一区| 欧美日韩第一区日日骚| 在线播放/欧美激情| 777xxx欧美| 日韩一区二区三区高清免费看看| 7777女厕盗摄久久久| 亚洲人被黑人高潮完整版| 欧美日韩一区二区三区四区 | 久久av老司机精品网站导航| 亚洲va欧美va人人爽| 五月婷婷综合激情| 男人的天堂久久精品| 欧美aaa在线| 韩国精品主播一区二区在线观看| 国产综合色在线视频区| 国产盗摄女厕一区二区三区 | 午夜电影网一区| 日本在线播放一区二区三区| 美国欧美日韩国产在线播放| 加勒比av一区二区| eeuss鲁片一区二区三区在线看| 色狠狠桃花综合| 91麻豆精品国产91久久久久久 | 91精品福利视频| 911国产精品| 久久精品一区二区| 亚洲精品一二三区| 美女视频免费一区| 成人h精品动漫一区二区三区| 97精品国产露脸对白| 欧美一区二区在线免费观看| 国产亚洲制服色| 一区二区高清视频在线观看| 麻豆免费精品视频| 一本久道久久综合中文字幕| 91精品午夜视频| 亚洲视频一区二区免费在线观看| 亚洲成av人片观看| 成人国产精品视频| 日韩一区二区麻豆国产| 中文字幕一区二区三区不卡| 人人狠狠综合久久亚洲| 99久久久国产精品免费蜜臀| 日韩免费在线观看| 亚洲丶国产丶欧美一区二区三区| 丁香啪啪综合成人亚洲小说| 欧美高清视频www夜色资源网| 国产精品久久久久久久久免费丝袜 | 欧美高清hd18日本|