honeylab's blog

各種ハードウェアの改造、主にファミコンミニなどをやってます(ました)

【速報】電源ONで直接SDスロットから自前ビルドu-bootの起動に成功

タイトルの件、成功

一番先に成功したからってずっと試してたMMCカード。
USBつないでsunxi-fel uboot u-boot-sunxi-with-spl.binでは起動してたのに、
何度書いて試しても起動しない。
(MMCは読みに行ってるけど結局あきらめられてNANDのu-bootが走っちゃってた)

 

512MBという今となってはちょっと小さい(しかもSDじゃない)ということから
ふと思い立って、数少ない普通に読めてた2GのSDカードに手順通り

Bootable SD card - linux-sunxi.org

書いてスイッチ入れたらいきなりu-boot起動したわ。しかもちゃんとUART2で。

 

なんだってーーーーーー

 

いや、さすがにちょっと信じられなくて何度もスイッチON/OFFして確かめちゃったよ。
というわけで、これでKernelをコンパイルして配置すれば単体起動が出来そう。
テンション上がってきた。

 

起動ログ。MMCのTRACE入ってるから読みにくいわ。

 

U-Boot SPL 2016.11-rc3-g8cf4582-dirty (Dec 07 2016 - 14:46:32)
DRAM: 256 MiB
Trying to boot from MMC1
init mmc 0 clock and io
mmc 0 set  clock to 24000000
create mmc
init mmc 2 clock and io
mmc 2 set  clock to 24000000
create mmc
set ios: bus_width: 1, clock: 0
set ios: bus_width: 1, clock: 400000
mmc 0 set  clock to 400000
CMD_SEND:0
                ARG                      0x00000000
mmc 0, cmd 0(0x80008000), arg 0x00000000
mmc resp 0x00000000
                MMC_RSP_NONE
CMD_SEND:8
                ARG                      0x00000000
mmc 0, cmd 8(0x80000148), arg 0x000001aa
mmc resp 0x000001aa
                MMC_RSP_R1,5,6,7         0x00000000
CMD_SEND:55
                ARG                      0x00000000
mmc 0, cmd 55(0x80000177), arg 0x00000000
mmc resp 0x00000120
                MMC_RSP_R1,5,6,7         0x00000000
CMD_SEND:41
                ARG                      0x00000000
mmc 0, cmd 41(0x80000069), arg 0x40300000
mmc resp 0x00ff8000
                MMC_RSP_R3,4             0x00000000
CMD_SEND:55
                ARG                      0x00000000
mmc 0, cmd 55(0x80000177), arg 0x00000000
mmc resp 0x00000120
                MMC_RSP_R1,5,6,7         0x00000000
CMD_SEND:41
                ARG                      0x00000000
mmc 0, cmd 41(0x80000069), arg 0x40300000
mmc resp 0x80ff8000
                MMC_RSP_R3,4             0x00000000
MMC Starup
CMD_SEND:2
                ARG                      0x00000000
mmc 0, cmd 2(0x800001c2), arg 0x00000000
mmc resp 0xdb00ace3 0x006221aa 0x44303247 0x134b4753
                MMC_RSP_R2               0x00000000
                                         0x00000000
                                         0x00000000
                                         0x00000000

                                        DUMPING DATA
                                        000 - 00 00 00 00
                                        004 - 00 00 00 00
                                        008 - 00 00 00 00
                                        012 - 00 00 00 00
CMD_SEND:3
                ARG                      0x00000000
mmc 0, cmd 3(0x80000143), arg 0x00000000
mmc resp 0xb3680520
                MMC_RSP_R1,5,6,7         0x00000000
CMD_SEND:9
                ARG                      0x00000000
mmc 0, cmd 9(0x800001c9), arg 0xb3680000
mmc resp 0x968000f5 0xedb7ffbf 0x5f5a83a2 0x002f0032
                MMC_RSP_R2               0x00000000
                                         0x00000000
                                         0x00000000
                                         0x00000000

                                        DUMPING DATA
                                        000 - 00 00 00 00
                                        004 - 00 00 00 00
                                        008 - 00 00 00 00
                                        012 - 00 00 00 00
CMD_SEND:13
                ARG                      0x00000000
mmc 0, cmd 13(0x8000014d), arg 0xb3680000
mmc resp 0x00000700
                MMC_RSP_R1,5,6,7         0x00000000
CURR STATE:3
CMD_SEND:7
                ARG                      0x00000000
mmc 0, cmd 7(0x80000147), arg 0xb3680000
mmc resp 0x00000700
                MMC_RSP_R1,5,6,7         0x00000000
CMD_SEND:55
                ARG                      0x00000000
mmc 0, cmd 55(0x80000177), arg 0xb3680000
mmc resp 0x00000920
                MMC_RSP_R1,5,6,7         0x00000000
CMD_SEND:51
                ARG                      0x00000000
mmc 0, cmd 51(0x80002373), arg 0x00000000
trans data 8 bytes
cacl timeout 78 msec
mmc resp 0x00000920
                MMC_RSP_R1,5,6,7         0x00000000
CMD_SEND:6
                ARG                      0x00000000
mmc 0, cmd 6(0x80002346), arg 0x00fffff1
trans data 64 bytes
cacl timeout 78 msec
mmc resp 0x00000900
                MMC_RSP_R1,5,6,7         0x00000000
CMD_SEND:6
                ARG                      0x00000000
mmc 0, cmd 6(0x80002346), arg 0x80fffff1
trans data 64 bytes
cacl timeout 78 msec
mmc resp 0x00000900
                MMC_RSP_R1,5,6,7         0x00000000
CMD_SEND:55
                ARG                      0x00000000
mmc 0, cmd 55(0x80000177), arg 0xb3680000
mmc resp 0x00000920
                MMC_RSP_R1,5,6,7         0x00000000
CMD_SEND:6
                ARG                      0x00000000
mmc 0, cmd 6(0x80000146), arg 0x00000002
mmc resp 0x00000920
                MMC_RSP_R1,5,6,7         0x00000000
set ios: bus_width: 4, clock: 400000
mmc 0 set  clock to 400000
CMD_SEND:55
                ARG                      0x00000000
mmc 0, cmd 55(0x80000177), arg 0xb3680000
mmc resp 0x00000920
                MMC_RSP_R1,5,6,7         0x00000000
CMD_SEND:13
                ARG                      0x00000000
mmc 0, cmd 13(0x8000234d), arg 0x00000000
trans data 64 bytes
cacl timeout 78 msec
mmc resp 0x00000920
                MMC_RSP_R1,5,6,7         0x00000000
set ios: bus_width: 4, clock: 50000000
mmc 0 set  clock to 50000000
CMD_SEND:16
                ARG                      0x00000000
mmc 0, cmd 16(0x80000150), arg 0x00000200
mmc resp 0x00000900
                MMC_RSP_R1,5,6,7         0x00000000
CMD_SEND:17
                ARG                      0x00000000
mmc 0, cmd 17(0x80002351), arg 0x0000a000
trans data 512 bytes
cacl timeout 78 msec
mmc resp 0x00000900
                MMC_RSP_R1,5,6,7         0x00000000
CMD_SEND:16
                ARG                      0x00000000
mmc 0, cmd 16(0x80000150), arg 0x00000200
mmc resp 0x00000900
                MMC_RSP_R1,5,6,7         0x00000000
CMD_SEND:18
                ARG                      0x00000000
mmc 0, cmd 18(0x80003352), arg 0x0000a000
trans data 367616 bytes
cacl timeout 78 msec
mmc resp 0x00000900
                MMC_RSP_R1,5,6,7         0x00000000
CMD_SEND:12
                ARG                      0x00000000
mmc cmd 12 check rsp busy
                MMC_RSP_R1b              0x00000000


U-Boot 2016.11-rc3-g8cf4582-dirty (Dec 07 2016 - 14:46:32 -0800) Allwinner Technology

DRAM:  256 MiB
MMC:   init mmc 0 clock and io
mmc 0 set  clock to 24000000
create mmc
init mmc 2 clock and io
mmc 2 set  clock to 24000000
create mmc
SUNXI SD/MMC: 0, SUNXI SD/MMC: 1
set ios: bus_width: 1, clock: 0
set ios: bus_width: 1, clock: 400000
mmc 0 set  clock to 400000
CMD_SEND:0
                ARG                      0x00000000
mmc 0, cmd 0(0x80008000), arg 0x00000000
mmc resp 0x00000000
                MMC_RSP_NONE
CMD_SEND:8
                ARG                      0x000001AA
mmc 0, cmd 8(0x80000148), arg 0x000001aa
mmc resp 0x000001aa
                MMC_RSP_R1,5,6,7         0x000001AA
CMD_SEND:55
                ARG                      0x00000000
mmc 0, cmd 55(0x80000177), arg 0x00000000
mmc resp 0x00000120
                MMC_RSP_R1,5,6,7         0x00000120
CMD_SEND:41
                ARG                      0x40300000
mmc 0, cmd 41(0x80000069), arg 0x40300000
mmc resp 0x00ff8000
                MMC_RSP_R3,4             0x00FF8000
CMD_SEND:55
                ARG                      0x00000000
mmc 0, cmd 55(0x80000177), arg 0x00000000
mmc resp 0x00000120
                MMC_RSP_R1,5,6,7         0x00000120
CMD_SEND:41
                ARG                      0x40300000
mmc 0, cmd 41(0x80000069), arg 0x40300000
mmc resp 0x80ff8000
                MMC_RSP_R3,4             0x80FF8000
MMC Starup
CMD_SEND:2
                ARG                      0x00000000
mmc 0, cmd 2(0x800001c2), arg 0x00000000
mmc resp 0xdb00ace3 0x006221aa 0x44303247 0x134b4753
                MMC_RSP_R2               0x134B4753
                                         0x44303247
                                         0x006221AA
                                         0xDB00ACE3

                                        DUMPING DATA
                                        000 - 13 4B 47 53
                                        004 - 44 30 32 47
                                        008 - 00 62 21 AA
                                        012 - DB 00 AC E3
CMD_SEND:3
                ARG                      0x00000000
mmc 0, cmd 3(0x80000143), arg 0x00000000
mmc resp 0xb3680520
                MMC_RSP_R1,5,6,7         0xB3680520
CMD_SEND:9
                ARG                      0xB3680000
mmc 0, cmd 9(0x800001c9), arg 0xb3680000
mmc resp 0x968000f5 0xedb7ffbf 0x5f5a83a2 0x002f0032
                MMC_RSP_R2               0x002F0032
                                         0x5F5A83A2
                                         0xEDB7FFBF
                                         0x968000F5

                                        DUMPING DATA
                                        000 - 00 2F 00 32
                                        004 - 5F 5A 83 A2
                                        008 - ED B7 FF BF
                                        012 - 96 80 00 F5
CMD_SEND:13
                ARG                      0xB3680000
mmc 0, cmd 13(0x8000014d), arg 0xb3680000
mmc resp 0x00000700
                MMC_RSP_R1,5,6,7         0x00000700
CURR STATE:3
CMD_SEND:7
                ARG                      0xB3680000
mmc 0, cmd 7(0x80000147), arg 0xb3680000
mmc resp 0x00000700
                MMC_RSP_R1,5,6,7         0x00000700
CMD_SEND:55
                ARG                      0xB3680000
mmc 0, cmd 55(0x80000177), arg 0xb3680000
mmc resp 0x00000920
                MMC_RSP_R1,5,6,7         0x00000920
CMD_SEND:51
                ARG                      0x00000000
mmc 0, cmd 51(0x80002373), arg 0x00000000
trans data 8 bytes
cacl timeout 78 msec
mmc resp 0x00000920
                MMC_RSP_R1,5,6,7         0x00000920
CMD_SEND:6
                ARG                      0x00FFFFF1
mmc 0, cmd 6(0x80002346), arg 0x00fffff1
trans data 64 bytes
cacl timeout 78 msec
mmc resp 0x00000900
                MMC_RSP_R1,5,6,7         0x00000900
CMD_SEND:6
                ARG                      0x80FFFFF1
mmc 0, cmd 6(0x80002346), arg 0x80fffff1
trans data 64 bytes
cacl timeout 78 msec
mmc resp 0x00000900
                MMC_RSP_R1,5,6,7         0x00000900
CMD_SEND:55
                ARG                      0xB3680000
mmc 0, cmd 55(0x80000177), arg 0xb3680000
mmc resp 0x00000920
                MMC_RSP_R1,5,6,7         0x00000920
CMD_SEND:6
                ARG                      0x00000002
mmc 0, cmd 6(0x80000146), arg 0x00000002
mmc resp 0x00000920
                MMC_RSP_R1,5,6,7         0x00000920
set ios: bus_width: 4, clock: 400000
mmc 0 set  clock to 400000
CMD_SEND:55
                ARG                      0xB3680000
mmc 0, cmd 55(0x80000177), arg 0xb3680000
mmc resp 0x00000920
                MMC_RSP_R1,5,6,7         0x00000920
CMD_SEND:13
                ARG                      0x00000000
mmc 0, cmd 13(0x8000234d), arg 0x00000000
trans data 64 bytes
cacl timeout 78 msec
mmc resp 0x00000920
                MMC_RSP_R1,5,6,7         0x00000920
set ios: bus_width: 4, clock: 50000000
mmc 0 set  clock to 50000000
CMD_SEND:16
                ARG                      0x00000200
mmc 0, cmd 16(0x80000150), arg 0x00000200
mmc resp 0x00000900
                MMC_RSP_R1,5,6,7         0x00000900
CMD_SEND:17
                ARG                      0x00000000
mmc 0, cmd 17(0x80002351), arg 0x00000000
trans data 512 bytes
cacl timeout 78 msec
mmc resp 0x00000900
                MMC_RSP_R1,5,6,7         0x00000900
CMD_SEND:16
                ARG                      0x00000200
mmc 0, cmd 16(0x80000150), arg 0x00000200
mmc resp 0x00000900
                MMC_RSP_R1,5,6,7         0x00000900
CMD_SEND:17
                ARG                      0x00000000
mmc 0, cmd 17(0x80002351), arg 0x00000000
trans data 512 bytes
cacl timeout 78 msec
mmc resp 0x00000900
                MMC_RSP_R1,5,6,7         0x00000900
CMD_SEND:16
                ARG                      0x00000200
mmc 0, cmd 16(0x80000150), arg 0x00000200
mmc resp 0x00000900
                MMC_RSP_R1,5,6,7         0x00000900
CMD_SEND:18
                ARG                      0x00088000
mmc 0, cmd 18(0x80003352), arg 0x00088000
trans data 131072 bytes
cacl timeout 78 msec
mmc resp 0x00000900
                MMC_RSP_R1,5,6,7         0x00000900
CMD_SEND:12
                ARG                      0x00000000
mmc cmd 12 check rsp busy
                MMC_RSP_R1b              0x00000900
*** Warning - bad CRC, using default environment

In:    serial
Out:   serial
Err:   serial
Net:   No ethernet found.
starting USB...
No controllers found
 

ニンテンドークラシックミニでSDカードが認識された(一部)

 前回の記事

honeylab.hatenablog.jp

の続きです。

 

SDカードが認識できました!

f:id:honeylab:20161206123917p:plain


f:id:honeylab:20161206123135p:plain

 

f:id:honeylab:20161206123219p:plain

ただし、一部のカードは認識して、一部はそうではない、という状態です。

一番左のTranscendの古いMMC 512が一番サクッと認識した気がします。
あと2枚、どれだか忘れましたがw ManufactureID が1bのやつが読めました。
読めたものの情報は以下の3枚です。

f:id:honeylab:20161206122144p:plain


手持ちの約10枚中、3枚は読めてます。
違いは何だろうとMMC_TRACEをONにしてにらめっこ中…

ただ、どうもいずれのカードも1ビット(CMD/CLK)だけでの通信はできてて、

CIDやCSDは読めてるっぽいんですが、

f:id:honeylab:20161206122826p:plain

---------------------------------------------------------------------------------------------------------------------

最後のほうで、ACMD13に対してだんまりになってしまって、ホストのほうが諦めてる、ように見えてる、ってところまでは来ています。

f:id:honeylab:20161206122723p:plain

 

で、一番さっくり読めてたTrancendの512にu-boot-with-spl.binを放り込んでスイッチを入れたところ、明らかに何も入ってないSDカードより長くあれやこれやした後、もともとのu-bootに戻ってきちゃってるっぽいです。
もしかしたらウォッチドッグに殺られてるのかな?
また、u-bootの起動中のメッセージもまだ出てないのでUART2の初期化が実はうまくいってないとか、binが間違ってるとかの可能性も。
読めるカードからのSD起動と、読めないカードを読めるようにする方法を調査中です。

ニンテンドークラシックミニにSDかーどをつなぐ

honeylab.hatenablog.jp

追加パッドが判明したので、SDカードをつなげられそうということがわかり頑張っていましたが、成果を焦るばかりにパッドをぶっ壊してしまうということが起きた後、
導電性接着剤を購入し、わずかに残っていたビアに盛ってやることで復活させることができました。

www.amazon.co.jp

ざっくりと写真です。

ぶっ壊した写真

f:id:honeylab:20161205133511p:plain

マスキング

f:id:honeylab:20161205133556p:plain

配線をくっつけた後

f:id:honeylab:20161205133645p:plain

レビューにあるように、粘性が低いのできっちりマスキングしないと結構漏れてしまうようです。
まぁ今回はこれで間に合ったのでこれ以上触らないことにします。


さて、今回の教訓を生かして、必要なパッドはいったん中継してから引き出すことにします。

f:id:honeylab:20161205133815p:plain

 

ここで、実はRXDとTXD(UART0)とPF2/PF4は同一のピンであることが判明しました。
つまり、普通のブートローダを使いながら、SDカードを使おうとすると競合して使えなくなってしまうということのようです。

なんと、AllwinnerのSoCはいつもこういう仕様のようで、

MicroSD Breakout - linux-sunxi.org

こんなへんちくりんな変換基盤を使うとMicroSD端子からUARTが出ますよ、ということらしい。
普通のユーザはせいぜいSDからのファームアップデートぐらいだし、べつにUARTなんかいらないでしょ、っていうことか。うんこ!。

 

で、途方に暮れていたものの、まだあきらめられるか、といろいろさがしていた結果
PB0/PB1であり、UART2のTX/RXになるパッドを発見しました!!!!!!

これで、u-bootやカーネルの標準出力をUART2にすることさえできればコンソールを使いつつ、SDカードを使うことができるはずです!

 

と、そこで、こいつに使われているR16のデータシートが見つからないので、近いはずのA33を見ると、FLASHブートローダの前に、必ずSDカードを読みますよ、ということが書いてありました。
これは物の試しに、とSDカードをつないでロジアナで覗いてみます。

 

f:id:honeylab:20161205134522p:plain

なんと!MMCモードに入る前のSPIモードでのイニシャライズが始まってるではないか!ktkr!!!

というわけで、UART2 + SDカードでこいつを単体起動させることを目標に、いろいろやっていきます。

最新情報は twitter で。

twitter.com

っていうか!こんだけ書いてたら!Linuxとか詳しい人は!
もうとっくにいろいろできちゃうんじゃないですかね!

 

Linuxむずかしい。

っていうか、まぁただの組み込みCPUにつながってる何か、だとやっと体になじんできたのでどうにかなるかな。
写真に写ってるSDカードの基板は、8年ぐらい前にトラ技のLPC2388基板とVS1011をつないで、アナログカメラにバーコードを読ませると音声をしゃべる機械を作る、という謎の機械を作った時の残りの部品です。

 

ニンテンドークラシックミニ テストパッド情報

あぁぁぁっぁぁあああああぁぁあ

なんか、いろいろ調べてたらSD(boot用のcard0)のパターンが残ってるんじゃね?ってなったので適当にはんだ付けしてぶらぶらさせてたら

f:id:honeylab:20161201081416p:plain

 

 

パターンはがれた!!!!!!
ダメだこれ!!!!!

 

あぁあぁ、細い線の部分がちぎれて内層からのビアだけになっちゃった…これははんだも乗らない

f:id:honeylab:20161201075730p:plain

そうだ!導電性接着剤!(アマゾンポチー

 

反省。成果を求めて焦るより、きちんといったん中継基板をかませましょう。

ということで、とりあえず残りの配線を傷めないようにやったんだけど、あと一本治るかかなり怪しいです。

あぁぁぁぁぁ

 

で、悔しいけどパッド情報更新しとくわ。間違えてたらごめんね。
判定にはFELに入って、ホストから sunxi-tools のgpio変更ツールで試した。

Sunxi-tools - linux-sunxi.org

 

シールドケース側

f:id:honeylab:20161201080451p:plain

 

裏面

f:id:honeylab:20161201081012p:plain

 

で、FELにいるときに0x4300000から吸い出したscript.binだと

http://linux-sunxi.org/Sunxi-tools#script-extractor 

script-extractor

This device side tool reads the script.bin data from RAM at the magic address 0x43000000 and saves it to a file. This tool gets statically compiled so it can be used on Android as well. Please note that it is only usable with FEX based kernels (as used in the stock Android firmware) and does not make any sense with the devicetree based mainline kernel.

card0が無効になってるんだけど、

CPUのリファレンスを見ると、何が何でもcard0から起動してくれるように思うし、

SD_CLKのピンがパタパタしてるし、カードつないだらCMDで初期化かけてるっぽいんだよね。

f:id:honeylab:20161201081330p:plain


だから、なんかできるんじゃないかと思って、導電性接着剤が到着するのを待つ。