| 518 | } |
| 519 | |
| 520 | uint32_t frequencyToSPIClock(uint32_t freq) |
| 521 | { |
| 522 | if (freq >= ESP8266_CLOCK) |
| 523 | return 0x80000000; |
| 524 | |
| 525 | const spiClk_t minFreqReg = { 0x7FFFF000 }; |
| 526 | uint32_t minFreq = ClkRegToFreq((spiClk_t*) &minFreqReg); |
| 527 | if(freq < minFreq) |
| 528 | return minFreqReg.regValue; // use minimum possible clock |
| 529 | |
| 530 | uint8_t calN = 1; |
| 531 | |
| 532 | spiClk_t bestReg = { 0 }; |
| 533 | int32_t bestFreq = 0; |
| 534 | |
| 535 | // find the best match |
| 536 | while(calN <= 0x3F) { // 0x3F max for N |
| 537 | |
| 538 | spiClk_t reg = { 0 }; |
| 539 | int32_t calFreq; |
| 540 | int32_t calPre; |
| 541 | int8_t calPreVari = -2; |
| 542 | |
| 543 | reg.regN = calN; |
| 544 | |
| 545 | while(calPreVari++ <= 1) { // test different variants for Pre (we calculate in int so we miss the decimals, testing is the easyest and fastest way) |
| 546 | calPre = (((ESP8266_CLOCK / (reg.regN + 1)) / freq) - 1) + calPreVari; |
| 547 | if(calPre > 0x1FFF) { |
| 548 | reg.regPre = 0x1FFF; // 8191 |
| 549 | } else if(calPre <= 0) { |
| 550 | reg.regPre = 0; |
| 551 | } else { |
| 552 | reg.regPre = calPre; |
| 553 | } |
| 554 | |
| 555 | reg.regL = ((reg.regN + 1) / 2); |
| 556 | // reg.regH = (reg.regN - reg.regL); |
| 557 | |
| 558 | // test calculation |
| 559 | calFreq = ClkRegToFreq(®); |
| 560 | //os_printf("-----[0x%08X][%d]\t EQU: %d\t Pre: %d\t N: %d\t H: %d\t L: %d = %d\n", reg.regValue, freq, reg.regEQU, reg.regPre, reg.regN, reg.regH, reg.regL, calFreq); |
| 561 | |
| 562 | if(calFreq == (int32_t) freq) { |
| 563 | // accurate match use it! |
| 564 | memcpy(&bestReg, ®, sizeof(bestReg)); |
| 565 | break; |
| 566 | } else if(calFreq < (int32_t) freq) { |
| 567 | // never go over the requested frequency |
| 568 | if(abs(freq - calFreq) < abs(freq - bestFreq)) { |
| 569 | bestFreq = calFreq; |
| 570 | memcpy(&bestReg, ®, sizeof(bestReg)); |
| 571 | } |
| 572 | } |
| 573 | } |
| 574 | if(calFreq == (int32_t) freq) { |
| 575 | // accurate match use it! |
| 576 | break; |
| 577 | } |
no test coverage detected