Calibration

Revision as of 00:01, 27 September 2024 by Hexkyz (talk | contribs)

During factory setup, the Switch goes through calibration and the generated data from this process is written to two NAND user partitions (PRODINFO and PRODINFOF).

CalibrationBinary

This is "nn::cal::CalibrationBinary".

This is a raw binary blob containing the main calibration data, which ranges from hardware IDs to system keys.

Offset Size Description
0x0 0x4 MagicNumber ("CAL0")
0x4 0x4 Version
0x8 0x4 BodySize (size of calibration data starting at offset 0x40)
0xC 0x2 Model
0xE 0x2 UpdateCount (increases each time calibration data is installed)
0x20 0x20 BodyHash (SHA256 hash calculated over calibration data)
0x40 0x1E ConfigurationId1
0x60 0x20 Reserved
0x80 0x4 WlanCountryCodesNum
0x84 0x4 WlanCountryCodesLastIndex
0x88 0x180 WlanCountryCodes
0x210 0x6 WlanMacAddress
0x220 0x6 BdAddress
0x230 0x6 AccelerometerOffset
0x238 0x6 AccelerometerScale
0x240 0x6 GyroscopeOffset
0x248 0x6 GyroscopeScale
0x250 0x18 SerialNumber
0x270 0x30 EccP256DeviceKey (unused)
0x2B0 0x180 EccP256DeviceCertificate (unused)
0x440 0x30 EccB233DeviceKey (unused)
0x480 0x180 EccB233DeviceCertificate
0x610 0x30 EccP256ETicketKey (unused)
0x650 0x180 EccP256ETicketCertificate (unused)
0x7E0 0x30 EccB233ETicketKey (unused)
0x820 0x180 EccB233ETicketCertificate (unused)
0x9B0 0x110 SslKey (unused)
0xAD0 0x4 SslCertificateSize
0xAE0 0x800 SslCertificate (only SslCertificateSize bytes are used)
0x12E0 0x20 SslCertificateHash (SHA256 over the SSL certificate)
0x1300 0x1000 RandomNumber
0x2300 0x20 RandomNumberHash (SHA256 over the random data block)
0x2320 0x110 GameCardKey (unused)
0x2440 0x400 GameCardCertificate
0x2840 0x20 GameCardCertificateHash (SHA256 over the GameCard certificate)
0x2860 0x220 Rsa2048ETicketKey (unused)
0x2A90 0x240 Rsa2048ETicketCertificate
0x2CE0 0x18 BatteryLot
0x2D00 0x800 SpeakerCalibrationValue
0x3510 0x4 RegionCode
0x3520 0x50 AmiiboKey
0x3580 0x14 AmiiboEcqvCertificate
0x35A0 0x70 AmiiboEcdsaCertificate
0x3620 0x40 AmiiboEcqvBlsKey
0x3670 0x20 AmiiboEcqvBlsCertificate
0x36A0 0x90 AmiiboEcqvBlsRootCertificate
0x3740 0x4 ProductModel
0x3750 0x6 ColorVariation
0x3760 0xC LcdBacklightBrightnessMapping
0x3770 0x50 ExtendedEccB233DeviceKey
0x37D0 0x50 ExtendedEccP256ETicketKey (unused)
0x3830 0x50 ExtendedEccB233ETicketKey (unused)
0x3890 0x240 ExtendedRsa2048ETicketKey
0x3AE0 0x130 ExtendedSslKey
0x3C20 0x130 ExtendedGameCardKey
0x3D60 0x4 LcdVendorId
0x3D70 0x240 [5.0.0+] ExtendedRsa2048DeviceKey
0x3FC0 0x240 [5.0.0+] Rsa2048DeviceCertificate
0x4210 0x1 [5.0.0+] UsbTypeCPowerSourceCircuitVersion
0x4220 0x4 [9.0.0+] HousingSubColor
0x4230 0x4 [9.0.0+] HousingBezelColor
0x4240 0x4 [9.0.0+] HousingMainColor1
0x4250 0x4 [9.0.0+] HousingMainColor2
0x4260 0x4 [9.0.0+] HousingMainColor3
0x4270 0x1 [9.0.0+] AnalogStickModuleTypeL
0x4280 0x12 [9.0.0+] AnalogStickModelParameterL
0x42A0 0x9 [9.0.0+] AnalogStickFactoryCalibrationL
0x42B0 0x1 [9.0.0+] AnalogStickModuleTypeR
0x42C0 0x12 [9.0.0+] AnalogStickModelParameterR
0x42E0 0x9 [9.0.0+] AnalogStickFactoryCalibrationR
0x42F0 0x1 [9.0.0+] ConsoleSixAxisSensorModuleType
0x4300 0x6 [9.0.0+] ConsoleSixAxisSensorHorizontalOffset
0x4310 0x1 [6.0.0+] BatteryVersion
0x4320 0x1 [10.0.0+] TouchIcVendorId
0x4330 0x4 [9.0.0+] ColorModel
0x4340 0x1 [10.0.0+] ConsoleSixAxisSensorMountType

SpeakerCalibrationValue

This is "nn::cal::SpeakerCalibrationValue".

Offset Size Description
0x0 0x2 Version
0x2 0x22 Reserved
0x24 0x2 SpeakerHpf2A1
0x26 0x2 SpeakerHpf2A2
0x28 0x2 SpeakerHpf2H0
0x2A 0x2 SpeakerEqInputVolume
0x2C 0x2 SpeakerEqOutputVolume
0x2E 0x2 SpeakerEqCtrl1
0x30 0x2 SpeakerEqCtrl2
0x32 0x2 SpeakerDrcAgcCtrl2
0x34 0x2 SpeakerDrcAgcCtrl3
0x36 0x2 SpeakerDrcAgcCtrl1
0x38 0x2 SpeakerAnalogVolume
0x3A 0x2 HeadphoneAnalogVolume
0x3C 0x2 SpeakerDigitalVolumeMin
0x3E 0x2 SpeakerDigitalVolumeMax
0x40 0x2 HeadphoneDigitalVolumeMin
0x42 0x2 HeadphoneDigitalVolumeMax
0x44 0x2 MicFixedGain
0x46 0x2 MicVariableVolumeMin
0x48 0x2 MicVariableVolumeMax
0x4A 0x7B6 Reserved

ProductModel

This is "nn::cal::ProductModel".

Value Description
0 Invalid
1 Nx
2 Copper
3 Iowa
4 Hoag
5 Calcio
6 Aula

ColorVariation

This is "nn::cal::ColorVariation".

Value Description
0
1
2
3
4

LcdVendorId

This is "nn::cal::LcdVendorId".

Offset Size Description
0x0 0x1 Vendor
0x1 0x1 Model
0x2 0x1 Board
0x3 0x1 Reserved

Vendor

Value Description
0x10 JDI
0x20 InnoLux
0x30 AUO
0x40 Sharp
0x50 Samsung

Board

Value Description
0xF Icosa/Iowa
0x10 Hoag
0x20 Aula

UsbTypeCPowerSourceCircuit

This is "nn::cal::UsbTypeCPowerSourceCircuit".

Value Description
0

HousingColor

This is "nn::cal::HousingColor".

Offset Size Description
0x0 0x1 R
0x1 0x1 G
0x2 0x1 B
0x3 0x1 A

AnalogStickModuleType

This is "nn::cal::AnalogStickModuleType".

Value Description
0x23 H1
0x25 H5
0x41 F1

AnalogStickModelParameter

This is "nn::cal::AnalogStickModelParameter". Same as AnalogStickModelValue.

AnalogStickFactoryCalibration

This is "nn::cal::AnalogStickFactoryCalibration". Same as AnalogStickCalibrationValue.

ConsoleSixAxisSensorModuleType

This is "nn::cal::ConsoleSixAxisSensorModuleType".

Value Description
-1 Invalid
0 None
1 Lsm6ds3
2
3
4 Lsm6ds3trc
5 Icm40607
6 Icm42607p
7 Lsm6dso

ConsoleSixAxisSensorHorizontalOffset

This is "nn::cal::ConsoleSixAxisSensorHorizontalOffset". Same as SixAxisSensorModelValue.

BatteryVersion

This is "nn::cal::BatteryVersion".

Value Description
0
1
2

TouchIcVendorId

This is "nn::cal::TouchIcVendorId".

Value Description
0
1

ColorModel

This is "nn::cal::ColorModel".

Value Description
0

ConsoleSixAxisSensorMountType

This is "nn::cal::ConsoleSixAxisSensorMountType".

Value Description
0

Error detection

Each block of raw calibration data (with the exception of blocks with SHA256 hashes) is padded to 16 bytes, being the last 2 bytes a CRC-16 over said block.

XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX
00 00 00 00 00 00 00 00 00 00 00 00 00 00 YY YY

XX == data
00 == padding
YY == crc

The CRC-16 is generated as follows:

unsigned int crc_16_table[16] = {
 0x0000, 0xCC01, 0xD801, 0x1400, 0xF001, 0x3C00, 0x2800, 0xE401,
 0xA001, 0x6C00, 0x7800, 0xB401, 0x5000, 0x9C01, 0x8801, 0x4400 };

unsigned short int get_crc_16 (char *p, int n) {
 unsigned short int crc = 0x55AA;
 int r;

 while (n-- > 0) {
   r = crc_16_table[crc & 0xF];
   crc = (crc >> 4) & 0x0FFF;
   crc = crc ^ r ^ crc_16_table[*p & 0xF];

   r = crc_16_table[crc & 0xF];
   crc = (crc >> 4) & 0x0FFF;
   crc = crc ^ r ^ crc_16_table[(*p >> 4) & 0xF];

   p++;
 }

 return(crc);
}

CalibrationFile

This is "nn::cal::CalibrationFile".

This is a FAT12 compliant filesystem mainly used to keep calibration logs and other assorted files.

├── Certifications
│   └── WirelessCertification.png
└── ptd
    ├── DeviceIdWithEmsBit.dat
    ├── Ecid.dat
    ├── prodCode.dat
    └── log
        ├── Process_asm1.log
        ├── Process_board1.log
        ├── TestFlagLine.log
        ├── TestFlagQc.log
        ├── AGING
        │   └── Sequence.log
        ├── BOARD_TEST
        │   └── Sequence.log
        ├── BOARD_WIRELESS
        │   └── Sequence.log
        ├── FINAL_CHECK
        │   └── Sequence.log
        ├── LCD_AND_KEY
        │   └── Sequence.log
        └── USB_AND_HP
            └── Sequence.log

DeviceIdWithEmsBit

Contains a 0x10-byte uppercase hex string, identical to the DeviceId in the DeviceCert.