Training courses

Kernel and Embedded Linux

Bootlin training courses

Embedded Linux, kernel,
Yocto Project, Buildroot, real-time,
graphics, boot time, debugging...

Bootlin logo

Elixir Cross Referencer

#! @PATH_PERL@ -w
#
# drift of 104.8576 -> +1 tick.  Base  of 10000 ticks.
#
# 970306 HMS Deal with nanoseconds.  Fix sign of adjustments.
package calc_tickadj;
use strict;

exit run(@ARGV) unless caller;

sub run {
    my $opts;
    if (!processOptions(\@_, $opts)) {
        usage(1);
    };
    my $drift_file = $opts->{'drift-file'};
    my $tick       = $opts->{'tick'};

    if (!$tick) {
        my ($fl) = `tickadj`;
        if (defined $fl && $fl =~ /(?:KERNEL|PRESET)?\s*tick\s+=\s+(\d+)/) {
            $tick = $1;
        }
        else {
            die "Could not get tick value, try manually with -t/--tick\n";
        }
    }

    # Drift file is in PPM where Milion is actually 2**20
    my $cvt   = (2 ** 20) / $tick;
    my $drift = 0.;

    open my $dfh, $drift_file or die "Could not open $drift_file: $!\n";

    $drift = <$dfh>; 

    close $dfh;
    die "Invalid drift file value <$drift>" if $drift !~ /[+-]?\d+\.?[0-9]+/;

    while ($drift < 0) {
        $drift += $cvt;
        $tick--;
    }

    while ($drift > $cvt) {
        $drift -= $cvt;
        $tick++;
    }

    printf "%.3f (drift)\n", $drift;
    printf "%d usec; %d nsec\n", $tick, ($tick + ($drift/$cvt)) * 1000;

    return 0;
}

@calc_tickadj_opts@

1;
__END__