ラズベリーパイをROMライターにしてみた(Writer編)
前回のReader編に引き続き、今日は、Writer編
設定とか、ROMとラズパイの接続とかは、前回のReader編とまったく同じです。
まずは、Pythonのプログラムから。
#!/usr/bin/env python #-*- coding: UTF-8 -*- import smbus import time import sys bus = smbus.SMBus(1) def write_ROM(): count=0 ad=0 f=open(f_name,'r') for m in f: l1=m[:-1].split(' ') l2=[ l1[0][0:2], l1[0][2:4], l1[0][4:6], l1[0][6:8], l1[1][0:2], l1[1][2:4], l1[1][4:6], l1[1][6:8], l1[2][0:2], l1[2][2:4], l1[2][4:6], l1[2][6:8], l1[3][0:2], l1[3][2:4], l1[3][4:6], l1[3][6:8] ] l3=[(count%16)*16,int(l2[0],16),int(l2[1],16),int(l2[2],16),int(l2[3],16),int(l2[4],16),int(l2[5],16),int(l2[6],16),int(l2[7],16),int(l2[8],16),int(l2[9],16),int(l2[10],16),int(l2[11],16),int(l2[12],16),int(l2[13],16),int(l2[14],16),int(l2[15],16) ] print l2 bus.write_i2c_block_data(0x50,ad,l3) count+=1 if count%16 == 0: ad+=1 time.sleep(0.2) b1 = (count)*16/256 b2 = (count)*16%256 l_count=[count*16,b1,b2] print('bytes=%d Bytes1=%x bytes2=%x' %(l_count[0],l_count[1],l_count[2])) f.close() if __name__ == '__main__': args = sys.argv if len(args)<3: print('usage: python {} <Device Address(HEX)> <source file name>'.format(__file__)) exit(0) addr=int(args[1],16) f_name=args[2] write_ROM()
若干、ちからまかせ的な、あまりスマートじゃないスクリプトですが、まぁ、そこは目をつぶっていただいて、
使い方です。
もっぱら、自分の目的のためですので、あまり、汎用的ではありませんが、
4バイトごとに空白をはさんだ1行16バイトのデータファイルを読んで、ROMに書き込みます。
例えば、上記のスクリプトを"i2cromwrite.py" というファイルにしたとしますと、
$ python i2cromwrite.py 50 HONYOHONYO.txt
とやると、HONYOHONYO.txtというファイルのデータが書き込まれます。
最初の50は、デバイスアドレス 0x50 です。
自分の場合は、WAVファイルをROMに落としたかったので、まず、WAVファイルを用意して、バイナリエディタで開きます。
僕の場合は、xedit.exe というフリーのバイナリエディタを使ったので、データが4バイトごとのブロックで1行16バイト表示されます。 ここから、必要な部分を切り取って、テキストファイルにデータを貼り付けます。
テキストファイル上で必要な加工を行った後、ラズパイに転送し、ROMに書き込むという手順でやっています。 ちなみに必要な加工というのは、最初の行にデータのバイト数を書き込んでいます。 そうすると、PICで読み込むときに、その回数読めばすむので・・・。
この一連の作業が、以下のような感じになります。
まず、WAVファイルを開いて、データ部分を切り取ります。
続いて、メモ帳を開いて、データを貼り付け、最初の行にバイト数を書き込みます。
このファイルをラズパイに送ります。
FTPでも良いし、USBメモリやSDカード経由でも良いし、なんでも良いかと思います。
そして、上記のPythonのコードでROMに書き込みます。
これで、ROMに書き込まれている・・・はずです・・・。