omap: Improve PLL parameter calculation tool

Improve the tool that finds multiplier and divider for PLLs:
The previous algorithm could get stuck on local maxima
and required the user to specify the tolerance. Improve
the algorithm to go through the entire search space and find
the optimal solution.

Signed-off-by: Aneesh V <aneesh@ti.com>
This commit is contained in:
Aneesh V 2011-11-21 23:38:57 +00:00 committed by Albert ARIBAUD
parent e4fce34e7a
commit 28a181ff81
1 changed files with 96 additions and 91 deletions

View File

@ -63,45 +63,41 @@ typedef unsigned int u32;
* $ gcc clocks_get_m_n.c
* $ ./a.out
*/
int get_m_n_optimized(u32 target_freq_khz, u32 ref_freq_khz, u32 *m, u32 *n,
u32 tolerance_khz)
int get_m_n_optimized(u32 target_freq_khz, u32 ref_freq_khz, u32 *M, u32 *N)
{
u32 min_freq = target_freq_khz - tolerance_khz;
u32 max_freq = target_freq_khz;
u32 freq, freq_old;
*n = 1;
u32 freq = target_freq_khz;
u32 m_optimal, n_optimal, freq_optimal = 0, freq_old;
u32 m, n;
n = 1;
while (1) {
*m = min_freq / ref_freq_khz / 2 * (*n) ;
m = target_freq_khz / ref_freq_khz / 2 * n;
freq_old = 0;
while (1) {
freq = ref_freq_khz * 2 * (*m) / (*n);
if (abs(target_freq_khz - freq_old) <=
abs(target_freq_khz - freq)) {
freq = ref_freq_khz * 2 * m / n;
if (freq > target_freq_khz) {
freq = freq_old;
(*m)--;
m--;
break;
}
(*m)++;
m++;
freq_old = freq;
}
if (freq >= min_freq && freq <= max_freq)
if (freq > freq_optimal) {
freq_optimal = freq;
m_optimal = m;
n_optimal = n;
}
n++;
if ((freq_optimal == target_freq_khz) ||
((ref_freq_khz / n) < 1000)) {
break;
(*n)++;
if ((*n) > MAX_N + 1) {
printf("ref %d m %d n %d target %d : ",
ref_freq_khz, *m, *n, target_freq_khz);
printf("can not find m & n - please consider"
" increasing tolerance\n");
return -1;
}
}
(*n)--;
printf("ref %d m %d n %d target %d locked %d\n",
ref_freq_khz, *m, *n, target_freq_khz, freq);
if ((ref_freq_khz / (*n + 1)) < 1000) {
printf("\tREFCLK - CLKINP/(N+1) is less than 1 MHz - less than"
" ideal, locking time will be high!\n");
}
n--;
*M = m_optimal;
*N = n_optimal - 1;
printf("ref %d m %d n %d target %d locked %d\n", ref_freq_khz,
m_optimal, n_optimal - 1, target_freq_khz, freq_optimal);
return 0;
}
@ -109,89 +105,98 @@ void main(void)
{
u32 m, n;
printf("\nMPU - 2000000\n");
get_m_n_optimized(2000000, 12000, &m, &n, 0);
get_m_n_optimized(2000000, 13000, &m, &n, 0);
get_m_n_optimized(2000000, 16800, &m, &n, 800);
get_m_n_optimized(2000000, 19200, &m, &n, 0);
get_m_n_optimized(2000000, 26000, &m, &n, 0);
get_m_n_optimized(2000000, 27000, &m, &n, 0);
get_m_n_optimized(2000000, 38400, &m, &n, 0);
get_m_n_optimized(2000000, 12000, &m, &n);
get_m_n_optimized(2000000, 13000, &m, &n);
get_m_n_optimized(2000000, 16800, &m, &n);
get_m_n_optimized(2000000, 19200, &m, &n);
get_m_n_optimized(2000000, 26000, &m, &n);
get_m_n_optimized(2000000, 27000, &m, &n);
get_m_n_optimized(2000000, 38400, &m, &n);
printf("\nMPU - 1200000\n");
get_m_n_optimized(1200000, 12000, &m, &n, 0);
get_m_n_optimized(1200000, 13000, &m, &n, 0);
get_m_n_optimized(1200000, 16800, &m, &n, 800);
get_m_n_optimized(1200000, 19200, &m, &n, 0);
get_m_n_optimized(1200000, 26000, &m, &n, 0);
get_m_n_optimized(1200000, 27000, &m, &n, 0);
get_m_n_optimized(1200000, 38400, &m, &n, 0);
get_m_n_optimized(1200000, 12000, &m, &n);
get_m_n_optimized(1200000, 13000, &m, &n);
get_m_n_optimized(1200000, 16800, &m, &n);
get_m_n_optimized(1200000, 19200, &m, &n);
get_m_n_optimized(1200000, 26000, &m, &n);
get_m_n_optimized(1200000, 27000, &m, &n);
get_m_n_optimized(1200000, 38400, &m, &n);
printf("\nMPU - 1584000\n");
get_m_n_optimized(1584000, 12000, &m, &n, 0);
get_m_n_optimized(1584000, 13000, &m, &n, 0);
get_m_n_optimized(1584000, 16800, &m, &n, 400);
get_m_n_optimized(1584000, 19200, &m, &n, 0);
get_m_n_optimized(1584000, 26000, &m, &n, 0);
get_m_n_optimized(1584000, 27000, &m, &n, 0);
get_m_n_optimized(1584000, 38400, &m, &n, 0);
get_m_n_optimized(1584000, 12000, &m, &n);
get_m_n_optimized(1584000, 13000, &m, &n);
get_m_n_optimized(1584000, 16800, &m, &n);
get_m_n_optimized(1584000, 19200, &m, &n);
get_m_n_optimized(1584000, 26000, &m, &n);
get_m_n_optimized(1584000, 27000, &m, &n);
get_m_n_optimized(1584000, 38400, &m, &n);
printf("\nCore 1600000\n");
get_m_n_optimized(1600000, 12000, &m, &n, 0);
get_m_n_optimized(1600000, 13000, &m, &n, 0);
get_m_n_optimized(1600000, 16800, &m, &n, 200);
get_m_n_optimized(1600000, 19200, &m, &n, 0);
get_m_n_optimized(1600000, 26000, &m, &n, 0);
get_m_n_optimized(1600000, 27000, &m, &n, 0);
get_m_n_optimized(1600000, 38400, &m, &n, 0);
get_m_n_optimized(1600000, 12000, &m, &n);
get_m_n_optimized(1600000, 13000, &m, &n);
get_m_n_optimized(1600000, 16800, &m, &n);
get_m_n_optimized(1600000, 19200, &m, &n);
get_m_n_optimized(1600000, 26000, &m, &n);
get_m_n_optimized(1600000, 27000, &m, &n);
get_m_n_optimized(1600000, 38400, &m, &n);
printf("\nPER 1536000\n");
get_m_n_optimized(1536000, 12000, &m, &n, 0);
get_m_n_optimized(1536000, 13000, &m, &n, 0);
get_m_n_optimized(1536000, 16800, &m, &n, 0);
get_m_n_optimized(1536000, 19200, &m, &n, 0);
get_m_n_optimized(1536000, 26000, &m, &n, 0);
get_m_n_optimized(1536000, 27000, &m, &n, 0);
get_m_n_optimized(1536000, 38400, &m, &n, 0);
get_m_n_optimized(1536000, 12000, &m, &n);
get_m_n_optimized(1536000, 13000, &m, &n);
get_m_n_optimized(1536000, 16800, &m, &n);
get_m_n_optimized(1536000, 19200, &m, &n);
get_m_n_optimized(1536000, 26000, &m, &n);
get_m_n_optimized(1536000, 27000, &m, &n);
get_m_n_optimized(1536000, 38400, &m, &n);
printf("\nIVA 1862000\n");
get_m_n_optimized(1862000, 12000, &m, &n, 0);
get_m_n_optimized(1862000, 13000, &m, &n, 0);
get_m_n_optimized(1862000, 16800, &m, &n, 0);
get_m_n_optimized(1862000, 19200, &m, &n, 900);
get_m_n_optimized(1862000, 26000, &m, &n, 0);
get_m_n_optimized(1862000, 27000, &m, &n, 0);
get_m_n_optimized(1862000, 38400, &m, &n, 800);
get_m_n_optimized(1862000, 12000, &m, &n);
get_m_n_optimized(1862000, 13000, &m, &n);
get_m_n_optimized(1862000, 16800, &m, &n);
get_m_n_optimized(1862000, 19200, &m, &n);
get_m_n_optimized(1862000, 26000, &m, &n);
get_m_n_optimized(1862000, 27000, &m, &n);
get_m_n_optimized(1862000, 38400, &m, &n);
printf("\nIVA Nitro - 1290000\n");
get_m_n_optimized(1290000, 12000, &m, &n);
get_m_n_optimized(1290000, 13000, &m, &n);
get_m_n_optimized(1290000, 16800, &m, &n);
get_m_n_optimized(1290000, 19200, &m, &n);
get_m_n_optimized(1290000, 26000, &m, &n);
get_m_n_optimized(1290000, 27000, &m, &n);
get_m_n_optimized(1290000, 38400, &m, &n);
printf("\nABE 196608 sys clk\n");
get_m_n_optimized(196608, 12000, &m, &n, 700);
get_m_n_optimized(196608, 13000, &m, &n, 200);
get_m_n_optimized(196608, 16800, &m, &n, 700);
get_m_n_optimized(196608, 19200, &m, &n, 400);
get_m_n_optimized(196608, 26000, &m, &n, 200);
get_m_n_optimized(196608, 27000, &m, &n, 900);
get_m_n_optimized(196608, 38400, &m, &n, 0);
get_m_n_optimized(196608, 12000, &m, &n);
get_m_n_optimized(196608, 13000, &m, &n);
get_m_n_optimized(196608, 16800, &m, &n);
get_m_n_optimized(196608, 19200, &m, &n);
get_m_n_optimized(196608, 26000, &m, &n);
get_m_n_optimized(196608, 27000, &m, &n);
get_m_n_optimized(196608, 38400, &m, &n);
printf("\nABE 196608 32K\n");
get_m_n_optimized(196608000/4, 32768, &m, &n, 0);
get_m_n_optimized(196608000/4, 32768, &m, &n);
printf("\nUSB 1920000\n");
get_m_n_optimized(1920000, 12000, &m, &n, 0);
get_m_n_optimized(1920000, 13000, &m, &n, 0);
get_m_n_optimized(1920000, 16800, &m, &n, 0);
get_m_n_optimized(1920000, 19200, &m, &n, 0);
get_m_n_optimized(1920000, 26000, &m, &n, 0);
get_m_n_optimized(1920000, 27000, &m, &n, 0);
get_m_n_optimized(1920000, 38400, &m, &n, 0);
get_m_n_optimized(1920000, 12000, &m, &n);
get_m_n_optimized(1920000, 13000, &m, &n);
get_m_n_optimized(1920000, 16800, &m, &n);
get_m_n_optimized(1920000, 19200, &m, &n);
get_m_n_optimized(1920000, 26000, &m, &n);
get_m_n_optimized(1920000, 27000, &m, &n);
get_m_n_optimized(1920000, 38400, &m, &n);
printf("\nCore ES1 1523712\n");
get_m_n_optimized(1524000, 12000, &m, &n, 100);
get_m_n_optimized(1524000, 13000, &m, &n, 0);
get_m_n_optimized(1524000, 16800, &m, &n, 0);
get_m_n_optimized(1524000, 19200, &m, &n, 0);
get_m_n_optimized(1524000, 26000, &m, &n, 0);
get_m_n_optimized(1524000, 27000, &m, &n, 0);
get_m_n_optimized(1524000, 12000, &m, &n);
get_m_n_optimized(1524000, 13000, &m, &n);
get_m_n_optimized(1524000, 16800, &m, &n);
get_m_n_optimized(1524000, 19200, &m, &n);
get_m_n_optimized(1524000, 26000, &m, &n);
get_m_n_optimized(1524000, 27000, &m, &n);
/* exact recommendation for SDPs */
get_m_n_optimized(1523712, 38400, &m, &n, 0);
get_m_n_optimized(1523712, 38400, &m, &n);
}