init.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:3k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * Carsten Langgaard, carstenl@mips.com
  3.  * Copyright (C) 1999,2000 MIPS Technologies, Inc.  All rights reserved.
  4.  *
  5.  *  This program is free software; you can distribute it and/or modify it
  6.  *  under the terms of the GNU General Public License (Version 2) as
  7.  *  published by the Free Software Foundation.
  8.  *
  9.  *  This program is distributed in the hope it will be useful, but WITHOUT
  10.  *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11.  *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12.  *  for more details.
  13.  *
  14.  *  You should have received a copy of the GNU General Public License along
  15.  *  with this program; if not, write to the Free Software Foundation, Inc.,
  16.  *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
  17.  *
  18.  * PROM library initialisation code.
  19.  */
  20. #include <linux/config.h>
  21. #include <linux/init.h>
  22. #include <linux/string.h>
  23. #include <linux/kernel.h>
  24. #include <asm/io.h>
  25. #include <asm/mips-boards/prom.h>
  26. #include <asm/mips-boards/generic.h>
  27. #include <asm/gt64120.h>
  28. #include <asm/mips-boards/malta.h>
  29. /* Environment variable */
  30. typedef struct
  31. {
  32. char *name;
  33. char *val;
  34. } t_env_var;
  35. int prom_argc;
  36. char **prom_argv, **prom_envp;
  37. int init_debug = 0;
  38. char *prom_getenv(char *envname)
  39. {
  40.         /*
  41.  * Return a pointer to the given environment variable.
  42.  */
  43. t_env_var *env = (t_env_var *)prom_envp;
  44. int i;
  45. i = strlen(envname);
  46. while(env->name) {
  47. if(strncmp(envname, env->name, i) == 0) {
  48. return(env->val);
  49. }
  50. env++;
  51. }
  52. return(NULL);
  53. }
  54. static inline unsigned char str2hexnum(unsigned char c)
  55. {
  56. if(c >= '0' && c <= '9')
  57. return c - '0';
  58. if(c >= 'a' && c <= 'f')
  59. return c - 'a' + 10;
  60. return 0; /* foo */
  61. }
  62. static inline void str2eaddr(unsigned char *ea, unsigned char *str)
  63. {
  64. int i;
  65. for(i = 0; i < 6; i++) {
  66. unsigned char num;
  67. if((*str == '.') || (*str == ':'))
  68. str++;
  69. num = str2hexnum(*str++) << 4;
  70. num |= (str2hexnum(*str++));
  71. ea[i] = num;
  72. }
  73. }
  74.  
  75. int get_ethernet_addr(char *ethernet_addr)
  76. {
  77.         char *ethaddr_str;
  78.         ethaddr_str = prom_getenv("ethaddr");
  79. if (!ethaddr_str) {
  80.         printk("ethaddr not set in boot promn");
  81. return -1;
  82. }
  83. str2eaddr(ethernet_addr, ethaddr_str);
  84. if (init_debug > 1) {
  85.         int i;
  86. printk("get_ethernet_addr: ");
  87.         for (i=0; i<5; i++)
  88.         printk("%02x:", (unsigned char)*(ethernet_addr+i));
  89. printk("%02xn", *(ethernet_addr+i));
  90. }
  91. return 0;
  92. }
  93. int __init prom_init(int argc, char **argv, char **envp)
  94. {
  95. prom_argc = argc;
  96. prom_argv = argv;
  97. prom_envp = envp;
  98. mips_display_message("LINUX");
  99. /*
  100.  * Setup the North bridge to do Master byte-lane swapping when 
  101.  * running in bigendian.
  102.  */
  103. #if defined(__MIPSEL__)
  104. GT_WRITE(GT_PCI0_CMD_OFS, GT_PCI0_CMD_MBYTESWAP_BIT |
  105.  GT_PCI0_CMD_SBYTESWAP_BIT);
  106. #else
  107. GT_WRITE(GT_PCI0_CMD_OFS, 0);
  108. #endif
  109. #if defined(CONFIG_MIPS_MALTA)
  110. mips_io_port_base = MALTA_PORT_BASE;
  111. #else
  112. mips_io_port_base = KSEG1;
  113. #endif
  114. setup_prom_printf(0);
  115. prom_printf("nLINUX started...n");
  116. prom_init_cmdline();
  117. prom_meminit();
  118. return 0;
  119. }