CON _clkmode = xtal1 + pll16x _xinfreq = 5_000_000 CYCLE0 = sys#cycle0 SECONDS = sys#unixtime TIMEZONE = sys#timezone eeprom_pin = 28 OBJ c : "clibsd" sys : "sysdefs" ut : "unixtime" vs : "varsubs" spi : "safe_spi_p" ser : "cserial" fsrwx : "fsrwx" VAR byte buffer[100] DAT pins byte 255[4] sd_names byte "DO ", 0, "CLK", 0, "DI ", 0, "CS ", 0 PUB main | i, ptr, infile, handle longfill(sys#rendezvous, 0, ($8000 - sys#rendezvous)/4) c.start if pins == 255 repeat c.printf0(string("Press any key to start\n")) if ser.rxtime(1000) <> -1 quit ptr := @sd_names repeat i from 0 to 3 c.printf1(string("Enter SD %s pin number: "), ptr) c.scanf1(string("%d"), @result) pins[i] := result ptr += 4 WriteEEPromLong(eeprom_pin, @pins) spi.start_explicit(pins, pins[1], pins[2], pins[3]) c.mount_explicit(pins, pins[1], pins[2], pins[3]) 'c.chdir(@long[ptr][2]) load_sysparm 'vs.SaveVar(string("#"), string("0"), vs#PARM_FLAG) 'vs.SaveVar(string("SCRIPT_FILE"), string("/bin/_shellrc"), vs#LOCAL_FLAG) 'vs.SaveVar(string("PWD"), string("/"), vs#GLOBAL_FLAG) splash infile := c.fopen(string("/bin/shell"), string("r")) ifnot infile c.printf0(string("Could not open /bin/shell\n")) abort handle := long[infile][c#stream_handle] long[sys#shell_sector] := fsrwx.hget_first_sector(handle) long[sys#shell_size] := fsrwx.hget_filesize(handle) 'c.printf2(string("sector = %d, size = %d\n"), long[sys#shell_sector], long[sys#shell_size]) c.exit(0) pub load_sysparm | infile, ptr infile := c.fopen(string("/_sysparm"), string("r")) long[sys#cycle0] := cnt ifnot infile c.printf0(string("Could not open _sysparm\n")) return ifnot c.fgets(@buffer, 100, infile) c.fclose(infile) return c.sscanf1(@buffer, string("%d"), sys#unixtime) ifnot c.fgets(@buffer, 100, infile) c.fclose(infile) return c.sscanf3(@buffer, string("%d %d %d"), sys#timezone, sys#config, sys#shell_level) ifnot c.fgets(@buffer, 100, infile) c.fclose(infile) return c.sscanf3(@buffer, string("%d %d %d"), sys#ifflag, sys#whileflag, sys#scriptline) ptr := sys#environ_vars repeat while c.fgets(ptr, 100, infile) ptr := vs.FindChar(ptr, " ") byte[ptr++] := 0 ptr += strsize(ptr) - 1 byte[ptr++] := 0 byte[ptr] := 0 c.fclose(infile) pub splash | unixtime, date, time, hour, minute, second, year, month, day, cycle, temp, tz tz := long[TIMEZONE] unixtime := long[SECONDS] date := ut.date(unixtime, tz) time := ut.time(unixtime, tz) year := word[@date][1] month := byte[@date][1] day := byte[@date][0] hour := word[@time][1] minute := byte[@time][1] second := byte[@time][0] c.printf0(string("******************************************************\n")) c.printf0(string("* *\n")) c.printf0(string("* Spinix 1.33 November 14, 2013 *\n")) c.printf0(string("* *\n")) c.printf0(string("******************************************************\n")) c.printf0(string("\n")) c.printf0(string("Current date and time: ")) c.printf3(string("%2.2d/%2.2d/%2.2d "), year, month, day) c.printf3(string("%2.2d:%2.2d:%2.2d\n"),hour, minute, second) c.printf0(string("\n")) ' I2C EEProm methods follow below PUB WriteEEPromLong(SCL, addr) | devSel, ackbit ' Make sure EEProm is in a known state Initialize(SCL) ' Write three address bytes devSel := $A0 | ((addr >> 15) & %1110) Start(SCL) Write(SCL, devSel) Write(SCL, addr >> 8 & $FF) Write(SCL, addr & $FF) ' Write four data bytes repeat 4 Write(SCL, byte[addr++]) Stop(SCL) ' Wait till the write is done repeat Start(SCL) ackbit := Write(SCL, devSel) Stop(SCL) while ackbit PUB Initialize(SCL) | SDA ' An I2C device may be left in an SDA := SCL + 1 ' invalid state and may need to be outa[SCL] := 1 ' reinitialized. Drive SCL high. dira[SCL] := 1 dira[SDA] := 0 ' Set SDA as input repeat 9 outa[SCL] := 0 ' Put out up to 9 clock pulses outa[SCL] := 1 if ina[SDA] ' Repeat if SDA not driven high quit ' by the EEPROM PUB Start(SCL) | SDA ' SDA goes HIGH to LOW with SCL HIGH SDA := SCL + 1 outa[SCL]~~ ' Initially drive SCL HIGH dira[SCL]~~ outa[SDA]~~ ' Initially drive SDA HIGH dira[SDA]~~ outa[SDA]~ ' Now drive SDA LOW outa[SCL]~ ' Leave SCL LOW PUB Stop(SCL) | SDA ' SDA goes LOW to HIGH with SCL High SDA := SCL + 1 outa[SCL]~~ ' Drive SCL HIGH outa[SDA]~~ ' then SDA HIGH dira[SCL]~ ' Now let them float dira[SDA]~ ' If pullups present, they'll stay HIGH PUB Write(SCL, data) : ackbit | SDA SDA := SCL + 1 ackbit := 0 data <<= 24 repeat 8 ' Output data to SDA outa[SDA] := (data <-= 1) & 1 outa[SCL]~~ ' Toggle SCL from LOW to HIGH to LOW outa[SCL]~ dira[SDA]~ ' Set SDA to input for ACK/NAK outa[SCL]~~ ackbit := ina[SDA] ' Sample SDA when SCL is HIGH outa[SCL]~ outa[SDA]~ ' Leave SDA driven LOW dira[SDA]~~