ラズベリーパイを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に書き込まれている・・・はずです・・・。