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