videomixer: compute best m/d value for pixel clock synthesizer
This commit is contained in:
parent
132b6ce87d
commit
c8da400af0
|
@ -1,4 +1,5 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include <hw/csr.h>
|
#include <hw/csr.h>
|
||||||
#include <hw/flags.h>
|
#include <hw/flags.h>
|
||||||
|
@ -62,11 +63,31 @@ static void fb_clkgen_write(int cmd, int data)
|
||||||
while(fb_driver_clocking_status_read() & CLKGEN_STATUS_BUSY);
|
while(fb_driver_clocking_status_read() & CLKGEN_STATUS_BUSY);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void fb_get_clock_md(unsigned int pixel_clock, unsigned int *m, unsigned int *d)
|
static void fb_get_clock_md(unsigned int pixel_clock, unsigned int *best_m, unsigned int *best_d)
|
||||||
{
|
{
|
||||||
// TODO
|
unsigned int ideal_m, ideal_d;
|
||||||
*m = 13;
|
unsigned int bm, bd;
|
||||||
*d = 10;
|
unsigned int m, d;
|
||||||
|
unsigned int diff_current;
|
||||||
|
unsigned int diff_tested;
|
||||||
|
|
||||||
|
ideal_m = pixel_clock;
|
||||||
|
ideal_d = 5000;
|
||||||
|
|
||||||
|
bm = 1;
|
||||||
|
bd = 0;
|
||||||
|
for(d=1;d<=256;d++)
|
||||||
|
for(m=2;m<=256;m++) {
|
||||||
|
/* common denominator is d*bd*ideal_d */
|
||||||
|
diff_current = abs(d*ideal_d*bm - d*bd*ideal_m);
|
||||||
|
diff_tested = abs(bd*ideal_d*m - d*bd*ideal_m);
|
||||||
|
if(diff_tested < diff_current) {
|
||||||
|
bm = m;
|
||||||
|
bd = d;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*best_m = bm;
|
||||||
|
*best_d = bd;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void fb_set_mode(const struct video_timing *mode)
|
static void fb_set_mode(const struct video_timing *mode)
|
||||||
|
|
Loading…
Reference in New Issue