@ -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 ( " \t REFCLK - 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 ( " \n MPU - 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 ( " \n MPU - 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 ( " \n MPU - 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 ( " \n Core 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 ( " \n PER 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 ( " \n IVA 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 ( " \n IVA 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 ( " \n ABE 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 ( " \n ABE 196608 32K \n " ) ;
get_m_n_optimized ( 196608000 / 4 , 32768 , & m , & n , 0 ) ;
get_m_n_optimized ( 196608000 / 4 , 32768 , & m , & n ) ;
printf ( " \n USB 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 ( " \n Core 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 ) ;
}