====== UIC EEPROM structure ====== The UIC's EEPROM occupies address range 0x1000..0x17FF. (TODO: maybe it occupies more?) The first 256 bytes are used internally, while the rest is used for user data storage. https://bitbucket.org/memahaxx/libdrc/src/master/src/device-config.cpp for more info. ^ Address ^ Length ^ Description ^ | 0x1010 | 2 | Firmware install status -- set to A5 5A when a firmware is installed | | 0x1012 | 1 | ?? | | 0x1013 | 1 | LED status when no firmware installed -- 1=red 2=amber 0/x=none | | -- | -- | -- | | 0x1101 | 32 | Wifi SSID (WiiUxxxx...) | | 0x1121 | 1 | Wifi SSID length | | 0x1122 | 1 | Wifi auth type 0 = open 1 = shared key (?) | | 0x1123 | 1 | Wifi auth mode 0x00 = disabled 0x01 = none 0x04 = WPA 0x80 = WPA2 | | 0x1124 | 1 | Wifi encryption 0 = none 1 = WEP 2 = TKIP 3 = AES | | 0x1125 | 64 | Wifi passphrase | | 0x1165 | 1 | Wifi passphrase length | | 0x1166 | 2 | Wifi country code | | 0x116B | 2 | CRC16 over 0x1101..0x116A | | 0x116D | 16 | WoWL key | | 0x117F | 6 | WoWL MAC | | 0x1187 | 1 | WoWL setting (?) | | 0x118A | 1 | Last wifi channel | | -- | -- | -- | | 0x11FD | 1 | Layout of page 1 (should be 3) | | 0x11FE | 2 | CRC16 over 0x11FD | | -- | -- | -- | | 0x1200 | 1 | Board info 1 | | 0x1201 | 2 | CRC16 over 0x1200 | | 0x1203 | 1 | Region info 1 | | 0x1204 | 2 | CRC16 over 0x1203 | | 0x1206 | 1 | Board config 1 | | 0x1207 | 2 | CRC16 over 0x1206 | | 0x121A | 2 | Volume calibration 1 | | 0x121C | 2 | CRC16 over 0x121A..0x121B | | 0x121E | 12 | Accelerometer calibration 2 | | 0x122A | 2 | CRC16 over 0x121E..0x1229 | | 0x122C | 19 | Gyroscope calibration 1 | | 0x123F | 2 | CRC16 over 0x122C..0x123E | | 0x1253 | 16 | Touchscreen calibration 2 | | 0x1263 | 2 | CRC16 over 0x1253..0x1262 | | 0x1265 | 4 | Service version 2 | | 0x1269 | 2 | CRC16 over 0x1265..0x1268 | | -- | -- | -- | | 0x1280 | 1 | Board info 2 | | 0x1281 | 2 | CRC16 over 0x1280 | | 0x1283 | 1 | Region info 2 | | 0x1284 | 2 | CRC16 over 0x1283 | | 0x1286 | 1 | Board config 2 | | 0x1287 | 2 | CRC16 over 0x1286 | | 0x129A | 2 | Volume calibration 2 | | 0x129C | 2 | CRC16 over 0x129A..0x129B | | 0x129E | 12 | Accelerometer calibration 3 | | 0x12AA | 2 | CRC16 over 0x129E..0x12A9 | | 0x12AC | 19 | Gyroscope calibration 1 | | 0x12BF | 2 | CRC16 over 0x12AC..0x12BE | | 0x12D3 | 16 | Touchscreen calibration 3 | | 0x12E3 | 2 | CRC16 over 0x12D3..0x12E2 | | 0x12E5 | 4 | Service version 3 | | 0x12E9 | 2 | CRC16 over 0x12E5..0x12E8 | | -- | -- | -- | | 0x12FD | 1 | Layout of page 2 (should be 5) | | 0x12FE | 2 | CRC16 over 0x12FD | | -- | -- | -- | | 0x1300 | 1 | Language | | 0x1301 | 2 | CRC16 over 0x1300 | | 0x1303 | 1 | Opening screen index | | 0x1304 | 2 | CRC16 over 0x1303 | | 0x1306 | 1 | Development mode setting | | 0x1307 | 2 | CRC16 over 0x1306 | | 0x1313 | 12 | Accelerometer calibration 1 | | 0x131F | 2 | CRC16 over 0x1313..0x131E | | 0x1344 | 16 | Touchscreen calibration 1 | | 0x1354 | 2 | CRC16 over 0x1344..0x1353 | | 0x1356 | 1 | [[FLASH layout#Language bank|Language bank]] index | | 0x1357 | 2 | CRC16 over 0x1356 | | 0x1359 | 1 | Language version (together with CRC16 bytes) | | 0x135C | 4 | Remote control data version | | 0x1360 | 2 | CRC16 over 0x135C | | 0x1362 | 4 | Service version 1 | | 0x1366 | 2 | CRC16 over 0x1362..0x1365 | | 0x1368 | 4 | Opening screen 1 version | | 0x136C | 2 | CRC16 over 0x1368..0x136B | | 0x136E | 4 | Opening screen 2 version | | 0x1372 | 2 | CRC16 over 0x136E..0x1371 | | 0x1374 | 1 | Initial boot flag (?) | | 0x1375 | 2 | CRC16 over 0x1374 | | 0x1377 | 13 | LCD brightness levels | | 0x1384 | 2 | CRC16 over 0x1377..0x1383 | | 0x1386 | 1 | LCD brightness setting | | 0x1387 | 2 | CRC16 over 0x1386 | | 0x1389 | 5 | Remote control ID 1 | | 0x138E | 5 | Remote control ID 2 | | 0x1393 | 2 | CRC16 over 0x1389..0x1392 | | 0x1396 | 1 | Airwave setting | | 0x1397 | 2 | CRC16 over 0x1396 | | -- | -- | -- | | 0x13FD | 1 | Layout of page 3 (should be 4) | | 0x13FE | 2 | CRC16 over 0x13FD | | -- | -- | -- | | 0x1400 | 256 | ??? | | 0x1500 | 2 | CRC16 over 0x1400-0x14FF | | -- | -- | -- | | 0x1580 | 256 | ??? | | 0x1680 | 2 | CRC16 over 0x1580-0x167F | Data is stored in little-endian order. When multiple regions exist for a given information (for example, board info), the first region with a correct CRC16 is selected. ===== Board info ===== Bit 0-3 of the board info value are the main version, while bit 4-7 are the sub version. Main version: * 0 = DK1 * 1 = EP_DK2 * 2 = DP1 * 3 = DP2 * 4 = DK3 * 5 = DK4 * 6 = DP3 * 7 = DK5 * 8 = DP4 * 9 = DKMP * 10 = DP5 * 11 = MASS * 12 = DKMP2 * 13 = DRC_I Sub version: * 0 = DK1_EP_DK2 * 1 = DP1_DK3 * 2 = DK4 * 3 = DP3 * 4 = DK5 * 5 = DP4 * 6 = DKMP * 7 = DP5 * 8 = MASS * 9 = DKMP2 * 10 = DRC_I ===== Region info ===== * 0 = Japan * 1 = North America * 2 = Europe * 3 = China * 4 = South Korea * 5 = Taiwan * 6 = Australia ===== Board config ===== Value is 0x15 for retail boards. If bit0-1 are any value other than 1, the gamepad will enter service mode upon boot. ===== Language ===== (0-3 = America, 4-11 = Europe) * 0 = English * 1 = French * 2 = Spanish * 3 = Portuguese * 4 = English * 5 = French * 6 = Spanish * 7 = Portuguese * 8 = Dutch * 9 = Italian * 10 = German * 11 = Russian * 12 = Japanese * 13 = Chinese (simplified) * 14 = Korean * 15 = Chinese (traditional) ===== Volume calibration ===== ^ Offset ^ Length ^ Description ^ | 0x00 | 1 | Minimum volume | | 0x01 | 1 | Maximum volume | The minimum and maximum values are used to cap the reading from the volume slider within an acceptable range. TODO: detail how that reading is converted to the final volume setting passed to the audio amplifier ===== Gyroscope calibration ===== ^ Offset ^ Length ^ Description ^ | 0x00 | 3 | Zero X | | 0x03 | 3 | Zero Y | | 0x06 | 3 | Zero Z | | 0x09 | 3 | Rotation X | | 0x0C | 3 | Rotation Y | | 0x0F | 3 | Rotation Z | | 0x12 | 1 | Speed | ===== Accelerometer calibration ===== ^ Offset ^ Length ^ Description ^ | 0x00 | 2 | 0G X | | 0x02 | 2 | 0G Y | | 0x04 | 2 | 0G Z | | 0x06 | 2 | 1G X | | 0x08 | 2 | 1G Y | | 0x0A | 2 | 1G Z | ===== Touchscreen calibration ===== ^ Offset ^ Length ^ Description ^ | 0x00 | 2 | Point 1 screen X | | 0x02 | 2 | Point 1 screen Y | | 0x04 | 2 | Point 2 screen X | | 0x06 | 2 | Point 2 screen Y | | 0x08 | 2 | Point 1 raw X | | 0x0A | 2 | Point 1 raw Y | | 0x0C | 2 | Point 2 raw X | | 0x0E | 2 | Point 2 raw Y | Raw coordinates are 12-bit TSC readings, while screen coordinates are their corresponding values in pixels. Observed screen coordinates are: 53,30 802,451 ===== LCD brightness levels ===== ^ Offset ^ Length ^ Description ^ | 0x00 | 1 | Level 0 brightness level (setting A) | | 0x01 | 1 | Level 0 frequency (setting B) | | 0x02 | 1 | Level 1 brightness level | | 0x03 | 1 | Level 1 frequency | | 0x04 | 1 | Level 2 brightness level | | 0x05 | 1 | Level 2 frequency | | 0x06 | 1 | Level 3 brightness level | | 0x07 | 1 | Level 3 frequency | | 0x08 | 1 | Level 4 brightness level | | 0x09 | 1 | Level 4 frequency | | 0x0A | 1 | Level 5 brightness level | | 0x0B | 1 | Level 5 frequency | | 0x0C | 1 | Threshold level | This table maps 6 predefined brightness levels to their adequate LCD parameters. See [[LCD#Setting_the_brightness|the LCD page]] for information as to how these settings are used.