Raspberry Pi pico 解析(Bootloader 2nd stage at C/C++ SDK)

前回 bootrom で行っている内容をサラッと記載しました。今回は C/C++ SDK を使った時の最初の動作である Bootloader 2nd stage を追っていこうと思います。

bootrom で 256byteのデータを外部Flashから内蔵RAMの0x20041F00~0x20041FFFにコピーされて、プログラムの実行場所がその先頭の0x20041F00になる。Bootloader 2nd stage はここから始まる。これは Bootloader のリンカスクリプトからも分る。Bootloader 2nd stage のソースコードはというと、boot2_w25q080.S。ここで行っている内容は以下。

1. XIPで外部FlashとQSPIで繋ぐ
2. ベクターテーブルを 0x10000100 として登録する(PPB.VTOR)
3. MSR(main stack pointer)に 0x10000100 番地の値(stack pointer address)を設定する
4. 0x10000104 番地(リセットベクター)で指定されている先へジャンプする

0x10000100以降の内容はベクターテーブル+プログラムです。cortex-Mxを触っている人にとってはお馴染みの内容でしょう。

C/C++ SDK付属のcmake設定ファイル群ではこれらを実現するためのパッキング(コンパイルとCRC32の実行、プログラムの結合)を行っています。パワーオンリセットからの実行プログラム位置の概要としては下図のような感じ。①と③はROM、外部Flashそれぞれのベクターテーブルに入っているリセットベクターが示す位置になる。

rpi_pico_boot_2nd_sc.png

ぶっちゃけ、プログラム全体が252byteで足りるのなら、bootloder 2nd stage なんていらない。ってことでお試ししてみましょう。ちょうど良い所でdwelch67さんのプログラムを見つけました。252byte以下で 2nd stage 無しで実行することを目的とされたものです。リンカスクリプトを見ると、XIP領域への配置になっているのでbootromの解釈を間違えたかな~と思ったが、blinker00を書き込んで実行すると以下の様にSRAM内で実行されていました。

> mdb 0x20041f00 256
0x20041f00: 05 48 85 46 00 f0 0a f8 fe e7 01 60 70 47 00 68 70 47 01 38 fd d1 70 47 00 10 00 20 10 b5 20 21
0x20041f20: 22 48 ff f7 f2 ff 20 24 21 48 ff f7 f0 ff 04 42 fa d0 80 21 80 24 1d 48 49 00 ff f7 e6 ff 64 00
0x20041f40: 1b 48 ff f7 e4 ff 20 42 fa d0 80 21 19 48 89 04 ff f7 db ff 80 21 18 48 89 04 ff f7 d6 ff 17 48
0x20041f60: ff f7 d5 ff 40 21 48 40 80 31 01 40 14 48 ff f7 cc ff 05 21 13 48 ff f7 c8 ff 80 21 12 48 89 04
0x20041f80: ff f7 c3 ff 80 21 11 48 89 04 ff f7 be ff 80 20 40 03 ff f7 be ff 80 21 07 48 89 04 ff f7 b5 ff
0x20041fa0: 80 20 40 03 ff f7 b5 ff ec e7 c0 46 00 f0 00 40 08 c0 00 40 28 00 00 d0 18 00 00 d0 68 c0 01 40
0x20041fc0: 68 d0 01 40 cc 40 01 40 24 00 00 d0 14 00 00 d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x20041fe0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 fa 60 33 2f

> mdb 0x10000000 256
0x10000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x10000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x10000040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x10000060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x10000080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x100000a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x100000c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x100000e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

> resume
> halt
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x00000178 msp: 0x20041f00
target halted due to debug-request, current mode: Thread
xPSR: 0x21000000 pc: 0x20041f12 msp: 0x20000ff8

> targets
TargetName Type Endian TapName State
-- ------------------ ---------- ------ ------------------ ------------
0* rp2040.core0 cortex_m little rp2040.core0.cpu halted
1 rp2040.core1 cortex_m little rp2040.core1.cpu halted


dwelch67さんのプログラムのままだとデバッグ情報と実行位置が不一致になるのでリンカスクリプトを編集して配置を0x20041F00からにして.binファイルを生成し、252byteに揃え、CRC32を付加します。パディングとCRCの付加はSDKのpythonファイルを編集して作成しました。このpad_checksumはRPi-pico用に作られているはずなのにCRCの初期値(0xFFFFFFFF)をオプションで指定する必要があるという謎仕様で小1時間ほどはまってしまいました。この内容はFlashに書き込む必要があるので0x10000000へ直接書き込みます。

$ make
$ pad_checksum_bin -s 0xffffffff notmain.bin notmain_pad_crc.bin


rpi_pico_blink00_sram_write.png

これでblinker00が動きます。

アドレスが合っているelfファイルを生成したので、お次はデバッガと行きたいところなのだが、ちょっとトラブル発生でinsightを使ったデバッグはお預けです(シンボル入りのASMは表示するけどCファイルを表示してくれないとか、挙動がおかしいとか…)。-gオプション付けてなっただけでした。insight使ってデバッグ中の画面貼り付けておきます。

rpi_pico_blink00_sram_insight.png
スポンサーサイト



tag : RaspberryPi_pico

コメントの投稿

非公開コメント

黒ねこ時計 くろック D02
プロフィール

jujurou

Author:jujurou
運営HP:チャコの部屋
Twitter:jujurou

カレンダー
05 | 2021/06 | 07
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 - - -
最新記事
最新コメント
カテゴリ
ユーザタグ

ぺるけ Linux RaspberryPi 全段差動プッシュプル 6P43P-E 三段化 トランジスタ式ミニワッター 6P43P TRminiWatterPart4 RaspberryPi_pico MPD FON2405E イーサネットコンバータ OpenOCD DAC buildroot windows Bluetooth BeagleBoneBlack FM3ペリフェラル map ODROID-U2 FM3評価ボード library mingw OpenGL シングル bitbake KiCad 計測 プリアンプ Edison VMware FM4 ミニワッター 6N6P TL-WR700N 

月別アーカイブ
ランキング

FC2 Blog Ranking

カウンター
検索フォーム
リンク
RSSリンクの表示
QRコード
QRコード
ライセンス
クリエイティブ・コモンズ・ライセンス
Twitter