{{ message }}

## dekuNukem / Nintendo_Switch_Reverse_Engineering Public

Switch branches/tags
Nothing to show

Cannot retrieve contributors at this time
361 lines (343 sloc) 12.3 KB

The encoding algorithm for frequency is log2((double)freq/10.0)*32.0. The algorithm for amplitude is split in 3 range indexes (idx < 16, 16 <= idx < 32, idx < 128), it is:

``````// 32<= idx < 128
log2f(8.7f*amp)*32.0f

// 16 <= idx < 32
log2f(17.0f*amp)*16.0f
``````

An example of code using it is:

``````//Float frequency to hex conversion
if (freq < 0.0f)
freq = 0.0f;
else if (freq > 1252.0f)
freq = 1252.0f;
uint8_t encoded_hex_freq = (uint8_t)round(log2((double)freq/10.0)*32.0);

//Convert to Joy-Con HF range. Range in big-endian: 0x0004-0x01FC with +0x0004 steps.
uint16_t hf = (encoded_hex_freq-0x60)*4;
//Convert to Joy-Con LF range. Range: 0x01-0x7F.
uint8_t lf = encoded_hex_freq-0x40;

// Float amplitude to hex conversion
uint8_t encoded_hex_amp = 0;
if(amp > 0.23f)
encoded_hex_amp = (uint8_t)round(log2f(amp*8.7f)*32.f);
else if(amp > 0.12f)
encoded_hex_amp = (uint8_t)round(log2f(amp*17.f)*16.f);
else{
// TBD
}
uint16_t hf_amp = encoded_hex_amp * 2;    // encoded_hex_amp<<1;
uint8_t lf_amp = encoded_hex_amp / 2 + 64;// (encoded_hex_amp>>1)+0x40;
``````

The high frequency and low amplitude are encoded and must always add the "control" byte to the HA/LF byte. An example is the following:

``````//Left linear actuator
uint16_t hf = 0x01a8; //Set H.Frequency
uint8_t hf_amp = 0x88; //Set H.Frequency amplitude
//Byte swapping
byte[0] = hf & 0xFF;
byte[1] = hf_amp + ((hf >> 8) & 0xFF); //Add amp + 1st byte of frequency to amplitude byte

uint8_t lf = 0x63; //Set L.Frequency
uint16_t lf_amp = 0x804d; //Set L.Frequency amplitude
//Byte swapping
byte[2] = lf + ((lf_amp >> 8) & 0xFF); //Add freq + 1st byte of LF amplitude to the frequency byte
byte[3] = lf_amp & 0xFF;
``````

## Frequency Table

Values # are in HEX.

HF Byte 0-1 # LF Byte 2 # Frequency (Hz) Frequency Rounded (Hz)
`01` 40.875885 41
`02` 41.77095 42
`03` 42.685616 43
`04` 43.620308 44
`05` 44.57547 45
`06` 45.551544 46
`07` 46.548996 47
`08` 47.568283 48
`09` 48.609894 49
`0A` 49.674313 50
`0B` 50.762039 51
`0C` 51.873581 52
`0D` 53.009464 53
`0E` 54.170223 54
`0F` 55.356396 55
`10` 56.568542 57
`11` 57.807232 58
`12` 59.073048 59
`13` 60.366577 60
`14` 61.688435 62
`15` 63.039234 63
`16` 64.419617 64
`17` 65.830215 66
`18` 67.271713 67
`19` 68.744774 69
`1A` 70.250084 70
`1B` 71.788361 72
`1C` 73.360321 73
`1D` 74.966705 75
`1e` 76.608261 77
`1f` 78.285767 78
`20` 80 80
`04 00` `21` 81.75177 82
`08 00` `22` 83.541901 84
`0c 00` `23` 85.371231 85
`10 00` `24` 87.240616 87
`14 00` `25` 89.15094 89
`18 00` `26` 91.103088 91
`1c 00` `27` 93.097992 93
`20 00` `28` 95.136566 95
`24 00` `29` 97.219788 97
`28 00` `2a` 99.348625 99
`2c 00` `2b` 101.524078 102
`30 00` `2c` 103.747162 104
`34 00` `2d` 106.018929 106
`38 00` `2e` 108.340446 108
`3c 00` `2f` 110.712791 111
`40 00` `30` 113.137085 113
`44 00` `31` 115.614464 116
`48 00` `32` 118.146095 118
`4c 00` `33` 120.733154 121
`50 00` `34` 123.376869 123
`54 00` `35` 126.078468 126
`58 00` `36` 128.839233 129
`5c 00` `37` 131.660431 132
`60 00` `38` 134.543427 135
`64 00` `39` 137.489548 137
`68 00` `3a` 140.500168 141
`6c 00` `3b` 143.576721 144
`70 00` `3c` 146.720642 147
`74 00` `3d` 149.933411 150
`78 00` `3e` 153.216522 153
`7c 00` `3f` 156.571533 157
`80 00` `40` 160 160
`84 00` `41` 163.50354 164
`88 00` `42` 167.083801 167
`8c 00` `43` 170.742462 171
`90 00` `44` 174.481232 174
`94 00` `45` 178.30188 178
`98 00` `46` 182.206177 182
`9c 00` `47` 186.195984 186
`a0 00` `48` 190.273132 190
`a4 00` `49` 194.439575 194
`a8 00` `4a` 198.69725 199
`ac 00` `4b` 203.048157 203
`b0 00` `4c` 207.494324 207
`b4 00` `4d` 212.037857 212
`b8 00` `4e` 216.680893 217
`bc 00` `4f` 221.425583 221
`c0 00` `50` 226.27417 226
`c4 00` `51` 231.228928 231
`c8 00` `52` 236.292191 236
`cc 00` `53` 241.466309 241
`d0 00` `54` 246.753738 247
`d4 00` `55` 252.156937 252
`d8 00` `56` 257.678467 258
`dc 00` `57` 263.320862 263
`e0 00` `58` 269.086853 269
`e4 00` `59` 274.979095 275
`e8 00` `5a` 281.000336 281
`ec 00` `5b` 287.153442 287
`f0 00` `5c` 293.441284 293
`f4 00` `5d` 299.866821 300
`f8 00` `5e` 306.433044 306
`fc 00` `5f` 313.143066 313
`00 01` `60` 320 320
`04 01` `61` 327.00708 327
`08 01` `62` 334.167603 334
`0c 01` `63` 341.484924 341
`10 01` `64` 348.962463 349
`14 01` `65` 356.60376 357
`18 01` `66` 364.412354 364
`1c 01` `67` 372.391968 372
`20 01` `68` 380.546265 381
`24 01` `69` 388.87915 389
`28 01` `6a` 397.394501 397
`2c 01` `6b` 406.096313 406
`30 01` `6c` 414.988647 415
`34 01` `6d` 424.075714 424
`38 01` `6e` 433.361786 433
`3c 01` `6f` 442.851166 443
`40 01` `70` 452.54834 453
`44 01` `71` 462.457855 462
`48 01` `72` 472.584381 473
`4c 01` `73` 482.932617 483
`50 01` `74` 493.507477 494
`54 01` `75` 504.313873 504
`58 01` `76` 515.356934 515
`5c 01` `77` 526.641724 527
`60 01` `78` 538.173706 538
`64 01` `79` 549.958191 550
`68 01` `7a` 562.000671 562
`6c 01` `7b` 574.306885 574
`70 01` `7c` 586.882568 587
`74 01` `7d` 599.733643 600
`78 01` `7e` 612.866089 613
`7c 01` `7f` 626.286133 626
`80 01` 640 640
`84 01` 654.01416 654
`88 01` 668.335205 668
`8c 01` 682.969849 683
`90 01` 697.924927 698
`94 01` 713.20752 713
`98 01` 728.824707 729
`9c 01` 744.783936 745
`a0 01` 761.092529 761
`a4 01` 777.758301 778
`a8 01` 794.789001 795
`ac 01` 812.192627 812
`b0 01` 829.977295 830
`b4 01` 848.151428 848
`b8 01` 866.723572 867
`bc 01` 885.702332 886
`c0 01` 905.09668 905
`c4 01` 924.91571 925
`c8 01` 945.168762 945
`cc 01` 965.865234 966
`d0 01` 987.014954 987
`d4 01` 1008.627747 1009
`d8 01` 1030.713867 1031
`dc 01` 1053.283447 1053
`e0 01` 1076.347412 1076
`e4 01` 1099.916382 1100
`e8 01` 1124.001343 1124
`ec 01` 1148.61377 1149
`f0 01` 1173.765137 1174
`f4 01` 1199.467285 1199
`f8 01` 1225.732178 1226
`fc 01` 1252.572266 1253

## Amplitude Table

HA Byte 1 # LA Byte 2-3 # Amplitude Amplitude Rounded
`0` `00 40` 0.000000 0.000
`2` `80 40` 0.007843 0.010
`4` `00 41` 0.011823 0.012
`6` `80 41` 0.014061 0.014
`8` `00 42` 0.016720 0.017
`0a` `80 42` 0.019885 0.020
`0c` `00 43` 0.023648 0.024
`0e` `80 43` 0.028123 0.028
`10` `00 44` 0.033442 0.033
`12` `80 44` 0.039771 0.040
`14` `00 45` 0.047296 0.047
`16` `80 45` 0.056246 0.056
`18` `00 46` 0.066886 0.067
`1a` `80 46` 0.079542 0.080
`1c` `00 47` 0.094592 0.095
`1e` `80 47` 0.112491 0.112
`20` `00 48` 0.117471 0.117
`22` `80 48` 0.122671 0.123
`24` `00 49` 0.128102 0.128
`26` `80 49` 0.133774 0.134
`28` `00 4a` 0.139697 0.140
`2a` `80 4a` 0.145882 0.146
`2c` `00 4b` 0.152341 0.152
`2e` `80 4b` 0.159085 0.159
`30` `00 4c` 0.166129 0.166
`32` `80 4c` 0.173484 0.173
`34` `00 4d` 0.181166 0.181
`36` `80 4d` 0.189185 0.189
`38` `00 4e` 0.197561 0.198
`3a` `80 4e` 0.206308 0.206
`3c` `00 4f` 0.215442 0.215
`3e` `80 4f` 0.224982 0.225
`40` `00 50` 0.229908 0.230
`42` `80 50` 0.234943 0.235
`44` `00 51` 0.240087 0.240
`46` `80 51` 0.245345 0.245
`48` `00 52` 0.250715 0.251
`4a` `80 52` 0.256206 0.256
`4c` `00 53` 0.261816 0.262
`4e` `80 53` 0.267549 0.268
`50` `00 54` 0.273407 0.273
`52` `80 54` 0.279394 0.279
`54` `00 55` 0.285514 0.286
`56` `80 55` 0.291765 0.292
`58` `00 56` 0.298154 0.298
`5a` `80 56` 0.304681 0.305
`5c` `00 57` 0.311353 0.311
`5e` `80 57` 0.318171 0.318
`60` `00 58` 0.325138 0.325
`62` `80 58` 0.332258 0.332
`64` `00 59` 0.339534 0.340
`66` `80 59` 0.346969 0.347
`68` `00 5a` 0.354566 0.355
`6a` `80 5a` 0.362331 0.362
`6c` `00 5b` 0.370265 0.370
`6e` `80 5b` 0.378372 0.378
`70` `00 5c` 0.386657 0.387
`72` `80 5c` 0.395124 0.395
`74` `00 5d` 0.403777 0.404
`76` `80 5d` 0.412619 0.413
`78` `00 5e` 0.421652 0.422
`7a` `80 5e` 0.430885 0.431
`7c` `00 5f` 0.440321 0.440
`7e` `80 5f` 0.449964 0.450
`80` `00 60` 0.459817 0.460
`82` `80 60` 0.469885 0.470
`84` `00 61` 0.480174 0.480
`86` `80 61` 0.490689 0.491
`88` `00 62` 0.501433 0.501
`8a` `80 62` 0.512413 0.512
`8c` `00 63` 0.523633 0.524
`8e` `80 63` 0.535100 0.535
`90` `00 64` 0.546816 0.547
`92` `80 64` 0.558790 0.559
`94` `00 65` 0.571027 0.571
`96` `80 65` 0.583530 0.584
`98` `00 66` 0.596307 0.596
`9a` `80 66` 0.609365 0.609
`9c` `00 67` 0.622708 0.623
`9e` `80 67` 0.636344 0.636
`a0` `00 68` 0.650279 0.650
`a2` `80 68` 0.664518 0.665
`a4` `00 69` 0.679069 0.679
`a6` `80 69` 0.693939 0.694
`a8` `00 6a` 0.709133 0.709
`aa` `80 6a` 0.724662 0.725
`ac` `00 6b` 0.740529 0.741
`ae` `80 6b` 0.756745 0.757
`b0` `00 6c` 0.773316 0.773
`b2` `80 6c` 0.790249 0.790
`b4` `00 6d` 0.807554 0.808
`b6` `80 6d` 0.825237 0.825
`b8` `00 6e` 0.843307 0.843
`ba` `80 6e` 0.861772 0.862
`bc` `00 6f` 0.880643 0.881
`be` `80 6f` 0.899928 0.900
`c0` `00 70` 0.919633 0.920
`c2` `80 70` 0.939771 0.940
`c4` `00 71` 0.960348 0.960
`c6` `80 71` 0.981378 0.981
`c8` `00 72` 1.002867 1.003

The amplitudes below are not safe for the integrity of the linear resonant actuators.

HA Byte 1 # LA Byte 2-3 # Amplitude Amplitude Rounded
`ca` `80 72` 1.024826 1.025
`cc` `00 73` 1.047266 1.047
`ce` `80 73` 1.070197 1.070
`d0` `00 74` 1.093630 1.094
`d2` `80 74` 1.117576 1.118
`d4` `00 75` 1.142045 1.142
`d6` `80 75` 1.167051 1.167
`d8` `00 76` 1.192603 1.193
`da` `80 76` 1.218715 1.219
`dc` `00 77` 1.245398 1.245
`de` `80 77` 1.272665 1.273
`e0` `00 78` 1.300529 1.301
`e2` `80 78` 1.329003 1.329
`e4` `00 79` 1.358100 1.358
`e6` `80 79` 1.387834 1.388
`e8` `00 7a` 1.418218 1.418
`ea` `80 7a` 1.449268 1.449
`ec` `00 7b` 1.480997 1.481
`ee` `80 7b` 1.513420 1.513
`f0` `00 7c` 1.546553 1.547
`f2` `80 7c` 1.580411 1.580
`f4` `00 7d` 1.615010 1.615
`f6` `80 7d` 1.650366 1.650
`f8` `00 7e` 1.686497 1.686
`fa` `80 7e` 1.723417 1.723
`fc` `00 7f` 1.761146 1.761
`fe` `80 7f` 1.799701 1.800