pvvx
Активный участник сообщества
Загрузчик в ROM-BIOS:
Анализ показывает, что чип стартует с процедуры HalResetVsr() (в ROM0x3c4).
1) очищает rom_bss
2) исполняет HalRomInfo(); и включает блок отладчика (v400001F8 = v400001F8 & 0xFFFFFF00 | 2; )
3) устанавливает регистры тактирования блока Jtag:
*((volatile u32 *)(40000230)) |= 0x40;
*((volatile u32 *)(40000230)) |= 0x80;
4) разрешает JTAG: HalPinCtrlRtl8195A(JTAG, 0, 1);
5) устанавливает GPIO_GPE0_PULL_CTRL v40000338 = v40000338 & 0xFFFFFFFC | 2;
6) в зависимости от значений в регистре по адресу 0x40000210 (используется в режиме Debug RAM*) вызывает процедуры Debug_addr1 или Debug_addr2 или Debug_addr3 или Standart_addr_run. Debug_addr4 вызывается после инициализации console - см п.п.18. Таблица, кусок с адреса 0x20, должна быть размещена в памяти по адресу 0x10000bc8. В таблице описаны условия вызова.
7) устанавливает частоту 41666666 Hz: CPU HalCpuClkConfig(2);
8) устанавливает переменную ConfigDebugErr = -1;
9) инициализирует VectorTableInitRtl8195A(0x1FFFFFFC);
10) включает ноги LOG_UART: HalPinCtrlRtl8195A(LOG_UART, 0, 1);
11) назначает:
UartAdapter.BaudRate = UART_BAUD_RATE_38400;
UartAdapter.DataLength = UART_DATA_LEN_8BIT;
UartAdapter.FIFOControl = 0xC1;
UartAdapter.IntEnReg = 0x00;
UartAdapter.Parity = UART_PARITY_DISABLE;
UartAdapter.Stop = UART_STOP_1BIT;
и инициализирует: HalLogUartInit(UartAdapter);
12) инициализирует VectorIrqRegisterRtl8195A(UartLogIrqHandle);
13) назначает: UartAdapter.IntEnReg = 0x5;
и инициализирует: HalLogUartInit(UartAdapter);
14) инициализирует console: RtlConsolInit(0, 6, UartLogRomCmdTable);
15) инициализирует регистры :
*((volatile u32 *)(0x40000270)) |= 1u; // OSC32K_CTRL
*((volatile u32 *)(0x40000210)) |= 0x10000u; // SOC_GTIMER_EN
*((volatile u32 *)(0x40000230)) |= 0x4000u; // SOC_ACTCK_TIMER_EN
*((volatile u32 *)(0x40000230)) |= 0x8000u; // SOC_SLPCK_TIMER_EN
*((volatile u32 *)(0x40000204)) &= 0xFFFFFFEF; // ISO_OSC32K_EN
16) инициализирует таймер: HalTimerOpInit(HalTimerOp); HalTimerOp->HalTimerEn(0);
17) Через DiagPrintf() выводит надпись ROM Version: ....
18) в зависимости от значений в регистре по адресу 0x40000210 (используется в режиме Debug RAM) вызывает процедуры Debug_addr4. Таблица, кусок с адреса 0x20, должна быть размещена в памяти по адресу 0x10000bc8.
19) инициализирует spic (HalPinCtrlRtl8195A(), SpicInitRtl8195A())
20) считывает из Flash size [0x9800 0010] и addr [0x9800 0014], сравнивает “подпись” (dw [0x9800 0034], [0x9800 0038]) c ROM_IMG1_VALID_PATTEN (ROM: 0x00030c80: 23 79 16 88 FF 00 00 00), загружает из Flash код в RAM, отключает JTAG(!) ( HalPinCtrlRtl8195A(JTAG, 0, 0)) и запускает: Standart_addr_run().
RTL8710AF_Flash_record:
*Запуск процедур по флагам в регистре с адресом 0x40000210 требуется для обхода отладчиком загрузки с flash. Отладчик инициализирует CPU через JTAG и прописывает флаги в регистр с адресом 0x40000210 и загружает коды в RAM. После старта, если установлены флаги, CPU переходит в процедуры Debug_addr1, или Debug_addr2, или Debug_addr3, или Debug_addr4 до загрузки RAM из Flash. Этим и осуществляется отладка кода, заранее загруженного отладчиком в RAM.
Для отладки с GDB в Eclipse надо добавить команду:
Или вписать в скрипт:
Анализ показывает, что чип стартует с процедуры HalResetVsr() (в ROM0x3c4).
1) очищает rom_bss
2) исполняет HalRomInfo(); и включает блок отладчика (v400001F8 = v400001F8 & 0xFFFFFF00 | 2; )
3) устанавливает регистры тактирования блока Jtag:
*((volatile u32 *)(40000230)) |= 0x40;
*((volatile u32 *)(40000230)) |= 0x80;
4) разрешает JTAG: HalPinCtrlRtl8195A(JTAG, 0, 1);
5) устанавливает GPIO_GPE0_PULL_CTRL v40000338 = v40000338 & 0xFFFFFFFC | 2;
6) в зависимости от значений в регистре по адресу 0x40000210 (используется в режиме Debug RAM*) вызывает процедуры Debug_addr1 или Debug_addr2 или Debug_addr3 или Standart_addr_run. Debug_addr4 вызывается после инициализации console - см п.п.18. Таблица, кусок с адреса 0x20, должна быть размещена в памяти по адресу 0x10000bc8. В таблице описаны условия вызова.
7) устанавливает частоту 41666666 Hz: CPU HalCpuClkConfig(2);
8) устанавливает переменную ConfigDebugErr = -1;
9) инициализирует VectorTableInitRtl8195A(0x1FFFFFFC);
10) включает ноги LOG_UART: HalPinCtrlRtl8195A(LOG_UART, 0, 1);
11) назначает:
UartAdapter.BaudRate = UART_BAUD_RATE_38400;
UartAdapter.DataLength = UART_DATA_LEN_8BIT;
UartAdapter.FIFOControl = 0xC1;
UartAdapter.IntEnReg = 0x00;
UartAdapter.Parity = UART_PARITY_DISABLE;
UartAdapter.Stop = UART_STOP_1BIT;
и инициализирует: HalLogUartInit(UartAdapter);
12) инициализирует VectorIrqRegisterRtl8195A(UartLogIrqHandle);
13) назначает: UartAdapter.IntEnReg = 0x5;
и инициализирует: HalLogUartInit(UartAdapter);
14) инициализирует console: RtlConsolInit(0, 6, UartLogRomCmdTable);
15) инициализирует регистры :
*((volatile u32 *)(0x40000270)) |= 1u; // OSC32K_CTRL
*((volatile u32 *)(0x40000210)) |= 0x10000u; // SOC_GTIMER_EN
*((volatile u32 *)(0x40000230)) |= 0x4000u; // SOC_ACTCK_TIMER_EN
*((volatile u32 *)(0x40000230)) |= 0x8000u; // SOC_SLPCK_TIMER_EN
*((volatile u32 *)(0x40000204)) &= 0xFFFFFFEF; // ISO_OSC32K_EN
16) инициализирует таймер: HalTimerOpInit(HalTimerOp); HalTimerOp->HalTimerEn(0);
17) Через DiagPrintf() выводит надпись ROM Version: ....
18) в зависимости от значений в регистре по адресу 0x40000210 (используется в режиме Debug RAM) вызывает процедуры Debug_addr4. Таблица, кусок с адреса 0x20, должна быть размещена в памяти по адресу 0x10000bc8.
19) инициализирует spic (HalPinCtrlRtl8195A(), SpicInitRtl8195A())
20) считывает из Flash size [0x9800 0010] и addr [0x9800 0014], сравнивает “подпись” (dw [0x9800 0034], [0x9800 0038]) c ROM_IMG1_VALID_PATTEN (ROM: 0x00030c80: 23 79 16 88 FF 00 00 00), загружает из Flash код в RAM, отключает JTAG(!) ( HalPinCtrlRtl8195A(JTAG, 0, 0)) и запускает: Standart_addr_run().
RTL8710AF_Flash_record:
*Запуск процедур по флагам в регистре с адресом 0x40000210 требуется для обхода отладчиком загрузки с flash. Отладчик инициализирует CPU через JTAG и прописывает флаги в регистр с адресом 0x40000210 и загружает коды в RAM. После старта, если установлены флаги, CPU переходит в процедуры Debug_addr1, или Debug_addr2, или Debug_addr3, или Debug_addr4 до загрузки RAM из Flash. Этим и осуществляется отладка кода, заранее загруженного отладчиком в RAM.
Для отладки с GDB в Eclipse надо добавить команду:
Или вписать в скрипт:
Код:
#############
# Boot_Flash
define SetBootFlash
printf "SetBoot = Flash:\n"
monitor long 0x40000210 = 0x211157
end
# Boot RAM start_addr0() Run if ( v400001F4 & 0x8000000 ) && ( v40000210 & 0x80000000 )
define SetBootCall0
printf "SetBoot = Call0:\n"
monitor long 0x40000210 = 0x80011117
end
# Boot RAM start_addr1() Run if ( v40000210 & 0x20000000 )
define SetBootCall1
printf "SetBoot = Call1:\n"
monitor long 0x40000210 = 0x20011117
end
# Boot RAM start_addr2() Run if ( v40000210 & 0x10000000 )
define SetBootCall2
printf "SetBoot = Call2:\n"
monitor long 0x40000210 = 0x10011117
end
# Boot RAM start_addr3() Run if ( v400001F4 & 0x8000000 ) && ( v40000210 & 0x8000000 )
define SetBootCall3
printf "SetBoot = Call3:\n"
monitor long 0x40000210 = 0x8011117
end
# Boot RAM start_addr4() Init console, Run if ( v40000210 & 0x4000000 )
define SetBootCall4
printf "SetBoot = Call4:\n"
monitor long 0x40000210 = 0x4011117
end
Последнее редактирование: