Skip to content

Instantly share code, notes, and snippets.

@monaka
Created February 1, 2013 03:01
Show Gist options
  • Save monaka/4688835 to your computer and use it in GitHub Desktop.
Save monaka/4688835 to your computer and use it in GitHub Desktop.
#!/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')
@monaka
Copy link
Author

monaka commented Feb 1, 2013

CDCLINK対応のホスト側ブートローダが Win32ベッタリなので「Ruby で書き換えてみてやんよ」って始めたら結構ハマった.でもとりあえずOSXからSH2Aのファームを流しこむのはできた.
他CPU対応とかコマンドライン引数処理とかクラス化とか,そういうの力尽きたので,とりあえず貼って終わりにする.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment