Walrus,Visit. | 一覧 | 検索 | 更新履歴(RSS) | 新規作成
はてなブックマークに追加 はてなブックマークを表示 編集 | 編集(管理者用) | 差分

Linuxザウルス開発メモ/ハードウェア/C700メモリ増設

編集

128MB化の作業手順を書き上げました。後継者求む。

ページ作成: ヤマケン
Page created: YamaKen <yamaken at bp.iij4u.or.jp>

Use Excite_web_translation to translate this page into English. Sorry for inconvenience.

現状

編集

デフォルトの32MB状態

64MB化

  • 成功。動作中の不具合は特になし
  • カーネルにパッチをあてる必要がある
  • レジュームも動作するようになった
  • Genio e550GXから取った512Mbitチップ(2.5V品)×2を使用。C700の電源は3.3Vなので規格外だが動作する
  • CS1をプルアップして前半の64MBのみを使用

128MB化

  • 成功。2003/04/24 01:43 正常起動。今のところ特に問題なし
  • カーネルにパッチをあてる必要がある
  • レジュームも正常に動作する
  • Genio e550GXから取った512Mbitチップ(2.5V品)×2を使用。C700の電源は3.3Vなので規格外だが動作する
  • 基板上で未配線のCS1をPXA250のnSDCS1端子にジャンパ接続
  • 以下のコマンドを実行し、ほぼ全てのメモリを使い切ってゆく様子を「システム情報」で観察した
dd </dev/urandom >/dev/null count=1 bs=110M

128MB化の軌跡 (未整理)

  • カーネル起動中にこける
    • シリアルデバッグ環境が無いのでprintk()にウェイトを挿入してコンソールメッセージのスクロール速度を落として観察した
    • init 2.78の起動メッセージの後に以下のいずれかの不具合が発生する。それぞれの再現条件は今のところ規則性がないように見える
      • Unable to handle kernel paging request at virtual address 0x00004004
      • Unable to handle NULL pointer dereference at virtual address 00000000
      • "Segmentation fault"が2-3行続いた後 ERROR: launch.conf -- can not open file…
      • /etc/rc.d/rc.sysinit: line 107: 38 Segmentation fault dd if=/dev/zero of=/dev/ram1 bs=1024 count=64 2>/dev/null >/dev/null
    • ページテーブルの設定の問題ではないかと思い、シャープのパッチ中で"pg"や"page"というキーワードを検索して怪しいコードを探したが、ピックアップしたコードの容疑が次々晴れてしまい収穫なし
  • ハード的な動作が怪しい
    • ブート直後(MMU、スタック設定前)にメモリの後半64MBに対して0xa5a5a5a5, 0x5a5a5a5a, 0x00000000の各値の連続書込/読み出しには成功した
    • CS1配線のアナログ的品質が不十分ではないかと疑い、SDRAMへの供給クロックを半分の50MHzに落としてみた(MDREFRのK1DB2を1に変更)が、挙動変わらず
    • CS0領域とCS1領域に交互にビット反転パターンを書き込んで負荷をかけるとエラーが発生するかもしれない。未テスト。
    • 2003/04/23 追記
    • やはりハードが怪しい。OpenZaurus環境で何回か起動を試みたが、再現性のないSEGVやIllegal Instruction等が発生し、時々はrootでログインできるところまで行く。uname -aした時の文字化けパターンからアドレスが正しく入力できてない(間に合ってない)気がする

      • 2003/04/24 追記
      • ちょっとハズレ。SDRAMの後半64MB部分(内部的に別チップとして扱われている部分)のSDRAM初期化プロセスが正しく行われていなかった。詳しくはMRS(Mode Register Set)コマンドの発行部分のコードにバグがあり、コマンドが発行されていなかった。これにより正常動作していなかった。

  • これから切り分ける容疑
    • ハード(nSDCS1→CS1配線)のアナログ的品質が不十分では?
    • 今のところこれが一番疑わしい。

    • 後半64MBがページテーブルに設定されていないのでは?
    • ページテーブル初期化後に後半64MB全域にアクセスしてみる。arch/arm/mm/init.cあたり

      • 別の切り分けテストから、とりあえずの疑いは晴れた
    • SDRAMのCS1パーティションの初期化が不十分では?
    • ブートローダがCS0パーティションに対して行ったはずのpowerup sequenceをCS1にも行ってみる。プリチャージ、auto refresh、MRSの各コマンド発行

      • やってみたが挙動は変わらなかった

関連情報

デバイス

作業手順

SDRAMチップ取り

e550GXから512Mbitチップを取り外す

リボール (reball)

  • 総所要時間
  • SDRAMチップ2個分のリボール作業にかかる時間は以下の通り。ただし再融解が不要な場合

チップのクリーニング20分
Solderquik BGA preformを使ったハンダボール装着32分
洗浄42分
仕上げ31分
合計2時間5分
  • チップのクリーニング (所要時間: 2つで20分)
    • ハンダごてで糸ハンダを融かしながら端子面をなぞり、大まかにハンダを除去する
    • チップを台紙(A4コピー用紙)の上に置き、ヒートガンで強制乾燥させる。110℃で3分程度
    • フラックスと除去剤。以後の工程で多用する
  • Solderquik BGA preformを使ったハンダボール装着 (所要時間: 2つで32分)
    • 本来の手順ではReball_Quick_Guideにあるように、preformとBGAチップを型枠(fixture)にセットしてリフローするが、今回使うSDRAMチップの寸法のpreformは特注品になってしまうので、少々荒っぽい方法で作業を行う
    • Reball_Instruction_Manualは一通り目を通した方がよい。作業時のチップの取り扱いについて重要な事項が書いてある(220℃以上に熱するな、ブラッシング時にチップの背に指をあてて支持しろ、等々)
    • これがパッケージ。添付されている説明書に従って開ける
    • CSP54パッケージにちょうど合う品種は標準品に無いため、81端子チップ用の中3列のハンダボールを外して使う (所要時間: 2つで14分)
      • 竹串の先をカッターで細く削って、裏側からハンダボールを押し出して外す
      • preformの一辺を指で少しだけ持ち上げ、対辺は台紙(A4コピー用紙)に接するようにする。preformは薄焼ウェファーのような脆いものなので一箇所に力をかけて割ってしまわないようにする
      • 外したハンダボールはリペア用(for repair)に保存しておく。小さめのポリエチレン密封パックに入れる
      • 余分なハンダボールは必ず外しておく。残しておくとパッドのある部分のボールがうまく融着しない
    • SDRAMチップにpreformをセットする (所要時間: 3分×2)
      • フラックスを3回重ね塗りし、3分程放置して生乾き状態にする
      • preformを載せ、竹串で位置を整える。SDRAMチップに見えている配線パターン等を位置合わせの目印にする。短辺側は余白が等間隔になるように合わせればOK
      • 位置が合ったら、preformを軽く押し付けて固定する。ハンダボールがフラックスで粘着する感じに
    • リフロー (所要時間: 6分×2)
      • 以下の方法はReball_Instruction_Manualで「良くない」と書かれているが、後述の方法で問題ないレベルまでハンダボールの品質を上げる事ができる
      • 台紙(A4コピー用紙)の上にpreformを上に向けてSDRAMチップを置く
      • Linuxザウルス開発メモ/ハードウェア/BGAリワークの「ヒートガンの扱い」に書いた手順に従ってハンダボールを融着させる
      • 温度プロファイルはSDRAMチップ取り外し時のものと同じ
      • リフローが終わるとpreformが焼けて茶色に変色する
      • 5分程放置して冷ましてから次の作業に進む
  • 洗浄 (所要時間: 2つで42分)
    • 乾燥(1)までの所要時間: 16分×2
    • preformに精製水を吸収させる (soak)
      • 耐水フィルム上にSDRAMチップを置く
      • 精製水を数滴垂らし、1〜2分待つ
      • 水が浸透して白い箇所が無くなってきたら除去作業に移る
    • preformを大まかに除去する
      • 先を細く削った竹串で端から剥がしてゆく
      • うまく形の残ったままある程度剥がせたら、めくり上げた部分をベントニードルプライヤでつまんで剥がす。精密ピンセットでも可
      • 決して金属製の工具で直接ハンダボールやチップに触れてはいけない。機械的ダメージが加わってしまうので
      • ハンダボールが融着してない箇所があっても、後述の手順で修復できるのでそのまま作業を進める
      • 時々精製水で洗いながら竹串でカスを取り、大まかに除去された状態にする
    • 洗浄(1)
      • 使い捨てコップを2つ用意し、両方にブラシが洗える程度の量の精製水を入れておく
      • Reball_Instruction_Manualに従ってチップ上に残ったpreformのカスとフラックスを除去する
      • 1つ目のコップでブラシを洗いながら、目視で確認できる程度のカスが無くなるまでクリーニングする
      • 時々チップに精製水の水流を当て、洗い流しながらブラッシングする
      • チップの背に指をあてて支持し、機械的負荷がかからないようにする
      • ブラシの動かし方はReball_Instruction_Manualに従う事。90度づつ回転させながら1方向にブラシを走らせるが、ブラシの先端がチップに当たる角度を「ボールの根本」「真上」「ボールの根本(反対側)」の3通りに変えつつ、それぞれ何セットかこなしてから90度回転させる
      • ブラッシング時のイメージとして、歯磨きで歯垢除去を完璧に行うような感じでピカピカに磨き上げる
    • 洗浄(2)
      • 2つ目のコップで徹底的にクリーニングする
      • 1つ目のコップからチップとブラシを持ってくる時、両者とも精製水の水流でよく洗っておく。ブラシは共用ではなく2本用意した方が理想的
      • ハンダボールの根本に残っているフラックスを全部こそぎ取るように、ブラシの角度を変えながら磨き上げる
      • 頻繁にブラシとチップを精製水で洗い流しながら作業を行う
    • 乾燥(1) (所要時間: 6分×2)
      • チップを台紙(A4コピー用紙)の上に置き、ヒートガンで長めに強制乾燥させる。110℃で5分程度
      • 決して紙や布で直接水分を拭き取ってはいけない
  • 仕上げ (所要時間: 2つで31分)
    • クリーニング (所要時間: 2つで15分)
      • 乾燥したチップをフラックス除去剤でクリーニングする
      • 4つに折ったティッシュの上にチップを置き、フラックス除去剤の滴を表面張力が働くまで何回かつけ、ボールが浸された状態にする
      • チップの一辺を持ち上げて余分なフラックス除去剤をティッシュに吸収させる
      • フラックス除去剤をたっぷり含ませた刷毛(キャップに付いているもの)を使ってチップの裏面とハンダボールを一方向にブラッシングする
      • 水洗いの時と同様にハンダボールの3方向にブラシをあてる
      • 余分なフラックス除去剤をティッシュに吸い込ませながら洗い流す
      • 水洗いの時と同様にチップを90度回転させながら、全体をクリーニングする
      • 綿棒は使ってはいけない。繊維がハンダボールにからまってしまうので
    • 乾燥(2) (所要時間: 6分×2)
      • 乾燥(1)と同様にチップを乾燥させる
      • 乾燥が終わったら、ハンダボールの状態を確認する。パチンコ玉のように綺麗な球形で全体が金属光沢に包まれていて、チップ上の金属パッドがボールで隠れて完全に見えない状態ならOK。そうでない場合は後述の再融解で直す。以下の写真は両方とも悪い状態。良い状態については「再融解」にあるPXA250の写真を参照
    • フラックス塗布 (所要時間: 2つで4分)
      • 丁寧に3回重ね塗りする
      • 10分程自然乾燥させる。ヒートガンで強制乾燥させてはいけない。風圧でフラックスが端に押し流されてしまうので
      • 乾燥(2)の段階でハンダボールの状態が良好だった場合は、ここで作業完了
  • 再融解
    • 上記の「リフロー」からの手順を再度行う事で、ハンダボールの品質を上げる
    • ハンダボールが欠損している場合は、予備のハンダボールをここで装着する
      • 耐水フィルム上にフラックスを一滴垂らす
      • 上記のフラックスの中にハンダボールを1個の全体を浸す
      • 先を細く削った竹串で上記のハンダボールをちょっと横に引き出してフラックスを切り乾きかけの状態にする
      • 少し粘着力が出てくるので竹串の先にくっつけてチップ上の金属パッドに置く
      • フラックスの粘着力で軽く固定された状態にする
    • 以下はPXA250での作業例。リンク先の画像は特大サイズ(2048×1536)なので注意
    • 悪い状態。ハンダボールに光沢が無く、いびつな形をしている。右下にハンダボールの欠損もある
    • フラックスを塗布。欠損箇所にハンダボールを置いた
    • 再融解後。パチンコ玉のように綺麗な球形で全体が金属光沢に包まれている
      • 綿棒でクリーニングしてみたが、写真のように繊維が絡みつくので良くない
      • 欠損していたハンダボールも再生しているが、他のボールに比べてなぜか小さい(融着しなかったボールを再度置いただけなのでサイズは同じはず)。基板側の端子に予備ハンダを半球状に盛り上げておく事で対応した
    • 再度フラックスを塗布
      • 上部のやや右寄りの部分にフラックスが厚く溜ってしまっているが、これは多すぎであまり良くない状態。どうしても溜りやすい箇所ができてしまうが、なるべく均一に塗布できるように塗り方を工夫する

C700の分解、基板の剥き出し

  • TODO: 所要時間を計測する
  • 液晶につながっているフレキケーブル(flexible cable)を外す
    • 2本重なっているので、外側のケーブルから外す
    • コネクタの留め具(茶色の部分)は上に跳ね上げるタイプ。爪先でひっかけて上に跳ね上げる
    • ケーブルの根本両脇にタブが形成されているので、そことコネクタの間に極細マイナスドライバを入れて少しづつ外側に押し出して外す。片側をちょっと押し出したら反対側を押し出し、それを繰り返す
  • 液晶につながっているワイヤをハンダごてで取り外す
  • CFスロット内保護フィルムの除去
    • まず金属カバーを外す
      • コネクタ両脇のネジを外す
      • 4箇所ある基板上の穴にツメがハンダづけされているので、全部ハンダ吸い取り線を使って外す
    • フィルムの除去
      • CPU、SDRAMのシールドと一体になっているので、CPU側からベリベリと剥がしてゆく
      • 銅箔部分が基板の両面でハンダづけされているので外す
    • CFスロット内保護フィルムを外したら、金属製のCFスロットカバーを軽くはめ直しておく。作業時の支えにするため
  • CFスロット以外のフィルム類も耐熱性は無いので全て外しておく
  • SDスロットの上部カバーも熱で変形してしまうので外しておく
  • ジョグ(jog dial)も加熱時にハンダが融けて自重で落ちてしまうので、紙等で支えを作っておくと良いかもしれない

C700のSDRAMチップ除去

  • 総所要時間
  • SDRAMチップ2個分の除去作業にかかる時間は以下の通り。

SDRAMチップを外す12分
冷却10分
ハンダ除去5分
フラックス除去7分
強制乾燥5分
合計39分
  • 冷却 (所要時間: 5分×2)
  • 1個外すたびに5分間自然冷却する

  • ハンダごてで糸ハンダを融かしながら基板上の端子をなぞり、大まかにハンダを除去する (所要時間: ハンダ吸収まで含めて2つで5分)
    • この状態では端子上にわずかにハンダが盛り上がっている
    • 除去後は以下の写真のようになる。端子の状態がわかりやすいようにフラックスを除去してある
  • 綿棒にフラックス除去剤を染み込ませ、軽くこすって基板上のフラックスを拭き取る。大まかに拭き取った後、新しい綿棒に替えて再度拭き取る (所要時間: 2つで7分)
  • フラックス除去後の基板をヒートガンで強制乾燥させる (所要時間: 2つで5分)
    • 110℃で2分程度
    • 細口ノズルでSDRAM端子直上1.5cmから局所的に熱風を当てる
    • 2つのSDRAM端子をそれぞれ別々に乾燥させる。内側→外側の順で
    • この後3分程自然冷却し、続く工程のフラックス塗布に移る。途中に休憩等を挟んで時間を置かない事

512Mbitチップのハンダづけ

  • 総所要時間
  • SDRAMチップ2個分のハンダづけ作業にかかる時間は以下の通り。

フラックス塗布19分
位置合わせ10分
リフロー12分
冷却10分
LEDライトを使った目視検査4分
電圧測定による動作確認4分
合計59分
  • 一度に2個のSDRAMチップをハンダづけせず、一個づつ2回に分けて行う。内側→外側の順で
  • フラックス塗布 (所要時間: 2つで19分)
    • 基板上のSDRAM端子に丁寧に3回重ね塗りする。端子が十分フラックスでカバーされるよう、2mm程外側まではみ出して塗布する
    • 3分程自然乾燥させる。ヒートガンで強制乾燥させてはいけない。風圧でフラックスが端に押し流されてしまうので
    • 1個目のSDRAMチップをハンダづけする時にも2つのSDRAMチップの端子両方にフラックスを塗布する。端子を酸化から保護するため (所要時間: 4分)
    • 2個目のSDRAMチップをハンダづけする時は、以下の手順で再度塗布する (所要時間: 15分)
      • フラックス除去 3分
      • ヒートガンによる強制乾燥 110℃で2分
      • 自然冷却 3分
      • フラックス塗布 4分
      • 自然乾燥 3分
  • クリームハンダを塗布してはいけない (Don't apply solder paste!)
  • 素人BGAリワークの最重要ノウハウ。通常BGAのハンダ付けではクリームハンダを端子に塗布するが、個人レベルの作業では塗布しない方がうまく行く。以下のような理由による

    • 一発で正確な位置合わせを行うのが難しい
    • 一度基板上にチップを置いてから位置合わせを行う事になる。このため、クリームハンダが塗布してあるとそれが塗り広げられてハンダブリッジの原因になる

    • クリームハンダを塗布すると位置合わせ精度への要求が厳しくなる
    • クリームハンダは熱すると表面張力が落ちて平面的に広がるのに加え、フラックスが混入されているので融解時に近くのハンダと結合する力が大きい。このため位置合わせを正確に行わないとハンダブリッジを誘発する触媒になってしまう。これに対して、基板上の予備ハンダは強い表面張力で端子のパッド内に留まっているため、ブリッジを誘発せず位置合わせマージンを大きくできる

    • クリームハンダを精度良く塗布する事が難しい
    • 一つ一つの端子に竹串等で塗布しても精度が出ないのでハンダブリッジや接続不良の原因になる。ステンシルを使った塗布が一般的だが、CSP54パッケージ用には安価な使い捨てステンシルが存在しない

  • 位置合わせ (所要時間: 5分×2)
    • SDRAMチップを裏向きにして基板上の金属パッドの並びに縦軸・横軸それぞれ当てがい、チップの端が基板上のどこに位置するのが正しいか記憶する (TODO: 写真追加)
    • 記憶した縦・横の位置に大まかに合わせてSDRAMチップを基板上にそっと置く。フラックスが剥がれるので上から押し付けない事
    • 基板上の位置合わせガイド(線や矩形になっている銅剥き出しのパターン)を頼りに、竹串を使って正しい位置にチップを合わせる
    • LEDライトでチップの一辺と基板上のガイドの間を照らし、その間隔が対辺のそれと等しくなっている事を確認する (TODO: 写真追加)
    • 正しい位置にセットできたら、上からそっとチップ全体をなぞり、基板に押し付ける。フラックスの粘着力で軽く固定される程度でよい
    • 少々の位置ずれはセルフアライメント効果で自動的に修正される
    • 最後にQFPチップ(SHARP SIL50752F)を爪先で5回コンコンと叩き、アライメントさせる
    • 1個ハンダづけする毎に冷却と以下の各種検査を行う
  • 冷却 (所要時間: 5分×2)
  • 5分間自然冷却する

  • LEDライトを使った目視検査 (所要時間: 2分×2)
  • 横から照らし、ハンダボールの欠損が無いか確認する。ブリッジが発生している場合、端子の位置にハンダボールが無くなっている場合がある。内側の端子は確認できないので、大きな失敗を発見するのが目的。明らかに失敗していたらチップを除去して作業をやり直す

  • 電源端子間の導通試験 (所要時間: すぐ)
    • 電池、ACアダプタとも接続しない状態で以下の写真のパッドにテスタ棒を当て、電源(VDD-VSS間)がショートしていない事を確認する
  • 電圧測定による動作確認 (所要時間: 2分×2)
    • メイン基板単体のまま、ACアダプタのみを接続して電圧を確認する
    • 1個ハンダづけする毎に確認する事
    • 以下の写真のパッドにテスタ棒を当て、電圧を測定する。正常動作していれば3.3Vが出ているはず
    • 電圧に異常(mV単位しか出ない等)があればハンダづけ失敗なので、チップを除去して作業をやり直す
    • CS1がオープンなまま(内部でプルダウンされてアクティブなまま)電源を入れるので内部的に安全回路無しで出力が衝突している可能性がある(CS1未配線では起動しない事は確認済)。心配ならCS1をプルアップしてから測定する。ヒートガンを当てる時にはまた外す

CS1配線

  • TODO: 所要時間を計測する

SDRAMチップの後半領域を利用可能にするため、CS1(Chip Select 1)をジャンパ配線する

  • PXA250のnSDCS1とSDRAMチップのCS1を接続する
  • PXA250からはnSDCS1が基板裏側まで引き出され、ランドが設けてあるのでそこにジャンパ線をハンダづけする
  • SDRAMチップからもCS1がチップ脇まで引き出されランドが儲けてあるので、そこにジャンパを配線する
  • 写真では普通の複芯線で配線してあるが、厚みがあるためCF type2カードと干渉してしまう。以下のような代替手段が必要
    • ポリウレタン線等の細い線材で配線する
    • フレキシブルケーブル(のジャンク)で配線する
  • 電源LEDによる動作確認
    • SDRAMチップを2つとも実装してCS1を配線した後、ACアダプタを接続し電池蓋ロックのボタンを押してリセットすると数秒で電源LEDの点滅が始まる。この制御はCPUによって行われているので、正常動作の証となる。SDRAMのハンダづけが2つとも成功していないと点滅は始まらない
    • 上記の電源LED点滅が確認できたら、配線等を元に戻して組み上げる

カーネル改変

ブート直後のレジスタ設定変更

  • ブートローダによって設定されているXScaleのMDCNFGレジスタ(SDRAM設定)とMDREFRレジスタ(リフレッシュ設定)を増設したメモリに合わせて変更する。本来はカーネルで変更するようなものではないが、ブートローダは書き換え不能なP2ROMに収納されているしソースも無いので手が出せない。grubのような2段目ブートローダを導入して書き換えるのが理想的だが、大変なのでお手軽にカーネルに仕込む事にする
  • MDCNFG, MDREFRともメモリマップドレジスタなので設定変更コードはCで書きたいところだが、ブート直後でスタックが未設定のためコンパイラの吐いたコードは直接呼び出せない。このためコンパイラの吐いたコードを手で修正して取り込んだ
  • -yk3パッチで512Mbit SDRAMのCS1領域に対してSDRAMの初期化シーケンスを実行するようにした。これにより128MB化の際の動作不良が解消した。P2ROMに内蔵されているブートローダは32MBのSDRAMが搭載されている事を前提にしているのでこの領域の初期化を行っていない
      • ecos/packages/hal/arm/xscale/mpc50/current/include/hal_platform_setup.h
      • ecos/packages/hal/arm/xscale/uE250/current/include/hal_platform_setup.h
    • NetBSDのソースも見てみたかったが、何となくライセンス的に気持ち悪くなりそうな気がした(丸写しに近いコードになりそう)のでやめておいた。非GPLなソースを参考にする際のガイドライン的な資料をご存じの方は教えて下さい
--- linux-c700-b500-20021214-rom1_00.orig/arch/arm/kernel/head-armv.S	Thu Aug 29 12:27:20 2002
+++ linux-c700-b500-20021214-rom1_00/arch/arm/kernel/head-armv.S	Sun Apr 13 08:25:29 2003
@@ -145,6 +145,9 @@
 		teq	r7, #0				@ invalid architecture?
 		moveq	r0, #'a'			@ yes, error 'a'
 		beq	__error
+#if defined(CONFIG_PXA_CORGI_128MB) || defined(CONFIG_PXA_CORGI_64MB)
+		bl      cpu_xscale_sl_modify_sdram_config
+#endif
 		bl	__create_page_tables
 		adr	lr, __ret			@ return address
 		add	pc, r10, #12			@ initialise processor
--- linux-c700-b500-20021214-rom1_00.orig/arch/arm/mach-pxa/sharpsl_suspend.S	Tue Jan 14 12:07:55 2003
+++ linux-c700-b500-20021214-rom1_00-yk3/arch/arm/mach-pxa/sharpsl_suspend.S	Sun Apr 27 13:54:40 2003
@@ -43,6 +43,24 @@
 
 #include "sharpsl_param.h"
 
+
+#define PXA_PHYS_MD_BASE 0x48000000
+#define CORGI_PHYS_DISABLED_SDRAM 0xac000000
+#define PXA_MDCNFG_ORG_MASK 0xff
+#define PXA_MDREFR_DRI_SHIFT 12
+
+#if defined(CONFIG_PXA_CORGI_128MB)
+#define PXA_MDCNFG_ORG 0xCB
+#define PXA_MDREFR_DRI 0x17
+#elif defined(CONFIG_PXA_CORGI_64MB)
+#define PXA_MDCNFG_ORG 0xC9
+#define PXA_MDREFR_DRI 0x17
+#else
+#define PXA_MDCNFG_ORG 0xA9
+#define PXA_MDREFR_DRI 0x27
+#endif
+
+
 /* 
  * cpu_pxa_do_suspend()
  * 
@@ -1047,6 +1068,37 @@
  		
  	.align 5
  	.text
+ENTRY(cpu_xscale_sl_modify_sdram_config)
+	mov     r2, #PXA_PHYS_MD_BASE
 
-	
-		
+	ldr     r3, [r2, #MD_MDCNFG]
+	bic     r3, r3, #PXA_MDCNFG_ORG_MASK
+	orr     r3, r3, #PXA_MDCNFG_ORG
+	str     r3, [r2, #MD_MDCNFG]
+	ldr     r3, [r2, #MD_MDCNFG]
+
+	ldr     r3, [r2, #MD_MDREFR]
+	mov	r3, r3, lsr #PXA_MDREFR_DRI_SHIFT  @clear DRI(1)
+	mov	r3, r3, lsl #PXA_MDREFR_DRI_SHIFT  @clear DRI(2)
+	orr     r3, r3, #PXA_MDREFR_DRI
+	str     r3, [r2, #MD_MDREFR]
+	ldr     r3, [r2, #MD_MDREFR]
+
+        @power-up sequence to initialize CS1 partition of the SDRAM
+	ldr     r2, =CORGI_PHYS_DISABLED_SDRAM
+	str     r3, [r2]  @issue Precharge All and Auto Refresh #1
+	str     r3, [r2]  @issue Auto Refresh #2
+	str     r3, [r2]  @issue Auto Refresh #3
+	str     r3, [r2]  @issue Auto Refresh #4
+	str     r3, [r2]  @issue Auto Refresh #5
+	str     r3, [r2]  @issue Auto Refresh #6
+	str     r3, [r2]  @issue Auto Refresh #7
+	str     r3, [r2]  @issue Auto Refresh #8
+
+        @issue MRS command to the SDRAM including partition 1
+	mov     r2, #PXA_PHYS_MD_BASE
+	@ldr     r3, [r2, #MD_MDMRS]
+	mov     r3, #0  @some MRS field is overridden by MDCNFG value
+	str     r3, [r2, #MD_MDMRS]
+
+	mov	pc, lr

memory information設定変更

Linuxカーネルが認識するメモリ容量を変更。神木さんのメモを参考にした。

--- linux-c700-b500-20021214-rom1_00.orig/arch/arm/mach-pxa/corgi.c	Tue Jan 14 12:07:55 2003
+++ linux-c700-b500-20021214-rom1_00-yk3/arch/arm/mach-pxa/corgi.c	Sun Apr 27 13:34:52 2003
@@ -258,7 +258,17 @@
 fixup_corgi(struct machine_desc *desc, struct param_struct *params,
 		char **cmdline, struct meminfo *mi)
 {
-	SET_BANK (0, 0xa0000000, 32*1024*1024);
+	u32 corgi_ram_size;
+
+#if defined(CONFIG_PXA_CORGI_128MB)
+	corgi_ram_size = 128;
+#elif defined(CONFIG_PXA_CORGI_64MB)
+	corgi_ram_size = 64;
+#else
+	corgi_ram_size = 32;
+#endif
+
+	SET_BANK (0, PHYS_OFFSET, corgi_ram_size * 1024 * 1024);
 	mi->nr_banks      = 1;
 #if defined(CONFIG_BLK_DEV_INITRD)
 	setup_ramdisk (1, 0, 0, 8192);
@@ -271,7 +281,7 @@
 #ifdef CONFIG_SHARPSL_BOOTLDR_PARAMS
 	if (params->u1.s.page_size != PAGE_SIZE) {
 	    params->u1.s.page_size = PAGE_SIZE;
-	    params->u1.s.nr_pages = 32 * 1024 * 1024 / PAGE_SIZE;
+	    params->u1.s.nr_pages = corgi_ram_size * 1024 * 1024 / PAGE_SIZE;
 	    params->u1.s.ramdisk_size = 0;
 	    params->u1.s.flags = FLAG_READONLY | FLAG_RDLOAD | FLAG_RDPROMPT;
 	    params->u1.s.rootdev = ROOT_DEV;

FCS(Frequency Change Sequence)まわり

クロック変更時に実行されるFCSまわりのコードでMDCNFG, MDREFRの値がハードコーディングされている。これをメモリ容量の設定に応じた値に変更した。

--- linux-c700-b500-20021214-rom1_00.orig/arch/arm/mach-pxa/sharpsl_suspend.S	Tue Jan 14 12:07:55 2003
+++ linux-c700-b500-20021214-rom1_00-yk2/arch/arm/mach-pxa/sharpsl_suspend.S	Thu Apr 17 01:13:37 2003
@@ -43,6 +43,23 @@
 
 #include "sharpsl_param.h"
 
+
+#define PXA_PHYS_MD_BASE 0x48000000
+#define PXA_MDCNFG_ORG_MASK 0xff
+#define PXA_MDREFR_DRI_SHIFT 12
+
+#if defined(CONFIG_PXA_CORGI_128MB)
+#define PXA_MDCNFG_ORG 0xCB
+#define PXA_MDREFR_DRI 0x17
+#elif defined(CONFIG_PXA_CORGI_64MB)
+#define PXA_MDCNFG_ORG 0xC9
+#define PXA_MDREFR_DRI 0x17
+#else
+#define PXA_MDCNFG_ORG 0xA9
+#define PXA_MDREFR_DRI 0x27
+#endif
+
+
 /* 
  * cpu_pxa_do_suspend()
  * 
@@ -840,8 +859,8 @@
 	
 MD_BASE:	.word	io_p2v(0x48000000)
 CodeOnCacheAdr:	.word	CodeOnCache
-MDCNFG_ValAdr:	.word	0x01A819A9
-MDREFR_ValAdr:	.word	0x000BC027
+MDCNFG_ValAdr:	.word	0x01A81900 | PXA_MDCNFG_ORG
+MDREFR_ValAdr:	.word	0x000BC000 | PXA_MDREFR_DRI
 CCCR_ValAdr:	.word	0x00000145
 MSC0_ValAdr:	.word	0x7ff03DD8
 MSC1_ValAdr:	.word	0x2274225C
@@ -898,9 +917,9 @@
  	.text
 
 CodeOnCacheAdr_100:	.word	CodeOnCache_100
-MDCNFG_ValAdr_100:	.word	0x01A81AA9
+MDCNFG_ValAdr_100:	.word	0x01A81A00 | PXA_MDCNFG_ORG
 @@MDREFR_ValAdr_100:	.word	0x0009C02F
-MDREFR_ValAdr_100:	.word	0x0009C027
+MDREFR_ValAdr_100:	.word	0x0009C000 | PXA_MDREFR_DRI
 CCCR_ValAdr_100:	.word	0x00000241
 MSC0_ValAdr_100:	.word	0x7ff01888
 MSC1_ValAdr_100:	.word	0x1244123C
@@ -942,9 +961,9 @@
 	
 LCCR3VALUE_121:		.word	0x04000007
 CodeOnCacheAdr_121:	.word	CodeOnCache_121
-MDCNFG_ValAdr_121:	.word	0x01A81AA9
+MDCNFG_ValAdr_121:	.word	0x01A81A00 | PXA_MDCNFG_ORG
 @@MDREFR_ValAdr_121:	.word	0x0009C02F
-MDREFR_ValAdr_121:	.word	0x0009C027
+MDREFR_ValAdr_121:	.word	0x0009C000 | PXA_MDREFR_DRI
 CCCR_ValAdr_121:	.word	0x00000121
 MSC0_ValAdr_121:	.word	0x7ff01888
 MSC1_ValAdr_121:	.word	0x1244123C
@@ -993,8 +1012,8 @@
 LCCR3VALUE_145:		.word	0x0400000C
 CodeOnCacheAdr_145:	.word	CodeOnCache_145
 CCCR_ValAdr_145:	.word	0x00000145
-MDCNFG_ValAdr_145:	.word	0x01A819A9
-MDREFR_ValAdr_145:	.word	0x000BC027
+MDCNFG_ValAdr_145:	.word	0x01A81900 | PXA_MDCNFG_ORG
+MDREFR_ValAdr_145:	.word	0x000BC000 | PXA_MDREFR_DRI
 MSC0_ValAdr_145:	.word	0x7ff03DD8
 MSC1_ValAdr_145:	.word	0x2274225C
 MSC2_ValAdr_145:	.word	0x7FF024F4

レジューム (resume)

以下のコメントにあるように、レジューム時にはカーネルの制御下を離れたブートローダ(ファームウェアと呼んだ方が適切だと思うが)上のコードが実行されている。その中でMDCNFGがハードコーディングされているのではないかと予想し、

  • arch/arm/mach-pxa/sleep.S
/*
 * cpu_pxa_resume()
 *
 * entry point from bootloader into kernel during resume
 *
 * Note: Yes, part of the following code is located into the .data section.
 *       This is to allow sleep_save_sp to be accessed with a relative load
 *       while we can't rely on any MMU translation.  We could have put
 *       sleep_save_sp in the .text section as well, but some setups might
 *       insist on it to be truely read-only.
 */

	.data
	.align 5
ENTRY(pxa_cpu_resume)

ここにSDRAM設定の修正を突っ込めばレジュームが動作するようになるのではないかと思って以下のようにcpu_xscale_sl_modify_sdram_config()を呼び出すようにしてみたが、動作しなかったのでコメントアウトしてある。この追求は後回し。128MB化が先。

--- linux-c700-b500-20021214-rom1_00.orig/arch/arm/mach-pxa/sleep.S	Mon Aug 26 15:01:51 2002
+++ linux-c700-b500-20021214-rom1_00/arch/arm/mach-pxa/sleep.S	Sun Apr 13 08:41:24 2003
@@ -104,6 +104,9 @@
 	mov	r0, #I_BIT | F_BIT | MODE_SVC	@ set SVC, irqs off
 	msr	cpsr_c, r0
 
+#if defined(CONFIG_PXA_CORGI_128MB) || defined(CONFIG_PXA_CORGI_64MB)
+@	bl      cpu_xscale_sl_modify_sdram_config
+#endif
 	ldr	r0, sleep_save_sp		@ stack phys addr
 	ldr	r2, =resume_after_mmu		@ its absolute virtual address
 	ldmfd	r0, {r4 - r9, sp}		@ CP regs + virt stack ptr
  • 2003/04/17追記
  • brendanさんの指摘により、問題は解決した。上記の推理と対策は正しかったのだが、pxa_cpu_resume()と同等の機能を実装したcpu_pxa_resume()が存在し、実際のレジューム時にはそちらが使われているのでSDRAM設定の修正が実行されていなかった。見事に罠にはまってしまっていた。

    • arch/arm/mach-pxa/sharpsl_suspend.S
 ENTRY(cpu_pxa_resume)
 
 
+#if defined(CONFIG_PXA_CORGI_128MB) || defined(CONFIG_PXA_CORGI_64MB)
+	bl      cpu_xscale_sl_modify_sdram_config
+#endif
 	ldr     r3, sleep_param_p			@ Sleep mode information data structure
 	mov		r0, r3
 

配布物

おまけ: CPU換装

換装

  • Genio e550GXに搭載されているPXA250を剥がしてリボール、C700に搭載した。動作に問題なし
  • 目的は128MB化に必要なnSDCS1端子を引き出す事。隠れている配線を追うために一旦CPUを剥がす
  • 二次的な目的として、PXA255が入手できたら換装したいのでその練習

CS1を求めて

  • nSDCS1は基板裏側まで引き出され、ランドが設けてあった
  • というわけで、そのランドから容易にSDRAMのCS1まで配線できた

FAQ

項目追加お願いします。こちらで気付かない項目もあるので。こちらで調整するんでホントに適当でOKです。

TODO

写真撮影

  • SDRAMチップをバキュームピックアップで取り外しているところ
  • 位置合わせ
    • SDRAMチップを裏向きにして基板上の金属パッドの並びに縦軸・横軸それぞれ当てがい、チップの端が基板上のどこに位置するのが正しいか記憶する
    • LEDライトでチップの一辺と基板上のガイドの間を照らし、その間隔が対辺のそれと等しくなっている事を確認する

所要時間計測

  • C700の分解、基板の剥き出し
  • CS1配線

改造オフ

ノウハウの交換(と祭)。みんなでやれば怖くない。ただしあくまでも自己責任で。

  • 部品調達
  • Linuxザウルス開発メモ/ハードウェア/共同購入でSDRAMチップとPXA255共同購入を試みましたが、SDRAMの方は通常ルートではダメでした。Genio e550GXを潰して128MB化しようという方はいませんか? 伝統工芸の後継者が見つからないような寂しさを感じます。

  • 参加者いるの?
  • 「もしやるなら参加したい」という方は下のコメント欄にアピールして下さい

  • 作業場所確保
  • 都内で電源が確保でき、工作しても文句の出ない場所

WANTED

NetBSDのソースも見てみたかったが、何となくライセンス的に気持ち悪くなりそうな気がした(丸写しに近いコードになりそう)のでやめておいた。非GPLなソースを参考にする際のガイドライン的な資料をご存じの方は教えて下さい

コメント

お名前: コメント: 更新