|
|
1.1 ! root 1: #! /usr/pkg/bin/perl -w ! 2: ! 3: # $Id: tme-sun-eeprom.pl,v 1.2 2005/01/14 11:44:18 fredette Exp $ ! 4: ! 5: # machine/sun/tme-sun-eeprom.pl - dumps and makes Sun EEPROM contents: ! 6: ! 7: # Copyright (c) 2004 Matt Fredette ! 8: # All rights reserved. ! 9: # ! 10: # Redistribution and use in source and binary forms, with or without ! 11: # modification, are permitted provided that the following conditions ! 12: # are met: ! 13: # 1. Redistributions of source code must retain the above copyright ! 14: # notice, this list of conditions and the following disclaimer. ! 15: # 2. Redistributions in binary form must reproduce the above copyright ! 16: # notice, this list of conditions and the following disclaimer in the ! 17: # documentation and/or other materials provided with the distribution. ! 18: # 3. All advertising materials mentioning features or use of this software ! 19: # must display the following acknowledgement: ! 20: # This product includes software developed by Matt Fredette. ! 21: # 4. The name of the author may not be used to endorse or promote products ! 22: # derived from this software without specific prior written permission. ! 23: # ! 24: # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR ! 25: # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED ! 26: # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE ! 27: # DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, ! 28: # INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ! 29: # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR ! 30: # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ! 31: # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, ! 32: # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ! 33: # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE ! 34: # POSSIBILITY OF SUCH DAMAGE. ! 35: ! 36: sub binary_struct { ! 37: ! 38: # the EEPROM definition: ! 39: # ! 40: <<'EOF;'; ! 41: # amount of memory installed and tested, in MB: ! 42: # ! 43: 0x014 installed-#megs generic_char_dec 8 ! 44: 0x015 selftest-#megs generic_char_dec 0 ! 45: ! 46: # screen resolution: ! 47: # ! 48: 0x016 screen-resolution generic_char_hex 0x00=1152x900 0x12=1024x1024 0x13=1600x1280 0x14=1440x1440 0x15=640x480 0x16=1280x1024 ! 49: 0x050 screen-#columns generic_char_dec 80 ! 50: 0x051 screen-#rows generic_char_dec 34 ! 51: ! 52: # the console device: ! 53: # ! 54: 0x01f console-device generic_char_hex 0x00=onboard-bwtwo 0x10=ttya 0x11=ttyb 0x12=color-fb 0x20=p4-option ! 55: ! 56: # true if the watchdog causes a reset. ! 57: # ! 58: 0x017 watchdog-reboot? sun_eeprom_boolean false ! 59: ! 60: # any boot device: ! 61: # ! 62: 0x018 boot-device? sun_eeprom_boolean true ! 63: 0x019 boot-device sun_eeprom_boot_device sd(0,0,0) ! 64: ! 65: # any OEM banner and/or logo bitmap. ! 66: # ! 67: 0x020 oem-banner? sun_eeprom_boolean false ! 68: 0x068 oem-banner generic_string_buffer80 ! 69: 0x18f oem-logo? sun_eeprom_boolean false ! 70: 0x290 oem-logo generic_char_hex512 ! 71: ! 72: # keyboard parameters. ! 73: # ! 74: 0x01e keyboard-type generic_char_hex 0x00=sun *=other ! 75: 0x18d keyboard-locale generic_char_hex ! 76: 0x18e keyboard-id generic_char_hex ! 77: 0x021 keyboard-click? sun_eeprom_boolean false ! 78: ! 79: # the "diagnostic" boot device and file: ! 80: # ! 81: 0x022 diag-device sun_eeprom_boot_device le(0,0,0) ! 82: 0x028 diag-file generic_string_buffer40 ! 83: ! 84: # inverse video (white-on-black, not implemented?) ! 85: # ! 86: 0x027 inverse-video? sun_eeprom_boolean false ! 87: ! 88: # default parameters for ttya and ttyb: ! 89: # ! 90: 0x058 ttya-mode sun_eeprom_tty_mode 9600,8,n,1,- ! 91: 0x060 ttyb-mode sun_eeprom_tty_mode 9600,8,n,1,- ! 92: ! 93: # security mode and password (only on PROM revisions > 2.7.0). ! 94: # ! 95: 0x492 security-mode generic_char_hex 0x00=none 0x01=command 0x5e=full ! 96: 0x493 security-password generic_string_buffer8 ! 97: ! 98: # the 3/80 diagnostic "switch". ! 99: # ! 100: 0x70b diag-switch? generic_char_hex 0x06=false 0x12=true *=max ! 101: ! 102: # any user-defined keymap: ! 103: # ! 104: 0x18c .keymap? generic_char_hex 0x00=false 0x58=true ! 105: 0x190 .keymap-uppercase generic_char_hex128 ! 106: 0x210 .keymap-lowercase generic_char_hex128 ! 107: ! 108: # a short test pattern. ! 109: # ! 110: 0x0b8 .test-pattern generic_shorteb_hex 0x55aa ! 111: ! 112: # "Factory Defined" ! 113: # ! 114: 0x000 .testarea generic_longeb_hex ! 115: 0x004 .write-count generic_shorteb_dec3 ! 116: 0x00c .checksum generic_char_hex3 ! 117: 0x010 last-hardware-update generic_longeb_hex ! 118: ! 119: # make sure the EEPROM has the required length: ! 120: # ! 121: 0x7ff .padding generic_char_hex ! 122: ! 123: EOF; ! 124: } ! 125: ! 126: # this parses a set of sun EEPROM boolean values: ! 127: # ! 128: sub type_sun_eeprom_boolean_values { ! 129: my ($type, $count, $values) = @_; ! 130: if (!defined($values)) { ! 131: $values = 'false,' x $count; ! 132: chop($values); ! 133: $values .= ' '; ! 134: $values .= 'true,' x $count; ! 135: chop($values); ! 136: } ! 137: split(' ', $values); ! 138: } ! 139: ! 140: # this packs a sun EEPROM boolean value: ! 141: # ! 142: sub type_sun_eeprom_boolean_pack { ! 143: my ($type, $count, $value) = @_; ! 144: my ($bad, @parts); ! 145: ! 146: @parts = split(/,/, $value); ! 147: foreach (@parts) { ! 148: if ($value eq 'true') { ! 149: $_ = 0x12; ! 150: } ! 151: elsif ($value eq 'false') { ! 152: $_ = 0x00; ! 153: } ! 154: else { ! 155: $bad = $_; ! 156: $_ = 0; ! 157: } ! 158: } ! 159: ($bad, pack("C$count", @parts)); ! 160: } ! 161: ! 162: # this unpacks a sun EEPROM boolean value: ! 163: # ! 164: sub type_sun_eeprom_boolean_unpack { ! 165: my ($type, $count, $packed) = @_; ! 166: my (@parts); ! 167: ! 168: @parts = unpack("C$count", $packed); ! 169: foreach (@parts) { ! 170: if ($_ == 0x00) { ! 171: $_ = 'false'; ! 172: } ! 173: else { ! 174: $_ = 'true'; ! 175: } ! 176: } ! 177: join(',', @parts); ! 178: } ! 179: ! 180: # this parses a set of sun EEPROM boot device values: ! 181: # ! 182: sub type_sun_eeprom_boot_device_values { ! 183: my ($type, $count, $values) = @_; ! 184: if (!defined($values)) { ! 185: (''); ! 186: } ! 187: else { ! 188: split(' ', $values); ! 189: } ! 190: } ! 191: ! 192: # this packs a sun EEPROM boot device value: ! 193: # ! 194: sub type_sun_eeprom_boot_device_pack { ! 195: my ($type, $count, $value) = @_; ! 196: ! 197: if ($value =~ /^([a-z])([a-z])\((\d+),(\d+),(\d+)\)$/) { ! 198: (undef, $1.$2.pack("CCC", $3 + 0, $4 + 0, $5 + 0)); ! 199: } ! 200: else { ! 201: ($value, undef); ! 202: } ! 203: } ! 204: ! 205: # this unpacks a sun EEPROM boot device value: ! 206: # ! 207: sub type_sun_eeprom_boot_device_unpack { ! 208: my ($type, $count, $packed) = @_; ! 209: substr($packed, 0, 2).sprintf("(%d,%d,%d)", unpack("CCC", substr($packed, 2, 3))); ! 210: } ! 211: ! 212: # this parses a set of sun EEPROM tty mode values: ! 213: # ! 214: sub type_sun_eeprom_tty_mode_values { ! 215: my ($type, $count, $values) = @_; ! 216: if (!defined($values)) { ! 217: (''); ! 218: } ! 219: else { ! 220: split(' ', $values); ! 221: } ! 222: } ! 223: ! 224: # this packs a sun EEPROM tty mode value: ! 225: # ! 226: sub type_sun_eeprom_tty_mode_pack { ! 227: my ($type, $count, $value) = @_; ! 228: ! 229: if ($value =~ /^(\d+),8,n,1,([\-h])$/) { ! 230: (undef, pack('CnCN', ($1 == 9600 ? 0x00 : 0x12), $1, ($2 eq 'h' ? 0x00 : 0x12), 0)); ! 231: } ! 232: else { ! 233: ($value, undef); ! 234: } ! 235: } ! 236: ! 237: # this unpacks a sun EEPROM tty mode value: ! 238: # ! 239: sub type_sun_eeprom_tty_mode_unpack { ! 240: my ($type, $count, $packed) = @_; ! 241: my ($baud_set, $baud, $no_flow); ! 242: ($baud_set, $baud, $no_flow) = unpack('CnC', $packed); ! 243: unless ($baud_set) { ! 244: $baud = 9600; ! 245: } ! 246: $baud.',8,n,1,'.($no_flow ? '-' : 'h'); ! 247: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.