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

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

?? flash.c

?? uboot for at91rm9200dk
?? C
字號:
/* * (C) Copyright 2000 * Marius Groeger <mgroeger@sysgo.de> * Sysgo Real-Time Solutions, GmbH <www.elinos.com> * * (C) Copyright 2000 * Wolfgang Denk, DENX Software Engineering, wd@denx.de. * * Flash Routines for AMD 29F080B devices * *-------------------------------------------------------------------- * See file CREDITS for list of people who contributed to this * project. * * 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 */#include <common.h>#include <mpc8xx.h>flash_info_t flash_info[CFG_MAX_FLASH_BANKS];/*----------------------------------------------------------------------- * Functions */static ulong flash_get_size (vu_long *addr, flash_info_t *info);static int write_word (flash_info_t *info, ulong dest, ulong data);/*----------------------------------------------------------------------- */unsigned long flash_init (void){    unsigned long size;    int i;    /* Init: no FLASHes known */    for (i=0; i<CFG_MAX_FLASH_BANKS; ++i) {	flash_info[i].flash_id = FLASH_UNKNOWN;    }    /* for now, only support the 4 MB Flash SIMM */    size = flash_get_size((vu_long *)CFG_FLASH0_BASE, &flash_info[0]);    /*     * protect monitor and environment sectors     */#if CFG_MONITOR_BASE >= CFG_FLASH0_BASE    flash_protect(FLAG_PROTECT_SET,		  CFG_MONITOR_BASE,		  CFG_MONITOR_BASE+monitor_flash_len-1,		  &flash_info[0]);#endif#if (CFG_ENV_IS_IN_FLASH == 1) && defined(CFG_ENV_ADDR)# ifndef  CFG_ENV_SIZE#  define CFG_ENV_SIZE	CFG_ENV_SECT_SIZE# endif    flash_protect(FLAG_PROTECT_SET,		  CFG_ENV_ADDR,		  CFG_ENV_ADDR + CFG_ENV_SIZE - 1,		  &flash_info[0]);#endif    return /*size*/ (CFG_FLASH0_SIZE * 1024 * 1024);}/*----------------------------------------------------------------------- */void flash_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 >> 16) & 0xff) {    case 0x1:	printf ("AMD ");	break;    default:	printf ("Unknown Vendor ");	break;    }    switch (info->flash_id & FLASH_TYPEMASK) {    case AMD_ID_F040B:	printf ("AM29F040B (4 Mbit)\n");	break;    case AMD_ID_F080B:	printf ("AM29F080B (8 Mbit)\n");	break;    default:	printf ("Unknown Chip Type\n");	break;    }    printf ("  Size: %ld MB in %d Sectors\n",	    info->size >> 20, 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 ulong flash_get_size (vu_long *addr, flash_info_t *info){    short i;    vu_long vendor, devid;    ulong base = (ulong)addr;/*    printf("addr   = %08lx\n", (unsigned long)addr); */    /* Reset and Write auto select command: read Manufacturer ID */    addr[0] = 0xf0f0f0f0;    addr[0x0555] = 0xAAAAAAAA;    addr[0x02AA] = 0x55555555;    addr[0x0555] = 0x90909090;    udelay (1000);    vendor = addr[0];/*    printf("vendor = %08lx\n", vendor); */    if (vendor != 0x01010101) {	info->size = 0;	goto out;    }    devid = addr[1];/*    printf("devid  = %08lx\n", devid); */    if ((devid & 0xff) == AMD_ID_F080B) {	info->flash_id     = (vendor & 0xff) << 16 | AMD_ID_F080B;	/* we have 16 sectors with 64KB each x 4 */	info->sector_count = 16;	info->size         = 4 * info->sector_count * 64*1024;    }    else {	info->size = 0;	goto out;    }    /* check for protected sectors */    for (i = 0; i < info->sector_count; i++) {	/* sector base address */	info->start[i] = base + i * (info->size / info->sector_count);	/* read sector protection at sector address, (A7 .. A0) = 0x02 */	/* D0 = 1 if protected */	addr = (volatile unsigned long *)(info->start[i]);	info->protect[i] = addr[2] & 1;    }    /* reset command */    addr = (vu_long *)info->start[0];out:    addr[0] = 0xf0f0f0f0;    return info->size;}/*----------------------------------------------------------------------- */int flash_erase (flash_info_t *info, int s_first, int s_last){    vu_long *addr = (vu_long*)(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;    }    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] = 0xAAAAAAAA;    addr[0x02AA] = 0x55555555;    addr[0x0555] = 0x80808080;    addr[0x0555] = 0xAAAAAAAA;    addr[0x02AA] = 0x55555555;    udelay (100);    /* Start erase on unprotected sectors */    for (sect = s_first; sect<=s_last; sect++) {	if (info->protect[sect] == 0) {	/* not protected */	    addr = (vu_long*)(info->start[sect]);	    addr[0] = 0x30303030;	    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 = (vu_long*)(info->start[l_sect]);    while ((addr[0] & 0x80808080) != 0x80808080) {	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 */	    serial_putc ('.');	    last = now;	}    }    DONE:    /* reset to read mode */    addr = (volatile unsigned long *)info->start[0];    addr[0] = 0xF0F0F0F0;	/* reset bank */    printf (" done\n");    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;    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 int write_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] = 0xAAAAAAAA;    addr[0x02AA] = 0x55555555;    addr[0x0555] = 0xA0A0A0A0;    *((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) & 0x80808080) != (data & 0x80808080)) {	if (get_timer(start) > CFG_FLASH_WRITE_TOUT) {	    return (1);	}    }    return (0);}/*----------------------------------------------------------------------- */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人国产精品免费网站| 国产日韩欧美综合一区| 国产精品视频麻豆| 日韩二区三区四区| 91色.com| 久久久精品2019中文字幕之3| 一区二区三区资源| 粉嫩av一区二区三区粉嫩| 8x8x8国产精品| 亚洲人成网站色在线观看| 国产在线精品免费av| 欧美伊人久久久久久午夜久久久久| 久久综合视频网| 日本va欧美va精品发布| 在线看日本不卡| 最新中文字幕一区二区三区| 国模套图日韩精品一区二区| 欧美日本乱大交xxxxx| 亚洲欧美乱综合| 成人午夜视频在线观看| 国产亚洲1区2区3区| 精品无码三级在线观看视频| 欧美一区二区日韩| 日韩av一区二区三区四区| 欧美日韩一区二区三区四区五区| 亚洲精品乱码久久久久久日本蜜臀| 国产精品自拍毛片| 2024国产精品| 国产一区二区三区久久久| 91精品国产综合久久久蜜臀图片| 亚洲午夜久久久久久久久电影院| 色婷婷精品大在线视频| 亚洲精品你懂的| 欧美视频一区二区在线观看| 亚洲乱码国产乱码精品精98午夜| 菠萝蜜视频在线观看一区| 国产精品色一区二区三区| 不卡大黄网站免费看| 亚洲欧美另类久久久精品| 色88888久久久久久影院按摩 | 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 欧美视频你懂的| 午夜视频久久久久久| 欧美一区二区精品| 精品在线你懂的| 久久久精品2019中文字幕之3| 成人性生交大片免费看中文网站| 国产精品婷婷午夜在线观看| 成人av一区二区三区| 国产精品国产自产拍高清av| 91丨九色丨国产丨porny| 亚洲精品国产a| 日韩亚洲欧美在线观看| 国产成人99久久亚洲综合精品| 国产精品婷婷午夜在线观看| 欧美综合色免费| 麻豆精品一区二区三区| 中文字幕欧美日韩一区| 欧美怡红院视频| 久久99精品久久久久久动态图| 久久精品人人做| 99久久综合狠狠综合久久| 亚洲一区影音先锋| 日韩一区二区三| 成人精品小蝌蚪| 偷偷要91色婷婷| 中文字幕的久久| 欧美二区乱c少妇| 国产v综合v亚洲欧| 亚洲高清免费视频| 欧美激情一区二区三区在线| 欧美专区日韩专区| 国产成人精品亚洲777人妖| 亚洲一区二区在线观看视频| 久久综合九色综合欧美98| 色哟哟国产精品免费观看| 精品一区二区三区欧美| 亚洲综合成人在线| 国产欧美日韩精品一区| 欧美精品一卡二卡| 成人美女视频在线观看| 秋霞影院一区二区| 一区二区三区在线观看国产| 欧美va亚洲va| 欧美午夜精品电影| 成人黄色软件下载| 精品一区二区三区免费播放| 亚洲123区在线观看| 日韩理论电影院| 国产亚洲综合在线| 日韩精品一区二区三区四区| 色94色欧美sute亚洲线路一ni| 成人久久18免费网站麻豆| 激情都市一区二区| 日本免费新一区视频| 亚洲成人综合网站| 亚洲毛片av在线| 亚洲欧洲另类国产综合| 日韩一区二区电影网| 欧美日韩视频在线观看一区二区三区 | 久久激情综合网| 亚洲成人免费视| 亚洲日本在线天堂| 国产精品不卡一区二区三区| 久久精品一二三| 久久久精品免费观看| wwwwww.欧美系列| 久久午夜老司机| 欧美精品一区二区三区在线播放 | 青青草原综合久久大伊人精品 | 91免费版在线| 99re热视频这里只精品| 91香蕉视频污| 91一区一区三区| 欧美日韩在线观看一区二区| 欧洲精品在线观看| 欧美日韩不卡在线| 在线播放/欧美激情| 欧美军同video69gay| 日韩一级完整毛片| 精品久久久三级丝袜| 国产视频一区二区在线| 国产片一区二区| 亚洲品质自拍视频网站| 亚洲综合一区二区精品导航| 亚洲成人av福利| 日本视频中文字幕一区二区三区| 蜜臀av一区二区三区| 国产精品一二三四五| 99精品欧美一区二区三区小说| 色综合天天视频在线观看 | 成人国产一区二区三区精品| jiyouzz国产精品久久| 日本精品视频一区二区| 欧美老女人在线| 久久综合成人精品亚洲另类欧美 | 精品国产三级a在线观看| 国产亚洲人成网站| 亚洲欧美日韩国产综合在线 | 欧美一区二区三区人| 久久久蜜桃精品| 亚洲欧洲中文日韩久久av乱码| 午夜天堂影视香蕉久久| 极品美女销魂一区二区三区| av在线一区二区三区| 6080国产精品一区二区| 国产拍揄自揄精品视频麻豆| 亚洲丰满少妇videoshd| 激情图区综合网| 日本久久一区二区| 精品国产一区二区三区不卡| 亚洲色图丝袜美腿| 蜜桃免费网站一区二区三区| 91在线观看地址| 久久综合视频网| 亚洲成人激情av| 风间由美一区二区av101| 欧美欧美欧美欧美首页| 国产精品污www在线观看| 天天免费综合色| av在线播放不卡| 精品国产在天天线2019| 亚洲黄色免费网站| 国产精品一区在线观看乱码| 精品1区2区3区| 国产精品毛片a∨一区二区三区| 五月天欧美精品| 色婷婷激情综合| 国产精品乱码一区二区三区软件| 日韩激情视频网站| 一本久久综合亚洲鲁鲁五月天| 久久影音资源网| 日韩vs国产vs欧美| 在线观看日韩精品| 国产精品福利在线播放| 国产资源精品在线观看| 欧美精品视频www在线观看| 亚洲男人都懂的| jizz一区二区| 亚洲欧洲av在线| 成人免费视频国产在线观看| 久久色视频免费观看| 美女久久久精品| 日韩一区二区免费在线电影 | 精品国产91九色蝌蚪| 天天综合日日夜夜精品| 欧洲日韩一区二区三区| 亚洲欧美激情小说另类| 成人性生交大片免费看中文网站| 久久久久久**毛片大全| 久久99久国产精品黄毛片色诱| 欧美精品少妇一区二区三区| 午夜精品久久久久| 欧美日韩免费一区二区三区视频| 18涩涩午夜精品.www| 99在线精品一区二区三区| 国产精品久久久久影院亚瑟 | 亚洲女爱视频在线| 91色porny在线视频| 一区二区三区中文在线|