良い一日です、
IS25WX256-JHLEフラッシュと合わせてMIMXRT1062DVL6Bを使用した製品を開発しています。これはカスタムボードですが、NXP MCU BootUtility v6.2.0を使用してUSB経由でフラッシュする基本的なLED点滅ファームウェアでフラッシュからの起動が機能することを確認しました。
デバイスモデルを「ISSI_OctalSPI_IS25LXxxx_IS25WXxxx」に設定し、周波数を30MHzのみ変更します。
開発を続けると、2つの別々の問題に遭遇しました。
1: ROM ブートローダが 128KiB より大きいイメージの起動を拒否する
128Kより小さいファームウェアは問題なく起動しますが、それ以上のファームウェアは起動しません(デバッガをアタッチすると、ROM領域からのコードのみが実行中であることが表示されます)。
他の問題は、簡単な変更を行うことで除外します。
boot_dataの「length」フィールドを128K未満の数値にパッチします。
boot_data at 0x60001020
uint32_t start
uint32_t length <-- Only patched this from 200K to 30K!
uint32_t pluginその後、ファームウェアは実際には大きいにもかかわらず、問題なく起動します。フラッシュ内の 128K を超える領域は、ファームウェアから問題なくアクセスできます。
これで、より大きなイメージ を起動できるようになりました が、それは悪いハックのように感じます。何がそんなに問題ですか。
2:J-Link経由のフラッシュが機能しない
J-LinkやOzoneデバッガを使ってフラッシングができると、開発に大いに役立つと思います。
これをスムーズに機能させるにはどうすればよいでしょうか?
SEGGERの内蔵フラッシュローダーとRT-UFLを試してみました。
ここでは、この問題について詳しく説明しました https://github.com/JayHeng/RT-UFL/issues/16
さて、私は最小限のフラッシュローダーをゼロから書きましたが、これは機能しているようです。
このスレッドを見つけている他の人にとって重要なポイント:
フラッシュローダーの使用を開始するための基本コード:
serial_nor_config_option_t option;
option.option0.U = 0xC0603001;
option.option1.U = 0;
// NOTE(robin): Reset the flash chip as it may be in an invalid state.
BOARD_INITPINS_FLASH_RST_GPIO->DR_CLEAR = BOARD_INITPINS_FLASH_RST_PIN_MASK;
for(volatile int i = 0; i < 1000; ++i) {}
BOARD_INITPINS_FLASH_RST_GPIO->DR_SET = BOARD_INITPINS_FLASH_RST_PIN_MASK;
for(volatile int i = 0; i < 1000; ++i) {}
status_t volatile status = ROM_FLEXSPI_NorFlash_GetConfig(0, &flashConfig, &option);
if(status == kStatus_Success)
{
status = ROM_FLEXSPI_NorFlash_Init(0, &flashConfig);
if(status == kStatus_Success)
{
// Go nuts
}
} リンクをありがとうございます。
だから、はっきり言って、これが私が持つべきものですか?
J-Linkポップアップでは、 Compare は100%まで満たされますが、消去に失敗します。
Device "MIMXRT1062_OCTAL" selected.
Found SW-DP with ID 0x0BD11477
DPIDR: 0x0BD11477
CoreSight SoC-400 or earlier
Scanning AP map to find all available APs
AP[1]: Stopped AP scan as end of AP map has been reached
AP[0]: AHB-AP (IDR: 0x04770041)
Iterating through AP map to find AHB-AP to use
AP[0]: Core found
AP[0]: AHB-AP ROM base: 0xE00FD000
CPUID register: 0x411FC271. Implementer code: 0x41 (ARM)
Cache: L1 I/D-cache present
Found Cortex-M7 r1p1, Little endian.
FPUnit: 8 code (BP) slots and 0 literal slots
CoreSight components:
ROMTbl[0] @ E00FD000
[0][0]: E00FE000 CID B105100D PID 000BB4C8 ROM Table
ROMTbl[1] @ E00FE000
[1][0]: E00FF000 CID B105100D PID 000BB4C7 ROM Table
ROMTbl[2] @ E00FF000
[2][0]: E000E000 CID B105E00D PID 000BB00C SCS-M7
[2][1]: E0001000 CID B105E00D PID 000BB002 DWT
[2][2]: E0002000 CID B105E00D PID 000BB00E FPB-M7
[2][3]: E0000000 CID B105E00D PID 000BB001 ITM
[1][1]: E0041000 CID B105900D PID 001BB975 ETM-M7
[1][2]: E0042000 CID B105900D PID 004BB906 CTI
[0][1]: E0040000 CID B105900D PID 000BB9A9 TPIU-M7
[0][2]: E0043000 CID B105F00D PID 001BB101 TSG
I-Cache L1: 32 KB, 512 Sets, 32 Bytes/Line, 2-Way
D-Cache L1: 32 KB, 256 Sets, 32 Bytes/Line, 4-Way
Connected to target device.
J-Link/J-Trace serial number: 601014830
Reset: Halt core after reset via DEMCR.VC_CORERESET.
Reset: Reset device via AIRCR.SYSRESETREQ.
Failed to erase sectors.私もMIMXRT1060_UFL_L0で試してみましたが、同じ結果が得られました。
これをきちんとデバッグするためには、自分でRT-UFLをビルドする必要があると感じています。悲しいことに、そのビルドシステムはKeil MDKまたはIARのいずれかに依存しているようですが、これらは私たちが使用していない有料ソリューションです。だから私は最初にそれを変換する必要があります..