@@ -291,15 +291,34 @@ static void joypad_accessory_detect_read_callback(uint64_t *out_dwords, void *ct
291
291
{
292
292
return ; // Accessory communication error!
293
293
}
294
- else if (state == JOYPAD_ACCESSORY_STATE_DETECT_LABEL_READ )
294
+ else if (state == JOYPAD_ACCESSORY_STATE_DETECT_CPAK_LABEL_BACKUP )
295
+ {
296
+ memcpy ((void * )accessory -> cpak_label_backup , cmd -> recv .data , sizeof (cmd -> recv .data ));
297
+ // Step 2C: Overwrite the Controller Pak "label" area
298
+ for (size_t i = 0 ; i < sizeof (write_data ); ++ i ) write_data [i ] = i ;
299
+ accessory -> state = JOYPAD_ACCESSORY_STATE_DETECT_CPAK_LABEL_WRITE ;
300
+ accessory -> error = JOYPAD_ACCESSORY_ERROR_PENDING ;
301
+ accessory -> retries = 0 ;
302
+ joybus_accessory_write_async (
303
+ port , JOYBUS_ACCESSORY_ADDR_LABEL , write_data ,
304
+ joypad_accessory_detect_write_callback , ctx
305
+ );
306
+ }
307
+ else if (state == JOYPAD_ACCESSORY_STATE_DETECT_CPAK_LABEL_READ )
295
308
{
296
309
// Compare the expected label with what was actually read back
297
310
for (size_t i = 0 ; i < sizeof (write_data ); ++ i ) write_data [i ] = i ;
298
311
if (memcmp (cmd -> recv .data , write_data , sizeof (write_data )) == 0 )
299
312
{
300
- // Success: Label write persisted; this appears to be a Controller Pak
301
- accessory -> state = JOYPAD_ACCESSORY_STATE_IDLE ;
302
- accessory -> type = JOYPAD_ACCESSORY_TYPE_CONTROLLER_PAK ;
313
+ // Step 2E: Restore the Controller Pak "label" area
314
+ memcpy (write_data , (void * )accessory -> cpak_label_backup , sizeof (write_data ));
315
+ accessory -> state = JOYPAD_ACCESSORY_STATE_DETECT_CPAK_LABEL_RESTORE ;
316
+ accessory -> error = JOYPAD_ACCESSORY_ERROR_PENDING ;
317
+ accessory -> retries = 0 ;
318
+ joybus_accessory_write_async (
319
+ port , JOYBUS_ACCESSORY_ADDR_LABEL , write_data ,
320
+ joypad_accessory_detect_write_callback , ctx
321
+ );
303
322
}
304
323
else
305
324
{
@@ -418,28 +437,44 @@ static void joypad_accessory_detect_write_callback(uint64_t *out_dwords, void *c
418
437
{
419
438
// Transfer Pak has been turned off; reset Transfer Pak status
420
439
accessory -> transfer_pak_status .raw = 0x00 ;
421
- // Step 2A: Overwrite "label" area to detect Controller Pak
422
- uint8_t data [JOYBUS_ACCESSORY_DATA_SIZE ];
423
- for (size_t i = 0 ; i < sizeof (data ); ++ i ) data [i ] = i ;
424
- accessory -> state = JOYPAD_ACCESSORY_STATE_DETECT_LABEL_WRITE ;
440
+ // Step 2A: Set Controller Pak "linear paging bank" to 0
441
+ uint8_t data [JOYBUS_ACCESSORY_DATA_SIZE ] = {0 };
442
+ accessory -> state = JOYPAD_ACCESSORY_STATE_DETECT_CPAK_BANK_WRITE ;
425
443
accessory -> error = JOYPAD_ACCESSORY_ERROR_PENDING ;
426
444
accessory -> retries = 0 ;
427
445
joybus_accessory_write_async (
428
- port , JOYBUS_ACCESSORY_ADDR_LABEL , data ,
446
+ port , JOYPAD_CONTROLLER_PAK_BANK_SWITCH_ADDRESS , data ,
429
447
joypad_accessory_detect_write_callback , ctx
430
448
);
431
449
}
432
- else if (state == JOYPAD_ACCESSORY_STATE_DETECT_LABEL_WRITE )
450
+ else if (state == JOYPAD_ACCESSORY_STATE_DETECT_CPAK_BANK_WRITE )
433
451
{
434
- // Step 2B: Read back the "label" area to detect Controller Pak
435
- accessory -> state = JOYPAD_ACCESSORY_STATE_DETECT_LABEL_READ ;
452
+ // Step 2B: Backup the Controller Pak "label" area
453
+ accessory -> state = JOYPAD_ACCESSORY_STATE_DETECT_CPAK_LABEL_BACKUP ;
436
454
accessory -> error = JOYPAD_ACCESSORY_ERROR_PENDING ;
437
455
accessory -> retries = 0 ;
438
456
joybus_accessory_read_async (
439
457
port , JOYBUS_ACCESSORY_ADDR_LABEL ,
440
458
joypad_accessory_detect_read_callback , ctx
441
459
);
442
460
}
461
+ else if (state == JOYPAD_ACCESSORY_STATE_DETECT_CPAK_LABEL_WRITE )
462
+ {
463
+ // Step 2D: Read back the "label" area to detect Controller Pak
464
+ accessory -> state = JOYPAD_ACCESSORY_STATE_DETECT_CPAK_LABEL_READ ;
465
+ accessory -> error = JOYPAD_ACCESSORY_ERROR_PENDING ;
466
+ accessory -> retries = 0 ;
467
+ joybus_accessory_read_async (
468
+ port , JOYBUS_ACCESSORY_ADDR_LABEL ,
469
+ joypad_accessory_detect_read_callback , ctx
470
+ );
471
+ }
472
+ else if (state == JOYPAD_ACCESSORY_STATE_DETECT_CPAK_LABEL_RESTORE )
473
+ {
474
+ // Success: Controller Pak detected
475
+ accessory -> state = JOYPAD_ACCESSORY_STATE_IDLE ;
476
+ accessory -> type = JOYPAD_ACCESSORY_TYPE_CONTROLLER_PAK ;
477
+ }
443
478
else if (state == JOYPAD_ACCESSORY_STATE_DETECT_RUMBLE_PROBE_WRITE )
444
479
{
445
480
// Step 3B: Read probe value to detect Rumble Pak
0 commit comments