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

📄 oak_setup.c

📁 Linux内核源代码 为压缩文件 是<<Linux内核>>一书中的源代码
💻 C
字号:
/* * *    Copyright (c) 1999-2000 Grant Erickson <grant@lcse.umn.edu> * *    Module name: oak_setup.c * *    Description: *      Architecture- / platform-specific boot-time initialization code for *      the IBM PowerPC 403GCX "Oak" evaluation board. Adapted from original *      code by Gary Thomas, Cort Dougan <cort@fsmlabs.com>, and Dan Malek *      <dan@net4x.com>. * */#include <linux/config.h>#include <linux/init.h>#include <linux/smp.h>#include <linux/threads.h>#include <linux/interrupt.h>#include <linux/param.h>#include <linux/string.h>#include <linux/blk.h>#include <asm/processor.h>#include <asm/board.h>#include <asm/machdep.h>#include <asm/page.h>#include "local_irq.h"#include "ppc4xx_pic.h"#include <asm/time.h>#include "oak_setup.h"/* Function Prototypes */extern void abort(void);/* Global Variables */unsigned char __res[sizeof(bd_t)];/* * void __init oak_init() * * Description: *   This routine... * * Input(s): *   r3 - Optional pointer to a board information structure. *   r4 - Optional pointer to the physical starting address of the init RAM *        disk. *   r5 - Optional pointer to the physical ending address of the init RAM *        disk. *   r6 - Optional pointer to the physical starting address of any kernel *        command-line parameters. *   r7 - Optional pointer to the physical ending address of any kernel *        command-line parameters. * * Output(s): *   N/A * * Returns: *   N/A * */void __initoak_init(unsigned long r3, unsigned long r4, unsigned long r5, 	 unsigned long r6, unsigned long r7){	/*	 * If we were passed in a board information, copy it into the	 * residual data area.	 */	if (r3) {		memcpy((void *)__res, (void *)(r3 + KERNELBASE), sizeof(bd_t));	}#if defined(CONFIG_BLK_DEV_INITRD)	/*	 * If the init RAM disk has been configured in, and there's a valid	 * starting address for it, set it up.	 */	if (r4) {		initrd_start = r4 + KERNELBASE;		initrd_end = r5 + KERNELBASE;	}#endif /* CONFIG_BLK_DEV_INITRD */	/* Copy the kernel command line arguments to a safe place. */	if (r6) { 		*(char *)(r7 + KERNELBASE) = 0;		strcpy(cmd_line, (char *)(r6 + KERNELBASE));	}	/* Initialize machine-dependency vectors */	ppc_md.setup_arch	 	= oak_setup_arch;	ppc_md.setup_residual	 	= oak_setup_residual;	ppc_md.get_cpuinfo	 	= NULL;	ppc_md.irq_cannonicalize 	= NULL;	ppc_md.init_IRQ		 	= oak_init_IRQ;	ppc_md.get_irq		 	= oak_get_irq;	ppc_md.init		 	= NULL;	ppc_md.restart		 	= oak_restart;	ppc_md.power_off	 	= oak_power_off;	ppc_md.halt		 	= oak_halt;	ppc_md.time_init	 	= oak_time_init;	ppc_md.set_rtc_time	 	= oak_set_rtc_time;	ppc_md.get_rtc_time	 	= oak_get_rtc_time;	ppc_md.calibrate_decr	 	= oak_calibrate_decr;	ppc_md.kbd_setkeycode    	= NULL;	ppc_md.kbd_getkeycode    	= NULL;	ppc_md.kbd_translate     	= NULL;	ppc_md.kbd_unexpected_up 	= NULL;	ppc_md.kbd_leds          	= NULL;	ppc_md.kbd_init_hw       	= NULL;#if defined(CONFIG_MAGIC_SYSRQ)	ppc_md.ppc_kbd_sysrq_xlate	= NULL;#endif	return;}/* * Document me. */void __initoak_setup_arch(void){	/* XXX - Implement me */}/* * int oak_setup_residual() * * Description: *   This routine pretty-prints the platform's internal CPU and bus clock *   frequencies into the buffer for usage in /proc/cpuinfo. * * Input(s): *  *buffer - Buffer into which CPU and bus clock frequencies are to be *            printed. * * Output(s): *  *buffer - Buffer with the CPU and bus clock frequencies. * * Returns: *   The number of bytes copied into 'buffer' if OK, otherwise zero or less *   on error. */intoak_setup_residual(char *buffer){	int len = 0;	bd_t *bp = (bd_t *)__res;	len += sprintf(len + buffer,		       "clock\t\t: %dMHz\n"		       "bus clock\t\t: %dMHz\n",		       bp->bi_intfreq / 1000000,		       bp->bi_busfreq / 1000000);	return (len);}/* * Document me. */void __initoak_init_IRQ(void){	int i;	ppc4xx_pic_init();	for (i = 0; i < NR_IRQS; i++) {		irq_desc[i].handler = ppc4xx_pic;	}	return;}/* * Document me. */intoak_get_irq(struct pt_regs *regs){	return (ppc4xx_pic_get_irq(regs));}/* * Document me. */voidoak_restart(char *cmd){	abort();}/* * Document me. */voidoak_power_off(void){	oak_restart(NULL);}/* * Document me. */voidoak_halt(void){	oak_restart(NULL);}/* * Document me. */long __initoak_time_init(void){	/* XXX - Implement me */	return 0;}/* * Document me. */int __initoak_set_rtc_time(unsigned long time){	/* XXX - Implement me */	return (0);}/* * Document me. */unsigned long __initoak_get_rtc_time(void){	/* XXX - Implement me */	return (0);}/* * void __init oak_calibrate_decr() * * Description: *   This routine retrieves the internal processor frequency from the board *   information structure, sets up the kernel timer decrementer based on *   that value, enables the 403 programmable interval timer (PIT) and sets *   it up for auto-reload. * * Input(s): *   N/A * * Output(s): *   N/A * * Returns: *   N/A * */void __initoak_calibrate_decr(void){	unsigned int freq;	bd_t *bip = (bd_t *)__res;	freq = bip->bi_intfreq;	decrementer_count = freq / HZ;	count_period_num = 1;	count_period_den = freq;	/* Enable the PIT and set auto-reload of its value */	mtspr(SPRN_TCR, TCR_PIE | TCR_ARE);	/* Clear any pending timer interrupts */	mtspr(SPRN_TSR, TSR_ENW | TSR_WIS | TSR_PIS | TSR_FIS);}

⌨️ 快捷键说明

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