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

📄 prep_nvram.c

📁 Linux内核源代码 为压缩文件 是<<Linux内核>>一书中的源代码
💻 C
字号:
/* *  linux/arch/ppc/kernel/prep_nvram.c * *  Copyright (C) 1998  Corey Minyard * */#include <linux/init.h>#include <linux/delay.h>#include <linux/malloc.h>#include <linux/ioport.h>#include <asm/init.h>#include <asm/segment.h>#include <asm/io.h>#include <asm/processor.h>#include <asm/machdep.h>#include <asm/prep_nvram.h>/* * Allow for a maximum of 32K of PReP NvRAM data */#define MAX_PREP_NVRAM 0x8000static char nvramData[MAX_PREP_NVRAM];static NVRAM_MAP *nvram=(NVRAM_MAP *)&nvramData[0];#define PREP_NVRAM_AS0	0x74#define PREP_NVRAM_AS1	0x75#define PREP_NVRAM_DATA	0x77unsigned char *rs_pcNvRAM;unsigned char __prep prep_nvram_read_val(int addr){	outb(addr, PREP_NVRAM_AS0);	outb(addr>>8, PREP_NVRAM_AS1);	return inb(PREP_NVRAM_DATA);}  void __prep prep_nvram_write_val(int           addr,			  unsigned char val){	outb(addr, PREP_NVRAM_AS0);	outb(addr>>8, PREP_NVRAM_AS1);   	outb(val, PREP_NVRAM_DATA);}  /* * Most Radstone boards have NvRAM memory mapped at offset 8M in ISA space */unsigned char __prep rs_nvram_read_val(int addr){	return rs_pcNvRAM[addr];}  void __prep rs_nvram_write_val(int addr,			unsigned char val){	rs_pcNvRAM[addr]=val;}  void __init init_prep_nvram(void){	unsigned char *nvp;	int  i;	int  nvramSize;	/*	 * I'm making the assumption that 32k will always cover the	 * nvramsize.  If this isn't the case please let me know and we can	 * map the header, then get the size from the header, then map	 * the whole size. -- Cort	 */	if ( _prep_type == _PREP_Radstone )		rs_pcNvRAM = (unsigned char *)ioremap(_ISA_MEM_BASE+0x00800000,						      32<<10);	request_region(PREP_NVRAM_AS0, 0x8, "PReP NVRAM");	/*	 * The following could fail if the NvRAM were corrupt but	 * we expect the boot firmware to have checked its checksum	 * before boot	 */	nvp = (char *) &nvram->Header;	for (i=0; i<sizeof(HEADER); i++)	{		*nvp = ppc_md.nvram_read_val(i);		nvp++;	}		/*	 * The PReP NvRAM may be any size so read in the header to	 * determine how much we must read in order to get the complete	 * GE area	 */	nvramSize=(int)nvram->Header.GEAddress+nvram->Header.GELength;	if(nvramSize>MAX_PREP_NVRAM)	{		/*		 * NvRAM is too large		 */		nvram->Header.GELength=0;		return;	}	/*	 * Read the remainder of the PReP NvRAM	 */	nvp = (char *) &nvram->GEArea[0];	for (i=sizeof(HEADER); i<nvramSize; i++)	{		*nvp = ppc_md.nvram_read_val(i);		nvp++;	}}__prepchar __prep *prep_nvram_get_var(const char *name){	char *cp;	int  namelen;	namelen = strlen(name);	cp = prep_nvram_first_var();	while (cp != NULL) {		if ((strncmp(name, cp, namelen) == 0)		    && (cp[namelen] == '='))		{			return cp+namelen+1;		}		cp = prep_nvram_next_var(cp);	}	return NULL;}__prepchar __prep *prep_nvram_first_var(void){        if (nvram->Header.GELength == 0) {		return NULL;	} else {		return (((char *)nvram)			+ ((unsigned int) nvram->Header.GEAddress));	}}__prepchar __prep *prep_nvram_next_var(char *name){	char *cp;	cp = name;	while (((cp - ((char *) nvram->GEArea)) < nvram->Header.GELength)	       && (*cp != '\0'))	{		cp++;	}	/* Skip over any null characters. */	while (((cp - ((char *) nvram->GEArea)) < nvram->Header.GELength)	       && (*cp == '\0'))	{		cp++;	}	if ((cp - ((char *) nvram->GEArea)) < nvram->Header.GELength) {		return cp;	} else {		return NULL;	}}

⌨️ 快捷键说明

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