ユーザ用ツール

サイト用ツール


ハイハイスクールアドベンチャー_picocalc版

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
ハイハイスクールアドベンチャー_picocalc版 [2025/04/04 12:37] – [LovyanGFX] arakiハイハイスクールアドベンチャー_picocalc版 [2025/04/04 13:56] (現在) – [LovyanGFX] araki
行 98: 行 98:
 なるほど。 なるほど。
 そんなわけで、懸命に SPI 周りをきれいにする方法を模索して、あれこれやってみたが全く解決しない。 そんなわけで、懸命に SPI 周りをきれいにする方法を模索して、あれこれやってみたが全く解決しない。
 +((AIのいうことを鵜吞みにするとは、お前はバカか?でも、らびやんさんとわたしとだったらわたしの仕業の方がずっとありそうじゃん!!))
  
 結局最初に排除した「_spi_regsの未初期化」の可能性を考慮して、コードの修正を行うと、あっさり動いた。 結局最初に排除した「_spi_regsの未初期化」の可能性を考慮して、コードの修正を行うと、あっさり動いた。
行 104: 行 105:
  
 電源OFF/ONの時はたまたま動く場合と、そうでない場合とがあったということなのだろう。 電源OFF/ONの時はたまたま動く場合と、そうでない場合とがあったということなのだろう。
 +
 +<code cpp Bus_SPI.cpp.diff>
 +--- Bus_SPI.cpp.orig    2024-11-22 16:12:20.561052300 +0900
 ++++ Bus_SPI.cpp 2025-04-04 16:13:20.533910740 +0900
 +@@ -60,14 +60,14 @@
 +       return false;
 +     }
 +
 +-    uint32_t temp = _spi_regs->cr0 & ~(SPI_SSPCR0_SCR_BITS | SPI_SSPCR0_DSS_BITS);
 +-    _clkdiv_write |= temp;
 +-    _clkdiv_read  |= temp;
 +-
 +     // DCピンを出力に設定
 +     lgfxPinMode(_cfg.pin_dc, pin_mode_t::output);
 +     _spi_regs = reinterpret_cast<spi_hw_t *>(_spi_dev[_cfg.spi_host]);
 +
 ++    uint32_t temp = _spi_regs->cr0 & ~(SPI_SSPCR0_SCR_BITS | SPI_SSPCR0_DSS_BITS);
 ++    _clkdiv_write |= temp;
 ++    _clkdiv_read  |= temp;
 ++
 +     int dma_ch = dma_claim_unused_channel(true);
 +     _dma_ch = dma_ch;
 +     if (dma_ch >= 0)
 +</code>
 +
 +なお、この変更は、[[https://x.com/lovyan03|らびやんさん]]が取り込んでくださって、現在((2025/4/4現在)) developブランチを利用することで、この問題を回避したコードが利用できるようになっています。
 +
 +ハイハイスクールアドベンチャーも現状は developブランチを使用するようになっています。
 +
 +素早く対応していただきらびやんさんには感謝しています。
 +
 +==== PicoCalcについて ====
 +
 +[[https://www.clockworkpi.com/picocalc|PicoCalc]] はRaspberry Pi Picoが同梱されているが、Pico, Pico W, Pico2, そして Pico 2Wのいずれでも動くように作られている。((ただしバイナリは1/1Wと2/2Wとの間で互換性はない。))
 +
 +Pico/Wは RP2040で264KB SRAM、Cortex-M0 dual core、Pico2/2Wは RP2350で520KB SRAM、Cortex-M3 dual core/RiscVという構成で、つまり2の方が性能的な上位であり、使えるRAMも大きい。
 +
 +更に RP2350はPSRAMが利用できる。
 +PicoCalcは8MBのPSRAMを搭載しているので、これを活用するためにも 2ないしは 2Wを用意したい。
 +
 +実際わたしは、2Wを用意して組み込んだ。
 +
 +結果として、ハイハイスクールアドベンチャーは264KBのメモリでは動かないようなので、この選択は正解だったといえる。
 +
 +=== バイナリの互換性について ===
 +
 +Clockwork Piが配布している PicoCalc用のファームウェアイメージは、Pico用である。
 +つまり、Pico2用ではないのでそのまま焼いても動かない。
 +
 +Picoは、BOOTSELボタンを押しながら起動することで、内蔵フラッシュを切り離し、USBマスストレージとしてアクセス可能になる。
 +この状態で、uf2形式のなどでファームウェアイメージをコピーするか、picotoolで書き込むことができる。
 +
 +正しいイメージが書き込まれると制御が渡されてプログラムが動作を開始する仕組みだ。
 +Pico2にPico用のイメージを焼いても動かない。
 +
 +なので、Pico2を入れた PicoCalcは、Pico2用にバイナリを作らないといけない。
 +くみ上げて動作確認するにあたって、Pico用のイメージを書き込んで動かないって悩んでいたのは秘密なのだ。
 +
 +=== 操作性について ===
 +
 +ひとたび動き出せば PicoCalcは操作しやすいデバイスだ。
 +4インチ320x320の液晶は、解像度こそ低いが大きく見やすい。
 +老害世代にはありがたい仕様だ。
 +
 +問題はそこではない。
 +Picoシリーズは、プログラムの書き換えにBOOTSELスイッチを押しながら起動する必要があるのだが、ケースに空いたスリットからでないとアクセスできないのでボタンが押しにくいのだ。
 +
 +また、電源ボタンはあるがリセットボタンはない。
 +リセットは3.3V ENピンをGNDに落とせばいいので、用意できないわけではないのだから、なぜないのかは不明である。
 +
 +開発作業を考えればあってしかるべきものだ。
 +
 +この点が改良されたモデルが出ることを期待している。
 +
 +
 +==== SDカード ====
 +
 +PicoCalcはSDカードスロットを内蔵していて、SPI接続している。
 +液晶とは別のバスを使っているのでコンフリクトはしていない。
 +
 +^名前^値^
 +|SPI|0|
 +|RX(MISO)|16|
 +|CS|17|
 +|SCK|18|
 +|TX(MOSI)|19|
 +
 +以下のコードで初期化することで、ArduinoのSDライブラリでSDHC/FAT32でアクセスができる。
 +
 +<code cpp>
 +    SPI.setTX(19);
 +    SPI.setSCK(18);
 +    SPI.setRX(16);
 +    SPI.setCS(17);
 +    while (false == SD.begin(17, SPI))
 +    {
 +      //Serial1.println("SD Wait ...");
 +      delay(500);
 +    }
 +</code>
 +
 +==== キーボード ====
 +
 +PicoCalcのキーボードはSMT32で制御されていて、PicoとはI2C接続している。
 +キーボードへのアクセス方法については、FUZIX用のコードが参考になるだろう。
 +
 +Kernel/platform/platform-rpipico/i2ckbd.[ch] にコードがある。
 +
 +Pico側から見たとき、キーボードは I2C1に接続している。
 +
 +^名前^値^
 +|I2C|1|
 +|ADDRESS|0x1F|
 +|SCL|6|
 +|SDA|7|
 +
  
  
ハイハイスクールアドベンチャー_picocalc版.1743770233.txt.gz · 最終更新: 2025/04/04 12:37 by araki