コグノスケ


link 未来から過去へ表示(*)  link 過去から未来へ表示

link もっと前
2021年7月5日 >>> 2021年7月5日
link もっと後

2021年7月5日

OpenOCDとHiFive UnleashedのSPI Flashその1 - UnleashedとOpenOCD

目次: OpenOCD

OpenOCDではSiFive HiFive1のSPI Flashへの書き込み&消去ができます。しかしSiFive HiFive UnleashedのSPI Flashに対しては正常に動作しません。書き込みは成功しますが、消去はできません。一見すると成功しているのに一切データが消去できない謎の現象が発生します。

HiFive UnleashedのSPI FlashにOpenOCDで書き込み&消去を行った例を示します。OpenOCDの制御方法は何通りかあります。直接制御したい場合はポート4444にtelnetすると良いです。

OpenOCDにtelnetで接続

$ telnet localhost 4444

Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Open On-Chip Debugger

> reset halt
JTAG tap: riscv.cpu tap/device found: 0x20000913 (mfg: 0x489 (SiFive Inc), part: 0x0000, ver: 0x2)

私はGDB経由で制御するほうが慣れているので、GDB経由で制御します。GDBの場合はポート3333に接続します。この例ではZephyr用のツールチェーンに含まれるGDBを使っていますが、RV64に対応していれば何でも良いです(RV32専用ではダメです、UnleashedのCPUはRV64なので)。

OpenOCDにGDBで接続
$ riscv64-zephyr-elf-gdb

(gdb) set arch riscv:rv64

The target architecture is assumed to be riscv:rv64

(gdb) target remote :3333

Remote debugging using :3333

(gdb) monitor reset halt

JTAG tap: riscv.cpu tap/device found: 0x20000913 (mfg: 0x489 (SiFive Inc), part: 0x0000, ver: 0x2)

★★monitor xxxxはremote monitor(この場合OpenOCD)へのコマンドと解釈される

(gdb) monitor flash probe 0

Found flash device 'issi is25wp256d' (ID 0x0019709d)
device needs paging or 4-byte addresses - not implemented    ★★ん?なんだこれ
flash 'fespi' found at 0x20000000

(gdb) x/32x 0x20000000

0x20000000:     0xffffffff      0xffffffff      0xffffffff      0xffffffff
0x20000010:     0xffffffff      0xffffffff      0xffffffff      0xffffffff
0x20000020:     0xffffffff      0xffffffff      0xffffffff      0xffffffff
0x20000030:     0xffffffff      0xffffffff      0xffffffff      0xffffffff
0x20000040:     0xffffffff      0xffffffff      0xffffffff      0xffffffff
0x20000050:     0xffffffff      0xffffffff      0xffffffff      0xffffffff
0x20000060:     0xffffffff      0xffffffff      0xffffffff      0xffffffff
0x20000070:     0xffffffff      0xffffffff      0xffffffff      0xffffffff

(gdb) monitor flash fillw 0x20000000 0xddccbbaa 0x10

Disabling abstract command writes to CSRs.
wrote 64 bytes to 0x20000000 in 0.203977s (0.306 KiB/s)

★★書き込みに成功


(gdb) x/32x 0x20000000

0x20000000:     0xddccbbaa      0xddccbbaa      0xddccbbaa      0xddccbbaa
0x20000010:     0xddccbbaa      0xddccbbaa      0xddccbbaa      0xddccbbaa
0x20000020:     0xddccbbaa      0xddccbbaa      0xddccbbaa      0xddccbbaa
0x20000030:     0xddccbbaa      0xddccbbaa      0xddccbbaa      0xddccbbaa
0x20000040:     0xffffffff      0xffffffff      0xffffffff      0xffffffff
0x20000050:     0xffffffff      0xffffffff      0xffffffff      0xffffffff
0x20000060:     0xffffffff      0xffffffff      0xffffffff      0xffffffff
0x20000070:     0xffffffff      0xffffffff      0xffffffff      0xffffffff

★★書き込めた


(gdb) monitor flash erase_address 0x20000000 0x10000

erased address 0x20000000 (length 65536) in 0.204166s (313.470 KiB/s)

★★消去も成功したように見えるものの


(gdb) x/32x 0x20000000

0x20000000:     0xddccbbaa      0xddccbbaa      0xddccbbaa      0xddccbbaa
0x20000010:     0xddccbbaa      0xddccbbaa      0xddccbbaa      0xddccbbaa
0x20000020:     0xddccbbaa      0xddccbbaa      0xddccbbaa      0xddccbbaa
0x20000030:     0xddccbbaa      0xddccbbaa      0xddccbbaa      0xddccbbaa
0x20000040:     0xffffffff      0xffffffff      0xffffffff      0xffffffff
0x20000050:     0xffffffff      0xffffffff      0xffffffff      0xffffffff
0x20000060:     0xffffffff      0xffffffff      0xffffffff      0xffffffff
0x20000070:     0xffffffff      0xffffffff      0xffffffff      0xffffffff

★★消えないぞ……?

書き込めるのに消せないとは?これいかに?この謎を追います。最初にOpenOCDがどうやってSPI Flashを書き換えているのか?次にどうやって消去しているのか?を追います。妙な警告メッセージが出ている点も気になります。

SPI Flashとは?

その名の通りSPIで接続されたFlashメモリデバイスのことです。SPIはSerial Peripheral Interfaceの略で、CE#(Chip EnableもしくはChip Select, CS# とも)、SCLK、SDI、SDOの4線で構成される非常にシンプルなI/Oバスです。

個人的には「入力と出力が常に同時に行われるのがSPIの大きな特徴」に思います。


SPIの入出力波形の例(SPI FlashのRead Product Identificationコマンド)

例えばこの波形図ではSoCからSPI FlashにInstruction(0xAB) と3バイトのダミーデータを出力(SI側の信号)しているとき、SPI FlashからSoCに意味のないデータが返ってきます(SO側の信号)。

入出力が別々に行われるバス(Ethernetなど)に慣れていると、無意味なデータを受け取る=無駄なリクエストを相手に送っている、ことを示しますから、無駄な入力はやめてくれ〜としばらく混乱しました。しかしまあ、わかってしまえば非常に単純な話でして、常に入出力が同時に行われる仕様なので、無駄は発生していません。また、無意味な入力データは受け取った後に無視すれば良いだけです。

続きはまた次回。

編集者:すずき(2023/09/24 09:17)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
2021年7月5日 >>> 2021年7月5日
link もっと後

管理用メニュー

link 記事を新規作成

<2021>
<<<07>>>
----123
45678910
11121314151617
18192021222324
25262728293031

最近のコメント5件

  • link 24年4月22日
    hdkさん (04/24 08:36)
    「うちのHHFZ4310は15年突破しまし...」
  • link 24年4月22日
    すずきさん (04/24 00:37)
    「ちゃんと数えてないですけど蛍光管が10年...」
  • link 24年4月22日
    hdkさん (04/23 20:52)
    「おお... うちのHHFZ4310より後...」
  • link 20年6月19日
    すずきさん (04/06 22:54)
    「ディレクトリを予め作成しておけば良いです...」
  • link 20年6月19日
    斎藤さん (04/06 16:25)
    「「Preferencesというメニューか...」

最近の記事3件

  • link 24年4月25日
    すずき (04/26 16:49)
    「[AVIFの変換] AVIFが読めないアプリケーションがたまにあるので、AVIF(AV1 Image File Format)...」
  • link 24年2月7日
    すずき (04/24 02:52)
    「[複数の音声ファイルのラウドネスを統一したい] PCやデジタル音楽プレーヤーで音楽を聞いていると、曲によって音量の大小が激しく...」
  • link 24年4月22日
    すずき (04/23 20:13)
    「[仕事部屋の照明が壊れた] いきなり仕事部屋のシーリングライトが消えました。蛍光管の寿命にしては去年(2022年10月19日の...」
link もっとみる

こんてんつ

open/close wiki
open/close Linux JM
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 2024年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDFファイル RSS 1.0

最終更新: 04/26 16:49