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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * BK Id: SCCS/s.prep_nvram.c 1.12 09/08/01 15:47:42 paulus
  3.  */
  4. /*
  5.  *  linux/arch/ppc/kernel/prep_nvram.c
  6.  *
  7.  *  Copyright (C) 1998  Corey Minyard
  8.  *
  9.  */
  10. #include <linux/init.h>
  11. #include <linux/delay.h>
  12. #include <linux/slab.h>
  13. #include <linux/ioport.h>
  14. #include <asm/sections.h>
  15. #include <asm/segment.h>
  16. #include <asm/io.h>
  17. #include <asm/processor.h>
  18. #include <asm/machdep.h>
  19. #include <asm/prep_nvram.h>
  20. static char nvramData[MAX_PREP_NVRAM];
  21. static NVRAM_MAP *nvram=(NVRAM_MAP *)&nvramData[0];
  22. unsigned char __prep prep_nvram_read_val(int addr)
  23. {
  24. outb(addr, PREP_NVRAM_AS0);
  25. outb(addr>>8, PREP_NVRAM_AS1);
  26. return inb(PREP_NVRAM_DATA);
  27. }
  28.   
  29. void __prep prep_nvram_write_val(int           addr,
  30.   unsigned char val)
  31. {
  32. outb(addr, PREP_NVRAM_AS0);
  33. outb(addr>>8, PREP_NVRAM_AS1);
  34.     outb(val, PREP_NVRAM_DATA);
  35. }
  36.   
  37. void __init init_prep_nvram(void)
  38. {
  39. unsigned char *nvp;
  40. int  i;
  41. int  nvramSize;
  42. /*
  43.  * The following could fail if the NvRAM were corrupt but
  44.  * we expect the boot firmware to have checked its checksum
  45.  * before boot
  46.  */
  47. nvp = (char *) &nvram->Header;
  48. for (i=0; i<sizeof(HEADER); i++)
  49. {
  50. *nvp = ppc_md.nvram_read_val(i);
  51. nvp++;
  52. }
  53. /*
  54.  * The PReP NvRAM may be any size so read in the header to
  55.  * determine how much we must read in order to get the complete
  56.  * GE area
  57.  */
  58. nvramSize=(int)nvram->Header.GEAddress+nvram->Header.GELength;
  59. if(nvramSize>MAX_PREP_NVRAM)
  60. {
  61. /*
  62.  * NvRAM is too large
  63.  */
  64. nvram->Header.GELength=0;
  65. return;
  66. }
  67. /*
  68.  * Read the remainder of the PReP NvRAM
  69.  */
  70. nvp = (char *) &nvram->GEArea[0];
  71. for (i=sizeof(HEADER); i<nvramSize; i++)
  72. {
  73. *nvp = ppc_md.nvram_read_val(i);
  74. nvp++;
  75. }
  76. }
  77. __prep
  78. char __prep *prep_nvram_get_var(const char *name)
  79. {
  80. char *cp;
  81. int  namelen;
  82. namelen = strlen(name);
  83. cp = prep_nvram_first_var();
  84. while (cp != NULL) {
  85. if ((strncmp(name, cp, namelen) == 0)
  86.     && (cp[namelen] == '='))
  87. {
  88. return cp+namelen+1;
  89. }
  90. cp = prep_nvram_next_var(cp);
  91. }
  92. return NULL;
  93. }
  94. __prep
  95. char __prep *prep_nvram_first_var(void)
  96. {
  97.         if (nvram->Header.GELength == 0) {
  98. return NULL;
  99. } else {
  100. return (((char *)nvram)
  101. + ((unsigned int) nvram->Header.GEAddress));
  102. }
  103. }
  104. __prep
  105. char __prep *prep_nvram_next_var(char *name)
  106. {
  107. char *cp;
  108. cp = name;
  109. while (((cp - ((char *) nvram->GEArea)) < nvram->Header.GELength)
  110.        && (*cp != ''))
  111. {
  112. cp++;
  113. }
  114. /* Skip over any null characters. */
  115. while (((cp - ((char *) nvram->GEArea)) < nvram->Header.GELength)
  116.        && (*cp == ''))
  117. {
  118. cp++;
  119. }
  120. if ((cp - ((char *) nvram->GEArea)) < nvram->Header.GELength) {
  121. return cp;
  122. } else {
  123. return NULL;
  124. }
  125. }