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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? memory.c

?? s3c2440 bootloader 源碼
?? C
字號(hào):
/* * vivi/lib/memory.c: * * Copyright (C) 2002 MIZI Research, Inc. * * 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 * * * Author: Janghoon Lyu <nandy@mizi.com> * Date  : $Date: 2004/02/04 06:22:25 $ * * $Revision: 1.1.1.1 $ * $Id: memory.c,v 1.1.1.1 2004/02/04 06:22:25 laputa Exp $ * * * History *  * 2002-02-25: Janghoon Lyu <nandy@mizi.com> *    - Initial code * * 2002-07-08: Janghoon Lyu <nandy@mizi.com> * * 2002-07-15: Janghoon Lyu <nandy@mizi.com> * */#include "config.h"#include "machine.h"#include "command.h"#include "hardware.h"#include "vivi_string.h"#include "sizes.h"#include "vivi_lib.h"#include "printk.h"#include <types.h>#include <string.h> /*  * Clear memory (set to '0')  */voidclear_mem(unsigned long base, unsigned long len){	__asm__ volatile (		"mov	r0, %0\n"	/* store base address */		"mov	r1, %1\n"	/* store length */		"mov	r2, #0\n"		"mov	r3, r2\n"		"mov	r4, r2\n"		"mov	r5, r2\n"		"mov	r6, r2\n"		"mov	r7, r2\n"		"mov	r8, r2\n"		"mov	r9, r2\n"	" 1:	 stmia	r0!, {r2-r9}\n"	/* clear 32 (4 bytes * 8) bytes */		"subs	r1, r1, #(8 * 4)\n"		"bne	1b\n"		: /* no outputs */		: "r" (base), "r" (len)		: "r0", "r1", "r2", "r3", "r4", 		  "r5", "r6", "r7", "r8", "r9" 	);}/* * Based on ppcboot/board/board.c * * Check memory range for valid RAM. A simple memory test determines * the actually available RAM size between addresses `base' and * `base + maxsize'. Some (not all) hardware errors are detected: * - short between address lines * - short between data lines */long find_dram_size(long *base, long maxsize){	volatile long *addr;  	ulong cnt, val;	ulong save[32];     /* to make test non-destructive */	int i = 0;	for (cnt = maxsize/sizeof(long); cnt > 0; cnt >>= 1) {		addr = base + cnt;      /* pointer arith! */		save[i++] = *addr;		*addr = ~cnt; 	}	/* write 0 to base address */	addr = base; 	save[i] = *addr;	*addr = 0;	/* check at base address */	if ((val = *addr) != 0) { 		*addr = save[i];		return (0);	}	for (cnt = 1; cnt <= maxsize/sizeof(long); cnt <<= 1) {		addr = base + cnt;      /* pointer arith! */		val = *addr;		*addr = save[--i];		if (val != (~cnt)) {			return (cnt * sizeof(long));		}	}	return (maxsize);}long probe_dram_size(void){	long mem_size;	mem_size = find_dram_size((long *)DRAM_BASE, SZ_256M);	printk("Detected memory size = 0x%08lx, %dM (%d bytes)\n", 		mem_size, (mem_size >> 20), mem_size);	return mem_size;}unsigned long mem_compare(const char *to, const char *from, size_t len, int echo){	unsigned long ofs = 0;	if (echo) progress_bar(ofs, len + ofs);	while (len >= sizeof(unsigned long)) {		if (*(unsigned long *)(to + ofs) != *(unsigned long *)(from + ofs))			return ofs;		len -= sizeof(unsigned long);		ofs += sizeof(unsigned long);	}	if (echo) progress_bar(ofs, len + ofs);	if (len > 0) {		if (*(to + ofs) != *(from + ofs));			return ofs;		len -= sizeof(char);		ofs += sizeof(char);	}	if (echo) progress_bar(ofs, len + ofs);	return ofs;}#ifdef CONFIG_CMD_MEMstatic size_t mem_copy(void *to, const void *from, size_t len, int echo){	ulong ofs = 0;	while (len >= sizeof(unsigned long)) {		*(unsigned long *)(to + ofs) = *(unsigned long *)(from + ofs);		len -= sizeof(unsigned long);		ofs += sizeof(unsigned long);	}	if (len > 0) {		(*(char *)(to + ofs) = *(char *)(from + ofs));		len -= sizeof(char);		ofs += sizeof(char);	}	return ofs;}static void search_value(unsigned long *start, unsigned long *end,                          unsigned long value){	volatile unsigned long *addr;	while ((end - start) != 0) {		addr = start;		if (*addr == value) 			printk("address = 0x%08lx\n", start);		start++;	}}static void inlinewrite(long *to, ulong value){	volatile long *addr = to;	*addr = value;}static ulong inlineread(long *from){	volatile long *addr = from;	return *addr;}void print_mem_map(void){	long dram_size;	long sp = 0;	dram_size = find_dram_size((long *)DRAM_BASE, SZ_256M);	printk("Default ram size: %dM\n", (DRAM_SIZE >> 20));	printk("Real ram size   : %dM\n", (dram_size >> 20));	printk("Free memory     : %dM\n\n", (RAM_SIZE >> 20));	printk("RAM mapped to           : 0x%08lx - 0x%08lx\n", \		DRAM_BASE, (DRAM_BASE + DRAM_SIZE));	printk("Flash memory mapped to  : 0x%08lx - 0x%08lx\n", \		FLASH_UNCACHED_BASE, (FLASH_UNCACHED_BASE + FLASH_SIZE));	printk("Available memory region : 0x%08lx - 0x%08lx\n", \		RAM_BASE, (RAM_BASE + RAM_SIZE));	printk("Stack base address      : 0x%08lx\n", (STACK_BASE + STACK_SIZE - 4));	__asm__("mov %0, sp" : "=r" (sp));	printk("Current stack pointer   : 0x%08lx\n", sp);}void print_mem_ctrl_regs(void){	printk("\nMemory control register vlaues\n");#if defined(CONFIG_ARCH_S3C2400)	printk("     BWSCON = 0x%08lx\n", _BWSCON);	printk("   BANKCON0 = 0x%08lx\n", _BANKCON0);	printk("   BANKCON1 = 0x%08lx\n", _BANKCON1);	printk("   BANKCON2 = 0x%08lx\n", _BANKCON2);	printk("   BANKCON3 = 0x%08lx\n", _BANKCON3);	printk("   BANKCON4 = 0x%08lx\n", _BANKCON4);	printk("   BANKCON5 = 0x%08lx\n", _BANKCON5);	printk("   BANKCON6 = 0x%08lx\n", _BANKCON6);	printk("   BANKCON7 = 0x%08lx\n", _BANKCON7);	printk("    REFRESH = 0x%08lx\n", _REFRESH);#elif defined(CONFIG_ARCH_S3C2410) || defined(CONFIG_ARCH_S3C2440) 	printk("     BWSCON = 0x%08lx\n", BWSCON);	printk("   BANKCON0 = 0x%08lx\n", BANKCON0);	printk("   BANKCON1 = 0x%08lx\n", BANKCON1);	printk("   BANKCON2 = 0x%08lx\n", BANKCON2);	printk("   BANKCON3 = 0x%08lx\n", BANKCON3);	printk("   BANKCON4 = 0x%08lx\n", BANKCON4);	printk("   BANKCON5 = 0x%08lx\n", BANKCON5);	printk("   BANKCON6 = 0x%08lx\n", BANKCON6);	printk("   BANKCON7 = 0x%08lx\n", BANKCON7);	printk("    REFRESH = 0x%08lx\n", REFRESH);	printk("   BANKSIZE = 0x%08lx\n", BANKSIZE);	printk("     MRSRB6 = 0x%08lx\n", MRSRB6);	printk("     MRSRB7 = 0x%08lx\n", MRSRB7);	printk("     DSC0   = 0x%08lx\n", DSC0);	printk("     DSC1   = 0x%08lx\n", DSC1);#elif defined(CONFIG_ARCH_SA1100)	printk("SDRAM bank0:\n");	printk("   mdcnfg = 0x%08lx\n",			CTL_REG_READ(SA1100_DRAM_CONFIGURATION_BASE+SA1100_MDCNFG));	printk("   mdrefr = 0x%08lx\n",			CTL_REG_READ(SA1100_DRAM_CONFIGURATION_BASE+SA1100_MDREFR));#else	printk("UNKNOWN ARCHITECTURE!\n");#endif}static void mem_info(void){	printk("\nRAM Information:\n");	print_mem_map();	print_mem_ctrl_regs();}/* * Commands */static user_subcommand_t mem_cmds[];static void command_mem_info(int argc, const char **argv){	mem_info();}static void command_mem_set_regs(int argc, const char **argv){	//init_mem_regs();}void command_mem_copy(int argc, const char *argv[]){        void *dst;        void *src;	int ret;	size_t retlen, len;	if (argc != 4) {		printk("invalid 'mem copy' command: too few(many) arguments\n");		return;	}	dst = (void *)strtoul(argv[1], NULL, 0, &ret);	src = (void *)strtoul(argv[2], NULL, 0, &ret);	len = (size_t)strtoul(argv[3], NULL, 0, &ret);	printk("Copy from 0x%08lx, to 0%08lx. length is 0x%08lx\n", src, dst, len);	retlen = mem_copy(dst, src, len, 0);	printk("\nCopied %d (0x%08lx) bytes\n", retlen, retlen);}void command_mem_compare(int argc, const char *argv[]){        char *to, *from;	int ret;	unsigned long ofs;	size_t len;	if (argc != 4) {		printk("invalid 'mem cmp' command: too few(many) arguments\n");		return;	}        to = (char *)strtoul(argv[1], NULL, 0, &ret);        from = (char *)strtoul(argv[2], NULL, 0, &ret);	len = (size_t)strtoul(argv[3], NULL, 0, &ret);	ofs = mem_compare(to, from, len, 1);	if (ofs != len) {		printk("\nNot matched. offset = 0x%08lx\n", ofs);		printk("value:  src = 0x%08lx, dst = 0x%08lx",			*(unsigned long *)(from + ofs), *(unsigned long *)(to + ofs));	}	printk("\nOK.\n");}/* * vivi> mem search <start_addr> <end_addr> <value> * *       search (argv[0]): command of memeory * <start_addr> (argv[1]): start address for search. *   <end_addr> (argv[2]): end address for serach. *      <value> (argv[3]): value to serach. */void command_search(int argc, const char **argv){	unsigned long *start;	unsigned long *end;	unsigned long value;	int ret;	if (argc != 4) {		printk("invalid 'mem serach' command: too few(many) arguments\n");		print_usage("  ", mem_cmds);		return;	}	start = (unsigned long *)strtoul(argv[1], NULL, 0, &ret);	if (ret) goto error_parse_arg;	end = (unsigned long *)strtoul(argv[2], NULL, 0, &ret);	if (ret) goto error_parse_arg;	value = strtoul(argv[3], NULL, 0, &ret);	if (ret) goto error_parse_arg;	printk("serach 0x%08lx value from 0x%08lx to 0x%08lx\n", value, start, end);	search_value(start, end, value);	return;error_parse_arg:	printk("Can't parsing arguments\n");	return;}void command_size(void){	probe_dram_size();}static user_subcommand_t mem_cmds[] = {{	"cmp",	command_mem_compare,	"compare <dst> <src> <length> -- compare "}, { 	"copy",	command_mem_copy,	"mem copy <dst> <src> <length>" }, { 	"info",		command_mem_info,	"mem info" }, {	"reset",	command_mem_set_regs,	"mem reset -- reset memory control register" }, {	"search",	command_search,	"mem serach <start_addr> <end_addr> <value> -- serach memory address that contain value" }, {		NULL,	NULL,	NULL }};#ifdef CONFIG_MEMORY_RAM_TESTextern int mem_test(unsigned long start, unsigned long ramsize, int quiet);#endifvoid command_mem(int argc, const char **argv){	switch (argc) {	case 1:		invalid_cmd("mem", mem_cmds);		break;	case 2:		if (strncmp("size", argv[1], 4) == 0) {			command_size();			break;		}	case 3:		if (strncmp("read", argv[1], 4) == 0) {			ulong value;			long *addr = (long *)strtoul(argv[2], NULL, 0, NULL);			value = read(addr);			printk("addr: 0x%08lx, value: 0x%08lx\n", addr, value);			break;		}	case 4:		if (strncmp("write", argv[1], 4) == 0) {			long *addr = (long *)strtoul(argv[2], NULL, 0, NULL);			ulong value = strtoul(argv[3], NULL, 0, NULL);			write(addr, value);			printk("addr: 0x%08lx, value: 0x%08lx\n", addr, value);			break;		}#ifdef CONFIG_MEMORY_RAM_TEST		/*		 * vivi> mem test <start> <size>		 */		if (strncmp("test", argv[1], 4) == 0) {			unsigned long start = strtoul(argv[2], NULL, 0, NULL);			unsigned long size = strtoul(argv[3], NULL, 0, NULL);			mem_test(start, size, 1);			break;		}#endif	case 5:#ifdef CONFIG_MEMORY_RAM_TEST		/*		 * vivi> mem test <start> <size>		 */		if (strncmp("test", argv[1], 4) == 0) {			unsigned long start = strtoul(argv[2], NULL, 0, NULL);			unsigned long size = strtoul(argv[3], NULL, 0, NULL);			unsigned long quiet = strtoul(argv[4], NULL, 0, NULL);			mem_test(start, size, quiet);			break;		}#endif	default:		execsubcmd(mem_cmds, argc-1, argv+1);	}}user_command_t mem_cmd = {	"mem",	command_mem,	NULL,	"mem [{cmds}] \t\t\t-- Manage Memory"};#endif /* CONFIG_CMD_MEM */

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品久久久久久久久动漫 | 成人av在线播放网站| 一片黄亚洲嫩模| 久久免费的精品国产v∧| 91久久香蕉国产日韩欧美9色| 另类专区欧美蜜桃臀第一页| 亚洲色图一区二区| 国产亚洲精品bt天堂精选| 欧美日韩国产在线观看| 99国产精品一区| 国产91精品欧美| 久久99久久99精品免视看婷婷| 亚洲一区二区三区三| 国产精品久久久久久久久晋中| 精品少妇一区二区| 欧美性猛交xxxxxx富婆| 91女神在线视频| 风间由美中文字幕在线看视频国产欧美| 日本怡春院一区二区| 亚洲国产成人va在线观看天堂| 亚洲精品欧美二区三区中文字幕| 中文在线一区二区| 久久九九99视频| 久久网站最新地址| 日韩一级大片在线| 91精品久久久久久久99蜜桃| 欧美日韩在线播放三区四区| 一本在线高清不卡dvd| 99久精品国产| 97久久精品人人做人人爽 | 色综合视频一区二区三区高清| 国产精品亚洲第一区在线暖暖韩国| 免费成人在线播放| 免费高清在线一区| 老司机精品视频一区二区三区| 轻轻草成人在线| 免费观看成人av| 精品一二线国产| 国产美女在线精品| 国产盗摄女厕一区二区三区| 国产在线视频不卡二| 韩国三级中文字幕hd久久精品| 国产原创一区二区三区| 国产精品77777竹菊影视小说| 国产精品 日产精品 欧美精品| 国产自产v一区二区三区c| 国产精品资源在线看| 懂色av噜噜一区二区三区av| 成人免费视频视频在线观看免费| 成人h动漫精品| 一本色道久久综合亚洲精品按摩| 在线观看日韩精品| 欧美一区二区视频免费观看| 欧美大片在线观看一区| 久久精品日韩一区二区三区| 国产精品私房写真福利视频| 亚洲特级片在线| 一区二区三区成人| 日韩综合一区二区| 国产一区二区三区四区五区入口| 成人一道本在线| 欧美视频一区二区| 欧美zozozo| 最新中文字幕一区二区三区| 亚洲高清免费视频| 激情伊人五月天久久综合| 国产91精品久久久久久久网曝门| 91精彩视频在线| 日韩一区二区精品| 中文字幕av一区二区三区| 亚洲国产精品综合小说图片区| 蜜桃传媒麻豆第一区在线观看| 国产1区2区3区精品美女| 日本韩国一区二区| 日韩一级片在线观看| 国产精品蜜臀av| 日本人妖一区二区| 成人精品鲁一区一区二区| 欧美四级电影网| 久久亚洲综合色一区二区三区| 亚洲精品视频自拍| 激情都市一区二区| 欧美曰成人黄网| 国产亚洲综合色| 亚洲福利一二三区| 成人蜜臀av电影| 欧美肥大bbwbbw高潮| 国产精品夫妻自拍| 久久精品国产亚洲aⅴ| 色综合久久久久综合体| 久久综合中文字幕| 丝袜美腿亚洲色图| 91污片在线观看| 久久网这里都是精品| 午夜精品久久久久影视| 大美女一区二区三区| 91精品国产免费| 一区二区三区中文字幕精品精品| 黑人巨大精品欧美黑白配亚洲| 欧洲生活片亚洲生活在线观看| 久久久综合激的五月天| 亚洲成人资源网| 色综合咪咪久久| 日本一区二区三区在线不卡| 久久精品国产在热久久| 欧美日韩国产天堂| 亚洲美女在线国产| 成人在线综合网| 久久精品夜色噜噜亚洲a∨| 日本美女一区二区三区视频| 欧美在线观看一二区| 中文字幕中文乱码欧美一区二区| 激情六月婷婷久久| 日韩欧美美女一区二区三区| 性感美女极品91精品| 在线免费视频一区二区| 国产精品久久久久久久久图文区| 激情成人午夜视频| 精品噜噜噜噜久久久久久久久试看 | 欧美性大战久久久久久久| 日韩美女视频19| av欧美精品.com| 中文成人av在线| 国产大陆精品国产| 久久久久久一级片| 韩国女主播一区二区三区| 精品区一区二区| 韩国午夜理伦三级不卡影院| 精品国产乱码久久| 麻豆视频观看网址久久| 日韩欧美国产综合在线一区二区三区 | 91香蕉视频黄| 1区2区3区精品视频| av电影一区二区| 亚洲色图.com| 色婷婷综合视频在线观看| 亚洲欧美日韩国产综合| 91麻豆文化传媒在线观看| 怡红院av一区二区三区| 日本道色综合久久| 一区二区三区视频在线看| 欧美色老头old∨ideo| 午夜成人免费电影| 日韩欧美自拍偷拍| 国产一区二区在线观看免费 | 午夜精品久久久久久久蜜桃app| 欧美三区在线观看| 日本欧美在线观看| 久久久精品tv| 91视频.com| 精品国产污污免费网站入口| 国产精品综合二区| 亚洲欧美一区二区在线观看| 99久久精品一区二区| 亚洲一区二区三区国产| 欧美一级专区免费大片| 国产精品1024| 尤物av一区二区| 日韩视频一区二区三区| 国产毛片精品国产一区二区三区| 久久精品免视看| 在线视频综合导航| 奇米四色…亚洲| 欧美国产日韩a欧美在线观看| 97se狠狠狠综合亚洲狠狠| 午夜精品久久久久久久久久久| 欧美sm极限捆绑bd| 91丨九色丨蝌蚪富婆spa| 日韩激情视频在线观看| 久久久.com| 精品视频999| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | av高清不卡在线| 日韩中文欧美在线| 欧美国产视频在线| 欧美三级欧美一级| 国产精品羞羞答答xxdd| 亚洲网友自拍偷拍| 久久精品网站免费观看| 在线观看av一区二区| 国产精品一区免费在线观看| 一区二区三区美女| 国产无一区二区| 欧美性猛片xxxx免费看久爱| 国产精品系列在线观看| 亚洲第一福利一区| 国产精品久久久久四虎| 欧美成人精品1314www| 91麻豆精品在线观看| 国产在线播精品第三| 天涯成人国产亚洲精品一区av| 中文字幕av一区二区三区| 日韩一区二区三区av| 色偷偷久久一区二区三区| 国产永久精品大片wwwapp| 午夜国产精品影院在线观看| 亚洲欧美在线视频观看| 久久这里只有精品6| 制服丝袜激情欧洲亚洲| 色综合久久久久久久|