Firmware: Fix various endianness issues. Most importantly, this fixes a bug with touch input not working correctly on big-endian systems. (Regression from commit bb38022.)

This commit is contained in:
rogerman 2018-12-12 02:49:44 -08:00
parent 471f53e506
commit 8c2379f6f8
2 changed files with 54 additions and 37 deletions

View File

@ -516,7 +516,7 @@ bool CFIRMWARE::saveSettings(const char *firmwareUserSettingsFilePath)
FWUserSettings &userSettings0 = MMU.fw.data.userSettings0; FWUserSettings &userSettings0 = MMU.fw.data.userSettings0;
FWUserSettings &userSettings1 = MMU.fw.data.userSettings1; FWUserSettings &userSettings1 = MMU.fw.data.userSettings1;
if (userSettings1.updateCounter == ((userSettings0.updateCounter + 1) & 0x7F)) if (userSettings1.updateCounter == ((LE_TO_LOCAL_16(userSettings0.updateCounter) + 1) & 0x7F))
{ {
userSettings0 = userSettings1; userSettings0 = userSettings1;
} }
@ -814,7 +814,7 @@ void NDS_InitFirmwareWithConfig(const FirmwareConfig &inConfig)
fw.header.identifier[3] = 'P'; fw.header.identifier[3] = 'P';
// User Settings offset 0x3fe00 / 8 // User Settings offset 0x3fe00 / 8
fw.header.userSettingsOffset = offsetof(NDSFirmwareData, userSettings0) / 8; fw.header.userSettingsOffset = LOCAL_TO_LE_16( (u16)(offsetof(NDSFirmwareData, userSettings0) / 8) );
// NDS type // NDS type
if (inConfig.consoleType == NDS_CONSOLE_TYPE_DSI) if (inConfig.consoleType == NDS_CONSOLE_TYPE_DSI)
@ -833,26 +833,26 @@ void NDS_InitFirmwareWithConfig(const FirmwareConfig &inConfig)
fw.userSettings0.birthdayDay = inConfig.birthdayDay; fw.userSettings0.birthdayDay = inConfig.birthdayDay;
// Copy the default char buffers into the UTF-16 string buffers. // Copy the default char buffers into the UTF-16 string buffers.
fw.userSettings0.nicknameLength = inConfig.nicknameLength; fw.userSettings0.nicknameLength = LOCAL_TO_LE_16((u16)inConfig.nicknameLength);
fw.userSettings0.messageLength = inConfig.nicknameLength; fw.userSettings0.messageLength = LOCAL_TO_LE_16((u16)inConfig.messageLength);
for (size_t i = 0; i < fw.userSettings0.nicknameLength; i++) for (size_t i = 0; i < inConfig.nicknameLength; i++)
{ {
fw.userSettings0.nickname[i] = inConfig.nickname[i]; fw.userSettings0.nickname[i] = LOCAL_TO_LE_16(inConfig.nickname[i]);
} }
for (size_t i = 0; i < fw.userSettings0.messageLength; i++) for (size_t i = 0; i < inConfig.messageLength; i++)
{ {
fw.userSettings0.message[i] = inConfig.message[i]; fw.userSettings0.message[i] = LOCAL_TO_LE_16(inConfig.message[i]);
} }
// Default touch-screen calibration settings. // Default touch-screen calibration settings.
fw.userSettings0.tscADC_x1 = inConfig.tscADC_x1; fw.userSettings0.tscADC_x1 = LOCAL_TO_LE_16(inConfig.tscADC_x1);
fw.userSettings0.tscADC_y1 = inConfig.tscADC_y1; fw.userSettings0.tscADC_y1 = LOCAL_TO_LE_16(inConfig.tscADC_y1);
fw.userSettings0.tscPixel_x1 = inConfig.tscPixel_x1; fw.userSettings0.tscPixel_x1 = inConfig.tscPixel_x1;
fw.userSettings0.tscPixel_y1 = inConfig.tscPixel_y1; fw.userSettings0.tscPixel_y1 = inConfig.tscPixel_y1;
fw.userSettings0.tscADC_x2 = inConfig.tscADC_x2; fw.userSettings0.tscADC_x2 = LOCAL_TO_LE_16(inConfig.tscADC_x2);
fw.userSettings0.tscADC_y2 = inConfig.tscADC_y2; fw.userSettings0.tscADC_y2 = LOCAL_TO_LE_16(inConfig.tscADC_y2);
fw.userSettings0.tscPixel_x2 = inConfig.tscPixel_x2; fw.userSettings0.tscPixel_x2 = inConfig.tscPixel_x2;
fw.userSettings0.tscPixel_y2 = inConfig.tscPixel_y2; fw.userSettings0.tscPixel_y2 = inConfig.tscPixel_y2;
@ -870,10 +870,10 @@ void NDS_InitFirmwareWithConfig(const FirmwareConfig &inConfig)
// Copy the default config for userSettings0 into userSettings1. // Copy the default config for userSettings0 into userSettings1.
fw.userSettings1 = fw.userSettings0; fw.userSettings1 = fw.userSettings0;
fw.userSettings0.updateCounter = 0; fw.userSettings0.updateCounter = 0x0000;
fw.userSettings1.updateCounter = 1; fw.userSettings1.updateCounter = 0x0001;
fw.userSettings0.crc16 = (u16)calc_CRC16(0xFFFF, &fw.userSettings0, 0x70); fw.userSettings0.crc16 = LOCAL_TO_LE_16( (u16)calc_CRC16(0xFFFF, &fw.userSettings0, 0x70) );
fw.userSettings1.crc16 = (u16)calc_CRC16(0xFFFF, &fw.userSettings1, 0x70); fw.userSettings1.crc16 = LOCAL_TO_LE_16( (u16)calc_CRC16(0xFFFF, &fw.userSettings1, 0x70) );
// Begin setting up the WiFi info. // Begin setting up the WiFi info.
fw.wifiInfo.length = 0x0138; fw.wifiInfo.length = 0x0138;
@ -929,7 +929,7 @@ void NDS_InitFirmwareWithConfig(const FirmwareConfig &inConfig)
fw.wifiInfo.MACAddr[5] = inConfig.MACAddress[5]; fw.wifiInfo.MACAddr[5] = inConfig.MACAddress[5];
// Wifi settings CRC16 // Wifi settings CRC16
fw.wifiInfo.crc16 = calc_CRC16(0, &fw.wifiInfo.length, fw.wifiInfo.length); fw.wifiInfo.crc16 = LOCAL_TO_LE_16( (u16)calc_CRC16(0, &fw.wifiInfo.length, fw.wifiInfo.length) );
// WFC User ID, uniquely located on the first WiFi profile and no other // WFC User ID, uniquely located on the first WiFi profile and no other
fw.wifiAP1.wfcUserID[0] = inConfig.WFCUserID[0]; fw.wifiAP1.wfcUserID[0] = inConfig.WFCUserID[0];
@ -1042,9 +1042,9 @@ void NDS_InitFirmwareWithConfig(const FirmwareConfig &inConfig)
fw.wifiAP3.configureMode = 0xFF; fw.wifiAP3.configureMode = 0xFF;
} }
fw.wifiAP1.crc16 = (u16)calc_CRC16(0, &fw.wifiAP1, 254); fw.wifiAP1.crc16 = LOCAL_TO_LE_16( (u16)calc_CRC16(0, &fw.wifiAP1, 254) );
fw.wifiAP2.crc16 = (u16)calc_CRC16(0, &fw.wifiAP2, 254); fw.wifiAP2.crc16 = LOCAL_TO_LE_16( (u16)calc_CRC16(0, &fw.wifiAP2, 254) );
fw.wifiAP3.crc16 = (u16)calc_CRC16(0, &fw.wifiAP3, 254); fw.wifiAP3.crc16 = LOCAL_TO_LE_16( (u16)calc_CRC16(0, &fw.wifiAP3, 254) );
if (&inConfig != &CommonSettings.fwConfig) if (&inConfig != &CommonSettings.fwConfig)
{ {

View File

@ -102,6 +102,7 @@ typedef union __PACKED
struct struct
{ {
#ifndef MSB_FIRST
u16 language:3; u16 language:3;
u16 gbaModeScreenSelection:1; u16 gbaModeScreenSelection:1;
u16 backlightLevel:2; u16 backlightLevel:2;
@ -116,6 +117,22 @@ typedef union __PACKED
u16 settingsOkay3:1; u16 settingsOkay3:1;
u16 settingsOkay4:1; u16 settingsOkay4:1;
u16 settingsOkay5:1; u16 settingsOkay5:1;
#else
u16 :1;
u16 bootmenuDisable:1;
u16 backlightLevel:2;
u16 gbaModeScreenSelection:1;
u16 language:3;
u16 settingsOkay5:1;
u16 settingsOkay4:1;
u16 settingsOkay3:1;
u16 settingsOkay2:1;
u16 :1;
u16 settingsOkay1:1;
u16 settingsLost:1;
u16 :1;
#endif
}; };
} FW_USERSETTINGS_LANGUAGE_FLAGS; } FW_USERSETTINGS_LANGUAGE_FLAGS;