4
# $Id: calibrate_slics 3957 2008-03-07 00:45:53Z tzafrir $
9
my $SlicsFile = "$ENV{XPP_BASE}/$ENV{XPD_BUS}/$ENV{XPD_NAME}/slics";
11
my @SlicNums = (0 .. 7);
13
if ( ! -f $SlicsFile ) {
18
# set DEBUG_CALIBRATION in /etc/default/zaptel or similar
19
if (exists $ENV{DEBUG_CALIBRATION}) {
25
select(undef,undef,undef,$timeout);
29
print STDERR "LOG: @_\n";
34
logger(@_) if ($debug);
37
sub write_to_slic_file($) {
38
my $write_str = shift;
40
open(SLICS,">$SlicsFile") or
41
die("Failed writing to slics file $SlicsFile");
42
print SLICS $write_str;
49
my $read_slic = shift;
54
sprintf("%d R%s %02X", $read_slic, $direct, $read_reg));
56
open(SLICS,$SlicsFile) or
57
die("Failed reading from slics file $SlicsFile");
58
#awk '/^SLIC_REPLY:/{print $5}' $SLICS | cut -dx -f2
62
# debug "answer line: $_";
64
if (/^ \d*\s+[RW][DIS]\s+[[:xdigit:]]+\s+([[:xdigit:]]+)\s+([[:xdigit:]]+)/){
65
@reply = (hex($1), hex($2));
66
#debug "got [$reply]\n";
78
# TODO: rearange arguments
79
sub write_reg{#($$$$$) {
80
my $read_slic = shift;
83
my $reg_val_low = shift;
84
my $reg_val_hi = shift;
86
my $str = sprintf "%d W%s %02X %02X",
87
$read_slic, $direct, $read_reg, $reg_val_low;
89
$str .= sprintf " %02X", $reg_val_hi;
91
write_to_slic_file($str);
94
sub log_calib_params() {
95
for my $i (100 .. 107) {
96
my $line="Calib Reg $i: ";
97
for my $slic (@SlicNums) {
98
$line .= " ".read_reg($slic, $i, 'D');
104
sub init_indirect_registers() {
105
return write_to_slic_file("#
175
sub init_early_direct_regs() {
176
return write_to_slic_file("#
184
my @FilterParams = ();
186
sub save_indirect_filter_params() {
187
for my $slic (@SlicNums) {
188
for my $reg (35 .. 39) {
189
$FilterParams[$slic][$reg] =
190
[read_reg($slic, $reg, 'I')];
191
write_reg($slic, $reg, 'I', 0, 0x80);
197
sub restore_indirect_filter_params() {
198
for my $slic (@SlicNums) {
199
for my $reg (35 .. 39) {
200
write_reg($slic, $reg, 'I',
201
@{$FilterParams[$slic][$reg]});
206
my $ManualCalibrationSleepTime = 0.04; # 40ms
208
sub manual_calibrate_loop($$) {
209
my $write_reg = shift;
210
my $read_reg = shift;
212
# counters to count down to (at most) 0
213
my @slic_counters = ();
214
for my $i (0 .. $#SlicNums) {
215
$slic_counters[$i] = 0x1F;
219
my $calibration_in_progress = 1;
220
write_reg(31, $write_reg, 'D', 0x1F);
221
mysleep $ManualCalibrationSleepTime;
223
# wait until all slics have finished calibration, or for timeout
224
while ($calibration_in_progress) {
225
$calibration_in_progress = 0; # until proven otherwise
226
my $debug_calib_str = "ManualCalib:: ";
227
for my $slic(@SlicNums) {
228
my $value = read_reg($slic, $read_reg, 'D');
229
$debug_calib_str .= " [$slic_counters[$slic]:$value]";
230
if ($value != 0 && $slic_counters[$slic] >= 0) {
231
$calibration_in_progress = 1;
232
$slic_counters[$slic]--;
233
write_reg($slic,$write_reg,'D',$slic_counters[$slic]);
236
debug($debug_calib_str);
237
# TODO: unnecessary sleep in the last round:
238
mysleep $ManualCalibrationSleepTime;
242
sub manual_calibrate() {
243
manual_calibrate_loop(98, 88);
244
manual_calibrate_loop(99, 89);
247
sub auto_calibrate($$) {
248
my $calib_96 = shift;
249
my $calib_97 = shift;
257
"", $calib_96, $calib_97
260
# wait until all slics have finished calibration, or for timeout
262
# time periods in seconds:
263
my $sleep_time = 0.1;
264
my $timeout_time = 2;
265
CALIB_LOOP: for my $slic (@SlicNums) {
266
debug("checking slic $slic");
268
if ((read_reg($slic, 60, 'D')) == 0) {
269
# move to next register
270
debug("slic $slic calibrated");
273
if ( $sleep_cnt > $timeout_time/$sleep_time) {
274
debug("Auto Calibration: Exiting on timeout: $timeout_time.");
277
debug("auto_calibrate not done yet: slic #$slic\n");
285
###########################################################
290
# TODO: for all slics check the following reads to check communication
291
#read_reg($slic, 0x08, 'D'): 0x02
292
#read_reg($slic, 0x0B, 'D'): 0x33
293
#read_reg($slic, 0x40, 'D'): 0x00 (?)
297
init_indirect_registers();
298
debug "after init_indirect_registers\n";
299
init_early_direct_regs();
300
debug "after init_early_direct_regs\n";
301
auto_calibrate(0x47, 0x1E);
302
debug "after auto_calibrate\n";
304
debug "after manul_calibrate\n";
305
auto_calibrate(0x40, 0x01);
306
debug "after auto_calibrate 2\n";