#!/usr/bin/perl

# clock
# John Jacobsen, NPX Designs, Inc., jacobsen\@npxdesigns.com
# Started: Wed Jul 28 10:18:35 2004
# show or set clock source for dor driver

use strict;
sub usage { return <<EOF;
Usage: clock [0-7|all] [internal|external]
Examples:
 % clock
 Card 0: internal
 Card 1: external
 % clock 0
 Card 0: internal
 % clock 0 external
 % clock 0
 Card 0: external
 % clock all internal
 % clock
 Clock 0: internal
 Clock 1: internal
EOF
;
	  }

my $pd = "/proc/driver/domhub";
die "No driver loaded?\n" unless -d $pd;

my @ids;
my @cards = <$pd/card*>;
for(@cards) {
    /card(\d+)/;
    push @ids, $1;
}

my $arg = shift;
my $act = shift;
if(!defined $arg) {
    for(@ids) {
	print "Card $_: ".`cat $pd/card$_/clksel`;
    }
    exit;
} elsif($arg =~ /^(\d+)$/) {
    my $c = $1;
    my $found = 0;
    for(@ids) {
	$found++ if $_ eq $c;
    }
    if(!$found) {
	print "Card $c not found: clock help for help.\n" ;
	exit -1;
    }
    my $cs = "$pd/card$c/clksel";
    if(!defined $act) { print "Card $c: ".`cat $cs`; exit; }
    if($act eq "internal") {
	system "echo internal > $cs";
	exit;
    } elsif($act eq "external") {
	system "echo external > $cs";
	exit;
    } else {
	die usage;
    }
} elsif($arg eq "all") {
    for(@ids) {
	my $c = $_;
	my $cs = "$pd/card$c/clksel";
	if(!defined $act) { 
	    print "Card $c: ".`cat $cs`; 
	} elsif($act eq "internal") {
	    system "echo internal > $cs";
	} elsif($act eq "external") {
	    system "echo external > $cs";
	} else {
	    print "Unknown action: $act\n";
	    die usage;
	}
    }
} else {
    die usage;
}

__END__

