ラズベリーパイを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ファイルを開いて、データ部分を切り取ります。
f:id:manpukukoji:20171027110127p:plain
続いて、メモ帳を開いて、データを貼り付け、最初の行にバイト数を書き込みます。
f:id:manpukukoji:20171027110230p:plain
このファイルをラズパイに送ります。
FTPでも良いし、USBメモリやSDカード経由でも良いし、なんでも良いかと思います。
そして、上記のPythonのコードでROMに書き込みます。
f:id:manpukukoji:20171027110745p:plain
これで、ROMに書き込まれている・・・はずです・・・。