techlab:projekte:inhouse:oxocards

Oxocards

Infos

Unter Linux müssen noch esptool.py und ampy installiert werden.

Backup der Oxocard (keine Ahnung, wie gross der belegte Speicher ist, hier mal 3M). Ein Modell, dass ich geklont hatte, hatte eine Flashgrösse von ca. 1877392 Bytes (1.8MB). Das image (3M) ist da (wird beim flashen komprimiert): oxocard-orig.img

esptool.py -p /dev/ttyUSB0 read_flash 0 3000000 oxocard-orig.img

Download der TigerJython-Dateien für die Oxocard:

wget http://www.tigerjython4kids.ch/download/MicroPython.bin
wget http://www.tigerjython4kids.ch/download/oxocardmodules.zip

Flashen des ESP32:

esptool.py --port /dev/ttyUSB0 erase_flash
esptool.py --port /dev/ttyUSB0 --chip esp32 write_flash -z 0x1000 MicroPython.bin

Kopieren der Python-Dateien (aus der zip-Datei)

for a in *.py; do ampy -p /dev/ttyUSB0 put $a; echo $a; done

Backup wieder einspielen:

esptool.py --port /dev/ttyUSB0 write_flash 0 oxocard-orig.img

Oder Factory reset:

wget http://www.tigerjython4kids/download/blockly_flash.zip
esptool.py --port /dev/ttyUSB0 erase_flash
esptool.py --port /dev/ttyUSB0 --chip esp32 write_flash -z --flash_mode dio --flash_freq 40m --flash_size detect 0x1000 bootloader_blockly.bin 0xe000 phy_init_data_blockly.bin 0x10000 OxocardBlockly.bin 0x8000 partitions_blockly.bin

Scripts

Die obigen Zeilen sind in folgende Scripts eingearbeitet:

download-images.rb

download-images.rb

download-images.rb
#!/usr/bin/ruby
 
$oxodir="/data/oxocard"
 
def ex(cmd)
    puts cmd
    res = system(cmd)
    if (res==nil)
        puts "Could not even run the command #{cmd}. Aborting."
        exit(-1)
    end
    return res
end
 
def trycmd(cmd, n=2)
    n.times {
        return true if ex(cmd)
        puts "command returned an error, trying again in 2 sec.."
        sleep(2)
    }
    puts "Executing #{cmd} returned an error. Aborting."
    exit(-1)
end
 
 
def dl(url, force=false)
    file = File.basename(url)
    ext = file.rindex(".")
    file = file[0...ext]+"-"+Time.now.strftime("%F")+file[ext..-1]
    if File.exists?(file) and !force
        puts "File #{file} already exists. Not downloading again. (use -f to force)"
    else
       unless ex("curl -L #{url} > #{$oxodir}/#{file}")
           ex("rm -f #{$oxodir}/#{file}")
           puts "Could not download from #{url}, aborting."
           exit(-1)
       end
    end
end
 
force = (ARGV[0]=="-f")
 
puts "Downloading TigerJython Images to #{$oxodir}"
 
 
dl("https://www.tigerjython4kids.ch/download/MicroPython.bin", force)
dl("https://www.tigerjython4kids.ch/download/oxocardmodules.zip", force)
dl("https://www.tigerjython4kids.ch/download/blockly_flash.zip", force)

flash-image.rb

flash-image.rb

flash-image.rb
#!/usr/bin/ruby
 
$oxodir="/data/oxocard"
$port = "/dev/ttyUSB0"
 
def ex(cmd)
    puts cmd
    res = system(cmd)
    if (res==nil)
        puts "Could not even run the command #{cmd}. Aborting."
        exit(-1)
    end
    return res
end
 
def trycmd(cmd, n=2)
    n.times {
        return true if ex(cmd)
        puts "command returned an error, trying again in 2 sec.."
        sleep(2)
    }
    puts "Executing #{cmd} returned an error. Aborting."
    exit(-1)
end
 
 
def checkForFile(glob)
    files = Dir.glob(glob)
    if files.size==0
        puts "No file of pattern #{glob} found. Attempting downloading it..."
        trycmd("ruby #{$oxodir}/bin/download-images.rb",1)
        files = Dir.glob(glob)
        if files.size==0
            puts "Sorry, cannot get file of pattern #{glob}, aborting now."
            exit(-1)
        end
    end
    return File.realpath(files.max_by {|f| File.mtime(f)})
end
 
 
def flash_tiger()
    # Flashing MicroPython
    file=checkForFile("#{$oxodir}/MicroPython*.bin")
    puts "Using most recent file #{file}"
    trycmd("esptool.py --port #{$port} erase_flash")
    trycmd("esptool.py --port #{$port} --chip esp32 write_flash -z 0x1000 #{file}")
 
    # TigerJython python modules
    file=checkForFile("#{$oxodir}/oxocardmodules*.zip")
    puts "Using most recent file #{file}"
    zipdir = "#{$oxodir}/oxocardmodules"
    ex("rm -rf #{zipdir}; mkdir #{zipdir}")
    trycmd("cd #{zipdir}; unzip #{file}",1)
    Dir.glob("#{zipdir}/*.py").sort.each{|f|
        trycmd("ampy -p #{$port} put '#{File.realpath(f)}'",3)
    }
end
 
def flash_blockly()
    file=checkForFile("#{$oxodir}/blockly_flash*.zip")
    puts "Using most recent file #{file}"
    zipdir = "#{$oxodir}/blockly"
    trycmd("rm -rf #{zipdir}",1)
    trycmd("cd #{zipdir}; unzip -o #{file}",1)
    trycmd("esptool.py --port #{$port} erase_flash",2)
    trycmd("cd #{zipdir}; esptool.py --port #{$port} --chip esp32 write_flash -z --flash_mode dio --flash_freq 40m --flash_size detect 0x1000 bootloader_blockly.bin 0xe000 phy_init_data_blockly.bin 0x10000 OxocardBlockly.bin 0x8000 partitions_blockly.bin",3)
end
 
 
if ARGV.size==0
    puts "Usage: ruby flash-image.rb t[iger]|b[lockly]"
    exit
end
 
if ARGV[0]=~/^[Tt]/
    flash_tiger()
elsif ARGV[0]=~/^[Bb]/
    flash_blockly
else
     puts "Usage: ruby flash-image.rb t[iger]|b[lockly]"
end
  • techlab/projekte/inhouse/oxocards.txt
  • Last modified: 2019/03/13 10:40
  • by ivo