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