Created
February 1, 2013 03:01
-
-
Save monaka/4688835 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env ruby | |
require 'rubygems' | |
gem 'ruby-serialport','>=0.7.0' | |
require 'serialport' | |
$sp = SerialPort.new('/dev/tty.usbmodem2411', 115200, 8, 1, 0) | |
$sp.binmode | |
matchword_msg = [ '00aaa5' ] | |
p matchword_msg.pack('H*'); | |
$sp.write matchword_msg.pack('H*'); | |
$sp.flush | |
retbin = $sp.read(1) | |
ret = retbin.unpack("H*") | |
p ret[0] | |
if ret[0] != '55' then | |
raise 'Negociation failed.' | |
end | |
p 'Connection established.' | |
def _send_hidcmd_hdr | |
hidcmd_hdr = [ '00' * 60 + 'aa55' ] ## dummy aa 55 | |
$sp.write hidcmd_hdr.pack('H*') | |
end | |
def load(base_addr, fname) | |
chunk_len = 16 | |
b = open(fname) | |
b.binmode | |
addr = base_addr | |
while true do | |
chunk = b.read(chunk_len) | |
break if !chunk | |
len = chunk.bytesize | |
_send_hidcmd_hdr | |
transfer_hdr = '010400' # MONIT_SOF HIDASP_POKE, MEM_BYTE | |
packet = [ transfer_hdr, len, addr ].pack('H6vV') + chunk | |
packet += "\0" * (60 - packet.bytesize) | |
$sp.write packet | |
$sp.flush | |
break if len < chunk_len | |
addr += len | |
end | |
end | |
def jump(addr) | |
_send_hidcmd_hdr | |
exec_hdr = "010600" # MONIT_SOF HIDASP_JMP DUMMY | |
packet = [ exec_hdr, 1, addr ].pack('H6vV') | |
packet += "\0" * (60 - packet.bytesize) | |
p packet.length | |
$sp.write packet | |
$sp.flush | |
end | |
def reset_vector(fname) | |
b = open(fname) | |
b.binmode | |
b.read(4).unpack('N') | |
end | |
base_addr = 0x1c000000 | |
load base_addr, 'SH2A-1C000000.bin' | |
jump reset_vector('SH2A-1C000000.bin')[0] | |
#p reset_vector('SH2A-1C000000.bin') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
CDCLINK対応のホスト側ブートローダが Win32ベッタリなので「Ruby で書き換えてみてやんよ」って始めたら結構ハマった.でもとりあえずOSXからSH2Aのファームを流しこむのはできた.
他CPU対応とかコマンドライン引数処理とかクラス化とか,そういうの力尽きたので,とりあえず貼って終わりにする.