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