SceSdif is a kernel module that is primary responsible for communicating with SD devices. This includes onboard eMMC, game card MMC, wi-fi/bluetooth SDIO devices.
To communicate with particular device SceSdif module uses device index (sd_ctx_index)
Device Index
|
Type
|
Description
|
0
|
MMC
|
onboard eMMC
|
1
|
MMC
|
game card
|
2
|
SDIO
|
wi-fi/bluetooth
|
There is one more index value that closely correlates with device index.
This is speculated to be device type index. It is initialized by internal subroutine that does preinitialization (cmd0, cmd8, cmd5_sdio, cmd55, acmd41).
Value is typically stored in sd_context_data structure in field dev_type_idx.
Device Type Index
|
Description
|
0
|
unknown (invalid ?)
|
1
|
onboard eMMC
|
2
|
game card
|
3
|
wi-fi/bluetooth
|
Module
Known NIDs
Version |
Name |
World |
Privilege |
NID
|
1.69 |
SceSdif |
Non-secure |
Kernel |
0xCA882EE3
|
3.60 |
SceSdif |
? |
Kernel |
0x2E7C52F7
|
Libraries
Known NIDs
Data segment layout
Address |
Size |
Description
|
0x0000 |
0x40 |
unknown
|
0x0040 |
0x24C0 |
sd_context_global eMMC
|
0x2500 |
0x24C0 |
sd_context_global game card
|
0x49C0 |
0x24C0 |
sd_context_global wlan/bt
|
0x6E80 |
0x0x398 |
sd_context_part eMMC
|
0x7218 |
0x398 |
sd_context_part game card
|
0x75B0 |
0xC0 |
custom context used in c1271539
|
0x7670 |
0xC0 |
custom context used in c1271539
|
0x7730 |
0xC0 |
custom context used in c1271539
|
0x77F0 |
0xD38 |
custom context used in aabaa0f0
|
0x8528 |
0xD38 |
custom context used in aabaa0f0
|
0x9260 |
0x398 |
sd_context_part wlan/bt
|
0x95F8 |
0x888 |
unknown
|
0x9E80 |
0x118 |
some wlan/bt data
|
SceSdifForDriver
typedef struct output_23a4ef01
{
uint32_t unk_0;
uint32_t unk_4;
uint32_t unk_8;
uint32_t unk_C;
};
typedef struct output_24
{
uint32_t unk_0;
uint32_t unk_4;
uint32_t unk_8;
uint32_t unk_C;
uint32_t unk_10;
uint8_t unk_14;
uint8_t unk_15;
uint8_t unk_16;
uint8_t unk_17;
uint32_t unk_18;
uint32_t unk_1C;
uint32_t unk_20;
uint32_t unk_24;
};
typedef struct output_76d2b87b
{
uint32_t unk_0;
uint32_t unk_4;
uint16_t unk_8;
};
typedef struct cmd_input // size is 0x240
{
uint32_t size; // 0x240
uint32_t unk_4;
uint32_t command;
uint32_t argument;
uint8_t data0[0x50];
struct cmd_input* next_cmd;
uint32_t unk_64;
uint32_t unk_68;
uint32_t unk_6C;
uint32_t unk_70;
uint32_t unk_74;
struct sd_context_global* gctx_ptr;
uint32_t unk_7C;
uint8_t data1[0x1C0];
} cmd_input;
typedef struct sd_context_data // size is 0xC0
{
struct cmd_input* cmd_ptr;
struct cmd_input* cmd_ptr_next;
uint32_t unk_8;
uint32_t unk_C;
uint32_t sd_index;
struct sd_context_part* ctx;
uint32_t unk_18;
uint32_t unk_1C;
uint8_t data[0xA0];
} sd_context_data;
typedef struct sd_context_part // size is 0x398
{
struct sd_context_global* gctx_ptr;
uint8_t data[0x38C];
void* unk_390;
uint32_t unk_394;
} sd_context_part;
typedef struct sd_context_global // size is 0x24C0
{
struct cmd_input commands[16];
struct sd_context_data ctx_data;
} sd_context_global;
module_start
Version |
NID
|
3.60 |
0x935cd196
|
int module_start();
init
Version |
NID
|
3.60 |
0x0eb0ef86
|
int init();
deinit
Version |
NID
|
3.60 |
0xe5e5f42e
|
int deinit();
return_error
Version |
NID
|
3.60 |
0x235ad556
|
int return_error();
enable_slow_mode
Version |
NID
|
3.60 |
0xf37cf8e5
|
int enable_slow_mode();
get_card_insert_state1
Version |
NID
|
3.60 |
0x36a2b01b
|
int get_card_insert_state1(int sd_ctx_index);
get_card_insert_state2
Version |
NID
|
3.60 |
0xfd9e5cfa
|
int get_card_insert_state2(int sd_ctx_index);
gc_cmd56_response
Version |
NID
|
3.60 |
0x134e06c4
|
int gc_cmd56_response(sd_context_part* ctx, char* buffer, int length);
gc_cmd56_request
Version |
NID
|
3.60 |
0xb0996641
|
int gc_cmd56_request(sd_context_part* ctx, char* buffer, int length);
get_sd_context_global
Version |
NID
|
3.60 |
0xdc8f52f8
|
sd_context_global* get_sd_context_global(int sd_ctx_index);
get_sd_context_part_emmc
Version |
NID
|
3.60 |
0x6a71987f
|
sd_context_part* get_sd_context_part_emmc(int sd_ctx_index);
get_sd_context_part_game_cart
Version |
NID
|
3.60 |
0xb9ea5b1e
|
sd_context_part* get_sd_context_part_game_cart(int sd_ctx_index);
get_sd_context_part_wlan_bt
Version |
NID
|
3.60 |
0x6a8235fc
|
sd_context_part* get_sd_context_part_wlan_bt(int sd_ctx_index);
initialize_sd_context_part
Version |
NID
|
3.60 |
0x22c82e79
|
this function only initializes devices with sd_ctx_index 0 and 1
returns 0x80320013 on any other sd_ctx_index
int initialize_sd_context_part(int sd_ctx_index, sd_context_part** result);
wlan_bt_cmd52_sdio
Version |
NID
|
3.60 |
0x3428884d
|
int wlan_bt_cmd52_sdio(wlan_context* wlan_ctx);
wlan_bt_cmd52_sdio
Version |
NID
|
3.60 |
0xe80293ef
|
int wlan_bt_cmd52_sdio(wlan_context* wlan_ctx);
wlan_bt_cmd52_sdio
Version |
NID
|
3.60 |
0xd0f78d9b
|
int wlan_bt_cmd52_sdio(wlan_context* wlan_ctx, int num0, int num1, void* unk2, int num3);
wlan_bt_cmd52_sdio
Version |
NID
|
3.60 |
0x3c4cdc8b
|
int wlan_bt_cmd52_sdio(wlan_context* wlan_ctx, int num0, int num1, void* unk2, int num3);
wlan_bt_cmd52_sdio
Version |
NID
|
3.60 |
0x733bc373
|
int wlan_bt_cmd52_sdio(wlan_context* wlan_ctx, int num);
wlan_bt_cmd52_sdio
Version |
NID
|
3.60 |
0xdece963b
|
int wlan_bt_cmd52_sdio(sd_context_part* ctx, int num0, int num1, void* unk2);
wlan_bt_cmd52_sdio
Version |
NID
|
3.60 |
0x5d65e66b
|
int wlan_bt_cmd52_sdio(sd_context_part* ctx, int num0, int num1, void* unk2);
wlan_bt_cmd52_sdio
Version |
NID
|
3.60 |
0xbc45c83d
|
int wlan_bt_cmd52_sdio(sd_context_part* ctx, int num);
wlan_bt_initialize_custom_context2
Version |
NID
|
3.60 |
0xaabaa0f0
|
this function can send these commands: cmd3, cmd52_sdio, cmd0, cmd5_sdio, cmd55, acmd41, cmd7, cmd8
this function uses array of 2 custom contexts.
this function can either set device type index to 3 and use custom context for initialization.
or it can use preinitialization (cmd0, cmd8, cmd5_sdio, cmd55, acmd41) and then check that device type index is 3.
if device type index is not 3 then 0x80320017 error is returned.
int wlan_bt_initialize_custom_context2(int sd_ctx_index, sd_context_part** ctx);
wlan_bt
Version |
NID
|
3.60 |
0x855c95e1
|
int wlan_bt(wlan_context* wlan_ctx, void* unk0, void* unk1);
wlan_bt
Version |
NID
|
3.60 |
0x0c66e36f
|
int wlan_bt(sd_context_part* ctx, void* unk0);
wlan_bt_cmd7
Version |
NID
|
3.60 |
0xab0222f2
|
int wlan_bt_cmd7(sd_context_part* ctx);
wlan_bt_cmd52_sdio
Version |
NID
|
3.60 |
0x55baeb2d
|
int wlan_bt_cmd52_sdio(wlan_context* wlan_ctx);
wlan_bt_cmd52_sdio
Version |
NID
|
3.60 |
0xfe6f3e7b
|
int wlan_bt_cmd52_sdio(wlan_context* wlan_ctx);
wlan_bt_cmd52_sdio
Version |
NID
|
3.60 |
0xf1a24edd
|
int wlan_bt_cmd52_sdio(wlan_context* wlan_ctx);
wlan_bt_cmd52_sdio
Version |
NID
|
3.60 |
0x1847b18c
|
int wlan_bt_cmd52_sdio(wlan_context* wlan_ctx);
wlan_bt_cmd52_sdio
Version |
NID
|
3.60 |
0xd3c1e2b6
|
int wlan_bt_cmd52_sdio(wlan_context* wlan_ctx, int unk0, int unk1, int unk2);
wlan_bt_cmd52_sdio
Version |
NID
|
3.60 |
0x5bac6e70
|
int wlan_bt_cmd52_sdio(wlan_context* wlan_ctx, int unk0, int unk1, int unk2);
wlan_bt_cmd52_sdio
Version |
NID
|
3.60 |
0x01e8eb6c
|
int wlan_bt_cmd52_sdio(sd_context_part* ctx, char* output, int destLength_100);
wlan_bt_cmd52_sdio
Version |
NID
|
3.60 |
0x763f1075
|
int wlan_bt_cmd52_sdio(sd_context_part* ctx);
wlan_bt_initialize_custom_context1
Version |
NID
|
3.60 |
0x53962379
|
this function is just a wrapper for wlan_bt_initialize_custom_context2 (aabaa0f0)
int wlan_bt_initialize_custom_context1(int sd_ctx_index);
wlan_bt_cmd0
Version |
NID
|
3.60 |
0x3b6ab29e
|
int wlan_bt_cmd0(wlan_context* wlan_ctx, void* unk0, int* result);
wlan_bt_cmd0_cmd52_sdio
Version |
NID
|
3.60 |
0x180e7395
|
int wlan_bt_cmd0_cmd52_sdio(wlan_context* wlan_ctx, char* output, int destLength_100);
wlan_bt
Version |
NID
|
3.60 |
0x0f157f49
|
int wlan_bt(wlan_context* wlan_ctx);
wlan_bt
Version |
NID
|
3.60 |
0x849e3216
|
int wlan_bt(wlan_context* wlan_ctx);
wlan_bt
Version |
NID
|
3.60 |
0xb05eff68
|
int wlan_bt(wlan_context *wlan_ctx, int unk0);
sdstor_read_sector_async
Version |
NID
|
3.60 |
0x6f8d529b
|
int sdstor_read_sector_async(sd_context_part* ctx, int sector, char* buffer, int nSectors);
sdstor_read_sector
Version |
NID
|
3.60 |
0xb9593652
|
int sdstor_read_sector(sd_context_part* ctx, int sector, char* buffer, int nSectors);
sdstor_write_sector_async
Version |
NID
|
3.60 |
0x175543d2
|
int sdstor_write_sector_async(sd_context_part* ctx, int sector, char* buffer, int nSectors);
sdstor_write_sector
Version |
NID
|
3.60 |
0xe0781171
|
int sdstor_write_sector(sd_context_part* ctx, int sector, char* buffer, int nSectors);
sdstor_copy_ctx
Version |
NID
|
3.60 |
0x23a4ef01
|
int sdstor_copy_ctx(sd_context_part* ctx, output_23a4ef01* unk0);
sdstor_cmd0_cmd13
Version |
NID
|
3.60 |
0x6cc8e28d
|
int sdstor_cmd0_cmd13(int sd_ctx_index);
sdstor_cmd32_cmd33_cmd38_sdio
Version |
NID
|
3.60 |
0x35ba9df8
|
int sdstor_cmd32_cmd33_cmd38_sdio(int sd_ctx_index, int unk0);
sdstor_initialize_sd_context_part2
Version |
NID
|
3.60 |
0xc1271539
|
this function can execute all initialization commands just as initialize_sd_context_part (22c82e79) function.
these commands include: cmd0, cmd2, cmd3, cmd5_sdio, cmd6, cmd55, acmd41, cmd9, cmd7, cmd16, cmd8
there are couple of differences however:
- it can execute cmd42 lock/unlock command.
- it does not check sd_ctx_index argument.
- it uses array of 3 custom contexts instead of sd_context_part structures.
- it checks device type index after preinitialization (cmd0, cmd8, cmd5_sdio, cmd55, acmd41)
- it only initializes device with device type index 2. otherwice 0x80320017 error is returned.
int sdstor_initialize_sd_context_part2(int sd_ctx_index, int* result);
sdstor_cmd6_cmd30
Version |
NID
|
3.60 |
0x995748ea
|
int sdstor_cmd6_cmd30(sd_context_part *input, int unk0, int unk1, void *unk2);
sdstor
Version |
NID
|
3.60 |
0xe091ba2e
|
int sdstor(sd_context_part* unk, int unk0, int unk1, int* unk2);
sdif_write
Version |
NID
|
3.60 |
0x60642f49
|
int sdif_write(sd_context_part *ctx, int unk0, int unk1);
sdif_write
Version |
NID
|
3.60 |
0x0203ecdc
|
int sdif_write(sd_context_part *ctx, int unk0, int unk1);
sdif
Version |
NID
|
3.60 |
0x29a71e7f
|
int sdif();
sdif_cmd0_cmd13
Version |
NID
|
3.60 |
0x53518827
|
int sdif_cmd0_cmd13(sd_context_global *ctx, int *result);
sdif_cmd0
Version |
NID
|
3.60 |
0x475d8e45
|
int sdif_cmd0(int sd_ctx_index);
sdif
Version |
NID
|
3.60 |
0x3df7e207
|
int sdif(int sd_ctx_index, output_24* result);
sdif
Version |
NID
|
3.60 |
0x76d2b87b
|
int sdif(int sd_ctx_index, output_76d2b87b* result);
sdif_cmd_unk
Version |
NID
|
3.60 |
0xb83f7518
|
int sdif_cmd_unk(int sd_ctx_index, output_24* result);
sdif_cmd0_cmd16
Version |
NID
|
3.60 |
0xb32776c7
|
int sdif_cmd0_cmd16(sd_context_part* ctx, int num_200);
sdif_cmd0_cmd16
Version |
NID
|
3.60 |
0xaf702fe7
|
int sdif_cmd0_cmd16(sd_context_part* ctx, int num_200);