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

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

?? boot_kernel.c

?? s3c2440 bootloader 源碼
?? C
字號:
/* * vivi/lib/boot-kernel.c: copy the kernel image to ram, then execute it  * * Copyright (C) 2001,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 $ * * *  * * History *  * 2001-12-23: Janghoon Lyu <nandy@mizi.com> *    - Created code * * 2002-02-23: Janghoon Lyu <nandy@mizi.com> *    -  Add flash commands * * 2002-06-20: Janghoon Lyu <nandy@mizi.com> */#include "config.h"#include "machine.h"#include "boot_kernel.h"#include "priv_data.h"#include "command.h"#include "vivi_string.h"#include "printk.h"#include "mmu.h"#include <types.h>#include <setup.h>#include <string.h>#define LINUX_KERNEL_OFFSET	0x8000#define LINUX_PARAM_OFFSET	0x100#define LINUX_PAGE_SIZE		SZ_4K#define LINUX_PAGE_SHIFT	12#define LINUX_ZIMAGE_MAGIC	0x016f2818/* * call_linux(): execute the linux kernel * r0 = must contain a zero or else the kernel loops * r1 = architecture type * r2 = address to be executed */#ifdef CONFIG_ARCH_S3C2400void call_linux(long a0, long a1, long a2){	cache_clean_invalidate();	tlb_invalidate();__asm__(	"mov	r0, %0\n"	"mov	r1, %1\n"	"mov	r2, %2\n"	"mov	ip, #0\n"	"mcr	p15, 0, ip, c13, c0, 0\n"	/* zero PID */	"mcr	p15, 0, ip, c7, c7, 0\n"	/* invalidate I,D caches */	"mcr	p15, 0, ip, c7, c10, 4\n"	/* drain write buffer */	"mcr	p15, 0, ip, c8, c7, 0\n"	/* invalidate I,D TLBs */	"mrc	p15, 0, ip, c1, c0, 0\n"	/* get control register */	"bic	ip, ip, #0x0001\n"		/* disable MMU */	"mcr	p15, 0, ip, c1, c0, 0\n"	/* write control register */	"mov	pc, r2\n"	"nop\n"	"nop\n"	: /* no outpus */	: "r" (a0), "r" (a1), "r" (a2)	);}#elif defined(CONFIG_ARCH_S3C2410) || defined(CONFIG_ARCH_S3C2440)void  call_linux(long a0, long a1, long a2){	cache_clean_invalidate();	tlb_invalidate();__asm__(	"mov	r0, %0\n"	"mov	r1, %1\n"	"mov	r2, %2\n"	"mov	ip, #0\n"	"mcr	p15, 0, ip, c13, c0, 0\n"	/* zero PID */	"mcr	p15, 0, ip, c7, c7, 0\n"	/* invalidate I,D caches */	"mcr	p15, 0, ip, c7, c10, 4\n"	/* drain write buffer */	"mcr	p15, 0, ip, c8, c7, 0\n"	/* invalidate I,D TLBs */	"mrc	p15, 0, ip, c1, c0, 0\n"	/* get control register */	"bic	ip, ip, #0x0001\n"		/* disable MMU */	"mcr	p15, 0, ip, c1, c0, 0\n"	/* write control register */	"mov	pc, r2\n"	"nop\n"	"nop\n"	: /* no outpus */	: "r" (a0), "r" (a1), "r" (a2)	);}#elif defined(CONFIG_ARCH_SA1100)void  call_linux(long r0, long r1, long r2){	__asm__(" mov r10, r1\n" 		" mov r11, r2\n" 		" mcr p15, 0, r0, c8, c7, 0\n" /* flush I and D TlB */		" mcr p15, 0, r0, c7, c10, 4\n" /* drain the write buffer */		" mov r3, #0x130\n"		" mcr p15, 0, r3, c1, c0, 0\n"   /* disable the MMU */		/* make sure the pipeline is emptied */		" mov r0, #0\n"  		" mov r0, r0\n"  		" mov r0, r0\n"  		" mov r0, r0\n"  		" mov r0, r0\n"  		/* zero PID in Fast Context Switch Extension PID register */		" mov r0, #0\n"  		" mcr p15, 0, r0, c13, c0, 0\n"		" mov r0, #0\n"  		" mov r1, r10\n" 		" mov pc, r11\n"         /* jump to addr. bootloader is done */ 		: : "r" (r0), "r" (r1), "r" (r2) );}#elif defined(CONFIG_ARCH_PXA250)void  call_linux(long r0, long r1, long r2){	__asm__(" mov r10, r1\n" 		" mov r11, r2\n" 		" mcr p15, 0, r0, c8, c7, 0\n" /* flush I and D TlB */		" mcr p15, 0, r0, c7, c10, 4\n" /* drain the write buffer */		" mov r3, #0x130\n"		" mcr p15, 0, r3, c1, c0, 0\n"   /* disable the MMU */		/* make sure the pipeline is emptied */		" mov r0, #0\n"  		" mov r0, r0\n"  		" mov r0, r0\n"  		" mov r0, r0\n"  		" mov r0, r0\n"  		/* zero PID in Fast Context Switch Extension PID register */		" mov r0, #0\n"  		" mcr p15, 0, r0, c13, c0, 0\n"		" mov r0, #0\n"  		" mov r1, r10\n" 		" mov pc, r11\n"         /* jump to addr. bootloader is done */ 		: : "r" (r0), "r" (r1), "r" (r2) );}#else#error not defined call_linux() for this architecture	#endif/* * pram_base: base address of linux paramter */static void setup_linux_param(ulong param_base){	struct param_struct *params = (struct param_struct *)param_base; 	char *linux_cmd;	printk("Setup linux parameters at 0x%08lx\n", param_base);	memset(params, 0, sizeof(struct param_struct));	params->u1.s.page_size = LINUX_PAGE_SIZE;	params->u1.s.nr_pages = (DRAM_SIZE >> LINUX_PAGE_SHIFT);#if 0	params->u1.s.page_size = LINUX_PAGE_SIZE;	params->u1.s.nr_pages = (dram_size >> LINUX_PAGE_SHIFT);	params->u1.s.ramdisk_size = 0;	params->u1.s.rootdev = rootdev;	params->u1.s.flags = 0;	/* TODO */	/* If use ramdisk */	/*	params->u1.s.initrd_start = ?;	params->u1.s.initrd_size = ?;	params->u1.s.rd_start = ?;	*/#endif	/* set linux command line */	linux_cmd = get_linux_cmd_line();	if (linux_cmd == NULL) {		printk("Wrong magic: could not found linux command line\n");	} else {		memcpy(params->commandline, linux_cmd, strlen(linux_cmd) + 1);		printk("linux command line is: \"%s\"\n", linux_cmd);	}}#if defined(CONFIG_S3C2410_NAND_BOOT) || defined(CONFIG_S3C2440_NAND_BOOT)extern int nand_read_ll(unsigned char*, unsigned long, int);#endif/* * dst: destination address * src: source * size: size to copy * mt: type of storage device */static inline int copy_kernel_img(ulong dst, const char *src, size_t size, int mt){	int ret = 0;	switch (mt) {		case MT_RAM:				/* noting to do */			break;		case MT_NOR_FLASH:			memcpy((char *)dst, (src + FLASH_UNCACHED_BASE), size);			break;		case MT_SMC_S3C2410: #if defined(CONFIG_S3C2410_NAND_BOOT) || defined(CONFIG_S3C2440_NAND_BOOT)			printk("copy kernel image from smc 0x%08x,size 0x%08x,to 0x%08x.\n",src,size,dst);			ret = nand_read_ll((unsigned char *)dst, 					   (unsigned long)src, (int)size);#endif			break;		case MT_UNKNOWN:		default:			printk("Undefined media type.\n");			return -1;	}	//return -1;	return ret;}static inline int media_type_is(const char *mt){	if (strncmp("ram", mt, 3) == 0) {		return MT_RAM;	} else if (strncmp("nor", mt, 3) == 0) {		return MT_NOR_FLASH;	} else if (strncmp("smc", mt, 3) == 0) {		return MT_SMC_S3C2410;	} else {		return MT_UNKNOWN;	}}/* * boot_kernel: booting the linux kernel * * from: address of stored kernel image * size: size of kernel image * media_type: a type of stoage device */int boot_kernel(ulong from, size_t size, int media_type){	int ret;	ulong boot_mem_base;	/* base address of bootable memory 嘎唱? */	ulong to;	ulong mach_type;	boot_mem_base = get_param_value("boot_mem_base", &ret);	if (ret) {		printk("Can't get base address of bootable memory\n");		printk("Get default DRAM address. (0x%08lx\n", DRAM_BASE);		boot_mem_base = DRAM_BASE;	}	/* copy kerne image */	to = boot_mem_base + LINUX_KERNEL_OFFSET;	printk("Copy linux kernel from 0x%08lx to 0x%08lx, size = 0x%08lx ... ",		from, to, size);	ret = copy_kernel_img(to, (char *)from, size, media_type);	if (ret) {		printk("failed\n");		return -1;	} else {		printk("done\n");	}	if (*(ulong *)(to + 9*4) != LINUX_ZIMAGE_MAGIC) {		printk("Warning: this binary is not compressed linux kernel image\n");		printk("zImage magic = 0x%08lx\n", *(ulong *)(to + 9*4));	} else {		printk("zImage magic = 0x%08lx\n", *(ulong *)(to + 9*4));	}	/* Setup linux parameters and linux command line */	setup_linux_param(boot_mem_base + LINUX_PARAM_OFFSET);	/* Get machine type */	mach_type = get_param_value("mach_type", &ret);	printk("MACH_TYPE = %d\n", mach_type);	/* Go Go Go */	printk("NOW, Booting Linux......\n");	call_linux(0, mach_type, to);	return 0;	}	/* * User Commands */static inline void display_help(void){	printk("invalid 'params' command: too few(many) arguments\n");	printk("Usage:\n");	printk("  boot <media_type> -- booting kernel \n");	printk("    value of media_type (location of kernel image\n");	printk("       1 = RAM\n");	printk("       2 = NOR Flash Memory\n");	printk("       3 = SMC (On S3C2410)\n");	printk("  boot <media_type> <mtd_part> -- boot from specific mtd partition\n");	printk("  boot <media_type> <addr> <size>\n");	printk("  boot help -- help about 'boot' command\n");}/* * default values: *   kernel mtd partition = "kernel" *   base adress of bootable memory = DRAM_BASE *   media type =  * * avalable commands * * boot * boot <media_type> * boot <media_type> <mtd_part_name> * boot <media_type> <base address of stored kernel image> <kernel_size> * boot help * * Anyway, I need three values. this: *  media type, address of kernel image, size of kernel image, */void command_boot(int argc, const char **argv){	int media_type = 0;	ulong from = 0;	size_t size = 0;	mtd_partition_t *kernel_part;	int ret;	switch (argc) {		case 1:			media_type = get_param_value("media_type", &ret);			if (ret) {				printk("Can't get default 'media_type'\n");				return;			}			kernel_part = get_mtd_partition("kernel");			if (kernel_part == NULL) {				printk("Can't find default 'kernel' partition\n");				return;			}			from = kernel_part->offset;			size = kernel_part->size;			break;		case 2:			if (strncmp("help", argv[1], 4) == 0) {				display_help();				return;			}			media_type = media_type_is(argv[1]);			kernel_part = get_mtd_partition("kernel");			from = kernel_part->offset;			size = kernel_part->size;			break;		case 3:			media_type = media_type_is(argv[1]);			kernel_part = get_mtd_partition(argv[2]);			from = kernel_part->offset;			size = kernel_part->size;			break;		case 4:			media_type = media_type_is(argv[1]);			from = strtoul(argv[2], NULL, 0, NULL);			size = strtoul(argv[3], NULL, 0, NULL);			break;		default:			display_help();			break;	}	boot_kernel(from, size, media_type);}user_command_t boot_cmd = {	"boot",	command_boot,	NULL,	"boot [{cmds}] \t\t\t-- Booting linux kernel"};

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人av片在线观看| 久久久综合视频| 26uuu亚洲婷婷狠狠天堂| 中文字幕一区日韩精品欧美| 日韩中文字幕一区二区三区| 99精品桃花视频在线观看| 日韩欧美自拍偷拍| 亚洲第一激情av| 国产99一区视频免费| 欧美电影免费提供在线观看| 亚洲自拍都市欧美小说| av高清久久久| 久久精品一二三| 免费看黄色91| 欧美三级资源在线| 亚洲精品乱码久久久久久黑人| 国产一区二区三区免费播放| 欧美一区二区网站| 亚洲成年人网站在线观看| 色诱视频网站一区| 亚洲视频在线一区| 色综合久久中文字幕综合网| 国产精品进线69影院| 国产成人免费av在线| 久久久久久久久久久久久女国产乱| 麻豆成人久久精品二区三区红| 欧美丰满美乳xxx高潮www| 亚洲成人激情自拍| 欧美二区三区的天堂| 五月天精品一区二区三区| 欧美三级韩国三级日本一级| 亚洲成av人在线观看| 欧美日韩成人一区| 免费观看成人av| 精品日韩99亚洲| 国产精品99久久久久久宅男| 欧美经典一区二区| 成人一区二区三区视频| 国产精品久久精品日日| 99re热视频精品| 一区二区三区鲁丝不卡| 欧美久久久久久久久久| 美女视频黄久久| 欧美tickle裸体挠脚心vk| 国内成+人亚洲+欧美+综合在线| 日韩精品最新网址| 国产精华液一区二区三区| 国产精品视频观看| 欧美优质美女网站| 青青草视频一区| 国产欧美一区二区精品久导航| 99久久精品情趣| 三级欧美在线一区| 久久久三级国产网站| 9l国产精品久久久久麻豆| 亚洲综合一区在线| 欧美电影免费观看高清完整版在线观看| 国产一区二三区| 亚洲精品一二三| 日韩视频免费直播| 成人国产视频在线观看| 亚洲va国产天堂va久久en| 精品国产乱码久久久久久夜甘婷婷| 国产精品99久久久| 亚洲高清免费在线| 精品sm在线观看| 色偷偷88欧美精品久久久| 免费人成精品欧美精品| 一色桃子久久精品亚洲| 欧美人体做爰大胆视频| 成人小视频在线观看| 亚洲一区在线免费观看| 久久只精品国产| 日本高清不卡在线观看| 国模冰冰炮一区二区| 亚洲国产成人av| 国产精品你懂的| 精品国产91亚洲一区二区三区婷婷 | 欧美中文字幕不卡| 国产在线视频不卡二| 亚洲国产精品久久不卡毛片 | 亚洲精品中文字幕在线观看| 日韩欧美中文一区| 91久久一区二区| 成人性生交大片免费看中文网站| 日韩国产欧美在线观看| 日韩伦理av电影| 久久精品在线观看| 欧美一级片在线看| 欧美日韩综合在线免费观看| 99精品视频中文字幕| 国产馆精品极品| 狠狠色狠狠色综合系列| 午夜精品国产更新| 亚洲国产日产av| 亚洲综合久久久| 亚洲另类色综合网站| 中文文精品字幕一区二区| 精品国产乱码久久久久久1区2区| 欧美三级资源在线| 欧美日韩综合不卡| 日本高清免费不卡视频| 色综合色综合色综合色综合色综合 | 成人免费小视频| 中文字幕av不卡| 欧美国产一区二区| 久久久午夜精品| 国产亚洲欧美一区在线观看| 国产精品原创巨作av| 亚洲国产成人91porn| 亚洲综合图片区| 亚洲黄色小视频| 亚洲一区二区黄色| 亚洲午夜激情av| 石原莉奈一区二区三区在线观看| 亚洲高清视频在线| 亚洲第一成人在线| 日本不卡不码高清免费观看| 日韩有码一区二区三区| 美国欧美日韩国产在线播放| 玖玖九九国产精品| 激情五月激情综合网| 国产在线精品视频| 成人午夜视频网站| 色综合久久六月婷婷中文字幕| 在线观看视频一区| 欧美色倩网站大全免费| 日韩手机在线导航| 久久精品人人爽人人爽| 中文字幕在线不卡| 一区二区日韩av| 美女一区二区久久| 国产成人在线视频免费播放| 国产99久久久国产精品免费看| 97超碰欧美中文字幕| 欧美精品一卡两卡| 久久伊人蜜桃av一区二区| 中文字幕在线视频一区| 亚洲午夜精品网| 蜜桃一区二区三区在线观看| 丁香一区二区三区| 欧美日韩一区精品| 欧美mv日韩mv国产网站| 国产精品视频在线看| 亚洲成av人片观看| 狠狠色丁香久久婷婷综合_中 | 国产专区欧美精品| 99久久er热在这里只有精品66| 一本到不卡精品视频在线观看| 欧美日韩大陆一区二区| 国产亚洲婷婷免费| 亚洲国产精品自拍| 国产精品自拍在线| 欧美久久婷婷综合色| 欧美激情艳妇裸体舞| 一区二区三国产精华液| 国产精品中文字幕欧美| 欧美日韩高清在线| 中文欧美字幕免费| 久久精品国产澳门| 色999日韩国产欧美一区二区| 久久人人超碰精品| 日韩精品每日更新| 色94色欧美sute亚洲13| 久久综合久久综合亚洲| 午夜影院久久久| av在线不卡观看免费观看| 欧美电影免费观看高清完整版在线观看| 国产精品久久久久久一区二区三区| 午夜影院在线观看欧美| 99精品欧美一区二区三区小说 | 亚洲国产cao| av一本久道久久综合久久鬼色| 日韩欧美一区二区免费| 亚洲综合图片区| 91在线porny国产在线看| 久久久亚洲国产美女国产盗摄| 午夜精品一区二区三区三上悠亚 | 欧美久久久久久久久中文字幕| 亚洲日本电影在线| 国产成人在线看| 久久婷婷久久一区二区三区| 日本aⅴ免费视频一区二区三区| 一本久久综合亚洲鲁鲁五月天| 精品99久久久久久| 精品在线一区二区| 日韩一区二区免费在线电影| 亚洲成人黄色小说| 欧美三区在线观看| 亚洲1区2区3区视频| 欧美自拍偷拍一区| 一区二区三区精品在线观看| 91性感美女视频| 亚洲精品第一国产综合野| 91女人视频在线观看| 中文字幕日本乱码精品影院| 成人国产在线观看| 亚洲欧美国产毛片在线| 北条麻妃一区二区三区| 中文字幕人成不卡一区|