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

📄 setup.c

📁 arm平台上的uclinux系统全部源代码
💻 C
字号:
/* *  linux/arch/m68knommu/kernel/setup.c * *  Copyright (C) 1998,1999  D. Jeff Dionne <jeff@rt-control.com> *  Copyright (C) 1998       Kenneth Albanowski <kjahds@kjahds.com> *  Copyright (C) 1995       Hamish Macdonald *//* * This file handles the architecture-dependent parts of system setup */#include <linux/config.h>#include <linux/kernel.h>#include <linux/sched.h>#include <linux/delay.h>#include <linux/interrupt.h>#include <linux/fs.h>#include <linux/fb.h>#include <linux/console.h>#include <linux/genhd.h>#include <linux/errno.h>#include <linux/string.h>#include <linux/major.h>#include <asm/shglports.h>#include <asm/setup.h>#include <asm/irq.h>#include <asm/machdep.h>#ifdef CONFIG_BLK_DEV_INITRD#include <linux/blk.h>#include <asm/pgtable.h>#endifextern void register_console(void (*proc)(const char *));/*  conswitchp               = &fb_con;*/#ifdef CONFIG_CONSOLEextern struct consw *conswitchp;#ifdef CONFIG_FRAMEBUFFERextern struct consw fb_con;#endif#endif  #ifdef CONFIG_SHGLCOREint comm_status_led;int comm_error_led;int alarm_led;struct semaphore porte_interlock = MUTEX;#endifunsigned long rom_length;unsigned long memory_start;unsigned long memory_end;char command_line[512];char saved_command_line[512];/* setup some dummy routines */static void dummy_waitbut(void){}void (*mach_sched_init) (void (*handler)(int, void *, struct pt_regs *));/* machine dependent keyboard functions */int (*mach_keyb_init) (void);int (*mach_kbdrate) (struct kbd_repeat *) = NULL;void (*mach_kbd_leds) (unsigned int) = NULL;/* machine dependent irq functions */void (*mach_init_IRQ) (void);void (*(*mach_default_handler)[]) (int, void *, struct pt_regs *) = NULL;int (*mach_request_irq) (unsigned int, void (*)(int, void *, struct pt_regs *),                         unsigned long, const char *, void *);int (*mach_free_irq) (unsigned int, void *);void (*mach_enable_irq) (unsigned int) = NULL;void (*mach_disable_irq) (unsigned int) = NULL;int (*mach_get_irq_list) (char *) = NULL;void (*mach_process_int) (int, struct pt_regs *) = NULL;/* machine dependent timer functions */unsigned long (*mach_gettimeoffset) (void);void (*mach_gettod) (int*, int*, int*, int*, int*, int*);int (*mach_hwclk) (int, struct hwclk_time*) = NULL;int (*mach_set_clock_mmss) (unsigned long) = NULL;void (*mach_mksound)( unsigned int count, unsigned int ticks );void (*mach_reset)( void );void (*waitbut)(void) = dummy_waitbut;void (*mach_debug_init)(void);extern void register_console(void (*proc)(const char *));#define MASK_256K 0xfffc0000#ifdef CONFIG_M68000	#define CPU "68000"#endif#ifdef CONFIG_M68328#ifdef CONFIG_UCSIMM	#define CPU "68EZ328 DragonBallEZ"#else	#define CPU "68328 DragonBall"#endif#endif#ifdef CONFIG_M68332	#define CPU "68332"#endif#ifdef CONFIG_M68360	#define CPU "68360"#endif#ifdef CONFIG_SHGLCOREstatic int RAM_present(unsigned long address){	unsigned int i, j;	register int result;	i = *((volatile unsigned char *)address);	(*((volatile unsigned char *)address))++;	j = *((volatile unsigned char *)address);	result = (((i+1)&0xff) == j);	*((volatile unsigned char *)address) = i;	i = *((volatile unsigned char *)address);	(*((volatile unsigned char *)address))++;	j = *((volatile unsigned char *)address);	result = result && (((i+1)&0xff) == j);	*((volatile unsigned char *)address) = i;	return result;}static unsigned char FLASH_MID[5];static unsigned char FLASH_DID[5];static void FLASH_identify_sub(void){	volatile unsigned short int * address;	volatile unsigned char * caddress;	unsigned short int mid, did;		address = (unsigned short int*)(0x005555 << 1);	*address = 0xAAAA;	address = (unsigned short int*)(0x002AAA << 1);	*address = 0x5555;	address = (unsigned short int*)(0x005555 << 1);	*address = 0x9090;		address = (unsigned short int*)(0x000000 << 1);	mid = *address;	if (*address != mid)		mid = 0;	address = (unsigned short int*)(0x000001 << 1);	did = *address;	if (*address != did)		did = 0;	*address = 0xF0F0;		FLASH_MID[0] = mid & 0xff;	FLASH_MID[1] = mid >> 8;	FLASH_DID[0] = did & 0xff;	FLASH_DID[1] = did >> 8;		address = (unsigned short int*)(0x085555 << 1);	*address = 0xAAAA;	address = (unsigned short int*)(0x082AAA << 1);	*address = 0x5555;	address = (unsigned short int*)(0x085555 << 1);	*address = 0x9090;		address = (unsigned short int*)(0x080000 << 1);	mid = *address;	if (*address != mid)		mid = 0;	address = (unsigned short int*)(0x080001 << 1);	did = *address;	if (*address != did)		did = 0;	*address = 0xF0F0;		FLASH_MID[2] = mid & 0xff;	FLASH_MID[3] = mid >> 8;	FLASH_DID[2] = did & 0xff;	FLASH_DID[3] = did >> 8;	caddress = (unsigned char*)(0x405555);	*caddress = 0xAA;	caddress = (unsigned char*)(0x402AAA);	*caddress = 0x55;	caddress = (unsigned char*)(0x405555);	*caddress = 0x90;		caddress = (unsigned char*)(0x400000);	mid = *caddress;	if (*caddress != mid)		mid = 0;	caddress = (unsigned char*)(0x400001);	did = *caddress;	if (*caddress != did)		did = 0;	*caddress = 0xF0;		FLASH_MID[4] = mid & 0xff;	FLASH_DID[4] = did & 0xff;}/* Identify FLASH using built-in identify ops, with for run-from-RAM idiom */static void FLASH_identify(unsigned long memory_start){	int len;	void (*code)(void);      	len = (char*)&FLASH_identify-(char*)&FLASH_identify_sub;	code = (void*)memory_start;	memcpy(code, &FLASH_identify_sub, len);		code();}/* Conjure up name for a specific flash part */static void FLASH_part(int mid, int did){	if (mid == 0x20) {		/* SGS-Thompson */		if (did == 0xE2)			printk("ST M29F040");		else			printk("ST D0x%02x", did);	} else if (mid == 0x01) {		/* AMD */		if (did == 0xA4)			printk("AMD 29F040B");		else			printk("AMD D0x%02x", did);	} else if ((mid == 0x00) && (did == 0x00))		printk("Not present");	else		printk("M0x%02x D0x%02x", mid, did);}#endif /* CONFIG_SHGLCORE */void setup_arch(char **cmdline_p,		unsigned long * memory_start_p, unsigned long * memory_end_p){	extern int _etext, _edata, _end, _ramend, _romvec, _flashend;	#ifdef CONFIG_68328_SERIAL       extern void console_print_68328(const char * b);	register_console(console_print_68328);#endif#ifdef CONFIG_68332_SERIAL       extern void console_print_68332(const char * b);	register_console(console_print_68332);#endif#ifdef CONFIG_SHGLCORE	PQSPAR |= 0x70; /* Configure PCS1,2,3 as PQS4,5,6 = SBOUT, SBCLK, SBIN  */	PORTQS = 0;	DDRQS  |= 0x30; /* Make PQS4,5 outputs. */	DDRQS  &= (~0x40); /* and PQS6 input.  */	PEPAR &= (~0x4b); /* PE0,1,3,6 as outputs for all the usuall /SB chip selects. */	DDRE  |= 0x4b;  	PQSPAR = 0x70;	DDRQS = 0x30;	PORT_QS->sbclk=0;	PORT_E->sbirigb = 1;	PORT_E->sbsrom = 0;        SET_COMM_STATUS_LED(1);        SET_COMM_ERROR_LED(1);        SET_ALARM_LED(1);#endif#ifdef CONFIG_PILOT#if 0	*(volatile char *)0xfffff41C = 0x00; /* Port D edge-detect polarity (0=trigger on rise)*/	*(volatile char *)0xfffff41D = 0xff; /* Port D interrupt generator */	*(volatile char *)0xfffff41F = 0x00; /* Port D trigger (0=level, 1=edge) */	*(volatile unsigned long *)0xfffff304 &= ~0x0000ff00; /* Unmask Port D interrupts */#endif#endif	printk("\x0F\r\n\nuClinux/MC" CPU "\n");	printk("Flat model support (C) 1998,1999 Kenneth Albanowski, D. Jeff Dionne\n");#ifdef CONFIG_PILOT	printk("TRG SuperPilot FLASH card support <info@trgnet.com>\n");#endif	memory_start = &_end;#ifdef CONFIG_SHGLCORE	printk("\n");	printk("	Bank 0		Bank 1		Bank 2		Bank 3\n");	printk("RAM	");		printk( RAM_present(0x200000) ? "Present\t\t" : "Not present\t");	printk( RAM_present(0x280001) ? "Present\t\t" : "Not present\t");	printk( RAM_present(0x300000) ? "Present\t\t" : "Not present\t");	printk( RAM_present(0x380001) ? "Present\n" : "Not present\n");		FLASH_identify(memory_start);		printk("ROM	");		FLASH_part(FLASH_MID[0], FLASH_DID[0]); printk("\t");	FLASH_part(FLASH_MID[1], FLASH_DID[1]);	printk("\t");	FLASH_part(FLASH_MID[2], FLASH_DID[2]); printk("\t");	FLASH_part(FLASH_MID[3], FLASH_DID[3]);	printk("\n");	printk("FLASH	");		FLASH_part(FLASH_MID[4], FLASH_DID[4]);	printk("\n");		printk("\n");#endif /* CONFIG_SHGLCORE */		init_task.mm->start_code = 0;	init_task.mm->end_code = (unsigned long) &_etext;	init_task.mm->end_data = (unsigned long) &_edata;	init_task.mm->brk = (unsigned long) &_end;	ROOT_DEV = MKDEV(BLKMEM_MAJOR,0);	command_line[512-1] = '\0';		if (memcmp(command_line, "Arg!", 4))		command_line[4] = '\0';		memset(command_line, 0, 4);	strcpy(saved_command_line, command_line+4);	*cmdline_p = command_line+4;		#ifdef DEBUG	if (strlen(*cmdline_p)) 		printk("Command line: '%s'\n", *cmdline_p);#endif#ifdef CONFIG_PILOT_MEMORY_DISPLAY	{		unsigned long * mem = (memory_start + 16) & ~15;		memcpy(mem, *(volatile unsigned long*)0xFFFFFA00, 160*160/8);		*(volatile unsigned long*)0xFFFFFA00 = mem;		memory_start += 4096;	}#endif                                                                	*memory_start_p = memory_start;	*memory_end_p = memory_end = (unsigned long)&_ramend - 0x10000;	rom_length = (unsigned long)&_flashend - (unsigned long)&_romvec;#ifdef CONFIG_CONSOLE#ifdef CONFIG_FRAMEBUFFER	conswitchp = &fb_con;#else	conswitchp = 0;#endif#endif}int get_cpuinfo(char * buffer){    char *cpu, *mmu, *fpu;    u_long clockfreq, clockfactor;    cpu = CPU;    mmu = "none";    fpu = "none";    clockfactor = 16;    clockfreq = loops_per_sec*clockfactor;    return(sprintf(buffer, "CPU:\t\t%s\n"		   "MMU:\t\t%s\n"		   "FPU:\t\t%s\n"		   "Clocking:\t%lu.%1luMHz\n"		   "BogoMips:\t%lu.%02lu\n"		   "Calibration:\t%lu loops\n",		   cpu, mmu, fpu,		   clockfreq/1000000,(clockfreq/100000)%10,		   loops_per_sec/500000,(loops_per_sec/5000)%100,		   loops_per_sec));}#if 0int get_hardware_list(char *buffer){    int len = 0;    char model[80];    u_long mem;    int i;    strcpy(model, "Unknown m68k");    len += sprintf(buffer+len, "Model:\t\t%s\n", model);    len += get_cpuinfo(buffer+len);    len += sprintf(buffer+len, "System Memory:\t%ldK\n", mem>>10);    return(len);}unsigned long arch_kbd_init(void){	if (mach_keyb_init)		return mach_keyb_init();	else		return 0;}#endifvoid arch_gettod(int *year, int *mon, int *day, int *hour,		 int *min, int *sec){	*year = *mon = *day = *hour = *min = *sec = 0;}

⌨️ 快捷键说明

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