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

📄 flash.c

📁 AT91RM9200的完整启动代码:包括loader, boot及U-boot三部分均已编译通过!欢迎下载使用!
💻 C
📖 第 1 页 / 共 2 页
字号:
	goto done;    }    if (dev->bank == FLASH0_BANK) {	addr = pos;	words = len;	while (words--) {	    if (FLASH0_READ(dev, addr) != 0xff) {		rv = 0;		goto done;	    }	    addr++;	}    }    rv = 1; done:    PRINTF("flashWrite: rv=%d\n", rv);    return rv;}/* * NOTE: the below code cannot run from FLASH!!! *//*********************************************************************** * * Flash Diagnostics * ***********************************************************************/STATUS flashDiag(flash_dev_t *dev){    unsigned int	*buf = 0;    int			i, len, sector;    int			rv = ERROR;    if (flashCheck(dev) == ERROR)	return ERROR;    printf("flashDiag: Testing device %d, "	   "base: 0x%x, %d sectors @ %d kB = %d kB\n",	   DEV_NO(dev), dev->base,	   dev->sectors,	   1 << (dev->lgSectorSize - 10),	   dev->sectors << (dev->lgSectorSize - 10));    len = 1 << dev->lgSectorSize;    printf("flashDiag: Erasing\n");    if (flashErase(dev) == ERROR) {	printf("flashDiag: Erase failed\n");	goto done;    }    printf("%d bytes requested ...\n", len);    buf = malloc(len);    printf("allocated %d bytes ...\n", len);    if (buf == 0) {	printf("flashDiag: Out of memory\n");	goto done;    }    /*     * Write unique counting pattern to each sector     */    for (sector = 0; sector < dev->sectors; sector++) {	printf("flashDiag: Write sector %d\n", sector);	for (i = 0; i < len / 4; i++)	    buf[i] = sector << 24 | i;	if (flashWrite(dev,		       sector << dev->lgSectorSize,		       (char *) buf,		       len) == ERROR) {	    printf("flashDiag: Write failed (dev: %d, sector: %d)\n",		   DEV_NO(dev), sector);	    goto done;	}    }    /*     * Verify     */    for (sector = 0; sector < dev->sectors; sector++) {	printf("flashDiag: Verify sector %d\n", sector);	if (flashRead(dev,		      sector << dev->lgSectorSize,		      (char *) buf,		      len) == ERROR) {	    printf("flashDiag: Read failed (dev: %d, sector: %d)\n",		   DEV_NO(dev), sector);	    goto done;	}	for (i = 0; i < len / 4; i++) {	    if (buf[i] != (sector << 24 | i)) {		printf("flashDiag: Verify error "		       "(dev: %d, sector: %d, offset: 0x%x)\n",		       DEV_NO(dev), sector, i);		printf("flashDiag: Expected 0x%08x, got 0x%08x\n",		       sector << 24 | i, buf[i]);		goto done;	    }	}    }    printf("flashDiag: Erasing\n");    if (flashErase(dev) == ERROR) {	printf("flashDiag: Final erase failed\n");	goto done;    }    rv = OK; done:    if (buf)	free(buf);    if (rv == OK)	printf("flashDiag: Device %d passed\n", DEV_NO(dev));    else	printf("flashDiag: Device %d failed\n", DEV_NO(dev));    return rv;}STATUS flashDiagAll(void){    int			i;    int			rv = OK;    PRINTF("flashDiagAll: devices=%d\n", flashDevCount);    for (i = 0; i < flashDevCount; i++) {	flash_dev_t	*dev = &flashDev[i];	if (dev->found && flashDiag(dev) == ERROR)	    rv = ERROR;    }    if (rv == OK)	printf("flashDiagAll: Passed\n");    else	printf("flashDiagAll: Failed because of earlier errors\n");    return OK;}/*----------------------------------------------------------------------- */unsigned long flash_init (void){    unsigned long size = 0;    flash_dev_t	*dev = NULL;    flashLibInit();    /*     * Provide info for FLASH (up to 960K) of Kernel Image data.     */    dev = FLASH_DEV_BANK0_LOW;    flash_info[FLASH_BANK_KERNEL].flash_id =      (dev->vendorID << 16) | dev->deviceID;    flash_info[FLASH_BANK_KERNEL].sector_count = dev->sectors;    flash_info[FLASH_BANK_KERNEL].size =      flash_info[FLASH_BANK_KERNEL].sector_count * FLASH_SECTOR_SIZE;    flash_info[FLASH_BANK_KERNEL].start[FIRST_SECTOR] = dev->base;    size += flash_info[FLASH_BANK_KERNEL].size;    /*     * Provide info for 512K PLCC FLASH ROM (U-Boot)     */    dev = FLASH_DEV_BANK0_BOOT;    flash_info[FLASH_BANK_BOOT].flash_id =      (dev->vendorID << 16) | dev->deviceID;    flash_info[FLASH_BANK_BOOT].sector_count = dev->sectors;    flash_info[FLASH_BANK_BOOT].size =      flash_info[FLASH_BANK_BOOT].sector_count * FLASH_SECTOR_SIZE;    flash_info[FLASH_BANK_BOOT].start[FIRST_SECTOR] = dev->base;    size += flash_info[FLASH_BANK_BOOT].size;    /*     * Provide info for 512K FLASH0 segment (U-Boot)     */    dev = FLASH_DEV_BANK0_HIGH;    flash_info[FLASH_BANK_AUX].flash_id =      (dev->vendorID << 16) | dev->deviceID;    flash_info[FLASH_BANK_AUX].sector_count = dev->sectors;    flash_info[FLASH_BANK_AUX].size =      flash_info[FLASH_BANK_AUX].sector_count * FLASH_SECTOR_SIZE;    flash_info[FLASH_BANK_AUX].start[FIRST_SECTOR] = dev->base;    size += flash_info[FLASH_BANK_AUX].size;    return  size;}/* * Get flash device from U-Boot flash info. */flash_dev_t*getFlashDevFromInfo(flash_info_t* info){  int i;  if(!info)    return NULL;  for (i = 0; i < flashDevCount; i++) {    flash_dev_t	*dev = &flashDev[i];    if(dev->found && (dev->base == info->start[0]))      return dev;  }  printf("ERROR: notice, no FLASH mapped at address 0x%x\n",	 (unsigned int)info->start[0]);  return NULL;}ulongflash_get_size (vu_long *addr, flash_info_t *info){    int i;    for(i = 0; i < flashDevCount; i++) {      flash_dev_t	*dev = &flashDev[i];      if(dev->found){	if(dev->base == (unsigned int)addr){	  info->flash_id = (dev->vendorID << 16) | dev->deviceID;	  info->sector_count = dev->sectors;	  info->size = info->sector_count * FLASH_SECTOR_SIZE;	  return dev->sectors * FLASH_SECTOR_SIZE;	}      }    }    return 0;}voidflash_print_info  (flash_info_t *info){  int i;  unsigned int chip;    if (info->flash_id == FLASH_UNKNOWN) {	printf ("missing or unknown FLASH type\n");	return;    }    switch ((info->flash_id >> 16) & 0xff) {    case 0x1:	printf ("AMD ");	break;    default:	printf ("Unknown Vendor ");	break;    }    chip = (unsigned int) info->flash_id & 0x000000ff;    switch (chip) {    case AMD_ID_F040B:	printf ("AM29F040B (4 Mbit)\n");	break;    case AMD_ID_LV160B:    case FLASH_AM160LV:    case 0x49:	printf ("AM29LV160B (16 Mbit / 2M x 8bit)\n");	break;    default:      printf ("Unknown Chip Type:0x%x\n", chip);	break;    }    printf ("  Size: %ld bytes in %d Sectors\n",	    info->size, 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[FIRST_SECTOR] + i*FLASH_SECTOR_SIZE,		info->protect[i] ? " (RO)" : "     "		);    }    printf ("\n");}/* * Erase a range of flash sectors. */int flash_erase (flash_info_t *info, int s_first, int s_last){    vu_long *addr = (vu_long*)(info->start[0]);    int prot, sect, l_sect;    flash_dev_t* dev = NULL;    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;    }    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;    /* Start erase on unprotected sectors */    dev = getFlashDevFromInfo(info);    if(dev){      printf("Erase FLASH[%s] -%d sectors:", dev->name, dev->sectors);      for (sect = s_first; sect<=s_last; sect++) {	if (info->protect[sect] == 0) {	/* not protected */	  addr = (vu_long*)(dev->base);	  /*   printf("erase_sector: sector=%d, addr=0x%x\n",	       sect, addr); */	  printf(".");	  if(ERROR == flashEraseSector(dev, sect)){	    printf("ERROR: could not erase sector %d on FLASH[%s]\n",		   sect, dev->name);	    return 1;	  }	}      }    }    printf (" done\n");    return 0;}/*----------------------------------------------------------------------- * 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){  flash_dev_t* dev = getFlashDevFromInfo(info);  int addr = dest - info->start[0];  if (! dev)    return 1;  if(OK != flashWrite(dev, addr, (char*)&data, sizeof(ulong))){    printf("ERROR: could not write to addr=0x%x, data=0x%x\n",	   (unsigned int)addr, (unsigned)data);    return 1;  }  if((addr % FLASH_SECTOR_SIZE) == 0)    printf(".");  PRINTF("write_word:0x%x, base=0x%x, addr=0x%x, data=0x%x\n",	 (unsigned)info->start[0],	 (unsigned)dest,	 (unsigned)(dest - info->start[0]),	 (unsigned)data);    return (0);}/*----------------------------------------------------------------------- * Copy memory to flash, returns: * 0 - OK * 1 - write timeout * 2 - Flash not erased */int write_buff (flash_info_t *info, uchar *src, ulong addr, ulong cnt){    ulong cp, wp, data;    int i, l, rc;    flash_dev_t* dev = getFlashDevFromInfo(info);    if( dev ) {      printf("FLASH[%s]:", dev->name);      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));    }    return 1;}/*----------------------------------------------------------------------- */

⌨️ 快捷键说明

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