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

📄 linux.c

📁 Hermit-at-1.1.3,一款bootloader
💻 C
字号:
/* * Copyright (c) 2004-2005 Atmark Techno, Inc.  All Rights Reserved. */#include <ep93xx/ioregs.h>#include <ep93xx/memcpy.h>#include <target/herrno.h>#include <target/io.h>#include <target/scan.h>#include <target/str.h>#include <target/buffer.h>#include <target/memcmp.h>#include <target/atag.h>#include <target/gunzip.h>#include "linux.h"#include "memmap.h"#include <target/memzero.h>#include <target/flash.h>#include <target/setenv.h>//#include "eth.h"#include "board.h"#include "mmu.h"/* for setting the root device */#define MINORBITS       8#define MKDEV(ma,mi)    (((ma) << MINORBITS) | (mi))#define RAMDISK_MAJOR   1	/* major for "RAM disk" */#define RAMDISK0_MINOR	0	/* b 1 0 == /dev/ram0 */#define ROM_FLASH_MAJOR	31	/* major for "ROM/flash memory card" */#define FLASH0_MINOR	16	/* b 31 16 == /dev/flash0 */#define FLASH1_MINOR	17	/* b 31 17 == /dev/flash1 */static int major = RAMDISK_MAJOR;static int minor = RAMDISK0_MINOR;#define COMMAND_LINE_SIZE 1024extern unsigned long bytes_out;#define SECTOR_SIZE     0x200#define INODE_SIZE      0x80static int linux_cmdfunc(int argc, char *argv[]){	struct tag *tag = (struct tag *) LINUX_PARAM_ADDRESS;	int sdram32bit = get_board_sdram32bit();	/* zero param block */	memzero (tag, LINUX_PARAM_SIZE);	/* set up core tag */	tag->hdr.tag = ATAG_CORE;	tag->hdr.size = tag_size(tag_core);	tag->u.core.flags = 0;	tag->u.core.pagesize = 0x1000;	tag->u.core.rootdev = MKDEV(major, minor);	/* 32/8 MB of SDRAM at 0xc0000000 */	tag = tag_next(tag);	tag->hdr.tag = ATAG_MEM;	tag->hdr.size = tag_size(tag_mem32);	tag->u.mem.size = sdram32bit ? DRAM1_SIZE : DRAM1_SIZE16;	tag->u.mem.start = sdram32bit ? DRAM1_START : DRAM1_START16;	/* 32/8 MB of SDRAM at 0xc4000000/0xc1000000 */	tag = tag_next(tag);	tag->hdr.tag = ATAG_MEM;	tag->hdr.size = tag_size(tag_mem32);	tag->u.mem.size = sdram32bit ? DRAM2_SIZE : DRAM2_SIZE16;	tag->u.mem.start = sdram32bit ? DRAM2_START : DRAM2_START16;	if (!sdram32bit) {	    /* 16 MB of SDRAM at 0xc4800000 */	    tag = tag_next(tag);	    tag->hdr.tag = ATAG_MEM;	    tag->hdr.size = tag_size(tag_mem32);	    tag->u.mem.size = DRAM3_SIZE16;	    tag->u.mem.start = DRAM3_START16;	}	if (major == RAMDISK_MAJOR) {	  /* an initial ramdisk image in flash at 0x00700000 */	  tag = tag_next(tag);	  tag->hdr.tag = ATAG_INITRD;	  tag->hdr.size = tag_size(tag_initrd);	  tag->u.initrd.start = INITRD_LOAD_ADDRESS;	  tag->u.initrd.size  = bytes_out;	}	/* the command line arguments */	if (argc > 1) {		tag = tag_next(tag);		tag->hdr.tag = ATAG_CMDLINE;		tag->hdr.size = (COMMAND_LINE_SIZE + 3 +			 sizeof(struct tag_header)) >> 2;		{			const unsigned char *src;			unsigned char *dst;			dst = tag->u.cmdline.cmdline;			memzero (dst, COMMAND_LINE_SIZE);			while (--argc > 0) {				src = *++argv;				hprintf ("Doing %s\n", src);				while (*src)					*dst++ = *src++;				*dst++ = ' ';			}			*--dst = '\0';		}	}	tag = tag_next(tag);	tag->hdr.tag = 0;	tag->hdr.size = 0;	/* branch to kernel image */	__asm__ volatile (	"	mov	r4, #0xC0000000\n"	/* start of DRAM */	"	add	r4, r4, #0x00018000\n"	/* kernel offset */	"	mov	r0, #0\n"		/* kernel sanity check */	"	mov	r1, #0x100\n"           /* armadillo2x0 arch. number */	"	orr     r1, r1, #0x82\n"	/* number = 0x182 (386) */	"	mov	r2, #0\n"	"	mov	r3, #0\n"	"	mov	pc, r4"			/* go there! */	);	/* never get here */	return 0;}char mtdparts210[] = { MTDPARTS210 };char mtdparts2x0[] = { MTDPARTS2X0 };char console[] = { "console=ttyAM0,115200" };static int boot_cmdfunc(int argc, char *argv[]){	int i;	int gunzip_kernel = 1;	int o_argc = 0;	if(argc > 1){	  o_argc = argc;	}else{	  o_argc = get_option_count();	}	{	char *o_argv[o_argc + 3];	if(argc > 1){	  for(i = 0; i < argc; i++){	    o_argv[i] = argv[i];	  }	}else{	  if(o_argc <= 1){	    o_argv[o_argc++] = console;	  }else{	    get_options(o_argv);	  }	}	major = RAMDISK_MAJOR;	minor = RAMDISK0_MINOR;	argc = o_argc;	argv = o_argv;	switch(get_board_id()) {	case BOARD_ID_A210:	case BOARD_ID_A210C:	  argv[argc++] = mtdparts210;	  console[13] = '1';	  break;	case BOARD_ID_A220:	case BOARD_ID_A230:	case BOARD_ID_A240:	  argv[argc++] = mtdparts2x0;	  break;	default:	  break;	}	for(i=0; i<o_argc; i++){	  if(strncmp(o_argv[i], "console=", 8) == 0){	    if(strncmp(&o_argv[i][8], "ttyAM0", 6) == 0){	      jumper_mode = 1;	    }else if(strncmp(&o_argv[i][8], "ttyAM1", 6) == 0){	      jumper_mode = 0;	    }else{	      jumper_mode = 0;	    }	    break;	  }	}	if(argc < 1)		return -H_EUSAGE;		LED_RED_ON();	boost_on (BOOST_LINUX_MODE);	if(gunzip_kernel){	  gunzip_object(" kernel", LINUX_SRC_ADDRESS, LINUX_LOAD_ADDRESS);	}	if(major == RAMDISK_MAJOR){	  gunzip_object("ramdisk", INITRD_SRC_ADDRESS, INITRD_LOAD_ADDRESS);	}	boost_off();	linux_cmdfunc(argc, argv);	}	return 0;}const command_t linux_command =	{ "linux", "<linux options>", "start Linux", &linux_cmdfunc };const command_t boot_command =	{ "boot", "", "boot default Linux kernel and ramdisk", &boot_cmdfunc };

⌨️ 快捷键说明

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