ref: babf901b4a508c3ec5d1f89655f10377bbdf9637
dir: /appl/cmd/auxi/fpgaload.b/
implement Fpgaload;
include"sys.m";
sys: Sys;
include "draw.m";
include "arg.m";
Fpgaload: module
{
init: fn(nil: ref Draw->Context, nil: list of string);
};
init(nil: ref Draw->Context, args: list of string)
{
sys = load Sys Sys->PATH;
arg := load Arg Arg->PATH;
if(arg == nil)
error(sys->sprint("can't load %s: %r", Arg->PATH));
arg->init(args);
arg->setusage("fpgaload [-c clock] file.rbf");
clock := -1;
while((c := arg->opt()) != 0)
case c {
'c' =>
clock = int arg->earg();
if(clock <= 0)
error("invalid clock value");
* =>
arg->usage();
}
args = arg->argv();
if(args == nil)
arg->usage();
arg = nil;
fd := sys->open(hd args, Sys->OREAD);
if(fd == nil)
error(sys->sprint("can't open %s: %r", hd args));
ofd := sys->open("#G/fpgaprog", Sys->OWRITE);
if(ofd == nil)
error(sys->sprint("can't open %s: %r", "#G/fpgaprog"));
a := array[128*1024] of byte;
while((n := sys->read(fd, a, len a)) > 0)
if(sys->write(ofd, a, n) != n)
error(sys->sprint("write error: %r"));
if(n < 0)
error(sys->sprint("read error: %r"));
if(clock >= 0)
setclock(clock);
}
setclock(n: int)
{
fd := sys->open("#G/fpgactl", Sys->OWRITE);
if(fd == nil)
error(sys->sprint("can't open %s: %r", "#G/fpgactl"));
if(sys->fprint(fd, "bclk %d", n) < 0)
error(sys->sprint("can't set clock to %d: %r", n));
}
error(s: string)
{
sys->fprint(sys->fildes(2), "fpgaload: %s\n", s);
raise "fail:error";
}