prom.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:4k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *
  3.  * BRIEF MODULE DESCRIPTION
  4.  *    PROM library initialisation code, assuming a version of
  5.  *    pmon is the boot code.
  6.  *
  7.  * Copyright 2000,2001 MontaVista Software Inc.
  8.  * Author: MontaVista Software, Inc.
  9.  *          ppopov@mvista.com or source@mvista.com
  10.  *
  11.  * This file was derived from Carsten Langgaard's
  12.  * arch/mips/mips-boards/xx files.
  13.  *
  14.  * Carsten Langgaard, carstenl@mips.com
  15.  * Copyright (C) 1999,2000 MIPS Technologies, Inc.  All rights reserved.
  16.  *
  17.  *  This program is free software; you can redistribute  it and/or modify it
  18.  *  under  the terms of  the GNU General  Public License as published by the
  19.  *  Free Software Foundation;  either version 2 of the  License, or (at your
  20.  *  option) any later version.
  21.  *
  22.  *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
  23.  *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
  24.  *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
  25.  *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
  26.  *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  27.  *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
  28.  *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
  29.  *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
  30.  *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  31.  *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  32.  *
  33.  *  You should have received a copy of the  GNU General Public License along
  34.  *  with this program; if not, write  to the Free Software Foundation, Inc.,
  35.  *  675 Mass Ave, Cambridge, MA 02139, USA.
  36.  */
  37. #include <linux/module.h>
  38. #include <linux/kernel.h>
  39. #include <linux/init.h>
  40. #include <linux/string.h>
  41. #include <asm/bootinfo.h>
  42. /* #define DEBUG_CMDLINE */
  43. char arcs_cmdline[CL_SIZE];
  44. extern int prom_argc;
  45. extern char **prom_argv, **prom_envp;
  46. typedef struct
  47. {
  48.     char *name;
  49. /*    char *val; */
  50. }t_env_var;
  51. char * prom_getcmdline(void)
  52. {
  53. return &(arcs_cmdline[0]);
  54. }
  55. void  prom_init_cmdline(void)
  56. {
  57. char *cp;
  58. int actr;
  59. actr = 1; /* Always ignore argv[0] */
  60. cp = &(arcs_cmdline[0]);
  61. while(actr < prom_argc) {
  62.         strcpy(cp, prom_argv[actr]);
  63. cp += strlen(prom_argv[actr]);
  64. *cp++ = ' ';
  65. actr++;
  66. }
  67. if (cp != &(arcs_cmdline[0])) /* get rid of trailing space */
  68. --cp;
  69. *cp = '';
  70. }
  71. char *prom_getenv(char *envname)
  72. {
  73. /*
  74.  * Return a pointer to the given environment variable.
  75.  * Environment variables are stored in the form of "memsize=64".
  76.  */
  77. t_env_var *env = (t_env_var *)prom_envp;
  78. int i;
  79. i = strlen(envname);
  80. while(env->name) {
  81. if(strncmp(envname, env->name, i) == 0) {
  82. return(env->name + strlen(envname) + 1);
  83. }
  84. env++;
  85. }
  86. return(NULL);
  87. }
  88. inline unsigned char str2hexnum(unsigned char c)
  89. {
  90. if(c >= '0' && c <= '9')
  91. return c - '0';
  92. if(c >= 'a' && c <= 'f')
  93. return c - 'a' + 10;
  94. return 0; /* foo */
  95. }
  96. inline void str2eaddr(unsigned char *ea, unsigned char *str)
  97. {
  98. int i;
  99. for(i = 0; i < 6; i++) {
  100. unsigned char num;
  101. if((*str == '.') || (*str == ':'))
  102. str++;
  103. num = str2hexnum(*str++) << 4;
  104. num |= (str2hexnum(*str++));
  105. ea[i] = num;
  106. }
  107. }
  108. int get_ethernet_addr(char *ethernet_addr)
  109. {
  110. int i;
  111.         char *ethaddr_str;
  112.         ethaddr_str = prom_getenv("ethaddr");
  113. if (!ethaddr_str) {
  114.         printk("ethaddr not set in boot promn");
  115. return -1;
  116. }
  117. str2eaddr(ethernet_addr, ethaddr_str);
  118. #if 0
  119. printk("get_ethernet_addr: ");
  120. for (i=0; i<5; i++)
  121. printk("%02x:", (unsigned char)*(ethernet_addr+i));
  122. printk("%02xn", *(ethernet_addr+i));
  123. #endif
  124. return 0;
  125. }
  126. void prom_free_prom_memory (void) {}
  127. EXPORT_SYMBOL(prom_getcmdline);
  128. EXPORT_SYMBOL(get_ethernet_addr);