Talk:SC Communication

From PS3 Developer wiki
Revision as of 13:38, 5 January 2015 by Flatz (talk | contribs)
Jump to navigation Jump to search

Syscon packets

Device Access Service (0x03)

EEPROM write

Purpose: Write block of data to EEPROM.

struct __attribute__ ((packed)) dev_access_request_t {
	uint8_t cmd; // 0x01
	uint8_t padding[3];
	uint32_t offset;
	uint32_t size;
	uint8_t data[0];
};

struct __attribute__ ((packed)) dev_access_response_t {
	uint8_t status; // 0x00:OK, 0x03:Wrong offset, 0x04:Wrong size, 0xFF:Error
	uint8_t data[0];
};
  • Although this service is not used on Slim and some Phat consoles anymore, it is working.
  • It seems it have the same restrictions as NVS service.

EEPROM read

Purpose: Read block of data from EEPROM.

struct __attribute__ ((packed)) dev_access_request_t {
	uint8_t cmd; // 0x00
	uint8_t padding[3];
	uint32_t offset;
	uint32_t size;
};

struct __attribute__ ((packed)) dev_access_response_t {
	uint8_t status; // 0x00:OK, 0x03:Wrong offset, 0x04:Wrong size, 0xFF:Error
	uint8_t data[0];
};
  • Although this service is not used on Slim and some Phat consoles anymore, it is working.
  • It seems it have the same restrictions as NVS service.

Thermal Service (0x11)

Get temperature alert?

Purpose: Used to get current temperature alert?.

struct __attribute__ ((packed)) get_thermal_alert_request_t {
	uint8_t cmd; // 0x20
	uint8_t param; // 0xFF
};

struct __attribute__ ((packed)) get_thermal_alert_response_t {
	uint8_t unk1; // status?
	uint8_t unk2; // status?
	uint8_t data[32];
};

Get temperature

Purpose: Used to get current temperature.

struct __attribute__ ((packed)) get_temperature_request_t {
	uint8_t cmd; // 0x00
	uint8_t tzone; // 0x00:CELL, 0x01:RSX
};

struct __attribute__ ((packed)) get_temperature_response_t {
	uint8_t status;
	int8_t temperature_hi;
	int8_t temperature_lo;
};
  • Temperature in celsius: sprintf("%d.%d", temperature_hi, (temperature_lo * 100) / 256);

Configuration Service (0x12)

Get XDR configuration

Purpose: Used at bootloader during initialization.

struct __attribute__ ((packed)) get_xdr_config_request_t {
	uint8_t cmd; // 0x00
	uint8_t param; // 0x00
};

struct __attribute__ ((packed)) get_xdr_config_response_t {
	uint8_t cmd;
	uint8_t padding[3];
	uint8_t data[128];
};
struct __attribute__ ((packed)) get_xdr_config2_request_t {
	uint8_t cmd; // 0x01
	uint8_t param; // 0x00
};

struct __attribute__ ((packed)) get_xdr_config2_response_t {
	uint8_t cmd;
	uint8_t data_size?;
	uint8_t padding[2];
	uint8_t data[256];
};
  • get_xdr_config2 returns more data (maybe different config?)

Get IDlog information

Purpose: Can be used to get CID/eCID information.

struct __attribute__ ((packed)) get_idlog_info_request_t {
	uint8_t cmd; // 0x03
	uint8_t param; // 0x01
};

struct __attribute__ ((packed)) get_idlog_info_response_t {
	uint8_t cmd;
	uint8_t padding[3];
	uint8_t ecid[16];
	uint8_t cid[6];
};

Get reference clock

Purpose: Used to calculate an initial value of timebase register.

struct __attribute__ ((packed)) get_reference_clock_request_t {
	uint8_t cmd; // 0x03
	uint8_t param; // 0x10
};

struct __attribute__ ((packed)) get_reference_clock_response_t {
	uint8_t cmd;
	uint8_t padding[3];
	uint32_t ref_clock_value;
	uint32_t unk;
};

Get core clock multiplier

Purpose: Used together with reference clock to calculate clock frequency.

struct __attribute__ ((packed)) get_core_clock_multiplier_request_t {
	uint8_t cmd; // 0x03
	uint8_t param; // 0x00
};

struct __attribute__ ((packed)) get_core_clock_multiplier_response_t {
	uint8_t cmd;
	uint8_t padding[3];
	uint8_t id; // 00:2, 01:4, 03: 8, 04:10, 05:12, 06:16, 07:20
};
  • Clock frequency = core clock multiplier table[id] * reference clock.
  • For example, if you have id=3 and reference clock=400000000, then your clock frequency will be: 400000000*8=3200000000 (3.2 Ghz)

Get platform ID

Purpose: Used to get platform ID (Cytology, Cookie, etc).

struct __attribute__ ((packed)) get_platform_id_request_t {
	uint8_t cmd; // 0x20
	uint8_t param; // 0x10
};

struct __attribute__ ((packed)) get_platform_id_response_t {
	uint8_t cmd;
	uint8_t padding[3];
	uint8_t platform_id[8]; // ASCII-string
};

Get hardware configuration

Purpose: Used to get hardware configuration (PS2 emulation compatibility, card support, WLAN interface, etc).

struct __attribute__ ((packed)) get_hw_config_request_t {
	uint8_t cmd; // 0x22
};

struct __attribute__ ((packed)) get_hw_config_response_t {
	uint8_t cmd;
	uint8_t padding[3];
	uint8_t data[12];
};

Get BE counters

Purpose: Used to get several BE counters.

struct __attribute__ ((packed)) get_be_counters_request_t {
	uint8_t cmd; // 0x41
};

struct __attribute__ ((packed)) get_be_counters_response_t {
	uint8_t cmd;
	uint32_t total_operation_time;
	uint32_t power_on_counter;
	uint32_t power_off_counter;
};

Power Service (0x13)

Shutdown

Purpose: Shutdown console.

struct __attribute__ ((packed)) shutdown_request_t {
	uint8_t cmd; // 0x00
};

Reboot

Purpose: Reboot console.

struct __attribute__ ((packed)) reboot_request_t {
	uint8_t cmd; // 0x01
};

NVS Service (0x14)

EEPROM write

Purpose: Write block of data to EEPROM.

struct __attribute__ ((packed)) nvs_access_request_t {
	uint8_t cmd; // 0x10
	uint8_t index;
	uint8_t offset;
	uint8_t size; // 0x00 for full block
};

struct __attribute__ ((packed)) nvs_access_response_t {
	uint8_t status; // 0x00:OK, 0x02:Invalid block index, 0x03:Invalid offset/size
	uint8_t index;
	uint8_t offset;
	uint8_t size;
	uint8_t data[0];
};

EEPROM read

Purpose: Read block of data from EEPROM.

struct __attribute__ ((packed)) nvs_access_request_t {
	uint8_t cmd; // 0x20
	uint8_t index;
	uint8_t offset;
	uint8_t size; // 0x00 for full block
};

struct __attribute__ ((packed)) nvs_access_response_t {
	uint8_t status; // 0x00:OK, 0x02:Invalid block index, 0x03:Invalid offset/size
	uint8_t index;
	uint8_t offset;
	uint8_t size;
	uint8_t data[0];
};

Query system power up cause

Purpose: Get information about system power up cause.

struct __attribute__ ((packed)) query_system_power_up_cause_request_t {
	uint8_t cmd; // 0x10
};

struct __attribute__ ((packed)) query_system_power_up_cause_response_t {
	uint8_t cmd;
	uint8_t padding1[3];
	uint32_t wake_source;
	uint8_t requested_os_context;
	uint8_t current_os_context;
	uint8_t requested_gr_context;
	uint8_t current_gr_context;
	uint8_t last_shutdown_cause;
	uint8_t padding2[3];
};

Get realtime clock

Purpose: Get current value of realtime clock.

struct __attribute__ ((packed)) get_rtc_request_t {
	uint8_t cmd; // 0x33
};

struct __attribute__ ((packed)) get_rtc_response_t {
	uint8_t cmd;
	uint8_t padding[3];
	uint32_t rtc;
};

Livelock Service (0x18)

Get service version

Purpose: Get information about service version.

struct __attribute__ ((packed)) get_service_version_request_t {
	uint8_t cmd; // 0x01
	uint8_t service_id;
};

struct __attribute__ ((packed)) get_service_version_response_t {
	uint8_t status;
	uint8_t service_id;
	uint8_t major_version;
	uint8_t minor_version;
};

Get syscon version

Purpose: Get information about syscon version.

struct __attribute__ ((packed)) get_sc_version_request_t {
	uint8_t cmd; // 0x12/0x14
};

struct __attribute__ ((packed)) get_sc_version_response_t {
	uint8_t cmd;
	uint8_t padding[3];
	uint16_t version;
};

A/V Service (0x30)

Get monitor information

Purpose: Get monitor information (EDID).

struct __attribute__ ((packed)) get_monitor_info_request_t {
	uint8_t cmd; // 0x0D
	uint8_t av_port; // 0x00
	uint8_t unk1; // 0x00
	uint8_t unk2; // 0x00 (garbage)
};

struct __attribute__ ((packed)) get_monitor_info_response_t {
	uint8_t status;
	uint8_t unk1;
	uint8_t unk2;
	uint8_t unk3;
	uint8_t data[256];
};

Sample responses when HDMI inserted (personal info removed):

000c000: 3001 0000 0000 8031 8000 0000 0104 0104  0......1........
000c010: 2000 0282 00ff ffff ffff ff00 0469 fa22   ............i."
000c020: 0101 0101 2c15 0103 8030 1b78 eec4 f5a3  ....,....0.x....
000c030: 574a 9c23 1150 54bf ef00 714f 8180 8140  WJ.#.PT...qO...@
000c040: 9500 a940 b300 d1c0 0101 023a 8018 7138  ...@.......:..q8
000c050: 2d40 582c 4500 132b 2100 001e 0000 00fd  -@X,E..+!.......
000c060: 0032 4c1e 5311 000a 2020 2020 2020 0000  .2L.S...      ..
000c070: 00fc 0056 4532 3238 0a20 2020 2020 2020  ...VE228.
000c080: 0000 00ff 00XX XXXX XXXX XXXX XXXX XXXX  .....EDIDSERIALN
000c090: XX0a 0188 0203 1ef1 4b90 0504 0302 0111  M.......K.......
000c0a0: 1213 141f 2309 0707 8301 0000 6503 0c00  ....#.......e...
000c0b0: 1000 1a36 80a0 7038 1e40 3020 3500 132b  ...6..p8.@0 5..+
000c0c0: 2100 001a 6621 56aa 5100 1e30 468f 3300  !...f!V.Q..0F.3.
000c0d0: 132b 2100 001e 011d 0072 51d0 1e20 6e28  .+!......rQ.. n(
000c0e0: 5500 132b 2100 001e 8c0a d08a 20e0 2d10  U..+!....... .-.
000c0f0: 103e 9600 132b 2100 0018 011d 8018 711c  .>...+!.......q.
000c100: 1620 582c 2500 132b 2100 009f 0000 0000  . X,%..+!.......
0000h: 00 FF FF FF FF FF FF 00 XX XX XX XX XX XX XX XX  .яяяяяя......... 
0010h: 26 17 01 03 80 3C 22 78 2E 2F A5 A5 54 50 9E 27  &...Ђ<"x./ҐҐTPћ' 
0020h: 10 50 54 A5 6B 80 D1 C0 61 C0 81 00 81 C0 81 40  .PTҐkЂСАaАЃ.ЃАЃ@ 
0030h: 81 80 A9 C0 B3 00 02 3A 80 18 71 38 2D 40 58 2C  ЃЂ©Аі..:Ђ.q8-@X, 
0040h: 45 00 56 50 21 00 00 1E 00 00 00 FF 00 41 39 44  E.VP!......я.A9D 
0050h: 30 30 36 31 30 53 4C 30 0A 20 00 00 00 FD 00 32  00610SL0. ...э.2 
0060h: 4C 1E 53 15 00 0A 20 20 20 20 20 20 00 00 00 FC  L.S...      ...ь 
0070h: 00 XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX  ................
0080h: 02 03 24 F1 4F 01 02 03 04 05 06 07 10 11 12 13  ..$сO........... 
0090h: 14 15 16 1F 23 09 07 07 83 01 00 00 67 03 0C 00  ....#...ѓ...g... 
00A0h: 10 00 00 2D 02 3A 80 18 71 38 2D 40 58 2C 45 00  ...-.:Ђ.q8-@X,E. 
00B0h: 56 50 21 00 00 1F 01 1D 80 18 71 1C 16 20 58 2C  VP!.....Ђ.q.. X, 
00C0h: 25 00 56 50 21 00 00 9F 01 1D 00 72 51 D0 1E 20  %.VP!..џ...rQР.  
00D0h: 6E 28 55 00 56 50 21 00 00 1E 8C 0A D0 8A 20 E0  n(U.VP!...Њ.РЉ а 
00E0h: 2D 10 10 3E 96 00 56 50 21 00 00 18 00 00 00 00  -..>–.VP!....... 
00F0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 96  ...............– 

Get HDMI KSV

Purpose: Get HDMI key selection vector.

struct __attribute__ ((packed)) get_hdmi_ksv_request_t {
	uint8_t cmd; // 0x11
};

struct __attribute__ ((packed)) get_hdmi_ksv_response_t {
	uint8_t result;
	uint8_t padding[3];
	uint8_t ksv[5];
};