qshinoの日記

Powershell関係と徒然なこと

python pci access

python.portio

>>> import portio # level を 3 に設定し、I/O ポートへのアクセスを許可します >>> portio.iopl(3) # 0x2000 から 1 byte を読み出します >>> portio.inb(0x2000) 254

pyhon.mmap

>>> import os >>> import mmap # メモリを読込専用で開きます >>> f = os.open('/dev/mem', os.O_RDONLY) # mmap でマッピングします >>> m = mmap.mmap(f, 32, prot=mmap.PROT_READ, offset=0x90503000) # 7 byte 目を読んでみます >>> m.seek(0x07) >>> m.read(1) b'\x00'

pypci

>>> import pypci # PCI 設定情報を収集します。 # ベンダー ID、装置 ID を使って絞り込みます。 >>> board = pypci.lspci(vendor=0x1147, device=3214) # port に関する情報は、Base Address Register に書き込まれています。 >>> board[0].bar [BaseAddressRegister(type='mem', addr=2421170176, size=64), BaseAddressRegister(type='mem', addr=2421166080, size=64), BaseAddressRegister(type='mem', addr=2421174272, size=32)] # BaseAddressRegister オブジェクトを使って通信します >>> bar2 = board[0].bar[2] # 読み込みの例 >>> pypci.read(bar2, 0x0c, 4) b'\x00\x00\x00\x0c' # アドレス範囲を超えると、エラーです >>> pypci.read(bar2, 0x1d, 4) BadAccessError: PCI addr space is 0x90503000-0x9050301f while tried to access 0x9050301d-0x90503020. # 書き込みの例 >>> pypci.write(bar[2], 0x04, b'\x01') >>> data = struct.pack('<I', 1234567) >>> pypci.write(bar[2], 0x00, data)

ref

https://qiita.com/nishimuraatsushi/items/97f281f206b7df454da3

http://www.mech.tohoku-gakuin.ac.jp/rde/contents/linux/drivers/nodriver.html