xref: /inferno-os/appl/cmd/auxi/fpgaload.b (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsythimplement Fpgaload;
2*37da2899SCharles.Forsyth
3*37da2899SCharles.Forsythinclude"sys.m";
4*37da2899SCharles.Forsyth	sys: Sys;
5*37da2899SCharles.Forsyth
6*37da2899SCharles.Forsythinclude "draw.m";
7*37da2899SCharles.Forsyth
8*37da2899SCharles.Forsythinclude "arg.m";
9*37da2899SCharles.Forsyth
10*37da2899SCharles.ForsythFpgaload: module
11*37da2899SCharles.Forsyth{
12*37da2899SCharles.Forsyth	init:	fn(nil: ref Draw->Context, nil: list of string);
13*37da2899SCharles.Forsyth};
14*37da2899SCharles.Forsyth
15*37da2899SCharles.Forsythinit(nil: ref Draw->Context, args: list of string)
16*37da2899SCharles.Forsyth{
17*37da2899SCharles.Forsyth	sys = load Sys Sys->PATH;
18*37da2899SCharles.Forsyth	arg := load Arg Arg->PATH;
19*37da2899SCharles.Forsyth	if(arg == nil)
20*37da2899SCharles.Forsyth		error(sys->sprint("can't load %s: %r", Arg->PATH));
21*37da2899SCharles.Forsyth	arg->init(args);
22*37da2899SCharles.Forsyth	arg->setusage("fpgaload [-c clock] file.rbf");
23*37da2899SCharles.Forsyth	clock := -1;
24*37da2899SCharles.Forsyth	while((c := arg->opt()) != 0)
25*37da2899SCharles.Forsyth		case c {
26*37da2899SCharles.Forsyth		'c' =>
27*37da2899SCharles.Forsyth			clock = int arg->earg();
28*37da2899SCharles.Forsyth			if(clock <= 0)
29*37da2899SCharles.Forsyth				error("invalid clock value");
30*37da2899SCharles.Forsyth		* =>
31*37da2899SCharles.Forsyth			arg->usage();
32*37da2899SCharles.Forsyth		}
33*37da2899SCharles.Forsyth	args = arg->argv();
34*37da2899SCharles.Forsyth	if(args == nil)
35*37da2899SCharles.Forsyth		arg->usage();
36*37da2899SCharles.Forsyth	arg = nil;
37*37da2899SCharles.Forsyth
38*37da2899SCharles.Forsyth	fd := sys->open(hd args, Sys->OREAD);
39*37da2899SCharles.Forsyth	if(fd == nil)
40*37da2899SCharles.Forsyth		error(sys->sprint("can't open %s: %r", hd args));
41*37da2899SCharles.Forsyth	ofd := sys->open("#G/fpgaprog", Sys->OWRITE);
42*37da2899SCharles.Forsyth	if(ofd == nil)
43*37da2899SCharles.Forsyth		error(sys->sprint("can't open %s: %r", "#G/fpgaprog"));
44*37da2899SCharles.Forsyth	a := array[128*1024] of byte;
45*37da2899SCharles.Forsyth	while((n := sys->read(fd, a, len a)) > 0)
46*37da2899SCharles.Forsyth		if(sys->write(ofd, a, n) != n)
47*37da2899SCharles.Forsyth			error(sys->sprint("write error: %r"));
48*37da2899SCharles.Forsyth	if(n < 0)
49*37da2899SCharles.Forsyth		error(sys->sprint("read error: %r"));
50*37da2899SCharles.Forsyth	if(clock >= 0)
51*37da2899SCharles.Forsyth		setclock(clock);
52*37da2899SCharles.Forsyth}
53*37da2899SCharles.Forsyth
54*37da2899SCharles.Forsythsetclock(n: int)
55*37da2899SCharles.Forsyth{
56*37da2899SCharles.Forsyth	fd := sys->open("#G/fpgactl", Sys->OWRITE);
57*37da2899SCharles.Forsyth	if(fd == nil)
58*37da2899SCharles.Forsyth		error(sys->sprint("can't open %s: %r", "#G/fpgactl"));
59*37da2899SCharles.Forsyth	if(sys->fprint(fd, "bclk %d", n) < 0)
60*37da2899SCharles.Forsyth		error(sys->sprint("can't set clock to %d: %r", n));
61*37da2899SCharles.Forsyth}
62*37da2899SCharles.Forsyth
63*37da2899SCharles.Forsytherror(s: string)
64*37da2899SCharles.Forsyth{
65*37da2899SCharles.Forsyth	sys->fprint(sys->fildes(2), "fpgaload: %s\n", s);
66*37da2899SCharles.Forsyth	raise "fail:error";
67*37da2899SCharles.Forsyth}
68