1 |
d5be5374
|
Harald Welte
|
#!/usr/bin/perl -w
|
2 |
|
|
|
3 |
|
|
use strict;
|
4 |
|
|
|
5 |
|
|
sub pll_fvco($$$$) {
|
6 |
|
|
my ($fosc, $z, $x, $y) = @_;
|
7 |
|
|
|
8 |
|
|
return $fosc * ($z + ($x/$y));
|
9 |
|
|
}
|
10 |
|
|
|
11 |
|
|
sub pll_flo($$) {
|
12 |
|
|
my ($fvco, $r_num) = @_;
|
13 |
|
|
|
14 |
|
|
return $fvco / $r_num;
|
15 |
|
|
}
|
16 |
|
|
|
17 |
|
|
sub is_flo_valid($) {
|
18 |
|
|
my $flo = shift;
|
19 |
|
|
|
20 |
|
|
if ($flo < 64000000 || $flo > 1700000000) {
|
21 |
|
|
return 0;
|
22 |
|
|
}
|
23 |
|
|
|
24 |
|
|
return 1;
|
25 |
|
|
}
|
26 |
|
|
|
27 |
|
|
sub min_vco_mult($) {
|
28 |
|
|
my ($fosc) = @_;
|
29 |
|
|
return (2600000000 / $fosc);
|
30 |
|
|
}
|
31 |
|
|
|
32 |
|
|
sub max_vco_mult($) {
|
33 |
|
|
my ($fosc) = @_;
|
34 |
|
|
return (3900000000 / $fosc);
|
35 |
|
|
}
|
36 |
|
|
|
37 |
|
|
sub test_setting($$$$$) {
|
38 |
|
|
my ($fosc, $z, $x, $y, $r) = @_;
|
39 |
|
|
my $flo;
|
40 |
|
|
my $fvco = pll_fvco($fosc, $z, $x, $y);
|
41 |
|
|
|
42 |
|
|
if ($fvco < 2600000000 || $fvco > 3900000000) {
|
43 |
|
|
return;
|
44 |
|
|
}
|
45 |
|
|
|
46 |
|
|
$flo = pll_flo($fvco, $r);
|
47 |
|
|
if (is_flo_valid($flo)) {
|
48 |
|
|
printf("%010u Hz (Z=%u, X=%u, R=%u)\n", $flo, $z, $x, $r);
|
49 |
|
|
}
|
50 |
|
|
|
51 |
|
|
$r = $r * 2;
|
52 |
|
|
$flo = pll_flo($fvco, $r);
|
53 |
|
|
if (is_flo_valid($flo) && $flo < 300000000) {
|
54 |
|
|
printf("%010u Hz (Z=%u, X=%u, R=%u, TPM)\n", $flo, $z, $x, $r);
|
55 |
|
|
}
|
56 |
|
|
}
|
57 |
|
|
|
58 |
|
|
|
59 |
|
|
sub hr() {
|
60 |
|
|
printf("======================================================================\n");
|
61 |
|
|
}
|
62 |
|
|
|
63 |
|
|
my $fosc = 26000000;
|
64 |
|
|
my $y = 65535;
|
65 |
|
|
my @r_int_vals = (2,4,6,8,12,16,20,24);
|
66 |
|
|
|
67 |
|
|
|
68 |
|
|
my $min_vco_mult = min_vco_mult($fosc);
|
69 |
|
|
my $max_vco_mult = max_vco_mult($fosc);
|
70 |
|
|
|
71 |
|
|
printf("Fosc = %u, min_vco_mult=%u, max_vco_mult=%u\n", $fosc,
|
72 |
|
|
$min_vco_mult, $max_vco_mult);
|
73 |
|
|
|
74 |
|
|
for (my $z = $min_vco_mult; $z <= $max_vco_mult; $z++) {
|
75 |
|
|
for (my $x = 0; $x <= 0xffff; $x+= 1) {
|
76 |
|
|
foreach my $r (@r_int_vals) {
|
77 |
|
|
test_setting($fosc, $z, $x, $y, $r);
|
78 |
|
|
}
|
79 |
|
|
}
|
80 |
|
|
}
|
81 |
|
|
|