ошибка жесткого сбоя u-boot после инициализации оперативной памяти

Я портировал U-boot на свою плату Waveshare coreH7 stm32h743. В качестве шаблона для портирования я использовал файлы stm32h743-disco и деревья устройств. моя встроенная SDRAM - IS42S16400J, что составляет 8 МБ. Я рассчитал параметры своего sdram и поместил их в файл дерева устройств моей платы, как показано ниже:

/*
             * Memory configuration from sdram datasheet IS42S32800G-6BLI
             * firsct bank is bank@0
             * second bank is bank@1
             */
            bank2: bank@1 {
                st,sdram-control = /bits/ 8 <NO_COL_8
                                 NO_ROW_12
                                 MWIDTH_16
                                 BANKS_4
                                 CAS_3
                                 SDCLK_2
                                 RD_BURST_EN
                                 RD_PIPE_DL_0>;
                st,sdram-timing = /bits/ 8 <TMRD_1
                                TXSR_1
                                TRAS_1
                                TRC_6
                                TRP_2
                                TWR_1
                                TRCD_1>;
                st,sdram-refcount = <300>;
            };

Кроме того, я настроил значения rcc для подачи драм на 100 МГц.

но когда uboot начинает инициализацию, происходит прерывание по аппаратной ошибке.

это журнал:

lib/fdtdec.c:fdtdec_setup_mem_size_base_fdt() fdtdec_setup_mem_size_base_fdt: Initial DRAM size 2000000
include/initcall.h:initcall_run_list() initcall: 08008a89
common/board_f.c:setup_dest_addr() Monitor len: 00039F80
common/board_f.c:setup_dest_addr() Ram size: 02000000
common/board_f.c:setup_dest_addr() Ram top: D2000000
include/initcall.h:initcall_run_list() initcall: 08008665
include/initcall.h:initcall_run_list() initcall: 0800117d
arch/arm/lib/cache.c:arm_reserve_mmu() TLB table from d1ff0000 to d1ff4000
include/initcall.h:initcall_run_list() initcall: 080088c3
include/initcall.h:initcall_run_list() initcall: 080088c7
include/initcall.h:initcall_run_list() initcall: 080086b1
common/board_f.c:reserve_uboot() Reserving 231k for U-Boot at: d1fb6000
include/initcall.h:initcall_run_list() initcall: 080088ed
common/board_f.c:reserve_malloc() Reserving 1032k for malloc() at: d1eb4000
include/initcall.h:initcall_run_list() initcall: 08008821
Hard fault
pc : 0800087e    lr : 00000000    xPSR : 21000000
r12 : d1eb3ff0   r3 : 00000000    r2 : 00000010
r1 : 00000000    r0 : d1eb3fb0
Resetting CPU ...

в чем проблема? RAM инициализируется неудачно? Почему? может неправильные параметры? как я могу узнать, что оперативная память успешно инициализирована? это обычный информационный журнал u-boot:

U-Boot 2020.07-00610-g610e1487c8-dirty (Aug 04 2020 - 00:34:13 +0430)

Model: Waveshare STM32H743i-Coreh7 board
DRAM:  Hard fault
pc : 0800087e    lr : 00000000    xPSR : 21000000
r12 : d1eb3ff0   r3 : 00000000    r2 : 00000010
r1 : 00000000    r0 : d1eb3fb0
Resetting CPU ...

person Mahyar Shokraeian    schedule 03.08.2020    source источник
comment
размер оперативной памяти 02000000 ?? Это правильно ? Я не знаю такого типа платы, но я думаю, что если вы портировали u boot, то, возможно, у вас где-то есть какая-то старая конфигурация. Еще раз проверьте шаги, где вы устанавливаете размер оперативной памяти   -  person secret squirrel    schedule 03.08.2020
comment
@secretsquirrel о да, вы правы, это неправильно, но я научил его автоматически определять размер оперативной памяти. Итак, где я должен настроить размер оперативной памяти?   -  person Mahyar Shokraeian    schedule 04.08.2020
comment
@secretsquirrel Я нашел это. Я думаю, что это в дереве устройств моей платы.   -  person Mahyar Shokraeian    schedule 04.08.2020


Ответы (1)


у тебя неправильный размер барана. как вы упомянули, фактический размер оперативной памяти составляет 8 МБ, то есть 0x7A1200 в шестнадцатеричном числе. но в журнале U-boot указан начальный размер DRAM 2000000. Вы должны изменить его в дереве устройств вашей платы.

memory {
      device_type = "memory";
      reg = <0xd0000000 0x7A1200>;
};
person Mahyar Shokraeian    schedule 04.08.2020