Это справочный материал по платформе на основе Rockchip DDR V2.7.2, а не отчёт об испытаниях ArmSoM и не гарантия поддержки всех возможностей каждой платой. Исходник охватывает несколько поколений SoC, Linux 3.0/3.10/4.4 и последующие ядра, Android, U-Boot, loader, Trust/ATF и HAL. Необходимо проверить конкретную плату, микросхемы DRAM и разводку, SoC, ветку SDK/BSP, DDR bin, Trust и ядро. Адаптация к платам ArmSoM аппаратно не проверялась.
Китайская статья следует китайскому PDF из 110 страниц, английская — английскому PDF из 115 страниц. Русская статья полностью переводит английский технический текст. Версия обоих источников — V2.7.2. Только английский исходник содержит §6.2.1 о настройке английского интерфейса, поэтому номера последующих подразделов главы 6 сдвинуты. Расхождения в расчётах ёмкости, обозначениях глазковых диаграмм, версиях и путях явно сохранены по месту и в редакционных записях, без скрытого объединения.
Риск операций: прошивка, изменение напряжения/частоты/ёмкости, удаление RZQ, инъекция ошибок ECC и стресс-тесты памяти могут повредить оборудование или данные либо вызвать перезапуск. Команды и отладочные значения вроде 1.6V — примеры исходника, а не рекомендации для произвольной платы ArmSoM. Проверьте документацию DRAM, схему, электрические пределы и соответствующий SDK; сохраните резервные копии и используйте контролируемое испытательное оборудование. Аппаратные команды не выполнялись. Наблюдения и измерения принадлежат исходнику. Указание путей инструментов и ресурсов не означает, что эти двоичные файлы поставляются с сайтом.
Официальные ресурсы: документация ArmSoM, Rockchip Linux, rkbin.
Предисловие посвящено разработке DDR SDRAM для всех SoC Rockchip. Таблица версий исходника указывает «Все SoC / Все версии ядра». Это заявленная область документа, а не подтверждённая совместимость всех сочетаний.
| SoC | Версия ядра |
|---|---|
| Все SoC | Все версии ядра |
1. Глава 1. Руководство разработчика DDR: частые вопросы
1.1 Как читать журнал DDR
Журнал DDR включает сообщения загрузчика loader и ядра. Сообщения loader разбираются ниже:
DDR Version 1.05 20170712//Version information of the DDR initialization code used to check
the version. From this line, you have entered the DDR initialization code.
In
SRX //If it prints SRX, means hot restart; without SRX, it means that it is cold boot. While
some chipset does not have this feature, there will not show SRX.
Channel a: DDR3 400MHz //The following log are the details of the DDR capacity. For more
explanation,please see the chapter"How to Check the Capacity of DDR".
Bus Width=32 Col=10 Bank=8 Row=15 CS=1 Die Bus-Width=16 Size=1024MB
Channel b: DDR3 400MHz
Bus Width=32 Col=10 Bank=8 Row=15 CS=1 Die Bus-Width=16 Size=1024MB
Memory OK //This is the result of DDR self-test, the first "Memroy OK" is the self-test
result of Channel a.
Memory OK //It is the self-test result of Channel b.If Channel a or b shows an error,
turning out that something wrong with the welding; no error, indicating that the current
self-test is good.But whether the entire DDR can work stably or not,also depends on the
subsequent stages of operation results.
OUT //After this line, the DDR initialization code is exited.
Ниже приведён журнал DDR для kernel 3.0 и kernel 3.10:
[ 0.528564] DDR DEBUG: version 1.00 20150126 //Version information
[ 0.528690] DDR DEBUG: Channel a: //The details of the DDR capacity
[ 0.528701] DDR DEBUG: DDR3 Device
[ 0.528716] DDR DEBUG: Bus Width=32 Col=10 Bank=8 Row=15 CS=1 Total Capability=1024MB
[ 0.528727] DDR DEBUG: Channel b:
[ 0.528736] DDR DEBUG: DDR3 Device
[ 0.528750] DDR DEBUG: Bus Width=32 Col=10 Bank=8 Row=15 CS=1 Total Capability=1024MB
//The following information about DDR specialize for DDR engineer debug, please ignore it.
//After "DDR DEBUG" print end, which means DDR initialization finishes in kernel.
В kernel 3.10 также выводятся следующие сообщения модуля изменения частоты DDR.
[ 1.473637] ddrfreq: verion 1.2 20140526 //DDR frequency scaling module version
[ 1.473653] ddrfreq: normal 396MHz video_1080p 240MHz video_4k 396MHz dualview 396MHz
idle 0MHz suspend 200MHz reboot 396MHz //The frequencies which read from dts table are
corresponding to the different scenarios.
[ 1.473661] ddrfreq: auto-freq=1 //This line reflects load scaling functon is enable or
not,"1" means on,"0" means off.
[ 1.473667] ddrfreq: auto-freq-table[0] 240MHz //the table of the load scaling
[ 1.473673] ddrfreq: auto-freq-table[1] 324MHz
[ 1.473678] ddrfreq: auto-freq-table[2] 396MHz
[ 1.473683] ddrfreq: auto-freq-table[3] 528MHz
//If crash or block in this print porcedure,it is most likely DDR frequency scaling bug.
В версиях после kernel 3.10 сведения об объёме DDR больше не печатаются ядром.
1.2 Как включить DDR bin Rockchip в готовый к использованию loader
1. Поместите DDR bin в соответствующий каталог rk\rkbin\bin\ проекта U-Boot.
2. Удалите прежний файл DDR bin.
3. Переименуйте новый DDR bin, присвоив ему имя удалённого файла.
4. Соберите U-Boot (см. Rockchip-Developer-Guide-UBoot-nextdev.pdf); будет создан соответствующий файл loader.
5. По журналу loader проверьте, что он действительно обновлён.
Каталоги DDR bin для разных платформ:
| SoC | Путь | Примечание |
|---|---|---|
| PX30 | rk\rkbin\bin\rk33\px30_ddr_333MHz_vX.XX.bin | |
| PX3SE | rk\rkbin\bin\rk31\px3se_ddr_300MHz_vX.XX_uartX.bin | |
| RK1808 | rk\rkbin\bin\rk1x\rk1808_ddr_XXXMHz_vX.XX.bin | |
| RK3036 | rk\rkbin\bin\rk30\rk3036_ddr_XXXMHz_vX.XX.bin | 1 |
| RK3126 RK3126B RK3126C |
rk\rkbin\bin\rk31\rk3126_ddr3_300MHz_vX.XX.bin | |
| RK3128 | rk\rkbin\bin\rk31\rk3128_ddr_300MHz_vX.XX.bin | |
| RK3288 | rk\rkbin\bin\rk32\rk3288_ddr_400MHz_vX.XX.bin | |
| RK322x | rk\rkbin\bin\rk32\rk322x_ddr_XXXMHz_vX.XX.bin | |
| RK322xh | rk\rkbin\bin\rk33\rk322xh_ddr_333MHz_vX.XX.bin | |
| RK3308 | rk\rkbin\bin\rk33\rk3308_ddr_XXXMHz_uartX_mX_vX.XX.bin | |
| RK3326 | rk\rkbin\bin\rk33\rk3326_ddr_333MHz_vX.XX.bin | |
| RK3328 | rk\rkbin\bin\rk33\rk3328_ddr_XXXMHz_vX.XX.bin | |
| RK3368 | rk\rkbin\bin\rk33\rk3368_ddr_600MHz_vX.XX.bin | |
| RK3399 | rk\rkbin\bin\rk33\rk3399_ddr_XXXMHz_vX.XX.bin | 2 |
| RK3399PRO | rk\rkbin\bin\rk33\rk3399pro_ddr_XXXMHz_vX.XX.bin | |
| RK3528 | rk\rkbin\bin\rk35\rk3528_ddr_XXXMHz_vX.XX.bin | 3 |
| RK3562 | rk\rkbin\bin\rk35\rk3562_ddr_XXXMHz_vX.XX.bin | |
| RK3566 | rk\rkbin\bin\rk35\rk3566_ddr_XXXMHz_vX.XX.bin | |
| RK3568 | rk\rkbin\bin\rk35\rk3568_ddr_XXXMHz_vX.XX.bin | |
| RK3576 | rk\rkbin\bin\rk35\rk3576_ddr_lp4_XXXXMHz_lp5_XXXXMHz_vX.XX.bin | |
| RK3588 | rk\rkbin\bin\rk35\rk3588_ddr_lp4_XXXXMHz_lp5_XXXXMHz_vX.XX.bin | |
| RV1106 | rk\rkbin\bin\rv11\rv1106_ddr_XXXMHz_vX.XX.bin | |
| RV1108 | rk\rkbin\bin\rv11\rv1108_ddr_vX.XX.bin | |
| RV1126 | rk\rkbin\bin\rv11\rv1126_ddr_XXXMHz_vX.XX.bin | |
| Новые платформы | Размещаются в rk\rkbin\bin по аналогичному правилу именования; их можно найти самостоятельно |
Примечание 1: используемая частота задаётся в rk\rkbin\RKBOOT\RK3036_ECHOMINIALL.ini или RK3036MINIALL.ini. Первый файл предназначен для изделий ECHO; остальные изделия RK3036 используют RK3036MINIALL.ini. Способ определения устройства ECHO исходник предлагает уточнять у подразделения системных продуктов Rockchip.
Примечание 2: используемая частота задаётся файлом rk\rkbin\RKBOOT\RK3399MINIALL.ini.
Примечание 3: вариант RK3528 предназначен для платы не с двумя слоями и DDR не с организацией 4BIT. Для двухслойной PCB или DDR 4BIT см. следующий раздел об особых вариантах DDR bin.
Примечание 4: файлы новых платформ размещаются в rk\rkbin\bin\ по аналогичному правилу именования; их можно найти самостоятельно.
1.3 Платформы с четырьмя частотами в DDR bin
DDR bin перечисленных ниже платформ содержит четыре частоты DDR. Наибольшая отражена в имени файла: например, в rv1126_ddr_924MHz_v1.05.bin последняя частотная точка — 924M.
В ядре можно использовать только эти четыре частоты. Для их изменения см. раздел «Изменение DDR bin».
Обычно по умолчанию используются следующие четыре частоты:
| Платформа | Файл | Частоты в файле (MHz) |
|---|---|---|
| RK3528 | rk3528_ddr_XXXMHz_vX.XX.bin | 324,528,780 и частота из имени файла |
| RK3562 | rk3562_ddr_XXXMHz_vX.XX.bin | 324,528,780 и частота из имени файла |
| RK3566 | rk3566_ddr_XXXMHz_vX.XX.bin | 324,528,780 и частота из имени файла |
| RK3568 | rk3568_ddr_XXXMHz_vX.XX.bin | 324,528,780 и частота из имени файла |
| RK3576 | rk3576_ddr_lp4_XXXXMHz_lp5_XXXXMHz_vX.XX.bin | LP4/LP4X:528,1068,1560 и частота из имени файла LP5/LP5X:534,1320,1968 и частота из имени файла |
| RK3588 | rk3588_ddr_lp4_XXXXMHz_lp5_XXXXMHz_vX.XX.bin | LP4/LP4X:528,1068,1560 и частота из имени файла LP5/LP5X:534,1320,1968 и частота из имени файла |
| RV1126 | rv1126_ddr_XXXMHz_vX.XX.bin | 328,528,784 и частота из имени файла |
Эти четыре точки можно увидеть в журнале последовательного порта loader:
DDR ... v1.14
LPDDR4X, 2112MHz
channel[0] BW=16 Col=10 Bk=8 CS0 Row=16/0 CS1 Row=16/0 CS=2 Die BW=16 Size=2048MB
channel[1] BW=16 Col=10 Bk=8 CS0 Row=16/0 CS1 Row=16/0 CS=2 Die BW=16 Size=2048MB
channel[2] BW=16 Col=10 Bk=8 CS0 Row=16/0 CS1 Row=16/0 CS=2 Die BW=16 Size=2048MB
channel[3] BW=16 Col=10 Bk=8 CS0 Row=16/0 CS1 Row=16/0 CS=2 Die BW=16 Size=2048MB
...
change to F1: 528MHz /* 4 DDR frequencies */
change to F2: 1068MHz
change to F3: 1560MHz
change to F0: 2112MHz
out
Также текущие четыре частоты можно прочитать инструментом rkbin/tools/ddrbin_tool, например:
./ddrbin_tool px30 -g gen_param.txt px30_ddr_333MHz_v1.15.bin
Подробнее о ddrbin_tool см. его руководство.
1.4 Особые варианты DDR bin
Некоторые файлы в rk\rkbin\bin требуют дополнительных пояснений.
RK3399
Разные типы памяти RK3399 поддерживают разные частоты, но имя DDR bin не разделяет их по типу DDR. Это может вызывать путаницу; пояснение приведено ниже.
| Файл | DDR3/LP3: частота при выходе из loader (MHz) | DDR3/LP3: частоты ядра (MHz) | LP4: частота при выходе из loader (MHz) | LP4: частоты ядра (MHz) |
|---|---|---|---|---|
| rk33\rk3399_ddr_666MHz_v1.30.bin | 666 | <=666 | 416 | 328, 416, 666, 856 |
| rk33\rk3399_ddr_800MHz_v1.30.bin | 800 | <=800 | 856 | 328,416, 666, 856 |
| rk33\rk3399_ddr_933MHz_v1.30.bin | 933 | <=933 | 856 | 328, 416, 666, 856, 933 |
Файлы с суффиксом eyescan
DDR bin с суффиксом eyescan используется для сборки loader, позволяющего получить двумерную глазковую диаграмму сигнала DDR. Примеры:
rk\rkbin\bin\rk35\rk3566_ddr_1056MHz_eyescan_v1.16.bin
rk\rkbin\bin\rk35\rk3588_ddr_lp4_2112MHz_lp5_2736MHz_eyescan_v1.11.bin
rk\rkbin\bin\rk35\rk3562_ddr_1332MHz_eyescan_v1.04.bin
rk\rkbin\bin\rk35\rk3568_ddr_1560MHz_eyescan_v1.16.bin
Файлы с суффиксом ultra
Сверхнизкое энергопотребление для электронных книг; используется совместно с соответствующей аппаратной платформой. Примеры:
rk\rkbin\bin\rk35\rk3566_ddr_XXXMHz_ultra_v1.10.bin
rk\rkbin\bin\rk35\rk3562_ddr_XXXMHz_ultra_v1.05.bin
Файлы с суффиксом tb
Предназначены для быстрой загрузки. Необходимо выбрать bin для фактического типа DDR. Примеры:
rk\rkbin\bin\rv11\rv1126_tpl_XXXMHz_ddr4_tb_v1.08.bin
rk\rkbin\bin\rv11\rv1126_tpl_XXXMHz_ddr3_tb_v1.08.bin
rk\rkbin\bin\rv11\rv1126_tpl_XXXMHz_lp3_tb_v1.08.bin
rk\rkbin\bin\rv11\rv1126_tpl_XXXMHz_lp4_tb_v1.08.bin
Для быстрой загрузки RV1106 с DDR3:
rk\rkbin\bin\rv11\rv1106_ddr_924MHz_tb_v1.13.bin
Файлы RK3528 с PCB в имени
Для конструкции DDR 4BIT:
rk\rkbin\bin\rk35\rk3528_ddr_1056MHz_4BIT_PCB_v1.07.bin
Для двухслойной PCB:
rk\rkbin\bin\rk35\rk3528_ddr_1056MHz_2L_PCB_v1.07.bin
1.5 Изменение DDR bin
Описанный выше DDR bin инициализирует DDR при загрузке. Инструменты Rockchip позволяют изменить параметры инициализации, частоту DDR, отключить последовательный порт, изменить его скорость и другие параметры.
rk_ddrBin_tool_windows
Исходник рекомендует rk_ddrBin_tool_windows: инструмент с графическим интерфейсом, которым проще пользоваться.
Инструменты доступны по адресу:
https://redmine.rock-chips.com/documents/49 -> rk_ddrBin_tool_windows_Vx.xx.7z
Обычно имеется несколько архивов. Необходимо скачать их все, затем распаковать.
Руководство пользователя доступно через меню Help инструмента.
rkbin/tools/ddrbin_tool
Это инструмент командной строки в проекте rkbin: rkbin/tools/ddrbin_tool.
Документация: rkbin/tools/ddrbin_tool_user_guide.txt.
Часто изменяемые параметры:
Изменение частоты DDR
Для SoC, поддерживающих только четыре частоты, см. раздел «Платформы с четырьмя частотами в DDR bin».
Четыре частоты можно изменить для соответствующего типа DDR. Ниже пример четырёх частот LPDDR4:

Редактируемая расшифровка снимка (исходные поля и значения):
| Параметр | Значение | Допустимый диапазон | Unit | Описание |
|---|---|---|---|---|
| lp4_freq | 2112 | 300-2133 | MHz | Начальная частота DDR (FSP_0) |
| lp4_f1_freq_mhz | 528 | 300-2133 | MHz | Частота DDR FSP_1 для переключения |
| lp4_f2_freq_mhz | 1068 | 300-2133 | MHz | Частота DDR FSP_2 для переключения |
| lp4_f3_freq_mhz | 1560 | 300-2133 | MHz | Частота DDR FSP_3 для переключения |
Изменение последовательного порта

Редактируемая расшифровка снимка (исходные поля и значения):
| Параметр | Значение | Допустимый диапазон | Unit | Описание |
|---|---|---|---|---|
| uart id | 0 | — | ID UART; 0xf отключает вывод UART |
Изменение скорости последовательного порта

Редактируемая расшифровка снимка (исходные поля и значения):
| Параметр | Значение | Допустимый диапазон | Unit | Описание |
|---|---|---|---|---|
| uart id | 0 | — | ID UART; 0xf отключает вывод UART | |
| uart iomux | 0 | — | IOMUX UART | |
| uart baudrate | 1500000 | bps | Поддерживает 115200 или 1500000 |
1.6 Изменение частоты DDR в U-Boot
RK322x
Следующий способ поддерживается только RK322x. Измените arch/arm/boot/dts/rk322x.dtsi в исходниках kernel-3.10.
dram: dram {
compatible = "rockchip,rk322x-dram";
status = "okay";
dram_freq = <786000000>;
rockchip,dram_timing = <&dram_timing>;
};
Достаточно изменить dram_freq в приведённом блоке; единица измерения — Hz. Частоту можно выбрать произвольно в рамках исходного способа настройки.
U-Boot автоматически разбирает DTS, читает значение и устанавливает соответствующую частоту.
RK3576/RK3588
Следующий способ поддерживается только RK3576 и RK3588. При инициализации DDR loader настраивает четыре частоты для последующего использования ядром. По умолчанию loader завершает работу на наибольшей частоте, после чего загрузка продолжается.
F1, F2, F3 и F0 ниже — эти четыре частоты. По умолчанию выход из loader выполняется на F0.
DDR ... v1.14
LPDDR4X, 2112MHz
channel[0] BW=16 Col=10 Bk=8 CS0 Row=16/0 CS1 Row=16/0 CS=2 Die BW=16 Size=2048MB
channel[1] BW=16 Col=10 Bk=8 CS0 Row=16/0 CS1 Row=16/0 CS=2 Die BW=16 Size=2048MB
channel[2] BW=16 Col=10 Bk=8 CS0 Row=16/0 CS1 Row=16/0 CS=2 Die BW=16 Size=2048MB
channel[3] BW=16 Col=10 Bk=8 CS0 Row=16/0 CS1 Row=16/0 CS=2 Die BW=16 Size=2048MB
...
change to F1: 528MHz /* 4 DDR frequencies */
change to F2: 1068MHz
change to F3: 1560MHz
change to F0: 2112MHz
out
Для изменения частоты DDR в U-Boot достаточно изменить частоту, на которой loader завершает работу.
В инструменте из раздела «Изменение DDR bin» найдите boot_fsp. Этот параметр выбирает F0/F1/F2/F3 как частоту выхода из loader и тем самым частоту DDR в U-Boot.

Редактируемая расшифровка снимка (исходные поля и значения):
| Параметр | Значение | Допустимый диапазон | Unit | Описание |
|---|---|---|---|---|
| boot_fsp | 0 | — | Частота DDR при входе в систему после инициализации: 0=fsp0, 1=fsp1, 2=fsp2, 3=fsp3 |
1.7 Включение и отключение изменения частоты DDR в ядре
Сначала убедитесь, что SoC поддерживает изменение частоты DDR в ядре. Затем включите или отключите его следующим способом.
Для kernel 4.4 и новее найдите окончательное описание узла dmc в DTS. Значение status = “disabled” отключает изменение частоты, а “okay” включает его.
Примечание 1: на RK3576 и RK3588 после включения dmc проверьте свойства center-supply и mem-supply согласно реальным соединениям питания изделия. Значения указывают имена узлов регуляторов, питающих модуль DDR на стороне
SoC и LOGIC соответственно.
По умолчанию для RK3576: center-supply = <&vdd_ddr_s0>, mem-supply = <&vdd_logic_s0>.
По умолчанию для RK3588: center-supply = <&vdd_ddr_s0>, mem-supply = <&vdd_log_s0>.
Если этих свойств нет в узле dmc, драйвер dmc не загрузится. Сообщение ядра:
rockchip-dmc dmc: Cannot get the regulator "center"
Примечание 2: на остальных платформах после включения dmc проверьте center-supply согласно реальным соединениям питания изделия. Значение указывает имя регулятора, питающего DDR-модуль на стороне SoC.
По умолчанию для RK3399: center-supply = <&vdd_center>.
Для других платформ, например PX30/RK3568/RV1126: center-supply=<&vdd_logic>.
Если этого свойства нет в узле dmc, драйвер dmc не загрузится. Сообщение ядра:
rockchip-dmc dmc: Cannot get the regulator "center"
Примечание 3: рекомендуется одинаковый status для dfi и dmc. В старом коде dmc зависит от dfi; отключение dfi делает dmc неработоспособным.
Например, для RK3399 EVB окончательное описание dmc находится в arch/arm64/boot/dts/rockchip/rk3399-evb.dtsi.
&dfi {
status = "okay";
};
&dmc {
center-supply = <&vdd_center>; /* This requires the customer to configure it according
to the actual hardware circuit*/
status = "okay"; /* enable kernel DDR scaling function */
...
};
&dfi {
status = "disabled";
};
&dmc {
status = "disabled"; /* disable kernel DDR scaling function */
...
};
Для kernel 3.10 найдите окончательное описание узла clk_ddr_dvfs_table в DTS. Установите status в “disabled”, чтобы отключить изменение частоты, либо в “okay”, чтобы включить.
Например, для платы RK3288 SDK окончательное описание clk_ddr_dvfs_table находится в arch/arm/boot/dts/rk3288-tb_8846.dts.
&clk_ddr_dvfs_table {
...
status="okay"; /* enable kernel DDR scaling function */
};
&clk_ddr_dvfs_table {
...
status="disabled"; /* disable kernel DDR scaling function */
};
Для kernel 3.0 измените dvfs_ddr_table в файле платы borad-**.c: оставьте в таблице только одну частоту DDR_FREQ_NORMAL, чтобы DDR не меняла частоту.
Например, файл платы RK3066 SDK: arch/arm/mach-rk30/board-rk30-sdk.c.
/* This table enable DDR scaling function */
static struct cpufreq_frequency_table dvfs_ddr_table[] = {
{.frequency = 200 * 1000 + DDR_FREQ_SUSPEND, .index = 1050 * 1000},
{.frequency = 300 * 1000 + DDR_FREQ_VIDEO, .index = 1050 * 1000},
{.frequency = 400 * 1000 + DDR_FREQ_NORMAL, .index = 1125 * 1000},
{.frequency = CPUFREQ_TABLE_END},
};
/* This table disable DDR scaling function */
static struct cpufreq_frequency_table dvfs_ddr_table[] = {
//{.frequency = 200 * 1000 + DDR_FREQ_SUSPEND, .index = 1050 * 1000},
//{.frequency = 300 * 1000 + DDR_FREQ_VIDEO, .index = 1050 * 1000},
{.frequency = 400 * 1000 + DDR_FREQ_NORMAL, .index = 1125 * 1000},
{.frequency = CPUFREQ_TABLE_END},
};
1.8 Полный запрет изменения частоты DDR, включая инициализацию
Предыдущий раздел отключает обычное изменение частоты. Однако при включении питания ddr_init может один раз изменить частоту, обновляя тайминги ради повышения производительности. Чтобы запретить и этот переход, кроме действий из предыдущего раздела внесите изменения ниже.
Для kernel 4.4 и новее
Достаточно выполнить действия раздела «Включение и отключение изменения частоты DDR в ядре»: переходы отключаются и в ddr_init.
Для kernel 3.10
SoC: RK322X.
Расположение кода: в ядре соответствующего кода нет.
Способ: достаточно отключить узел dram, установив “disabled”.
dram: dram {
compatible = "rockchip,rk322x-dram";
status = "disabled"; /* Please,modify here! */
dram_freq = <786000000>;
rockchip,dram_timing = <&dram_timing>;
};
SoC: RK3188.
Расположение: функция ddr_init() в arch/arm/mach-rockchip/ddr_rk30.c.
SoC: RK3288.
Расположение: функция ddr_init() в arch/arm/mach-rockchip/ddr_rk32.c.
SoC: RK3126B, RK3126C с прошивкой без trust.img.
Расположение: функция ddr_init() в arch/arm/mach-rockchip/ddr_rk3126b.c.
SoC: RK3126/RK3128.
Расположение: функция ddr_init() в ./arch/arm/mach-rockchip/ddr_rk3126.c.
Способ: закомментируйте следующие строки в функции ddr_init():
if(freq != 0)
value = clk_set_rate(clk, 1000*1000*freq);
else
value = clk_set_rate(clk, clk_get_rate(clk));
SoC: RV1108.
Расположение: функция ddr_init() в arch/arm/mach-rockchip/ddr_rv1108.c.
Способ: закомментируйте следующие строки в функции ddr_init():
if (freq == 0)
_ddr_change_freq(ddr_freq_current);
else
_ddr_change_freq(freq);
Для остальных SoC, включая RK3126B и RK3126C с trust.img, достаточно действий предыдущего раздела: изменение частоты отключается и в ddr_init. Для kernel 3.0:
Code Path
| SoC | Расположение кода |
|---|---|
| RK3066 | arch/arm/mach-rk30/ddr.c, функция ddr_init() |
| RK3026, RK3028A | arch/arm/mach-rk2928/ddr.c, функция ddr_init() |
arch/arm/mach-rk2928/ddr.c, ddr_init() function
Способ: закомментируйте следующие строки в функции ddr_init():
if(freq != 0)
value=ddr_change_freq(freq);
else
value=ddr_change_freq(clk_get_rate(clk_get(NULL, "ddr"))/1000000);
1.9 Определение объёма DDR
Для приблизительной оценки выполните следующую команду и посмотрите MemTotal. Это значение немного меньше фактического объёма; округлите оценку до целого объёма памяти.
root@rk3399:/ # cat /proc/meminfo
MemTotal: 3969804 kB
Подробные сведения об объёме DDR можно получить следующим образом.
Объём DDR печатается при её инициализации в loader и ядре. В kernel 4.4 и новее он не выводится; в kernel 3.10 выводится на части SoC (см. таблицу). В loader сведения доступны на всех SoC. Сообщения loader необходимо захватить через последовательный порт: при подключении ADB эта стадия уже пропущена.
| SoC | loader | kernel 3.0/3.10/ kernel 4.4 и новее |
|---|---|---|
| RK3026 | √ | √ |
| RK3028A | √ | √ |
| RK3036 | √ | × |
| RK3066 | √ | √ |
| RK3126 | √ | √ |
| RK3126B, RK3126C с trust.img | √ | × |
| RK3126B, RK3126C без trust.img | √ | √ |
| RK3128 | √ | √ |
| RK3188 | √ | √ |
| RK322x | √ | × |
| RK322xh | √ | × |
| RK3288 | √ | √ |
| RK3328 | √ | × |
| RK3368 | √ | × |
| RK3399 | √ | × |
| RV1108 | √ | × |
| Другие SoC | √ | × |
√ — сведения об объёме выводятся.
× — сведения об объёме не выводятся.
Подробные сведения включают тип DDR, частоту, канал (channel a/channel b), ширину шины BW, строки row, столбцы col, банки BK, CS, ширину шины кристалла die BW и размер size (total capability).
При одном канале SoC общий объём равен Size или Total capacity; при двух — сумме этих значений обоих каналов.
Подробный вывод объёма DDR в loader:
DDR Version 1.05 20170712
In
Channel a: DDR3 400MHz
Bus Width=32 Col=10 Bank=8 Row=15 CS=1 Die Bus-Width=16 Size=1024MB
Channel b: DDR3 400MHz
Bus Width=32 Col=10 Bank=8 Row=15 CS=1 Die Bus-Width=16 Size=1024MB
Memory OK
Memory OK
OUT
Подробный вывод объёма DDR в ядре:
[ 0.528564] DDR DEBUG: version 1.00 20150126
[ 0.528690] DDR DEBUG: Channel a:
[ 0.528701] DDR DEBUG: DDR3 Device
[ 0.528716] DDR DEBUG: Bus Width=32 Col=10 Bank=8 Row=15 CS=1 Total Capability=1024MB
[ 0.528727] DDR DEBUG: Channel b:
[ 0.528736] DDR DEBUG: DDR3 Device
[ 0.528750] DDR DEBUG: Bus Width=32 Col=10 Bank=8 Row=15 CS=1 Total Capability=1024MB
[ 0.528762] DDR DEBUG: addr=0xd40000
1.10 Изменение доступного объёма DDR
По исходнику, на всех платформах Rockchip объём DDR определяется автоматически; пользователю не требуется его задавать. Описанный способ предназначен прежде всего для оценки производительности или влияния уменьшения доступного объёма.
Другой способ приведён в Rockchip_Developer_Guide_UBoot_Nextdev_CN → CH08 Debugging Methods → Modify DDR Capacity.
При загрузке код инициализации DDR передаёт объём в U-Boot. U-Boot исключает часть защищённой памяти и передаёт результат ядру. Пользователь может изменить передаваемый ядру объём на стадии U-Boot.
Расположение кода:
./arch/arm/mach-rockchip/param.c
Порядок изменения:
1. Добавьте диагностический вывод текущего объёма DDR.
struct memblock *param_parse_ddr_mem(int *out_count)
{
...
for (i = 0, n = 0; i < count; i++, n++) {
base = t->u.ddr_mem.bank[i];
size = t->u.ddr_mem.bank[i + count];
printf("base:0x%llx, size:0x%llx\n", base, size); //Add this line to print
/* 0~4GB */
if (base < SZ_4GB) {
mem[n].base = base;
mem[n].size = ddr_mem_get_usable_size(base, size);
...
}
После изменений пересоберите и загрузите U-Boot. В новом журнале запуска появится следующий вывод.
U-Boot 2017.09-g0236dc3682-220712-dirty #hcy (Aug 04 2022 - 10:46:07 +0800)
Model: Rockchip RK3568 Evaluation Board
PreSerial: 2, raw, 0xfe660000
DRAM: base:0x0, size:0x40000000 //This line is the output we added
В следующем примере:
base:0x0, size:0x40000000
Как показано ниже, имеется одна область DRAM с базовым адресом 0x0 и размером 0x40000000.

Перед запуском ядра U-Boot исключает часть защищённой памяти и передаёт сведения об объёме DDR следующим образом.
Adding bank: 0x00200000 - 0x08400000 (size: 0x08200000) //After removing the secure memory
block
Adding bank: 0x09400000 - 0x40000000 (size: 0x36c00000) //After removing the secure memory
block
Total: 1182.666 ms
Starting kernel ...
[ 0.000000] Booting Linux on physical CPU 0x0000000000 [0x412fd050]
2. Разобравшись с форматом описания объёма, можно его изменить.
Предположим, в систему добавлена область DRAM Region 1, показанная на рисунке. Для этого внесите следующие изменения:

struct memblock *param_parse_ddr_mem(int *out_count)
{
...
/* extend top ram size */
if (t->u.ddr_mem.flags & DDR_MEM_FLG_EXT_TOP)
gd->ram_top_ext_size = t->u.ddr_mem.data[0];
//Modify DDR capacity information,starting here
count = 2;
t->u.ddr_mem.count = count;
t->u.ddr_mem.bank[0] = 0x0; //Region 0 base address
t->u.ddr_mem.bank[0 + count] = 0x40000000 - 0x0; //Region 0 size
t->u.ddr_mem.bank[1] = 0x70000000; //Region 1 base address
t->u.ddr_mem.bank[1 + count] = 0x80000000 - 0x70000000; //Region 1 size
t->u.ddr_mem.hash = 0;
///Modify DDR capacity information, end here
/* normal ram size */
count = t->u.ddr_mem.count;
mem = calloc(count + MEM_RESV_COUNT, sizeof(*mem));
if (!mem) {
printf("Calloc ddr memory failed\n");
return 0;
}
...
for (i = 0, n = 0; i < count; i++, n++) {
base = t->u.ddr_mem.bank[i];
size = t->u.ddr_mem.bank[i + count];
printf("base:0x%llx, size:0x%llx\n", base, size);
/* 0~4GB */
if (base < SZ_4GB) {
mem[n].base = base;
mem[n].size = ddr_mem_get_usable_size(base, size);
...
}
Рассмотрим следующий код подробнее:
count = 2; //Indicates that there are 2 blocks of DRAM space
t->u.ddr_mem.count = count; //Must be written like this
t->u.ddr_mem.bank[0] = 0x0;
t->u.ddr_mem.bank[0 + count] = 0x40000000 - 0x0; //The array index must have "+count"
//Region base address plus Region size is One group, how many groups there are, must be
the same as the "count" above
t->u.ddr_mem.bank[1] = 0x70000000;
t->u.ddr_mem.bank[1 + count] = 0x80000000 - 0x70000000; //The array index must have
"+count"
t->u.ddr_mem.hash = 0; //Must be written like this
Пересоберите и загрузите U-Boot. Новый журнал запуска покажет, что изменения вступили в силу.
...
U-Boot 2017.09-g0236dc3682-220712-dirty #hcy (Aug 04 2022 - 10:46:07 +0800)
Model: Rockchip RK3568 Evaluation Board
PreSerial: 2, raw, 0xfe660000
DRAM: base:0x0, size:0x40000000
base:0x70000000, size:0x10000000 //this is what we have added
...
Adding bank: 0x00200000 - 0x08400000 (size: 0x08200000)
Adding bank: 0x09400000 - 0x40000000 (size: 0x36c00000)
Adding bank: 0x70000000 - 0x80000000 (size: 0x10000000) //this is what we have added
Total: 1182.666 ms
Starting kernel ...
[ 0.000000] Booting Linux on physical CPU 0x0000000000 [0x412fd050]
Если физически используется только одна область DRAM, но её доступный размер требуется изменить на 0x80000000, добавьте следующий код.
count = 1; //Indicates that there is 1 block
t->u.ddr_mem.count = count; //Must be written like this
t->u.ddr_mem.bank[0] = 0x0;
t->u.ddr_mem.bank[0 + count] = 0x80000000 - 0x0; //The array index must have "+count"
t->u.ddr_mem.hash = 0; //Must be written like this
**Внимание:** нельзя произвольно увеличивать заявленный объём DRAM: при отсутствии реальной памяти система будет работать неправильно. Обычно объём уменьшают для оценки. Region1 добавлена в примере только для объяснения способа.
1.11 Просмотр частоты DDR
Через devfreq
Если изменение частоты DDR включено, текущую частоту можно получить через следующие узлы:
cat /sys/class/devfreq/dmc/cur_freq
console:/ # cat /sys/class/devfreq/dmc/cur_freq
780000000
Через clk_summary
cat /sys/kernel/debug/clk/clk_summary | grep scmi_clk_ddr
Или:
cat /sys/kernel/debug/clk/clk_summary | grep sclk_ddrc
Или:
cat /sys/kernel/debug/clk/clk_summary | grep sclk_ddr
Выбор зависит от версии ядра.
console:/ # cat /sys/kernel/debug/clk/clk_summary | grep scmi_clk_ddr
scmi_clk_ddr 0 0 0 2736000000 0 0 50000
/*2736000000 is the DDR frequency in Hz, that is, 2736MHz*/
1.12 Изменение частоты DDR
В ядре используются две стратегии: изменение частоты по сценарию и по нагрузке. Поведение kernel 4.4 и новее отличается от kernel 3.10.
Kernel 4.4 и новее:
По сценарию: при входе в заданный сценарий частота DDR переходит на соответствующее значение SYS_STATUS_XXX, если управление по нагрузке отключено. Если оно включено, частота повышается или снижается по фактической нагрузке и порогам upthreshold/downdifferential, но не ниже значения SYS_STATUS_XXX.
По нагрузке: частота во всех сценариях зависит от нагрузки, но остаётся не ниже значения SYS_STATUS_XXX. Исключение — SYS_STATUS_NORMAL: его значение заменяется частотой по нагрузке, а нижняя граница определяется auto-min-freq, а не SYS_STATUS_NORMAL.
Kernel 3.10:
По сценарию: при входе в заданный сценарий частота DDR переходит на SYS_STATUS_XXX и далее не меняется, даже если включено управление по нагрузке.
По нагрузке: заменяется сценарий SYS_STATUS_NORMAL; только в нём частота DDR определяется нагрузкой.
Способ изменения частоты необходимо выбирать по ветке ядра.
Для PX30S/RK3326S см. ниже раздел «Выбор частот DDR для PX30S/RK3326S».
Для платформ с четырьмя частотами в DDR bin см. ниже соответствующий раздел о выборе частоты.
В kernel 4.4 найдите узел dmc в DTS. Например, для RK3399 EVB он описан в arch/arm64/boot/dts/rockchip/rk3399-evb.dtsi и arch/arm64/boot/dts/rockchip/rk3399.dtsi.
&dmc {
status = "okay";
center-supply = <&vdd_center>;
upthreshold = <40>;
downdifferential = <20>;
system-status-freq = <
/*system status freq(KHz)*/
SYS_STATUS_NORMAL 800000
SYS_STATUS_REBOOT 528000
SYS_STATUS_SUSPEND 200000
SYS_STATUS_VIDEO_1080P 200000
SYS_STATUS_VIDEO_4K 600000
SYS_STATUS_VIDEO_4K_10B 800000
SYS_STATUS_PERFORMANCE 800000
SYS_STATUS_BOOST 400000
SYS_STATUS_DUALVIEW 600000
SYS_STATUS_ISP 600000
>;
/* Each line is used as a group of data, "min_bw "and "max_bw" represent the bandwidth
requirement corresponded by vop.When the requirement value fallling between the range of
"min_bw" and "max_bw", the DDR frequency needs to increase the frequency specified by
"freq", and is valid at "auto-freq-en=1" */
vop-bw-dmc-freq = <
/* min_bw(MB/s) max_bw(MB/s) freq(KHz) */
0 577 200000
578 1701 300000
1702 99999 400000
>;
auto-min-freq = <200000>;
};
dmc: dmc {
compatible = "rockchip,rk3399-dmc";
devfreq-events = <&dfi>;
interrupts = <GIC_SPI 1 IRQ_TYPE_LEVEL_HIGH 0>;
clocks = <&cru SCLK_DDRCLK>;
clock-names = "dmc_clk";
ddr_timing = <&ddr_timing>;
/* DDR utilization exceeds 40%, starts to increase frequency when "auto-freq-en=1 " */
upthreshold = <40>;
/* DDR utilization less than 20%, start to reduce frequency when "auto-freq-en=1 " */
downdifferential = <20>;
system-status-freq = <
/*system status freq(KHz)*/
/* It is valid when "auto-freq-en=0". It indicates that this scene is in common use
except for the following scenes */
SYS_STATUS_NORMAL 800000
/* It means the DDR frequency before reboot. When auto-freq-en=1, this frequency will be
used as the min value and increased according to the load status */
SYS_STATUS_REBOOT 528000
/* It means the DDR frequency at early suspend. When auto-freq-en=1, this frequency will
be used as the min value and increased according to the load status */
SYS_STATUS_SUSPEND 200000
/* It means the DDR frequency at playing 1080P video.When auto-freq-en=1, this frequency
will be used as the min value and increased according to the load status */
SYS_STATUS_VIDEO_1080P 300000
/* It means the DDR frequency at playing 4K video When auto-freq-en=1, this frequency
will be used as the min value and increased according to the load status */
SYS_STATUS_VIDEO_4K 600000
/* It means the DDR frequency at playing 4K 10bit video. When auto-freq-en=1, this
frequency will be used as the min value and increased according to the load status */
SYS_STATUS_VIDEO_4K_10B 800000
/* It means the DDR frequency at performance mode.When auto-freq-en=1, this frequency
will be used as the min value and increased according to the load status */
SYS_STATUS_PERFORMANCE 800000
/* It means the DDR frequency at touching,getting higher frequency from low in order to
improve touching respond.When auto-freq-en=1, this frequency will be used as the min value
and increased according to the load status */
SYS_STATUS_BOOST 400000
/* It means the DDR frequency at dual display mode.When auto-freq-en=1, this frequency
will be used as the min value and increased according to the load status */
SYS_STATUS_DUALVIEW 600000
/* It means the DDR frequency at ISP mode.When auto-freq-en=1, this frequency will be
used as the min value and increased according to the load status */
SYS_STATUS_ISP 600000
>;
/* When auto-freq-en=1, this frequency will be used as the min value of
SYS_STATUS_NORMAL scenario */
auto-min-freq = <400000>;
/* The value equals to 1,which indicates this function is on, to 0,which means off.If it
is on, "SYS_STATUS_NORMAL" will be taken by the load frequency completely and the lowest
frequency is" auto-min-freq" instead of "SYS_STATUS_NORMAL".That means,it takes the
frequency defined by this scene as the lowest frequency and the system will increase or
reduece DDR frequency through "upthreshold/downdifferential" according to DDR utilization */
auto-freq-en = <1>;
status = "disabled";
};
**Примечание 1:** таблица частот и напряжений kernel 4.4 работает иначе, чем в kernel 3.10. Частота непосредственно используется только при совпадении с opp-hz из dmc_opp_table. Меньшее значение округляется вверх к opp-hz, а превышающее верхнюю границу ограничивается ею. Чтобы избежать неожиданного ограничения, проверьте dmc_opp_table.
dmc_opp_table: opp-table3 {
opp-200000000 {
/* When the DDR frequency equals to 200MHz,this voltage is effective;less than
200MHz,running at 200MHz */
opp-hz = /bits/ 64 <200000000>;
opp-microvolt = <825000>; //vdd_center voltage
};
...
opp-800000000 {
opp-hz = /bits/ 64 <800000000>;
opp-microvolt = <900000>;
};
};
Разобравшись с параметрами конфигурации, измените частоту нужного сценария. При auto-freq-en=1 точно контролировать частоту сложнее. Если снижение частоты нужно для поиска неисправности, задайте auto-freq-en=0 и измените значения частот отдельных сценариев.
**Примечание 2:** для RK3399 с LPDDR4 и RV1126 набор поддерживаемых частот определяется loader. Он выводится через последовательный порт при инициализации DDR. Частоты в dmc_opp_table ядра должны соответствовать этому набору.
Например, loader RV1126 выводит 328MHz, 528MHz, 784MHz и 924MHz; в dmc_opp_table допустимо определить только эти четыре частоты.
change to: 328MHz
change to: 528MHz
change to: 784MHz
change to: 924MHz(final freq)
dmc_opp_table: dmc-opp-table {
compatible = "operating-points-v2";
opp-328000000 {
opp-hz = /bits/ 64 <328000000>;
opp-microvolt = <800000>;
};
opp-528000000 {
opp-hz = /bits/ 64 <528000000>;
opp-microvolt = <800000>;
};
opp-784000000 {
opp-hz = /bits/ 64 <784000000>;
opp-microvolt = <800000>;
};
opp-924000000 {
opp-hz = /bits/ 64 <924000000>;
opp-microvolt = <800000>;
};
};
При несовпадении частот dmc_opp_table и loader драйвер dmc встретит ошибку несоответствия при переключении DDR. Пример журнала:
rockchip-dmc dmc: Get wrong frequency, Request 1056000000, Current 924000000
В kernel 3.10 найдите узел clk_ddr_dvfs_table в DTS. Например, для платы RK3288 SDK его окончательное описание находится в arch/arm/boot/dts/rk3288-tb_8846.dts.
&clk_ddr_dvfs_table {
/* The logic voltage corresponding to the DDR frequency, if the frequency in "freq-
table" or "bd-freq-table" is larger than the maximum frequency here, the corresponding
voltage cannot be found and can not switched to the corresponding frequency. At this time,
you need to add frequency voltage table here */
operating-points = <
/* KHz uV */
200000 1050000
300000 1050000
400000 1100000
533000 1150000
>;
freq-table = <
/*status freq(KHz)*/
/* It is valid only when "auto-freq-en=0".And it indicates that this scene is common
use scene except for the following scenes */
SYS_STATUS_NORMAL 400000
/* DDR frequency at the early suspend */
SYS_STATUS_SUSPEND 200000
/* DDR frequency at playing 1080P video */
SYS_STATUS_VIDEO_1080P 240000
/* DDR frequency at playing 4K video */
SYS_STATUS_VIDEO_4K 400000
/* DDR frequency at playing 60FPS video */
SYS_STATUS_VIDEO_4K_60FPS 400000
/* DDR frequency at performance mode */
SYS_STATUS_PERFORMANCE 528000
/* DDR frequency at dual display */
SYS_STATUS_DUALVIEW 400000
/* DDR frequency at touching,getting higher frequency from low in order to improve
touching respond */
SYS_STATUS_BOOST 324000
/* DDR frequency at ISP */
SYS_STATUS_ISP 400000
>;
bd-freq-table = <
/* bandwidth freq */
5000 800000
3500 456000
2600 396000
2000 324000
>;
/* After the load frequency scaling turned on,where the "SYS_STATUS_NORMAL" scenario, it
will switch between several frequencies listed by this table according to the DDR bandwidth
utilization */
auto-freq-table = <
240000
324000
396000
528000
>;
/* The value equals to "1", indicating that the load frequency conversion function is
enabled; equals to 0, means disabled. After the load frequency conversion function turning
on, the "SYS_STATUS_NORMAL" scene frequency scaling will be completely replaced by the load
scaling frequency */
auto-freq=<1>;
/*
* 0: use standard flow
* 1: vop dclk never divided
* 2: vop dclk always divided
*/
vop-dclk-mode = <0>;
status="okay";
};
Разобравшись с параметрами конфигурации, измените частоту нужного сценария. При auto-freq-en=1 точно контролировать частоту сложнее. Если снижение частоты нужно для поиска неисправности, задайте auto-freq-en=0 и измените значения частот отдельных сценариев.
**Обязательно убедитесь, что выбранного напряжения достаточно для этой частоты.** Изменение напряжения описано в разделе «Изменение напряжения для заданной частоты DDR».
В английском исходнике здесь указано kernel3.10: найдите dvfs_ddr_table в файле платы borad-**.c. Например, для RK3066 SDK таблица находится в arch/arm/mach-rk30/board-rk30-sdk.c. Следующий абзац относится к kernel 3.0; это несогласованность исходника.
static struct cpufreq_frequency_table dvfs_ddr_table[] = {
/* DDR frequency at the early suspend */
{.frequency = 200 * 1000 + DDR_FREQ_SUSPEND, .index = 1050 * 1000},
/* DDR frequency at playing video */
{.frequency = 300 * 1000 + DDR_FREQ_VIDEO, .index = 1050 * 1000},
/* it indicates that this scene is common use scene except for above two scenes */
{.frequency = 400 * 1000 + DDR_FREQ_NORMAL, .index = 1125 * 1000},
{.frequency = CPUFREQ_TABLE_END},
};
В kernel 3.0 предусмотрены только три сценария. Частота задаётся значением «200 * 1000» поля .frequency, единица — KHz. Суффикс «+ DDR_FREQ_SUSPEND» при выборе частоты можно не учитывать.
**Обязательно убедитесь, что выбранного напряжения достаточно для этой частоты.** Изменение напряжения описано в разделе «Изменение напряжения для заданной частоты DDR».
1.12.1 Включение 928MHz для RK3399 с LPDDR4
1. Измените RKBOOT/RK3399MINIALL.ini в каталоге rkbin: выберите DDR bin для 933MHz и соберите loader.
diff --git a/RKBOOT/RK3399MINIALL.ini b/RKBOOT/RK3399MINIALL.ini
index d8e71dd7..3e20f255 100755
--- a/RKBOOT/RK3399MINIALL.ini
+++ b/RKBOOT/RK3399MINIALL.ini
@@ -5,7 +5,7 @@ MAJOR=1
MINOR=26
[CODE471_OPTION]
NUM=1
-Path1=bin/rk33/rk3399_ddr_800MHz_v1.27.bin
+Path1=bin/rk33/rk3399_ddr_933MHz_v1.27.bin
Sleep=1
[CODE472_OPTION]
NUM=1
@@ -14,7 +14,7 @@ Path1=bin/rk33/rk3399_usbplug_v1.26.bin
NUM=2
LOADER1=FlashData
LOADER2=FlashBoot
-FlashData=bin/rk33/rk3399_ddr_800MHz_v1.27.bin
+FlashData=bin/rk33/rk3399_ddr_933MHz_v1.27.bin
FlashBoot=bin/rk33/rk3399_miniloader_v1.26.bin
[OUTPUT]
PATH=rk3399_loader_v1.27.126.bin
После записи собранного loader в устройство журнал последовательного порта покажет пять поддерживаемых частот: 416MHz, 856MHz, 328MHz, 666MHz и 928MHz. Текущая частота DDR — 856MHz.
DDR Version 1.27 20211018
In
...
support 416 856 328 666 928 MHz, current 856MHz
OUT
2. В узле dmc_opp_table DTS ядра измените status = “disabled” записи opp-928000000 на status = “okay” либо удалите это свойство.
opp-928000000 {
opp-hz = /bits/ 64 <928000000>;
opp-microvolt = <900000>;
- status = "disabled";
};
3. В узле dmc замените все значения «856000» таблицы system-status-freq на «928000». Либо, согласно описанию SYS_STATUS_XXX в разделе об изменении частоты DDR, изменяйте отдельные сценарии в зависимости от требуемой пропускной способности реального проекта.
1.12.2 Выбор частот DDR для PX30S/RK3326S
На RK3326S/PX30S поддерживаются только четыре частотные точки. Они задаются узлом ddrx_params в arch/arm64/boot/dts/rockchip/px30s-dram-default-timing.dtsi и узлом px30s_dmc_opp_table в arch/arm64/boot/dts/rockchip/px30.dtsi.
В ddrx_params для DDR3 задайте freq_0, freq_1, freq_2, freq_3 внутри ddr3_params; для DDR4 — внутри ddr4_params.
В px30s_dmc_opp_table все типы DDR используют общую таблицу. Включённые частоты должны соответствовать freq_0, freq_1, freq_2, freq_3 в ddrx_params. Например, для LPDDR4 они должны совпадать со значениями lpddr4_params. Пример конфигурации:
px30s_dmc_opp_table: px30s-dmc-opp-table {
compatible = "operating-points-v2";
opp-328000000 {
opp-hz = /bits/ 64 <328000000>;
opp-microvolt = <1000000>;
};
opp-666000000 {
opp-hz = /bits/ 64 <666000000>;
opp-microvolt = <1000000>;
};
opp-786000000 {
opp-hz = /bits/ 64 <786000000>;
opp-microvolt = <1000000>;
};
opp-924000000 {
opp-hz = /bits/ 64 <924000000>;
opp-microvolt = <1000000>;
};
/* 1056M only for LP4 */
opp-1056000000 {
opp-hz = /bits/ 64 <1056000000>;
opp-microvolt = <1000000>;
status = "disabled";
};
};
/ {
...
lpddr4_params: lpddr4-params {
...
/* freq info, freq_0 is final frequency, unit: MHz */
freq_0 = <924>;
freq_1 = <328>;
freq_2 = <666>;
freq_3 = <786>;
...
};
};
Для работы LPDDR4 на 1056MHz измените одну из freq_0, freq_1, freq_2, freq_3 в lpddr4_params на 1056. В px30s_dmc_opp_table отключите прежнюю частотную точку и добавьте 1056000000.
Новая конфигурация:
px30s_dmc_opp_table: px30s-dmc-opp-table {
compatible = "operating-points-v2";
opp-328000000 {
opp-hz = /bits/ 64 <328000000>;
opp-microvolt = <1000000>;
};
opp-666000000 {
opp-hz = /bits/ 64 <666000000>;
opp-microvolt = <1000000>;
};
opp-786000000 {
opp-hz = /bits/ 64 <786000000>;
opp-microvolt = <1000000>;
};
opp-924000000 {
opp-hz = /bits/ 64 <924000000>;
opp-microvolt = <1000000>;
status = "disabled";
};
/* 1056M only for LP4 */
opp-1056000000 {
opp-hz = /bits/ 64 <1056000000>;
opp-microvolt = <1000000>;
};
};
/ {
...
lpddr4_params: lpddr4-params {
...
/* freq info, freq_0 is final frequency, unit: MHz */
freq_0 = <1056>;
freq_1 = <328>;
freq_2 = <666>;
freq_3 = <786>;
...
};
};
1.12.3 Выбор частоты для платформ с четырьмя точками в DDR bin
Способ подходит всем платформам из раздела о DDR bin с четырьмя частотами, кроме RV1126.
На этих платформах loader четырежды меняет частоту и сохраняет результаты тренировки для соответствующих частот.
F1, F2, F3 и F0 ниже — эти четыре частоты. По умолчанию выход из loader выполняется на F0.
DDR ... v1.14
LPDDR4X, 2112MHz
channel[0] BW=16 Col=10 Bk=8 CS0 Row=16/0 CS1 Row=16/0 CS=2 Die BW=16 Size=2048MB
channel[1] BW=16 Col=10 Bk=8 CS0 Row=16/0 CS1 Row=16/0 CS=2 Die BW=16 Size=2048MB
channel[2] BW=16 Col=10 Bk=8 CS0 Row=16/0 CS1 Row=16/0 CS=2 Die BW=16 Size=2048MB
channel[3] BW=16 Col=10 Bk=8 CS0 Row=16/0 CS1 Row=16/0 CS=2 Die BW=16 Size=2048MB
...
change to F1: 528MHz /* 4 DDR frequencies*/
change to F2: 1068MHz
change to F3: 1560MHz
change to F0: 2112MHz
out
Хотя поддерживаемые частоты здесь тоже определяются loader, драйвер dmc автоматически получает их значения. Поэтому проблема согласования dmc_opp_table отсутствует. Узлы dmc этих платформ выглядят следующим образом:
dmc: dmc {
...
system-status-freq = <
/*system status freq(KHz)*/
SYS_STATUS_NORMAL DMC_FREQ_LEVEL_MID_HIGH
SYS_STATUS_REBOOT DMC_FREQ_LEVEL_MID_LOW
...
SYS_STATUS_SUSPEND DMC_FREQ_LEVEL_LOW
...
SYS_STATUS_PERFORMANCE DMC_FREQ_LEVEL_HIGH
...
>;
...
};
Частоты сценариев задаются не числами, а определениями вида DMC_FREQ_LEVEL_HIGH, автоматически соответствующими четырём частотам loader. Если изменить их инструментом из раздела «Изменение DDR bin», определения DMC_FREQ_LEVEL_HIGH и другие также будут соответствовать новому набору. Для приведённого loader соответствие следующее:
| Макрос | Частота | Описание |
|---|---|---|
| DMC_FREQ_LEVEL_HIGH | F0 2112MHz | Наибольшая частота |
| DMC_FREQ_LEVEL_MID_HIGH | F3 1560MHz | Вторая по убыванию |
| DMC_FREQ_LEVEL_MID_LOW | F2 1068MHz | Третья по убыванию |
| DMC_FREQ_LEVEL_LOW | F1 528MHz | Наименьшая частота |
Чтобы изменить значения частот F0, F1, F2 и F3, см. «Изменение DDR bin».
Для изменения частоты сценария, например SYS_STATUS_NORMAL или SYS_STATUS_REBOOT, выберите DMC_FREQ_LEVEL_HIGH, DMC_FREQ_LEVEL_MID_HIGH, DMC_FREQ_LEVEL_MID_LOW либо DMC_FREQ_LEVEL_LOW.
1.13 Изменение напряжения для заданной частоты DDR
Для поиска неисправности изменением напряжения из командной строки используйте следующий способ. В версиях после kernel 4.4 напряжение регулятора можно менять через /sys/kernel/debug/regulator/. Сначала зафиксируйте частоту DDR, иначе ручная настройка будет конфликтовать с регулировкой напряжения при смене частоты. См. раздел «Фиксация частоты DDR».
Пример изменения напряжения для 3588:
cat /sys/kernel/debug/regulator/vdd_ddr_s0/voltage
echo 700000 > /sys/kernel/debug/regulator/vdd_ddr_s0/voltage
Регуляторы, которые требуется менять на каждой платформе для настройки напряжения при заданной частоте DDR:
| Платформа | Регулируемые узлы |
|---|---|
| RK3308/RK3308B | “vdd_core” или “vdd_log” |
| RK3576 | “vdd_logic_s0” и “vdd_ddr_s0” |
| RK3588 | “vdd_log_s0” и “vdd_ddr_s0” |
| Другие SoC | “vdd_center” или “vdd_logic” |
Kernel 4.4: пересоберите ядро, включив pm_tests: make ARCH=arm64 menuconfig -> Device Drivers -> SOC (System On Chip) specific Drivers -> Rockchip pm_test support.
Kernel 3.10: пересоберите ядро, включив pm_tests: make menuconfig -> System Type -> /sys/pm_tests/ support.
Команда изменения напряжения DDR:
RK3399
echo set vdd_center 900000 > /sys/pm_tests/clk_volt
Другие SoC
echo set vdd_logic 1200000 > /sys/pm_tests/clk_volt
Если pm_tests отсутствует или команда не решает задачу, измените прошивку ядра следующим образом.
В kernel 4.4 найдите dmc_opp_table в DTS. Для RK3399 EVB он находится в arch/arm64/boot/dts/rockchip/rk3399-opp.dtsi, для RK3368 — в arch/arm64/boot/dts/rockchip/rk3368.dtsi.
Пример для RK3399:
/* it runs in this frequency only when frequency equals to "opp-hz"listed by
"dmc_opp_table".If the frequency less than "opp-hz", the frequency will getting
higher,otherwise, it exceeds "opp-hz" the upper limited,it will restricted by "opp-hz".It is
different from kernel 3.10 */
dmc_opp_table: opp-table3 {
compatible = "operating-points-v2";
opp-200000000 {
/* When the DDR frequency equals to 200MHz,this voltage is effective;less than
200MHz,running at 200MHz */
opp-hz = /bits/ 64 <200000000>;
opp-microvolt = <825000>; //vdd_center voltage
};
opp-300000000 {
opp-hz = /bits/ 64 <300000000>;
opp-microvolt = <850000>;
};
opp-400000000 {
opp-hz = /bits/ 64 <400000000>;
opp-microvolt = <850000>;
};
opp-528000000 {
opp-hz = /bits/ 64 <528000000>;
opp-microvolt = <900000>;
};
opp-600000000 {
opp-hz = /bits/ 64 <600000000>;
opp-microvolt = <900000>;
};
opp-800000000 {
opp-hz = /bits/ 64 <800000000>;
opp-microvolt = <900000>;
};
};
Пример для RK3368:
/* it runs in this frequency only when frequency equals to "opp-hz"listed by
"dmc_opp_table".If the frequency less than "opp-hz", the frequency will getting
higher,otherwise, it exceeds "opp-hz" the upper limited,it will restricted by "opp-hz".It is
different from kernel 3.10 */
dmc_opp_table: opp_table2 {
compatible = "operating-points-v2";
opp-192000000 {
/* When the DDR frequency equals to 200MHz,this voltage is effective;less than
200MHz,running at 200MHz */
opp-hz = /bits/ 64 <192000000>;
opp-microvolt = <1100000>; //vdd_logic voltage
};
opp-300000000 {
opp-hz = /bits/ 64 <300000000>;
opp-microvolt = <1100000>;
};
opp-396000000 {
opp-hz = /bits/ 64 <396000000>;
opp-microvolt = <1100000>;
};
opp-528000000 {
opp-hz = /bits/ 64 <528000000>;
opp-microvolt = <1100000>;
};
opp-600000000 {
opp-hz = /bits/ 64 <600000000>;
opp-microvolt = <1100000>;
};
};
Измените напряжение, соответствующее частоте. Исходник описывает выбор напряжения по записи с частотой не выше заданной. Если новая частота выходит за границы таблицы, подходящее напряжение не будет найдено и переход DDR завершится ошибкой. Добавьте соответствующую пару частота–напряжение.
В kernel 3.10 найдите clk_ddr_dvfs_table в DTS. Например, для платы RK3288 SDK его окончательное описание находится в arch/arm/boot/dts/rk3288-tb_8846.dts.
&clk_ddr_dvfs_table {
/* This is Frequency-voltage table */
operating-points = <
/* KHz uV */
/* it is show when DDR frequency less than or equals to 200MHz,logic voltage uses
1050mV.Other lines mean the same here */
200000 1050000
300000 1050000
400000 1100000
533000 1150000
>;
...
status="okay";
};
Измените напряжение, соответствующее частоте. Исходник описывает выбор напряжения по записи с частотой не выше заданной. Если новая частота выходит за границы таблицы, подходящее напряжение не будет найдено и переход DDR завершится ошибкой. Добавьте соответствующую пару частота–напряжение.
В kernel 3.0 измените dvfs_ddr_table в файле платы borad-**.c. Например, для RK3066 SDK
файл находится в arch/arm/mach-rk30/board-rk30-sdk.c.
static struct cpufreq_frequency_table dvfs_ddr_table[] = {
{.frequency = 200 * 1000 + DDR_FREQ_SUSPEND, .index = 1050 * 1000},
{.frequency = 300 * 1000 + DDR_FREQ_VIDEO, .index = 1050 * 1000},
{.frequency = 400 * 1000 + DDR_FREQ_NORMAL, .index = 1125 * 1000},
{.frequency = CPUFREQ_TABLE_END},
};
Поле .index в dvfs_ddr_table задаёт соответствующее напряжение в uV.
1.14 Отключение управления по нагрузке с сохранением частот сценариев
В kernel 4.4 и новее найдите auto-freq-en в узле dmc DTS. Например, для RK3399 EVB оно находится в arch/arm64/boot/dts/rockchip/rk3399.dtsi.
dmc: dmc {
compatible = "rockchip,rk3399-dmc";
...
auto-min-freq = <400000>;
/* Set this value to 0 to close the load DDR Frequency scaling with leaving only the
scene frequency scaling */
auto-freq-en = <0>;
...
};
В kernel 3.10 найдите clk_ddr_dvfs_table в DTS. Например, для RK3288 EVB — arch/arm/boot/dts/rk3288-tb_8846.dts.
&clk_ddr_dvfs_table {
...
/* Set this value to 0 to close the load DDR Frequency scaling with leaving only the
scene frequency scaling */
auto-freq=<0>;
...
status="okay";
};
В kernel 3.0 управление частотой по нагрузке не поддерживается, поэтому отключать его не требуется.
1.15 Фиксация частоты DDR
Для поиска неисправности фиксацией частоты из командной строки используйте следующий способ.
Kernel 4.4 и новее:
Получите доступные частоты: cat /sys/class/devfreq/dmc/available_frequencies.
Установите частоту:
echo userspace > /sys/class/devfreq/dmc/governor
echo 300000000 > /sys/class/devfreq/dmc/min_freq //This line purposes to prevent the frequency to be set lower than "min_freq", cause operation failed.
echo 300000000 > /sys/class/devfreq/dmc/userspace/set_freq
Kernel 3.10:
Пересоберите ядро с pm_tests: make menuconfig -> System Type -> /sys/pm_tests/ support. Команда фиксации частоты DDR:
echo set clk_ddr 300000000 > /sys/pm_tests/clk_rate
Частота задаётся в Hz; параметр команды можно изменить по необходимости.
Если способ неприменим, остаётся изменить исходный код или DTS.
В kernel 4.4 и новее типичная причина неудачи — отсутствие требуемой частоты в выводе cat /sys/class/devfreq/dmc/available_frequencies.
Найдите DTS платы и добавьте требуемую частоту в dmc_opp_table. Например, для RK3399 EVB используется arch/arm64/boot/dts/rockchip/rk3399-opp.dtsi. Ниже предполагается добавление 666MHz:
dmc_opp_table: opp-table3 {
compatible = "operating-points-v2";
opp-200000000 {
opp-hz = /bits/ 64 <200000000>;
opp-microvolt = <825000>;
};
...
opp-666000000 {
/* When DDR frequency equals to 666MHz,use this voltage */
opp-hz = /bits/ 64 <666000000>;
opp-microvolt = <900000>; //vdd_center voltage
};
opp-800000000 {
opp-hz = /bits/ 64 <800000000>;
opp-microvolt = <900000>;
};
};
После этого частоту можно зафиксировать предыдущей командой.
Чтобы система сразу запускалась на фиксированной частоте, без ввода команды после включения, измените DTS следующим образом.
Предположим, требуется 666MHz. Для RK3399 EVB узел dmc находится в arch/arm64/boot/dts/rockchip/rk3399-evb.dtsi.
/* Here "dfi" status must be "okay", it is due to lagacy code, the dmc node is
restriced by the dfi node. If the "dfi" node is disabled, it will also invalidate the
dmc node. So it is best to keep the status of the "dfi" node consistent with dmc */
&dfi {
status = "okay";
};
&dmc {
status = "okay";
...
system-status-freq = <
/*system status freq(KHz)*/
SYS_STATUS_NORMAL 666000
/* Remove the rest scenario */
/*
SYS_STATUS_REBOOT 528000
SYS_STATUS_SUSPEND 200000
SYS_STATUS_VIDEO_1080P 200000
SYS_STATUS_VIDEO_4K 600000
SYS_STATUS_VIDEO_4K_10B 800000
SYS_STATUS_PERFORMANCE 800000
SYS_STATUS_BOOST 400000
SYS_STATUS_DUALVIEW 600000
SYS_STATUS_ISP 600000
*/
>;
...
auto-min-freq = <666000>;
/* The value of "auto-freq-en" shall be 0 to disable load DDR Frequency scaling */
auto-freq-en = <0>;
};
В kernel 3.10 найдите clk_ddr_dvfs_table. Для платы RK3288 SDK он находится в arch/arm/boot/dts/rk3288-tb_8846.dts.
&clk_ddr_dvfs_table {
operating-points = <
/* KHz uV */
/* step 3,if the target frequency exceeds the maximun of this table,you shall add
the voltage table corresponding to the target frequency */
200000 1050000
300000 1050000
400000 1100000
533000 1150000
>;
freq-table = <
/*status freq(KHz)*/
/* step 2, Comment out the other scenario,keep "SYS_STATUS_NORMAL" and define it to
you target frequency, for example you need 400MHz as below */
SYS_STATUS_NORMAL 400000
/*
SYS_STATUS_SUSPEND 200000
SYS_STATUS_VIDEO_1080P 240000
SYS_STATUS_VIDEO_4K 400000
SYS_STATUS_VIDEO_4K_60FPS 400000
SYS_STATUS_PERFORMANCE 528000
SYS_STATUS_DUALVIEW 400000
SYS_STATUS_BOOST 324000
SYS_STATUS_ISP 400000
*/
>;
bd-freq-table = <
/* bandwidth freq */
5000 800000
3500 456000
2600 396000
2000 324000
>;
auto-freq-table = <
240000
324000
396000
528000
>;
/* setp 1,set 0 to disable load DDR Frequency scaling */
auto-freq=<0>;
/*
* 0: use standard flow
* 1: vop dclk never divided
* 2: vop dclk always divided
*/
vop-dclk-mode = <0>;
status="okay";
};
Прошивка с фиксированной частотой получается за три шага:
1. Установите управление по нагрузке в 0.
2. Закомментируйте остальные сценарии; оставьте SYS_STATUS_NORMAL и задайте ему требуемую частоту.
3. Если частота превышает максимум таблицы, добавьте соответствующую ей запись напряжения.
В kernel 3.0 измените dvfs_ddr_table в borad-**.c. Например, для RK3066 SDK файл находится в arch/arm/mach-rk30/board-rk30-sdk.c.
static struct cpufreq_frequency_table dvfs_ddr_table[] = {
/* */
/* step 1. Comment out the other scene with leaving "DDR_FREQ_NORMAL" only */
//{.frequency = 200 * 1000 + DDR_FREQ_SUSPEND, .index = 1050 * 1000},
//{.frequency = 300 * 1000 + DDR_FREQ_VIDEO, .index = 1050 * 1000},
/* step 2, Define "DDR_FREQ_NORMAL" to your target frequency,meanwhile pay attention to
whether the voltage match the frequency or not */
{.frequency = 400 * 1000 + DDR_FREQ_NORMAL, .index = 1125 * 1000},
{.frequency = CPUFREQ_TABLE_END},
};
Достаточно двух шагов:
1. Закомментируйте остальные сценарии; оставьте только DDR_FREQ_NORMAL.
2. Задайте требуемую частоту DDR_FREQ_NORMAL и убедитесь, что напряжение ей соответствует.
1.16 Определение загрузки пропускной способности DDR
В kernel 4.4 и новее имеется команда просмотра общей загрузки DDR:
rk3288:/sys/class/devfreq/dmc # cat load
11@396000000Hz
Значение 11 означает, что текущая загрузка пропускной способности DDR равна 11%.
Rockchip также предоставляет отдельную программу наблюдения за пропускной способностью DDR. См. главу «Инструмент пропускной способности Rockchip DDR».
1.17 Проверка надёжности DDR
См. документ/главу DDR-Verification-Process.
1.18 Определение максимальной рабочей частоты DDR
1. Сначала добавьте соответствующую пару частота–напряжение. См. разделы «Изменение частоты DDR» и «Изменение напряжения для заданной частоты DDR».
2. Если платформа поддерживает глазковый инструмент, проверьте диаграмму по главе «Инструмент глазковой диаграммы Rockchip DDR DQ».
3. Запускайте google stressapptest от высокой частоты к низкой. При ошибке снизьте частоту и повторите тест. Если ошибок нет, увеличьте время тестирования. При устойчивой работе переходите к следующему шагу.
Google stressapptest находится в https://redmine.rock-chips.com/documents/49 → DDR related information_VerX.XX.7z → DDR particle verification_DDR test resource file → static_stressapptest. Использование описано в главе Guide_DDR_Verification_Process.
4. Предыдущий шаг даёт приблизительную верхнюю частоту. Теперь запустите memtester. При ошибке снижайте частоту и повторяйте тест; при отсутствии ошибок увеличьте время работы. Если тест остаётся успешным, получена проверенная этим методом верхняя частотная точка.
Memtester находится в https://redmine.rock-chips.com/documents/49 → DDR related information_VerX.XX.7z → DDR particle verification_DDR test resource file → static_memtester. См. главу Guide_DDR_Verification_Process.
Google stressapptest выполняет более грубую проверку и быстрее выявляет ошибки. Memtester проверяет тщательнее и сообщает ошибки медленнее; он ориентирован прежде всего на сигналы и покрывает часть случаев, пропускаемых google stressapptest.
Все эти способы являются программными тестами для быстрой оценки максимальной частоты. Они не гарантируют, что фактическая целостность сигналов DDR на этой частоте соответствует JEDEC. Необходимы измерения сигналов и длительные нагрузочные испытания.
1.19 Определение режима self-refresh
Режим можно определить измерением CKE; осциллограф с очень высокой полосой не требуется.
| Состояние CKE | Пояснение |
|---|---|
| Низкий уровень (время >7.8us) | Режим self-refresh |
| Высокий уровень | Обычная работа |
Если CKE периодически переключается между низким и высоким уровнями, таблица выше также применима: память входит в self-refresh, затем возвращается к обычной работе.
Примечание: в описанном методе низкий уровень CKE должен длиться более 7.8 us, чтобы считать состояние self-refresh. В power-down CKE тоже низкий, но менее 7.8 us. Не путайте эти случаи.
1.20 Определение режима auto power-down
Режим можно определить измерением CKE; осциллограф с очень высокой полосой не требуется.
| Состояние CKE | Пояснение |
|---|---|
| Низкий уровень (время <7.8us) | Режим power-down |
| Высокий уровень | Обычная работа |
В auto power-down CKE остаётся низким почти 7.8us для DDR3/DDR4 или 3.9us для LPDDR2/LPDDR3/LPDDR4, кратко становится высоким и повторяет цикл.
Примечание: для определения auto power-down время низкого уровня CKE должно быть меньше 7.8 us для DDR3/DDR4 или 3.9us для LPDDR2/LPDDR3/LPDDR4.
1.21 Отключение self-refresh и power-down
Микросхемы DDR имеют базовые функции энергосбережения, включая self-refresh и power-down; программное обеспечение также включает их для экономии энергии. При простое DDR входит в один из этих режимов в зависимости от длительности простоя.
Если энергосбережение не требуется, приоритетна только производительность либо у микросхемы возникают проблемы с этими режимами, их можно отключить следующим способом.
Установите sr_idle на рисунке в 0, чтобы запретить вход в self-refresh по времени простоя DDR.

Редактируемая расшифровка снимка (исходные поля и значения):
| Параметр | Значение | Допустимый диапазон | Unit | Описание |
|---|---|---|---|---|
| uart id | 2 | — | ID UART; 0xf отключает вывод UART | |
| uart iomux | 0 | — | IOMUX UART | |
| uart baudrate | 1500000 | bps | Поддерживает 115200 или 1500000 | |
| sr_idle | 93 | 0-1023 | 32clk | Число тактов простоя DRAM до self refresh; 0 отключает |
| pd_idle | 13 | 0-127 | 32clk | Число тактов простоя DRAM до power down; 0 отключает |
Установите pd_idle на рисунке в 0, чтобы запретить вход DDR в
power-down по времени простоя.

Редактируемая расшифровка снимка (исходные поля и значения):
| Параметр | Значение | Допустимый диапазон | Unit | Описание |
|---|---|---|---|---|
| uart id | 2 | — | ID UART; 0xf отключает вывод UART | |
| uart iomux | 0 | — | IOMUX UART | |
| uart baudrate | 1500000 | bps | Поддерживает 115200 или 1500000 | |
| sr_idle | 93 | 0-1023 | 32clk | Число тактов простоя DRAM до self refresh; 0 отключает |
| pd_idle | 13 | 0-127 | 32clk | Число тактов простоя DRAM до power down; 0 отключает |
1.22 Настройка de-skew сигналов DQ/DQS/CA/CLK
De-skew позволяет компенсировать неодинаковую длину дорожек DDR на PCB. В DDR PHY последовательно с сигналами включены элементы задержки. Регистры skew управляют числом элементов на каждой линии и тем самым её задержкой, приближая результат к равной длине трасс.
1.22.1 Настройка de-skew в ядре
Способ поддерживается только RK322Xh/RK3328; изменяется DTS.
SoC: RK322xh, RK3328.
Расположение кода:
arch/arm64/boot/dts/rk322xh-dram-default-timing.dtsi
arch/arm64/boot/dts/rk322xh-dram-2layer-timing.dtsi
Если эти файлы заменены собственными, измените соответствующие собственные файлы.
Способ изменения:
По результату инструмента deskew automatic scanning tool выберите значение mid и внесите его в соответствующее определение DTS.
Работа с инструментом описана в 3228H deskew automatic scanning tool instruction. pdf.
1.22.2 Настройка de-skew в loader
Изменение de-skew в loader этим способом поддерживается только RK3308.
SoC: RK3308.
Необходимые файлы и инструмент:
Инструмент автоматического сканирования deskew, 3308_deskew.exe, RK3308_DDRXPXXXXXX_Template_VXX_de-skew.txt, rk3308_ddr_XXXMHz_uartX_mX_vX.XX.bin.
Способ изменения:
По результату deskew automatic scanning tool выберите mid и внесите его в соответствующее определение RK3308_DDRXPXXXXXX_Template_VXX_de-skew.txt. С помощью 3308_deskew.exe перенесите определение de-skew из rk3308_ddrxpxxxxxx_template_vxx_de-skew.txt в rk3308_ddr_xxxmhz_uartx_mx_vx.xx.bin.
Использование описано в deskew automatic scanning tool instruction. pdf.
1.23 Нагрузочный тест DDR в U-Boot
В U-Boot портированы две распространённые программы проверки DDR: stressapptest и memtester.
Основные случаи применения:
- Если ядро не запускается, тест DDR в U-Boot помогает исключить проблему памяти.
- В ядре нет условий для запуска stressapptest или memtester.
Например, незавершённые модули ядра вызывают нестабильность системы и не позволяют длительно запускать тесты.
- Проверка большего объёма DDR.
Ядро может тестировать только память, не занятую системой. U-Boot занимает значительно меньше и позволяет проверить больший объём.
- Проверка заданного физического адреса.
1.23.1 stressapptest
Включите:
make ARCH=arm64 menuconfig ->Command line interface -> DDR Tool -> Enable DDR Tool
И включите:
make ARCH=arm64 menuconfig ->Command line interface -> DDR Tool -> Enable DDR Tool -> Enable stressapptest for ddr
Соберите U-Boot и запишите uboot.img.
Перезапустите устройство. В терминале последовательного порта ПК нажимайте CTRL+C, пока U-Boot не перейдёт в командный режим:
pclk_top_root 100000 KHz
aclk_low_top_root 396000 KHz
Net: No ethernet found.
Hit key to stop autoboot('CTRL+C'): 0
=> <INTERRUPT>
=> <INTERRUPT>
Введите stressapptest -h и выполните тест по описанию параметров.
1.23.2 memtester
Включите:
make ARCH=arm64 menuconfig ->Command line interface -> DDR Tool -> Enable DDR Tool
И включите:
make ARCH=arm64 menuconfig ->Command line interface -> DDR Tool -> Enable DDR Tool -> Enable memtester for ddr
Соберите U-Boot и запишите uboot.img.
Перезапустите устройство. В терминале последовательного порта ПК нажимайте CTRL+C, пока U-Boot не перейдёт в командный режим:
pclk_top_root 100000 KHz
aclk_low_top_root 396000 KHz
Net: No ethernet found.
Hit key to stop autoboot('CTRL+C'): 0
=> <INTERRUPT>
=> <INTERRUPT>
Введите memtester -h и выполните тест по описанию параметров.
1.24 Включение ECC на RK3568
ECC — Error Correcting Code, код исправления ошибок. DDR ECC обнаруживает и исправляет ошибки данных DDR.
RK3568 поддерживает SideBand ECC: рядом с каналом данных DDR устанавливается дополнительный кристалл для хранения ECC.
Поддерживается исправление однобитовых и обнаружение двухбитовых ошибок: SEC/DED ECC (Single Error Correction/Double Error Detection).
1. Включение ECC: при подключении микросхемы DDR к DDR_ECC_DQ0-7 ECC включается автоматически.
2. Назначение DDR_ECC_DQ0-7: реализация использует 32 бита данных DQ и 7 бит ECC.
DDR_ECC_DQ0-7 хранит ECC, вычисленные из DQ0-DQ31. Для этого к DDR_ECC_DQ0-7 требуется дополнительная микросхема DDR.
3. Дополнительная микросхема должна иметь тот же тип DRAM и то же число строк, столбцов и банков, что микросхемы на DQ0-31.
4. Поддерживаемые типы DRAM: исходник указывает поддержку ECC для всех типов DRAM в данном контексте платформы.
1.25 Получение сведений DDR ECC в ядре
Информация DDR ECC доступна через архитектуру EDAC ядра. На поддерживаемой платформе, например RK3568, аппаратный ECC должен быть включён (см. предыдущий раздел). Для получения сведений включите модуль edac в DTSI. Если в DTSI платформы нет узла edac, описанная поддержка отсутствует.
edac: edac {
...
status = "okay";
};
RK EDAC регистрируется в системе по следующему пути:
sys/devices/system/edac/mc/mc0
or
sys/bus/edac/devices/mc/mc0/
Получение имени RK EDAC:
# cat sys/devices/system/edac/mc/mc0/mc_name
rk_edac_ecc
Получение числа однобитовых исправляемых ошибок ce с текущей загрузки:
# cat sys/devices/system/edac/mc/mc0/ce_count
0
Получение числа многобитовых неисправляемых ошибок ue с текущей загрузки:
# cat sys/devices/system/edac/mc/mc0/ue_count
0
После перезагрузки ядро заново инициализирует EDAC и счётчики. Прежние значения очищаются; подсчёт начинается с нуля.
1.26 Программная инъекция ошибок DDR ECC в ядре
Для инъекции ошибок в DTS соответствующей платформы должен быть включён edac, а аппаратная часть должна поддерживать DDR ECC.
edac: edac {
...
status = "okay";
};
После загрузки тип внедряемой ошибки выбирается через следующий узел:
echo ce > /sys/module/rockchip_edac/parameters/edac_poison_mode
echo ue > /sys/module/rockchip_edac/parameters/edac_poison_mode
Параметр edac_poison_mode принимает два значения:
1. ce — однобитовая исправляемая ошибка.
2. ue — многобитовая неисправляемая ошибка.
Для формирования ошибок используйте следующий узел. Число, переданное echo, задаёт количество ошибок DDR ECC:
echo 10 > /sys/module/rockchip_edac/parameters/rockchip_edac_trigger
Примечания:
1. Если появилось следующее сообщение, убедитесь, что EDAC включён в ядре и аппаратная часть поддерживает DDR ECC:
echo 1 > /sys/module/rockchip_edac/parameters/rockchip_edac_trigger
sh: echo: write error: Operation not permitted
2. По умолчанию многобитовая неисправляемая ошибка ue вызывает перезагрузку системы. Для однобитовой ce ядро выводит предупреждение и учитывает событие в /sys/devices/system/edac/mc/mc0/ce_count.
Инъекция ошибок DDR ECC в HAL описана в главе Rockchip_Developer_Guide_HAL_DDR_ECC.
1.27 Получение идентификатора производителя DDR
Идентификатор производителя имеют только LPDDR, например LPDDR2/LPDDR3/LPDDR4/LPDDR4X/LPDDR5/LPDDR5X. У DDR2/DDR3/DDR4 такого идентификатора нет.
1.27.1 Через узел dmcdbg ядра
Следующие платформы позволяют читать идентификатор производителя через proc/dmcdbg/dmcinfo:
RK3566
RK3568
RK3326
RK3326S
Сначала включите dmcdbg в DTSI платформы. Если узла нет, платформа этот способ не поддерживает. Например, на RK356X включите dmcdbg в arch/arm64/boot/dts/rockchip/rk3568.dtsi:
dmcdbg: dmcdbg {
compatible = "rockchip,rk3568-dmcdbg";
status = "okay";
};
Пересоберите и обновите прошивку ядра, затем загрузите её. Команда cat proc/dmcdbg/dmcinfo показывает идентификатор производителя и другие сведения DDR.
console:/ # cat proc/dmcdbg/dmcinfo
DramType: LPDDR4
Dram ID: MR5=0x1,MR6=0x0,MR7=0x1 /* The MR5 is the manufacturer ID, and MR6 and MR7
are the version IDs reserved for the manufacturer definition */
DramCapacity:
CS Count: 1
Bus Width: 32 bit
Column: 10
Bank: 8
CS0_Row: 16
CS1_Row: 0
DieBusWidth: 16 bit
TotalSize: 2048 MB
devfreq/dmc: Enable
governor: dmc_ondemand
cur_freq: 780000000
NOTE:
more information about dmc can get from /sys/class/devfreq/dmc.
1.27.2 Через сообщения loader
Вывод loader RK3576/RK3588 содержит идентификатор производителя:
DDR ... v1.14
LPDDR5, 2736MHz
channel[0] BW=16 Col=10 Bk=16 CS0 Row=15 CS1 Row=15 CS=2 Die BW=16 Size=2048MB
channel[1] BW=16 Col=10 Bk=16 CS0 Row=15 CS1 Row=15 CS=2 Die BW=16 Size=2048MB
channel[2] BW=16 Col=10 Bk=16 CS0 Row=15 CS1 Row=15 CS=2 Die BW=16 Size=2048MB
channel[3] BW=16 Col=10 Bk=16 CS0 Row=15 CS1 Row=15 CS=2 Die BW=16 Size=2048MB
Manufacturer ID:0xff /* This is the manufacturer ID */
...
change to F0: 2736MHz
out
Вывод loader RK3399 содержит идентификатор производителя:
DDR Version ...
In
channel 0
...
MR5=0xFF /* This is the manufacturer ID */
...
change freq to 416MHz 0,1
Channel 0: LPDDR4,416MHz
Bus Width=32 Col=10 Bank=8 Row=16 CS=1 Die Bus-Width=16 Size=2048MB
Channel 1: LPDDR4,416MHz
Bus Width=32 Col=10 Bank=8 Row=16 CS=1 Die Bus-Width=16 Size=2048MB
...
OUT
1.27.3 Важные замечания
Обратите внимание:
1. Идентификатор производителя есть только у LPDDR2/LPDDR3/LPDDR4/LPDDR4X/LPDDR5/LPDDR5X; у DDR2/DDR3/DDR4 его нет.
2. Идентификатор обозначает производителя кристалла, а не марку корпусированной памяти. Многие поставщики DDR не изготавливают собственные пластины.
3. Для LPDDR нельзя получить модель, напечатанную на корпусе. Это отличается от NAND Flash и eMMC.
4. Расшифровка идентификатора производителя кристалла следует стандарту JEDEC JEP166.
1.27.4 Таблицы идентификаторов производителей
Ниже приведены таблицы, актуальные на момент подготовки исходного документа.
Таблицы могут обновляться. Для поиска новой версии используйте JEP166 на https://www.jedec.org.
Таблица идентификаторов LPDDR2 и LPDDR3:
| Значение MR5 | Производитель |
|---|---|
| 0x1 | Samsung |
| 0x2 | Qimonda |
| 0x3 | Elpida |
| 0x4 | Etron |
| 0x5 | Nanya |
| 0x6 | SK hynix |
| 0x7 | Mosel |
| 0x8 | Winbond |
| 0x9 | ESMT |
| 0xa | Zentel |
| 0xb | Spansion |
| 0xc | SST |
| 0xd | ZMOS |
| 0xe | Intel |
| 0x12 | Being Advanced Memory Corp |
| 0x1a | Xi’an UniIC Semiconductors Co., Ltd |
| 0x1b | ISSI |
| 0x1c | JSC |
| 0xaa | Tezzaron |
| 0xc2 | Macronix |
| 0xf8 | Fidelix |
| 0xfc | eveRAM |
| 0xfd | AP Memory |
| 0xfe | Numonyx |
| 0xff | Micron |
Таблица идентификаторов LPDDR4:
| Значение MR5 | Производитель |
|---|---|
| 0x1 | Samsung |
| 0x5 | Nanya |
| 0x6 | SK hynix |
| 0x8 | Winbond |
| 0x9 | ESMT |
| 0x13 | CXMT |
| 0x1a | Xi’an UniIC Semiconductors Co., Ltd |
| 0x1c | JSC |
| 0xf8 | Fidelix |
| 0xf9 | Ultra Memory |
| 0xfd | AP Memory |
| 0xff | Micron |
Таблица идентификаторов LPDDR5:
| Значение MR5 | Производитель |
|---|---|
| 0x1 | Samsung |
| 0x5 | Nanya |
| 0x6 | SK hynix |
| 0x8 | Winbond |
| 0x9 | ESMT |
| 0x13 | CXMT |
| 0xe5 | Dosilicon |
| 0xff | Micron |
1.28 Частые вопросы о сигналах
1.28.1 tINIT3 не соответствует протоколу
Причина: при инициализации DDR на Rockchip RESET срабатывает несколько раз. При измерении за начало tINIT3 ошибочно принимают первый переход RESET в высокий уровень, поэтому результат не соответствует протоколу.
Правильная точка измерения tINIT3 — последний переход RESET в высокий уровень, как показано ниже.
Нельзя использовать M2; следует использовать M3.

1.28.2 Ограничения включения ODT
По утверждению исходника со ссылкой на JEDEC, LPDDR4/LPDDR4X не допускают включение ODT ниже 800MHz.
По утверждению исходника со ссылкой на JEDEC, DDR4 не допускает включение ODT ниже 625MHz.
1.29 Частота регенерации при высокой температуре
При температуре выше 85°C исходник требует удвоенной частоты регенерации DDR.
Это особенно важно для промышленных и автомобильных изделий.
На платформе Rockchip предусмотрены следующие способы удвоения частоты регенерации.
LPDDR4/LPDDR4X/LPDDR5/LPDDR5X имеют собственный датчик температуры и через MR4 сообщают требуемую частоту регенерации. На некоторых платформах Rockchip реализован Automatic Temperature Derating (derate): частота автоматически меняется по MR4 и соответствует температуре кристалла DDR.
Для LPDDR3 derate не поддерживается по аппаратным причинам, поэтому принудительно применяется удвоенная частота регенерации.
DDR3 и DDR4 не имеют собственного датчика температуры и функции MR4 для сообщения требуемой частоты. Derate неприменим; нужна принудительная удвоенная регенерация.
Для удвоения частоты можно изменить ext_temp_ref в DDR bin.

Редактируемая расшифровка снимка (исходные поля и значения):
| Параметр | Значение | Допустимый диапазон | Unit | Описание |
|---|---|---|---|---|
| ext_temp_ref | 0 | — | 0: решение кода (1x для обычного SoC, 2x для 3568M/3568J); 1: фиксированное 2x; 2: фиксированное 4x; 3: фиксированное 1x обновление |
Способ изменения приведён в разделе «Изменение DDR bin».
Примечание: для промышленных, автомобильных и широкотемпературных SoC Rockchip частоты регенерации уже изменены. Повторно удваивать их этим инструментом не требуется.
В инструменте фиксированным режимам 2x/4x/1x соответствует следующая таблица:
| ext_temp_ref | DDR2/DDR3/DDR4 | LPDDR3/LPDDR4/LPDDR4x/LPDDR5 |
|---|---|---|
| Фиксированная регенерация 1x | tREFI=7.8us | tREFI=3.9us |
| Фиксированная регенерация 2x | tREFI=3.9us | tREFI=1.95us |
| Фиксированная регенерация 4x | tREFI=1.95us | tREFI=0.975us |
Обычные платформы, не относящиеся к промышленным, автомобильным или широкотемпературным, по умолчанию используют 1x, кроме DRAM с включённым derate.
Способы обработки и требуемые версии DDR bin для промышленных, автомобильных и широкотемпературных SoC Rockchip:
| Платформа | Тип DDR | Способ обработки и требования к версии DDR bin |
|---|---|---|
| RK3308J/M RK3308K RK3308GK |
Все типы DDR | rk3308_ddr_XXXMHz_uartX_mX_v1.26.bin и новее По умолчанию регенерация 4x (tREFI 0.25x) |
| RK3568J/M | LPDDR3 DDR3 DDR4 |
rk3568_ddr_XXXXMHz_v1.16.bin и новее По умолчанию регенерация 2x (tREFI 0.5x) |
| RK3568J/M | LPDDR4 LPDDR4X |
rk3568_ddr_XXXXMHz_v1.18.bin и новее Derate включён по умолчанию |
| RK3588J/M | LPDDR4 LPDDR4X LPDDR5 LPDDR5X |
rk3588_ddr_XXXXMHz_v1.13.bin и новее Derate включён по умолчанию |
| RV1126K | Все типы DDR | rv1126_ddr_XXXXMHz_v1.03.bin и новее По умолчанию регенерация 2x (tREFI 0.5x) |
Платформы, в чьих DDR bin derate включён по умолчанию:
| Платформа | Тип DDR | Способ обработки и требования к версии DDR bin |
|---|---|---|
| RK3528 | LPDDR4 LPDDR4X |
rk3528_ddr_XXXXMHz_v1.07.bin или rk3528_ddr_XXXXMHz_2L_PCB_v1.07.bin или rk3528_ddr_XXXXMHz_4BIT_PCB_v1.07.bin и новее Derate включён по умолчанию; лишний обратный апостроф исходника после имени файла отмечен в редакционных записях |
| RK3562 | LPDDR4 LPDDR4X |
rk3562_ddr_XXXXMHz_v1.05.bin или rk3562_ddr_XXXXMHz_ultra_v1.05.bin и новее Derate включён по умолчанию |
| RK3568 | LPDDR4 LPDDR4X |
rk3568_ddr_XXXXMHz_v1.18.bin и новее Derate включён по умолчанию |
| RK3576 | LPDDR4 LPDDR4X LPDDR5 LPDDR5X |
rk3576_ddr_XXXXMHz_v1.00.bin и новее Derate включён по умолчанию |
| RK3588 | LPDDR4 LPDDR4X LPDDR5 LPDDR5X |
rk3588_ddr_XXXXMHz_v1.13.bin и новее Derate включён по умолчанию |
2. Глава 2. Поиск неисправностей DDR
2.1 Как определить, связана ли проблема с DDR
1. Проверьте журнал UART.
1. Если ошибка возникает в разделе инициализации DDR загрузчика loader, исходник относит её к проблеме DDR.
2. Проверьте в этом разделе число строк, столбцов и банков, тип DRAM и ширину шины. Неверные сведения могут приводить к проблемам DDR.
3. Если возникает panic системы, повторите запуск и сравните адреса panic. Совпадающие адреса обычно указывают не на DDR; разные — на возможную проблему DDR или целостности питания.
2. Проверьте изображение. Его искажение может указывать на проблему DDR.
3. Проведите диагностические проверки:
1. Уменьшите частоту ARM/GPU и, при фиксированной частоте, допустимым образом увеличьте напряжение. Если это помогает, исходник считает более вероятной проблему питания, а не DDR.
2. Отключите изменение частоты DDR. Если это помогает, вероятна проблема переключения частот.
3. Уменьшите частоту DDR до безопасного для проверяемой платформы значения (в исходнике приведён пример 324M). Улучшение указывает на вероятную проблему качества сигналов DDR.
2.2 Основные причины проблем DDR
1. Питание:
1. Недостаточное число конденсаторов, слишком большое расстояние до микросхемы или неудачное распределение.
2. Обратная связь питания не возвращена от требуемой конечной точки к PMU/DC-DC.
3. Проверьте выполнение медных полигонов по правилам разводки RK.
4. Площадка GND непосредственно под корпусом LQFP должна быть припаяна для хорошего заземления. Иначе ухудшаются внутреннее питание и теплоотвод.
2. Целостность сигналов:
1. Неравная длина дорожек PCB. Некоторые платформы RK не имеют соответствующих тренировок чтения/записи; разница длин непосредственно уменьшает запас setup/hold DDR.
2. Слишком малое расстояние между дорожками вызывает сильные перекрёстные помехи.
3. Неравная длина ветвей T-топологии
ухудшает фронт сигнала и делает его немонотонным.
4. Разрывы обратного пути в опорном слое. Слишком большой зазор при заливке меди может привести к тому, что переходное отверстие разрежет опорный слой и ухудшит целостность сигнала.
3. Дефекты компонентов DRAM:
1. Безымянные компоненты могут быть не проверены или даже отбракованы изготовителем; выход годных не гарантирован.
2. У некоторых безымянных компонентов слабый драйвер, то есть неблагоприятный выходной импеданс.
3. Для Hynix 4Gb C-die DDR3, например H5TQ4G63CFR, ранний код kernel 3.10 требует исправления перед использованием.
2.3 Способы локализации и устранения проблем DDR
Общий подход — искать закономерность зависаний: конкретная частота, связь с длительностью сна после пробуждения и т. п. Последовательно проверяйте фиксированную частоту, другие частоты, напряжение и силу драйвера, сужая область поиска. Значения должны оставаться допустимыми для конкретной аппаратуры.
1. Ошибки при инициализации DDR.
1. Сообщения «rd addr 0x… = 0x…», «16bit error!!!», «unknow device» обычно указывают на пайку. Инструмент Rockchip Platform DDR Test Tool помогает непосредственно локализовать такую проблему.
2. Для необычных объёмов, не являющихся степенью 2, например 768MB, 1.5GB или 3GB, некоторые версии кода могут быть несовместимы. Обновите loader; если проблема остаётся, передайте сведения специалистам DDR для анализа.
3. Большинство ошибок DDR loader в исходнике связывается с пайкой. В DDR test tool можно выбрать специальный тест пайки и пункты для соответствующего объёма памяти.
2. Проверьте в журнале loader число строк, столбцов и банков, ширину шины и тип DRAM.
На рисунке первая строка — версия кода DDR, третья — частота, четвёртая — тип DDR. Пятая слева направо: ширина шины DRAM, столбцы, банки, строки, число CS, ширина шины кристалла и общий объём. Строка OUT означает успешное завершение инициализации; далее печатают usbplug или miniloader. По исходнику, Die Bus-Width больше фактической не вызывает проблемы, но значение меньше фактического приводит к сбою.

Редактируемая расшифровка снимка (исходные поля и значения):
DDR Version V1.06 20171026
In
300MHz
DDR3
Bus Width=32 Col=10 Bank=8 Row=15 CS=2 Die Bus-Width=16 Size=2048MB
mach:14
OUT
Boot1 Release Time: 2017-06-12, version: 2.37
3. Проверьте изображение.
При зависании системы CPU может остановиться, но VOP продолжает повторно читать данные из DDR
и выводить изображение. Поэтому экран позволяет предварительно оценить состояние DDR в момент зависания.
1. Нормальное изображение означает, что DDR всё ещё доступна, но не исключает DDR как причину исходного сбоя.
2. Если изображение искажено:
Как на рисунке, зависание при переключении частоты может сделать DDR недоступной. Попробуйте фиксированную частоту. Другая возможная причина — нарушение питания и работы логики контроллера DDR.

На следующем рисунке дефекты PCB ухудшают целостность питания и сигналов, приводя к потере синхронизации DLL DDR3. В исходнике предложено рассмотреть VCC_DDR=1.6V или обход DLL. Это исходный пример, а не разрешение подавать 1.6V на произвольную плату: сначала проверьте допустимые пределы компонентов.

4. Проверка питания.
1. Зафиксируйте CPU/GPU на более низкой частоте и допустимым образом увеличьте напряжение arm/logic. Улучшение может указывать на питание.
2. Проверьте разводку питания.
3. Измерьте пульсации питания.
5. Проверка целостности сигналов.
1. Уменьшите частоту DDR. Улучшение делает проблему целостности сигналов вероятной.
2. Проверьте разводку и Gerber: трассировку и непрерывность опорного слоя.
3. Допустимым образом увеличьте или уменьшите силу драйвера/ODT и оцените изменение.
4. Проверьте влияние сопротивления RZQ. Исходник описывает случаи LPDDR3 220ball, где для усиления драйвера требовалось уменьшить RZQ или удалить его. Это аппаратно-зависимый пример, не универсальная инструкция для ArmSoM.
6. Безымянные компоненты.
Если целостность питания и сигналов проверена и нарушений нет, возможна проблема ячеек DRAM. Исходник предлагает следующие проверки:
1. Отключить pd_idle и sr_idle и проверить результат.
2. Для DDR3 обойти DLL DRAM.
3. Некоторые дефекты ячеек выявляет DDR test tool, но это лишь вспомогательное средство. PASS не доказывает отсутствие проблем DRAM или стабильность платы.
3. Глава 3. Процедура проверки DDR
Примечания
1. Для kernel Linux 4.19, 5.10, 6.1 и новее: в Android следуйте разделу проверки DDR в Android; для Buildroot, Yocto и Debian — разделу проверки в Linux.
2. Для kernel Linux 3.10 следуйте отдельному разделу проверки DDR в Linux 3.10.
3. Процедуры RV1108 и RK3308 отличаются от остальных платформ. См. соответствующие разделы этой главы.
4. Проверка требует тестовых файлов, описанных в исходном документе и предоставляемых вместе с ним. Это указание источника; наличие этих бинарных файлов в данной статье не подразумевается.
3.1 Проверка DDR в Android
3.1.1 Сборка тестовой прошивки Android
Сначала включите изменение частоты DDR. В DTS тестируемой платы найдите dfi и dmc и установите status = “okay”.
&dfi {
status = "okay";
};
&dmc {
status = "okay";
...
};
Здесь приведено только краткое описание сборки. Подробности — в разделе «Включение и отключение изменения частоты DDR в ядре» документа Rockchip_Developer_Guide_DDR_EN.
3.1.2 Подготовка тестовой среды Android
3.1.2.1 Запись прошивки
Перед тестом определите:
1. Разрядность ОС: 32 или 64 бита.
2. Общий объём DDR устройства: 512MB, 1GB, 2GB и т. д.
3. Максимальную частоту DDR для теста с фиксированной частотой: например 533MHz, 1560MHz или 2112MHz.
3.1.2.2 Автоматическая подготовка среды
1. В каталоге android_ddr_test_files тестового пакета дважды щёлкните push_files.bat. По подсказке скрипта и типу прошивки введите 1 или 2. Дождитесь завершения автоматической настройки.
Примечание: по журналу проверьте, что все действия выполнены нормально и нет сообщений об ошибках.
2. Если ошибок не было, раздел ручной подготовки можно пропустить.
3.1.2.3 Ручная подготовка среды
Если автоматическая настройка не удалась, выполните её вручную. Выберите и установите следующие файлы из android_ddr_test_files.
1. Установите fishingjoy.
Примечание: fishingjoy — сторонний APK, который требуется получить самостоятельно. Можно использовать другое приложение, автоматически работающее весь тест, либо циклическое воспроизведение видео.
<adb_tool> adb.exe install fishingjoy1.apk
2. Передайте stressapptest.
По разрядности прошивки Linux (64 или 32 бита) выберите соответствующий stressapptest в каталоге static_stressapptest.
Пример:
Для Linux 32bit передайте stressapptest_32bit.
<adb_tool> adb.exe push stressapptest_32bit /data/stressapptest
<adb_tool> adb.exe shell chmod 0777 /data/stressapptest
Для Linux 64bit передайте stressapptest_64bit.
<adb_tool> adb.exe push stressapptest_64bit /data/stressapptest
<adb_tool> adb.exe shell chmod 0777 /data/stressapptest
3. Передайте memtester.
По разрядности прошивки Linux (64 или 32 бита) выберите соответствующий memtester в каталоге static_memtester.
Пример:
Для Linux 32bit передайте memtester_32bit.
<adb_tool> adb.exe push memtester_32bit /data/memtester
<adb_tool> adb.exe shell chmod 0777 /data/memtester
Для Linux 64bit передайте memtester_64bit.
<adb_tool> adb.exe push memtester_64bit /data/memtester
<adb_tool> adb.exe shell chmod 0777 /data/memtester
4. Передайте ddr_freq_scan.sh.
<adb_tool> adb.exe push ddr_freq_scan.sh /data/ddr_freq_scan.sh
<adb_tool> adb.exe shell chmod 0777 /data/ddr_freq_scan.sh
5. Запишите буферизованные данные файловой системы из памяти на накопитель.
<adb_tool> adb.exe shell sync
3.1.2.4 Подготовка через USB-накопитель и последовательный порт
Если ADB недоступен, скопируйте тестовые файлы на плату с USB-накопителя, а среду подготовьте через последовательный порт.
1. Подготовка.
После включения запретите переход системы в сон: добавьте wake_lock командой echo 1 > /sys/power/wake_lock либо выберите Setting → Dsiplay → Sleep → Never sleep. Написание пункта Dsiplay сохранено из исходника.
Подключите USB-накопитель к ПК и скопируйте на него android_ddr_test_files.
Перейдите к пользователю root для получения прав.
<rk3399:/ $> su
Подключите USB-накопитель к плате и скопируйте файлы из android_ddr_test_files, static_memtester и static_stressapptest в /data устройства. Накопитель обычно смонтирован в /mnt/media_rw/***; имя узла индивидуально, используйте TAB для дополнения.
Пример:
Если точка монтирования — /mnt/media_rw/B4FE-5315, выполните:
<rk3399:/ #> cp -rf /mnt/media_rw/B4FE-5315/android_ddr_test_files /data/
<rk3399:/ #> cp -rf /mnt/media_rw/B4FE-5315/static_memtester /data/
<rk3399:/ #> cp -rf /mnt/media_rw/B4FE-5315/static_stressapptest /data/
2. Автоматическая подготовка среды.
Для прошивки linux 32bit выберите test_files_install_32bit.sh.
<rk3399:/ #> chmod 0777 /data/android_ddr_test_files/test_files_install_32bit.sh
<rk3399:/ #> /data/android_ddr_test_files/test_files_install_32bit.sh
Для прошивки linux 64bit выберите test_files_install_64bit.sh.
<rk3399:/ #> chmod 0777 /data/android_ddr_test_files/test_files_install_64bit.sh
<rk3399:/ #> /data/android_ddr_test_files/test_files_install_64bit.sh
По журналу проверьте успешное выполнение каждого пункта. Если ошибок нет, ручную подготовку можно пропустить.
3. Ручная подготовка среды.
Если автоматическая подготовка не удалась, выполните её вручную.
Для Linux 32bit скопируйте соответствующие тестовые файлы.
<rk3399:/ #> cp /data/static_stressapptest/stressapptest_32bit /data/stressapptest
<rk3399:/ #> cp /data/static_memtester/memtester_32bit /data/memtester
<rk3399:/ #> cp /data/android_ddr_test_files/ddr_freq_scan.sh /data/ddr_freq_scan.sh
Для Linux 64bit скопируйте соответствующие тестовые файлы.
<rk3399:/ #> cp /data/static_stressapptest/stressapptest_64bit /data/stressapptest
<rk3399:/ #> cp /data/static_memtester/memtester_64bit /data/memtester
<rk3399:/ #> cp /data/android_ddr_test_files/ddr_freq_scan.sh /data/ddr_freq_scan.sh
Измените права файлов.
<rk3399:/ #> chmod 777 /data/memtester /data/stressapptest /data/ddr_freq_scan.sh
Установите fishingjoy.
Примечание: fishingjoy — сторонний APK, который требуется получить самостоятельно. Можно использовать другое приложение, автоматически работающее весь тест, либо циклическое воспроизведение видео.
<rk3399:/ #> pm install /data/fishingjoy1.apk
Запишите буферизованные данные файловой системы из памяти на накопитель.
<rk3399:/ #> sync
3.1.3 Проверка объёма DDR в Android
Командой <rkxxxx:/ #> cat /proc/meminfo проверьте, соответствует ли MemTotal фактическому объёму DDR устройства.
Пример журнала:
rkxxxx:/ # cat /proc/meminfo
MemTotal: 2038904 kB
512MB приблизительно соответствует 533504kB (значение исходника).
1GB приблизительно соответствует 1048576kB.
1.5GB приблизительно соответствует 1582080kB (значение исходника).
2GB приблизительно соответствует 2097152kB.
3GB приблизительно соответствует 3145728kB.
4GB приблизительно соответствует 4194304kB.
Из-за различий управления и распределения памяти небольшое отклонение нормально.
3.1.4 Тест Android с фиксированной частотой DDR
1. Запустите fishingjoy.
2. Перейдите к root для получения прав.
<rkxxxx:/ $> su
3. Зафиксируйте частоту DDR.
Установите максимальную частоту DDR, поддерживаемую тестируемым устройством.
Пример:
Если требуется 2112MHz:
<rkxxxx:/ #> /data/ddr_freq_scan.sh 2112000000
Если требуется 1056MHz:
<rkxxxx:/ #> /data/ddr_freq_scan.sh 1056000000
Если требуется 600MHz:
<rkxxxx:/ #> /data/ddr_freq_scan.sh 600000000
4. По журналу проверьте правильность частоты.
Пример журнала:
<rkxxxx:/ #> /data/ddr_freq_scan.sh 1560000000
already change to 1560000000 done.
change frequency to available max frequency done.
5. Определите объём свободной памяти для тестирования DDR.
Выполните free -m. Обычно для теста выделяют 90% памяти, доступной для новых приложений, то есть значения available.
Пример журнала:
<rkxxxx:/ #> free -m
total used free shared buff/cache available
Mem: 3909 433 3294 9 181 3427
Swap: 0 0 0
Если available составляет 3427MB, для теста выбирают 3427MB * 0.9 = 3084MB.
Сопоставление: китайский абзац указывает 3427MB доступной памяти, но содержит 3294MB0.9=3084MB. Английский использует 3427MB0.9; расхождение зафиксировано без скрытого исправления.
6. Запустите stressapptest более чем на 12 часов.
Запуск stressapptest:
Основные параметры stressapptest:
-M mbytes: объём выделяемой для теста памяти в MB.
-s seconds: длительность теста в секундах. Для 12 часов используется 43200 секунд.
Пример:
Если доступно 3084MB и требуется 12-часовой тест (43200 секунд), выполните:
<rkxxxx:/ #> /data/stressapptest -s 43200 -i 4 -C 4 -W --stop_on_errors -M 3084
Проверка результатов:
После теста проверьте работу устройства, fishingjoy и результат PASS/FAIL stressapptest. Программа каждые 10 секунд выводит оставшееся время. Успешный результат: «Status: PASS - please verify no corrected errors»; ошибка: «Status: FAIL - test discovered HW problems».
7. Запустите memtester более чем на 12 часов.
Запуск memtester:
Основной параметр memtester:
<mem>m: объём выделяемой для теста памяти в MB.
Пример:
Если для memtester доступно 3084MB, выполните:
<rkxxxx:/ #> /data/memtester 3084m
Проверка результата:
После теста проверьте устройство, fishingjoy и ошибки memtester. Версия memtester из пакета изменена так, что автоматически останавливается при любой ошибке. Работа более 12 часов без остановки означает, что за этот период ошибок не обнаружено.
Если ошибок нет, memtester продолжает печатать следующий журнал:
Loop 10:
Stuck Address : ok
Random Value : ok
Compare XOR : ok
Compare SUB : ok
Compare MUL : ok
Compare DIV : ok
Compare OR : ok
Compare AND : ok
Sequential Increment: ok
Solid Bits : ok
Block Sequential : ok
Checkerboard : ok
Bit Spread : ok
Bit Flip : ok
Walking Ones : ok
Walking Zeroes : ok
При обнаружении ошибки memtester автоматически завершает тест и выходит. Пример журнала:
FAILURE: 0xffffffff != 0xffffbfff at offset 0x03b7d9e4.
EXIT_FAIL_OTHERTEST
3.1.5 Тест изменения частоты DDR в Android
1. Запустите fishingjoy.
2. Перейдите к root для получения прав.
<rkxxxx:/$> su
3. Запустите memtester в фоне.
Основной параметр memtester:
<mem>m: объём выделяемой для теста памяти в MB.
Пример:
Определение объёма памяти для теста описано в предыдущем разделе с фиксированной частотой.
Если для memtester доступно 3084MB, выполните:
<rkxxxx:/ #> /data/memtester 3084m
4. Запустите тестовые скрипты.
<rkxxxx9:/ #> /data/ddr_freq_scan.sh
Примечание: при принудительном изменении частоты возможно мерцание изображения, например из-за недостаточной пропускной способности. Исходник считает такое явление нормальным в этом тесте.
5. Проверьте результат; длительность тестирования — более 12 часов.
Убедитесь, что fishingjoy и само устройство работают нормально.
Проверьте работу программы изменения частоты и нормальный вывод её журнала.
Пример журнала:
DDR freq will change to 600000000 8786
already change to 600000000 done
DDR freq will change to 800000000 8787
already change to 800000000 done
DDR freq will change to 200000000 8788
already change to 200000000 done
Убедитесь, что memtester продолжает работать.
Командой <rkxxxx:/ #> ps | grep memtester проверьте, что процесс memtester всё ещё запущен.
Пример:
<rkxxxx:/ #> ps | grep memtester
root 14309 1730 74332 68156 0 5e980bf564 R /data/memtester
3.1.6 Тест перезагрузки Android
Тест перезагрузки через приложение Calculator:
**Чтобы устройство не засыпало, отключите экран блокировки: setting → security → set screen lock → None. Затем выберите Setting → Dsiplay → Sleep → Never sleep.** Названия меню приведены по исходнику.
Откройте Calculator, введите «83991906=» и нажмите RebootTest. Тест должен продолжаться более 12 часов.
3.1.7 Тест сна Android
Для RK3399 с LPDDR4 этот тест обязателен; для других типов DDR и платформ — необязателен.
Тест сна через Calculator:
Отключите USB-кабель ADB. Откройте Calculator, введите «83991906=» и нажмите SleepTest. Тест должен продолжаться более 12 часов.
3.2 Проверка DDR в Linux
3.2.1 Сборка тестовой прошивки Linux
Сначала включите изменение частоты DDR. В DTS тестируемой платы найдите dfi и dmc и установите status = “okay”.
&dfi {
status = "okay";
};
&dmc {
status = "okay";
...
};
Здесь приведено только краткое описание сборки. Подробности — в разделе «Включение и отключение изменения частоты DDR в ядре» документа Rockchip_Developer_Guide_DDR_EN.
3.2.2 Подготовка тестовой среды Linux
3.2.2.1 Запись прошивки
Перед тестом определите:
1. Разрядность ОС: 32 или 64 бита.
2. Общий объём DDR устройства: 512MB, 1GB, 2GB и т. д.
3. Максимальную частоту DDR для теста с фиксированной частотой: например 533MHz, 1560MHz или 2112MHz.
3.2.2.2 Подготовка среды
Прошивка SDK содержит ROCKCHIPS TEST TOOLS в каталоге /rockchip-test.
Если в сторонней ОС этих инструментов нет (отсутствует /rockchip-test), вручную скопируйте следующие файлы из тестового пакета DDR. Часть скриптов может требовать переноса и адаптации специалистом.
1. linux_ddr_test_files/ddr_freq_scaling.sh
2. linux_ddr_test_files/test_stress_glmark2.sh
3. linux_ddr_test_files/auto_reboot.sh
4. linux_ddr_test_files/suspend_resume.sh
5. Для Linux 64-bit выберите static_stressapptest/stressapptest_64bit и static_stressapptest/memtester_64bit; для Linux 32-bit — static_stressapptest/stressapptest_32bit и static_stressapptest/memtester_32bit. Пути memtester сохранены из исходника и требуют сверки с фактическим пакетом.
3.2.3 Проверка объёма DDR в Linux
Командой root@rkxxxx:/# cat /proc/meminfo проверьте соответствие MemTotal фактическому объёму DDR устройства.
Пример журнала:
root@rkxxxx:/# cat /proc/meminfo
MemTotal: 2038904 kB
512MB приблизительно соответствует 533504kB (значение исходника).
1GB приблизительно соответствует 1048576kB.
1.5GB приблизительно соответствует 1582080kB (значение исходника).
2GB приблизительно соответствует 2097152kB.
3GB приблизительно соответствует 3145728kB.
4GB приблизительно соответствует 4194304kB.
Из-за различий управления и распределения памяти небольшое отклонение нормально.
3.2.4 Тест Linux с фиксированной частотой DDR
1. Запустите glmark2 либо другое приложение с длительной непрерывной нагрузкой на GPU или NPU.
root@rkxxxx:/# /rockchip-test/gpu/test_stress_glmark2.sh > /dev/null &
2. Зафиксируйте частоту DDR.
Установите максимальную частоту DDR, поддерживаемую тестируемым устройством.
Пример:
Если требуется 1332MHz:
root@rkxxxx:/# /rockchip-test/ddr/ddr_freq_scaling.sh 1332000000
Если требуется 1056MHz:
root@rkxxxx:/# /rockchip-test/ddr/ddr_freq_scaling.sh 1056000000
3. Проверьте правильность частоты.
Пример журнала:
root@rkxxxx:/# cat /sys/class/devfreq/dmc/cur_freq
1332000000
4. Определите объём свободной памяти для теста DDR.
Выполните free -m. Обычно для теста выделяют 90% памяти, доступной для новых приложений, то есть значения available.
Пример журнала:
root@rkxxxx:/# free -m
total used free shared buff/cache available
Mem: 3909 433 3294 9 181 3427
Swap: 0 0 0
Если available составляет 3427MB, для теста выбирают 3427MB * 0.9 = 3084MB.
Сопоставление: китайский абзац указывает 3427MB доступной памяти, но содержит 3294MB0.9=3084MB. Английский использует 3427MB0.9; расхождение зафиксировано без скрытого исправления.
5. Запустите stressapptest более чем на 12 часов.
Запуск stressapptest:
Основные параметры stressapptest:
-M mbytes: объём выделяемой для теста памяти в MB.
-s seconds: длительность теста в секундах. Для 12 часов используется 43200 секунд.
Пример:
Если доступно 3084MB и требуется 12-часовой тест (43200 секунд), выполните:
root@rkxxxx:/# stressapptest -s 43200 -i 4 -C 4 -W --stop_on_errors -M 3084
Проверка результатов:
После теста проверьте устройство, glmark2 и результат PASS/FAIL stressapptest. Каждые 10 секунд программа выводит оставшееся время. Успех: «Status: PASS - please verify no corrected errors»; ошибка: «Status: FAIL - test discovered HW problems».
6. Запустите memtester более чем на 12 часов.
Запуск memtester:
Основной параметр memtester:
<mem>m: объём выделяемой для теста памяти в MB.
Пример:
Если для memtester доступно 3084MB, выполните:
root@rkxxxx:/# memtester 3084m
Проверка результата:
После теста проверьте устройство, glmark2 и ошибки memtester. Версия из тестового пакета изменена так, что автоматически останавливается при любой ошибке. Работа более 12 часов без остановки означает отсутствие обнаруженных ошибок за этот период.
Если ошибок нет, memtester продолжает печатать следующий журнал:
Loop 10:
Stuck Address : ok
Random Value : ok
Compare XOR : ok
Compare SUB : ok
Compare MUL : ok
Compare DIV : ok
Compare OR : ok
Compare AND : ok
Sequential Increment: ok
Solid Bits : ok
Block Sequential : ok
Checkerboard : ok
Bit Spread : ok
Bit Flip : ok
Walking Ones : ok
Walking Zeroes : ok
При обнаружении ошибки memtester автоматически завершает тест и выходит. Пример журнала:
FAILURE: 0xffffffff != 0xffffbfff at offset 0x03b7d9e4.
EXIT_FAIL_OTHERTEST
3.2.5 Тест изменения частоты DDR в Linux
1. Запустите glmark2 либо другое приложение с длительной непрерывной нагрузкой на GPU или NPU.
root@rkxxxx:/# /rockchip-test/gpu/test_stress_glmark2.sh > /dev/null &
2. Запустите memtester в фоне.
Основной параметр memtester:
<mem>m: объём выделяемой для теста памяти в MB.
Пример:
Определение объёма памяти для теста описано в предыдущем разделе с фиксированной частотой.
Если для memtester доступно 3084MB, выполните:
root@rkxxxx:/# memtester 3084m > /data/memtester_log.txt &
3. Запустите тестовые скрипты.
root@rkxxxx:/# /rockchip-test/ddr/ddr_freq_scaling.sh
Примечание: при принудительном изменении частоты возможно мерцание изображения, например из-за недостаточной пропускной способности. Исходник считает такое явление нормальным в этом тесте.
4. Проверьте результат; длительность теста — более 12 часов.
Убедитесь, что glmark2 и устройство работают нормально.
Проверьте работу программы изменения частоты и нормальный вывод её журнала.
Пример журнала:
cnt: 2315, ddr freq: success change to 528000000 Hz
cnt: 2316, ddr freq: success change to 528000000 Hz
cnt: 2317, ddr freq: success change to 1332000000 Hz
Убедитесь, что memtester продолжает работать.
Командой root@rkxxxx:/# ps | grep memtester проверьте, что memtester всё ещё запущен.
Пример:
root@rkxxxx:/# ps | grep memtester
root 14309 1730 74332 68156 0 5e980bf564 R /data/memtester
3.2.6 Тест перезагрузки Linux
1. Запустите тестовые скрипты.
root@rkxxxx:/# /rockchip-test/auto_reboot/auto_reboot.sh
2. Выполняйте тест более 12 часов и проверяйте работу устройства. Остановить тест можно следующей командой.
root@rkxxxx:/# echo off > /userdata/rockchip-test/reboot_cnt
3.2.7 Тест сна Linux
1. Запустите тестовые скрипты.
root@rkxxxx:/# /rockchip-test/suspend_resume/suspend_resume.sh
2. Выполняйте тест более 12 часов и проверяйте работу устройства.
3.3 Проверка DDR в Linux 3.10
3.3.1 Сборка тестовой прошивки Linux 3.10
В menuconfig ядра откройте System Type и включите DDR Test и pm_tests.
menuconfig
System Type --->
[*] /sys/pm_tests/ support
[*] DDR Test
Если пункта [] /sys/pm_tests/ support в menuconfig нет, соберите прошивку с фиксированной или изменяемой частотой по разделам «Фиксация частоты DDR» и «Включение и отключение изменения частоты DDR в ядре» документа Rockchip_Developer_Guide_DDR_EN.
3.3.2 Подготовка тестовой среды Linux 3.10
3.3.2.1 Запись прошивки
Перед тестом определите:
1. Версия Android тестовой прошивки: например android4.4, android5.0, android6.0 или android7.1.
2. Разрядность ОС: 32 или 64 бита.
3. Общий объём DDR: например 512MB, 1GB или 2GB.
4. Для фиксированной частоты — максимальная требуемая частота DDR, например 456MHz или 533MHz.
5. Для переменной частоты — диапазон, например 200MHz–456MHz или 200MHz–533MHz.
3.3.2.2 Автоматическая подготовка среды
В каталоге linux3.10_ddr_test_files дважды щёлкните push_files.bat. По подсказке и типу прошивки введите 1 или 2. Дождитесь завершения автоматической настройки. Если ошибок нет, ручную подготовку можно пропустить.
3.3.2.3 Ручная подготовка среды
Если автоматическая настройка не удалась, выберите и установите следующие файлы из linux3.10_ddr_test_files вручную.
1. Установите fishingjoy.
<adb_tool> adb.exe install fishingjoy1.apk
2. Передайте google stressapptest.
Выберите версию stressapptest согласно версии прошивки.
<adb_tool> adb.exe root
<adb_tool> adb.exe remount
<adb_tool> adb.exe push libstlport.so /system/lib/libstlport.so
<adb_tool> adb.exe shell chmod 644 /system/lib/libstlport.so
Для android4.4 передайте stressapptest_android4.4.
<adb_tool> adb.exe push stressapptest_android4.4 /data/stressapptest
<adb_tool> adb.exe shell chmod 0777 /data/stressapptest
Для остальных версий Android передайте stressapptest.
<adb_tool> adb.exe push stressapptest /data/stressapptest
<adb_tool> adb.exe shell chmod 0777 /data/stressapptest
3. Передайте memtester.
Выберите memtester согласно версии прошивки.
Пример:
Для Linux 32bit передайте memtester_32bit.
<adb_tool> adb.exe push memtester_32bit /data/memtester
<adb_tool> adb.exe shell chmod 644 /data/memtester
Для Linux 64bit передайте memtester_64bit.
<adb_tool> adb.exe push memtester_64bit /data/memtester
<adb_tool> adb.exe shell chmod 644 /data/memtester
4. Выполните синхронизацию.
<adb_tool> adb.exe shell sync
3.3.3 Проверка объёма DDR в Linux 3.10
Командой <rkxxxx:/ $> cat /proc/meminfo проверьте соответствие MemTotal фактическому объёму DDR.
Пример журнала:
<rkxxxx:/ $> cat /proc/meminfo
MemTotal: 2038904 kB
512MB приблизительно соответствует 533504kB (значение исходника).
1GB приблизительно соответствует 1048576kB.
1.5GB приблизительно соответствует 1582080kB (значение исходника).
2GB приблизительно соответствует 2097152kB.
3GB приблизительно соответствует 3145728kB.
4GB приблизительно соответствует 4194304kB.
Из-за различий управления и распределения памяти небольшое отклонение нормально.
3.3.4 Тест Linux 3.10 с фиксированной частотой DDR
1. Запустите fishingjoy.
2. Выполните su в последовательной консоли.
<rkxxxx:/ $> su
3. Зафиксируйте частоту DDR.
Установите максимальную частоту DDR, поддерживаемую тестируемым устройством.
Пример:
Если максимальная частота DDR — 533MHz:
<rkxxxx:/ #> echo set clk_ddr 533000000 > /sys/pm_tests/clk_rate
4. Выполняйте google stressapptest более 12 часов.
При общем объёме 512MB выделите 64MB для stressapptest.
<rkxxxx:/ #> /data/stressapptest -s 43200 -i 4 -C 4 -W --stop_on_errors -M 64
При общем объёме 1GB выделите 128MB для stressapptest.
<rkxxxx:/ #> /data/stressapptest -s 43200 -i 4 -C 4 -W --stop_on_errors -M 128
При общем объёме 2GB выделите 256MB для stressapptest.
<rkxxxx:/ #> /data/stressapptest -s 43200 -i 4 -C 4 -W --stop_on_errors -M 256
Исходник указывает общий объём 4MB и выделение 512MB для stressapptest. Это явное противоречие размеров, сохранённое для прослеживаемости; не используйте эту строку без сверки.
<rkxxxx:/ #> /data/stressapptest -s 43200 -i 4 -C 4 -W --stop_on_errors -M 512
5. Проверьте результат.
После теста проверьте устройство, fishingjoy и результат PASS/FAIL stressapptest. Каждые 10 секунд выводится оставшееся время. После завершения успешный тест печатает Status: PASS, неуспешный — Status: FAIL.
6. Выполняйте memtester более 12 часов.
При общем объёме 512MB выделите 64MB для memtester.
<rkxxxx:/ #> /data/memtester 64m
При общем объёме 1GB выделите 128MB для memtester.
<rkxxxx:/ #> /data/memtester 128m
При общем объёме 2GB выделите 256MB для memtester.
<rkxxxx:/ #> /data/memtester 256m
При общем объёме 4GB выделите 512MB для memtester.
<rkxxxx:/ #> /data/memtester 512m
7. Проверьте результат.
После теста проверьте устройство, fishingjoy и ошибки memtester. Версия из тестового пакета изменена так, что автоматически останавливается при ошибке. Работа более 12 часов без остановки означает отсутствие обнаруженных ошибок за это время.
Если ошибок нет, memtester продолжает печатать следующий журнал:
Loop 10:
Stuck Address : ok
Random Value : ok
Compare XOR : ok
Compare SUB : ok
Compare MUL : ok
Compare DIV : ok
Compare OR : ok
Compare AND : ok
Sequential Increment: ok
Solid Bits : ok
Block Sequential : ok
Checkerboard : ok
Bit Spread : ok
Bit Flip : ok
Walking Ones : ok
Walking Zeroes : ok
При обнаружении ошибки memtester автоматически завершает тест и выходит. Пример журнала:
FAILURE: 0xffffffff != 0xffffbfff at offset 0x03b7d9e4.
EXIT_FAIL_OTHERTEST
3.3.5 Тест изменения частоты DDR в Linux 3.10
Если ранее выполнялся тест с фиксированной частотой, перезагрузите устройство, иначе следующая команда изменения частоты не сможет работать.
1. Запустите fishingjoy.
2. Выполните su в последовательной консоли.
<rkxxxx:/ $> su
3. Запустите memtester в фоне.
При общем объёме 512MB выделите 64MB для memtester.
<rkxxxx:/ #> /data/memtester 64m > /data/_log.txt &
При общем объёме 1GB выделите 128MB для memtester.
<rkxxxx:/ #> /data/memtester 128m > /data/memtester_log.txt &
При общем объёме 2GB выделите 256MB для memtester.
<rkxxxx:/ #> /data/memtester 256m > /data/memtester_log.txt &
При общем объёме 4GB выделите 512MB для memtester.
<rkxxxx:/ #> /data/memtester 512m > /data/memtester_log.txt &
4. Выполните команду изменения частоты.
Задайте диапазон согласно поддерживаемым частотам тестируемого устройства.
Пример:
Если устройство поддерживает диапазон от 200MHZ до 533MHz:
<rkxxxx:/ #> echo 'a:200M-533M-1000000T' > proc/driver/ddr_ts
5. Проверьте результат; длительность — более 12 часов.
Убедитесь, что fishingjoy и само устройство работают нормально.
Проверьте работу программы изменения частоты и нормальный вывод её журнала.
Убедитесь, что memtester продолжает работать. Для проверки выполните <rkxxxx:/ #> ps | grep memtester.
Пример:
<rkxxxx:/ #> ps | grep memtester
root 14309 1730 74332 68156 0 5e980bf564 R /data/memtester
3.3.6 Тест перезагрузки Linux 3.10
Откройте Calculator, введите «83991906=» и нажмите RebootTest. Тест должен продолжаться более 12 часов.
3.4 Проверка DDR на RV1108
3.4.1 Сборка тестовой прошивки RV1108
В menuconfig ядра откройте System Type и включите DDR Test и pm_tests.
menuconfig
System Type --->
[*] /sys/pm_tests/ support
[*] DDR Test
Если пункта [] /sys/pm_tests/ support в menuconfig нет, соберите прошивку с фиксированной или изменяемой частотой по соответствующим разделам Rockchip_Developer_Guide_DDR.
3.4.2 Подготовка тестовой среды RV1108
Скопируйте stressapptest и memtester_32bit из rv1108_ddr_test_files в корень SD-карты и вставьте её в тестируемую плату.
3.4.3 Проверка объёма DDR на RV1108
Командой <rv1108:/ #> cat /proc/meminfo проверьте соответствие MemTotal фактическому объёму DDR.
Пример журнала:
<rv1108:/ #> cat /proc/meminfo
MemTotal: 133376 kB
64MB приблизительно соответствует 66688kB (значение исходника).
128MB приблизительно соответствует 133376kB (значение исходника).
256MB приблизительно соответствует 266752kB (значение исходника).
512MB приблизительно соответствует 533504kB (значение исходника).
Из-за различий управления и распределения памяти небольшое отклонение нормально.
3.4.4 Тест RV1108 с фиксированной частотой DDR
1. Зафиксируйте частоту DDR.
Установите максимальную частоту DDR, поддерживаемую тестируемым устройством.
Пример:
Если максимальная поддерживаемая частота DDR — 800MHz:
<rv1108:/ #> echo set clk_ddr 800000000 > /sys/pm_tests/clk_rate
2. Выполняйте google stressapptest более 12 часов.
При общем объёме 128MB выделите 16MB для stressapptest. Обычно выделяется одна восьмая общего объёма.
<rv1108:/ #> /mnt/sdcard/stressapptest -s 500 -i 1 -C 1 -W --stop_on_errors -M 16
3. Проверьте результат.
После теста проверьте устройство и результат PASS/FAIL stressapptest. Каждые 10 секунд выводится оставшееся время. После завершения успех обозначается Status: PASS, ошибка — Status: FAIL.
4. Выполняйте memtester более 12 часов.
При общем объёме 128MB выделите 16MB для stressapptest. Обычно выделяется одна восьмая общего объёма.
<rv1108:/ #> /mnt/sdcard/memtester_32bit 16m
5. Проверьте результат.
После теста проверьте устройство и ошибки memtester. Версия из тестового пакета изменена так, что автоматически останавливается при любой ошибке. Работа более 12 часов означает отсутствие обнаруженных ошибок за этот период.
Если ошибок нет, memtester продолжает печатать следующий журнал:
Loop 10:
Stuck Address : ok
Random Value : ok
Compare XOR : ok
Compare SUB : ok
Compare MUL : ok
Compare DIV : ok
Compare OR : ok
Compare AND : ok
Sequential Increment: ok
Solid Bits : ok
Block Sequential : ok
Checkerboard : ok
Bit Spread : ok
Bit Flip : ok
Walking Ones : ok
Walking Zeroes : ok
При обнаружении ошибки memtester автоматически завершает тест и выходит. Пример журнала:
FAILURE: 0xffffffff != 0xffffbfff at offset 0x03b7d9e4.
EXIT_FAIL_OTHERTEST
3.4.5 Тест изменения частоты DDR на RV1108
Если ранее выполнялся тест с фиксированной частотой, перезагрузите устройство, иначе следующая команда изменения частоты не сможет работать.
1. Запустите memtester в фоне.
При общем объёме 128MB выделите 16MB для memtester. Обычно выделяется одна восьмая общего объёма.
<rv1108:/ #> /mnt/sdcard/memtester_32bit 16m > /data/memtester_log.txt &
2. Выполните команду изменения частоты.
Тестовый диапазон — от 400MHz до максимальной частоты устройства.
Пример:
Если максимальная частота DDR устройства — 800MHz:
<rv1108:/ #> echo 'a:400M-800M-1000000T' > proc/driver/ddr_ts
3. Проверьте результат; длительность теста — более 12 часов.
Убедитесь, что устройство работает нормально.
Проверьте работу программы изменения частоты DDR и нормальный вывод журнала.
Убедитесь, что memtester продолжает работать, командой <rkxxxx:/ #> ps | grep memtester.
Пример:
<rkxxxx:/ #> ps | grep memtester
root 14309 1730 74332 68156 0 5e980bf564 R /data/memtester
3.4.6 Тест перезагрузки RV1108
Можно использовать встроенную функцию 1108: menu → debug → reboot test.
3.5 Проверка DDR на RK3308
3.5.1 Проверка объёма DDR на RK3308
Командой <rk3308:/ #> cat /proc/meminfo проверьте соответствие MemTotal фактическому объёму DDR.
Пример журнала:
<rk3308:/ #> cat /proc/meminfo
MemTotal: 246832 kB
MemFree: 201800 kB
64MB приблизительно соответствует 66688kB (значение исходника).
128MB приблизительно соответствует 133376kB (значение исходника).
256MB приблизительно соответствует 266752kB (значение исходника).
512MB приблизительно соответствует 533504kB (значение исходника).
Из-за различий управления и распределения памяти небольшое отклонение нормально.
3.5.2 Тест RK3308 с фиксированной частотой DDR
RK3308 не поддерживает изменение частоты DDR: она задаётся loader при инициализации и далее не меняется. Используйте loader с максимальной частотой. Для DDR3 исходник указывает 800MHz, для DDR2 и LPDDR2 — 533MHz.
1. Выполняйте memtester более 12 часов.
Сначала проверьте наличие тестового файла:
<rk3308:/ #> ls usr/bin/memtester
usr/bin/memtester
Если memtester имеется, команда следующая. При общем объёме 128MB выделите 16MB, обычно одну восьмую общей памяти.
<rk3308:/ #> memtester 16m > /data/memtester_log.txt &
Если файла нет, через ADB передайте в /data/ файл memtester_32bit.32bit для Linux-32 либо memtester_64bit.64bit для Linux-64.
Команда для Linux-32:
adb push \*file path*\memtester_32bit.32bit data/memtester
Команда для Linux-64:
adb push \*file path*\memtester_64bit.64bit data/memtester
Измените права:
<rk3308:/ #> chmod 777 /data/memtester
Команда memtester ниже. При общем объёме 128MB выделите 16MB, обычно одну восьмую общей памяти.
<rk3308:/ #> /data/memtester 16m > /data/memtester_log.txt &
2. Проверьте результат.
После теста убедитесь, что устройство работает нормально.
Проверьте ошибки memtester. **В этом варианте memtester не останавливается автоматически при ошибке; необходимо проверить весь вывод.**
Если ошибок нет, memtester продолжает печатать следующий журнал:
Loop 1:
Stuck Address : ok
Random Value : ok
Compare XOR : ok
Compare SUB : ok
Compare MUL : ok
Compare DIV : ok
Compare OR : ok
Compare AND : ok
Sequential Increment: ok
Solid Bits : ok
Block Sequential : ok
Checkerboard : ok
Bit Spread : ok
Bit Flip : ok
Walking Ones : ok
Walking Zeroes : ok
8-bit Writes : ok
16-bit Writes : ok
При ошибке memtester не останавливается автоматически. Пример журнала:
Loop 92:
Stuck Address : ok
Random Value : FAILURE: 0x37fe0f4190f6b999 != 0x37fe0f4196f6b999 at offset
0x0027a958.
FAILURE: 0x2823d0d6f62a4b01 != 0x2823d0d6f02a4b01 at offset 0x0027a958.
Compare XOR : FAILURE: 0x4c4f418e764340e8 != 0x4c4f418e704340e8 at offset
0x0027a958.
Compare SUB : FAILURE: 0x2856fb8ee22bd230 != 0xfe5ee503ee2bd230 at offset
0x0027a958.
Compare MUL : FAILURE: 0x00000000 != 0x00000001 at offset 0x0027a958.
Compare DIV : FAILURE: 0xefb2eceaffbf9604 != 0xefb2eceaffbf9605 at offset
0x0027a958.
Compare OR : FAILURE: 0xcbb2a0e8cfbb8200 != 0xcbb2a0e8cfbb8201 at offset
0x0027a958.
Compare AND : Sequential Increment: ok
Solid Bits : ok
Block Sequential : ok
Checkerboard : ok
Bit Spread : ok
Bit Flip : ok
Walking Ones : ok
Walking Zeroes : ok
8-bit Writes : ok
16-bit Writes : ok
3. Выполняйте google stressapptest более 12 часов.
Сначала проверьте наличие тестового файла:
<rk3308:/ #> ls usr/bin/stressapptest
usr/bin/stressapptest
Если stressapptest имеется, используйте следующую команду. При общем объёме 256MB выделите 32MB, обычно одну восьмую памяти. Параметр -s задаёт время в секундах; команда ниже выполняет тест 24 часа.
<rk3308:/ #> stressapptest -s 86400 -i 4 -C 4 -W --stop_on_errors -M 32
Если файла нет, передайте через ADB в /data/ stressapptest_32bit для Linux-32 либо stressapptest_64bit для Linux-64.
Команда для Linux-32:
adb push \*file path*\stressapptest_32bit data/stressapptest
Команда для Linux-64:
adb push \*file path*\stressapptest_64bit data/stressapptest
Измените права:
<rk3308:/ #> chmod 777 /data/stressapptest
Команда stressapptest ниже. При общем объёме 256MB выделите 32MB, обычно одну восьмую памяти. В примере тест длится 24 часа.
<rk3308:/ #> /data/stressapptest -s 86400 -i 4 -C 4 -W --stop_on_errors -M 32
4. Проверьте результат.
После теста убедитесь, что устройство работает нормально.
Проверьте PASS/FAIL stressapptest. Каждые 10 секунд программа выводит оставшееся время; после завершения успех обозначается Status: PASS, ошибка — Status: FAIL.
3.5.3 Тест сна и пробуждения RK3308
Для теста ядро должно поддерживать автоматическое пробуждение. В файле rk3308.dtsi найдите rockchip_suspend и добавьте RKPM_TIMEOUT_WAKEUP_EN побитовым ИЛИ, как показано ниже. В исходнике имя файла напечатано «rk3308. dtsi» с пробелом.
rockchip_suspend: rockchip-suspend {
...
rockchip,wakeup-config = <
(0
| RKPM_GPIO0_WAKEUP_EN
| RKPM_TIMEOUT_WAKEUP_EN
)
>;
};
После сборки прошивки рекомендуется тестовый скрипт. Сначала проверьте его наличие:
<rk3308:/ #> ls rockchip_test/rockchip_test.sh
rockchip_test/rockchip_test.sh
Если файл есть, команда следующая:
<rk3308:/ #> /rockchip_test/rockchip_test.sh
...
please input your test moudle: //the serial console first input 8<enter>, then 1<enter>
8
1
Если файла нет, выполните команду теста сна непосредственно в последовательной консоли:
<rk3308:/ #> while true; do echo mem > /sys/power/state; sleep 5; done
Выполняйте тест более 12 часов, затем проверьте работу устройства.
3.5.4 Тест перезагрузки RK3308
Рекомендуется скрипт проверки перезагрузки 3308. Сначала проверьте его наличие:
<rk3308:/ #> ls rockchip_test/rockchip_test.sh
rockchip_test/rockchip_test.sh
Если файл есть, команда перезагрузки следующая:
<rk3308:/ #> /rockchip_test/rockchip_test.sh
...
please input your test moudle: //the serial console input 13<enter>
13
Если файла нет, передайте auto_reboot_test.sh в /data/:
adb push \*file path*\auto_reboot_test.sh data/.
Измените права:
<rk3308:/ #> chmod 777 /data/auto_reboot_test.sh
Команда перезагрузки:
<rk3308:/ #> /data/auto_reboot_test.sh
Выполняйте тест более 12 часов, затем проверьте работу устройства.
4. Глава 4. Руководство по Rockchip DDR DQ Eye Tool
4.1 Сканирование двумерной глазковой диаграммы
4.1.1 Поддерживаемые платформы
RK3528, RK3562, RK3566, RK3568, RK3588, RK3576
4.1.2 Порядок использования
В loader необходимо включить eye_scan ddr bin. Этот файл содержит «eyescan» в имени и находится в rkbin/bin/rkxx, рядом с обычными ddr bin; пример: rkbin/bin/rk35/rk3568_ddr_1560MHz_eyescan_v1.16.bin. Сборка loader описана в разделе руководства разработчика DDR.
Если нужна другая частота, измените её в eye_scan ddr bin инструментом rkbin/tools/ddrbin_tool, затем соберите loader. Инструкция находится в rkbin/tools/ddrbin_tool_user_guide.txt.
Переведите устройство в режим maskrom и загрузите loader через RKDevTool. Результат выводится в последовательный порт. После сканирования двумерной диаграммы loader автоматически останавливается, поэтому инструмент сообщает об ошибке.

В режиме loader загрузка loader завершается успешно. После этого при каждом включении выполняется сканирование двумерной диаграммы с выводом в последовательный порт, а затем выполнение останавливается. Обычная загрузка системы невозможна; для восстановления перейдите в maskrom и загрузите обычный loader.
4.1.2.1 Анализ результатов
В начале журнала двумерной диаграммы указана задержка одного шага в fs (0.001ps). Например, «Unit: 1913 fs» в первой строке рисунка означает 1.913 ps на шаг.
Вторая строка «margin: rx:22-8,tx:26-32» означает минимально необходимые запасы setup/hold для чтения 22step/8step и для записи 26step/32step соответственно. Значения пересчитаны из ps в шаги программной диаграммы с учётом частоты. На диаграмме rx dq0 минимальный диапазон setup 22step и hold 8step отмечен символами «|». Значение «[33 ~ -1 ~-35]» справа означает запас setup 33 шага и hold 35 шагов при данном vref. По сравнению с минимумом 22step/8step дополнительный запас составляет 33-22=11step для setup и 35-8=27step для hold.

На рисунке выше показана диаграмма одного DQ.
Слева vref указывает опорное напряжение для соответствующей ширины глаза. Символ «*» перед vref отмечает напряжение с максимальной шириной, а «+» — напряжение, используемое текущей прошивкой. Значение vref приближённое: фактически выбирается ближайшее доступное внутреннее значение. Например, если показано 30.4%, а ближайшее доступное значение — 30.2%, реально действует 30.2%.
В середине «-» обозначает недопустимую фазовую точку, «*» — допустимую, «+» — исходную точку выборки. Диапазон между «|» соответствует минимально необходимому запасу setup/hold. Расстояние от «+» до крайнего левого «*» — запас setup, до крайнего правого «*» — запас hold. Если фактическая граница допустимого глаза попадает внутрь диапазона «|», соответствующая точка заменяется на «o». Символ «o» указывает на недостаточный запас сигнала. Пример приведён ниже.
Редакционное уточнение: в самом английском PDF два обозначения в кавычках пусты. По
*в конце того же абзаца и по китайскому соответствию здесь восстановлено чтение*; это явно отмеченная редакционная интерпретация, требующая сверки с выводом инструмента.

Справа в «[]» последовательно указаны левая граница глаза, среднее значение, правая граница и общая ширина.

На рисунке выше приведён объединённый результат для всех DQ.

Редактируемая расшифровка снимка (исходные поля и значения):
| cs0 RD | Поле | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| max eye | left | -42 | -42 | -44 | -46 | -39 | -44 | -44 | -39 | -45 | -44 | -47 | -44 | -46 | -47 | -44 | -49 |
| max eye | midd | 0 | 0 | -2 | -4 | 1 | -2 | -3 | 0 | 3 | 3 | 0 | 3 | 3 | 1 | 2 | -1 |
| max eye | right | 41 | 43 | 39 | 38 | 42 | 40 | 38 | 40 | 51 | 51 | 48 | 51 | 52 | 50 | 49 | 47 |
| max eye | range | 83 | 85 | 83 | 84 | 81 | 84 | 82 | 79 | 96 | 95 | 95 | 95 | 98 | 97 | 93 | 96 |
| current eye | left | -39 | -44 | -44 | -43 | -39 | -44 | -41 | -39 | -44 | -43 | -45 | -41 | -45 | -46 | -40 | -47 |
| current eye | midd | 0 | -1 | -2 | -1 | 1 | -2 | 0 | 0 | 3 | 4 | 1 | 5 | 3 | 2 | 6 | 0 |
| current eye | right | 38 | 41 | 39 | 40 | 41 | 40 | 40 | 40 | 51 | 52 | 48 | 52 | 52 | 51 | 52 | 48 |
| current eye | range | 77 | 85 | 83 | 83 | 80 | 84 | 81 | 79 | 95 | 95 | 93 | 93 | 97 | 97 | 92 | 95 |
Для проверки отдельных DQ на рисунке выше сведены результаты всех отдельных диаграмм.
Строка «max eye» содержит левую границу, среднее значение, правую границу и общую ширину самого широкого глаза для каждого DQ. Слева направо идут DQ0, DQ1 и далее. Здесь исходник связывает это значение с vref, отмеченным «+»; выше назначение «+» и «*» описано иначе — это противоречие требует проверки.
Строка «current eye» содержит результат для текущего vref в том же формате, что «max eye». Здесь исходник указывает маркер «*», что противоречит описанию маркеров выше; обозначения не следует считать проверенными.
Противоречие исходника: выше * обозначает Vref максимальной ширины, а + — текущий Vref; здесь обозначения max/current переставлены. Обе формулировки сохранены; проверьте версию инструмента и фактический вывод.
Итог: «all result: pass» в конце журнала означает, что запасы всех dq удовлетворяют требованиям. В противном случае выводится «all result: err».
4.2 Сканирование одномерной глазковой диаграммы
На платформах с поддержкой двумерного сканирования сначала используйте его: оно дополнительно учитывает vref. Одномерное сканирование применяют при особых требованиях.
4.2.1 Поддерживаемые платформы
RV1109, RV1126, RK3566, RK3568, RK3528, RK3562
4.2.2 Порядок использования
4.2.2.1 Подготовка
1. Проверьте версию DDR bin: для RV1126 требуется V1.09 или новее, для RK3568/RK3566 — V1.07 или новее. При более старой версии обновите проект rkbin.
2. Перед сборкой U-Boot откройте menuconfig в корне проекта, перейдите в «Command line interface», включите «Enable ddr test tool» и сохраните конфигурацию. Rockchip DDR DQ Eye Tool встроен в DDR Test Tool.

Редактируемая расшифровка снимка (исходные поля и значения):
[ ] Enable memtester for ddr
[*] Enable ddr test tool
Misc commands --->
3. Соберите U-Boot и загрузите Loader и uboot. Подробности приведены в соответствующем разделе документации UBOOT.
4. Подключите последовательный порт проверяемой платы к компьютеру и проверьте связь. При включении платы удерживайте Ctrl + C на компьютере, чтобы остановить загрузку в U-Boot. Сообщение «<INTERRUPT>» означает, что выполнение остановлено в U-Boot.

Редактируемая расшифровка снимка (исходные поля и значения):
hclk_top 150000 KHz
pclk_top 100000 KHz
aclk_perimid 300000 KHz
hclk_perimid 150000 KHz
pclk_pmu 100000 KHz
Net: eth0: ethernet@fe010000
Hit key to stop autoboot('CTRL+C'): 0
=> <INTERRUPT>
=> <INTERRUPT>
=> <INTERRUPT>
4.2.2.2 Просмотр диаграмм чтения и записи DDR DQ в U-Boot
Введите команду в U-Boot:
ddr_dq_eye <DDR frequency in MHz>
Параметр <DDR frequency in MHz> задаёт частоту DDR для просмотра диаграммы DQ в MHz. Если параметр не указан, используется максимальная частота.
Пример просмотра диаграммы DQ при частоте DDR 1056MHz:
ddr_dq_eye 1056
Пример просмотра диаграммы DQ при максимальной частоте DDR:
ddr_dq_eye
4.2.2.3 Анализ результатов


В начале инструмент показывает свою версию, тип DDR и частоту.
Далее выводятся диаграммы чтения и записи каждого CS.
В диаграмме «-» обозначает положение вне глаза, «*» — внутри глаза, «|» — точку выборки.
Справа показаны левый и правый запасы Margin_L и Margin_R, положение выборки и ширина глаза. Квадратными скобками отмечена ширина, не удовлетворяющая минимальному пределу, как у read eye DQ0 на рисунке.
В конце инструмент показывает минимальную ширину глаза для чтения и записи, а также требуемый минимум; выбирайте предел для близкой частоты.
4.2.3 Минимально допустимая ширина глаза DDR DQ
На основании испытаний DEMO и опыта проектов исходник задаёт минимальную ширину глаза чтения и записи DDR DQ. Если хотя бы одна из этих величин ниже предела, работа DDR может быть нестабильной. Это данные исходника, а не измерения ArmSoM.
Соответствие пределу означает лишь сравнительно надёжную ширину глаза DQ в данной конструкции. Оно не исключает другие проблемы DDR. Дополнительные испытания надёжности проводятся по требованиям фактического применения.
4.2.3.1 RV1126
| Тип DDR | Частота DDR CLK | Минимальная ширина глаза чтения | Минимальная ширина глаза записи |
|---|---|---|---|
| LPDDR4 | 1056MHz | 12 | 13 |
| LPDDR4 | 924MHz | 15 | 15 |
| DDR4 | 1056MHz | 13 | 9 |
| DDR4 | 924MHz | 15 | 11 |
| LPDDR3 | 1056MHz | 15 | 13 |
| LPDDR3 | 924MHz | 16 | 15 |
| DDR3 | 1056MHz | 14 | 14 |
| DDR3 | 924MHz | 17 | 17 |
4.2.3.2 RK3568/RK3566
| Тип DDR | Частота DDR CLK | Минимальная ширина глаза чтения | Минимальная ширина глаза записи |
|---|---|---|---|
| LPDDR4 | 1560MHz | 25 | 24 |
| LPDDR4 | 1184MHz | 30 | 29 |
| DDR4 | 1560MHz | 30 | 22 |
| DDR4 | 1184MHz | 32 | 26 |
| LPDDR3 | 1184MHz | 34 | 25 |
| LPDDR3 | 1056MHz | 39 | 28 |
| DDR3 | 1184MHz | 32 | 31 |
| DDR3 | 1056MHz | 39 | 34 |
5. Глава 5. Руководство по измерению пропускной способности DDR
5.1 Терминология
В этом разделе используются следующие основные термины:
monitor: функция наблюдения за различными командами DDR и сбора статистики.
5.2 Получение инструмента
https://redmine.rock-chips.com/documents/49 -> DDR Related Materials_VerX.XX.7z -> Tools ->DDR Bandwidth Tool
5.3 Поддерживаемые платформы
Список поддерживаемых платформ можно получить командой:
# rk-msch-probe_vx.xx -h
Будет выведена следующая информация; точный список платформ зависит от версии инструмента:
Usage: [-c chip_name -d msecs -f freq -h help]
-c <chip_name>:
'rk312x' include rk3126,rk3128 and px3se
'rk322x' include rk3128h,rk3228a,rk3228b and rk3229
...
[option] -d <msecs>: Sets the sampling interval in milliseconds.
[option] -f <freq>: Specifies the mean current DDR frequency in MHz.
[option] -h: Displays help information.
5.4 Параметры
Инструмент измерения пропускной способности DDR rk_msch_probe_vx.xx поддерживает следующие параметры:
-c: имя микросхемы. Убедившись в поддержке платформы, укажите её имя, например rk3326.
-d: интервал наблюдения в ms, необязательный параметр. По умолчанию 1000ms.
-f: текущая частота DDR в MHz, необязательный параметр. На каждом интервале инструмент пытается определить частоту DDR. Если это не удаётся, её необходимо указать вручную.
Сначала следует зафиксировать частоту DDR, иначе её изменение
сделает результаты неточными. Параметр -t test_loop задаёт число циклов измерения, после которых инструмент завершается. По умолчанию выполнение не ограничено.
-h: справка.
5.5 Условия использования
Регулятор devfreq для DMC не должен быть «dmc_ondemand». Рекомендуется переключиться на «userspace» следующей командой:
# echo userspace > /sys/class/devfreq/dmc/governor
Затем зафиксируйте частоту DDR; пример для 780MHz:
# echo 780000000 > /sys/class/devfreq/dmc/userspace/set_freq
Если при проверке инструмент выводит следующее сообщение, перечисленные условия не выполнены:
Error: The DDR monitor time gets error!!!
Please check the devfreq governor is not 'dmc_ondemand'!!!
For example:
# cat sys/class/devfreq/dmc/governor
# dmc_ondemand
Please switch the devfreq governor to others, such as 'userspace'.
For example:
# echo userspace > /sys/class/devfreq/dmc/governor
Delete the result of this time!
5.6 Пояснение вывода
При запуске rk_msch_probe_vx.xx отслеживает и выводит пропускную способность и загрузку DDR.
Вывод для обычных платформ:
V1.06_20200629
ddr freq: 928Mhz
CH0:
ddr monitor statistics:
ddr load = 3251.23MB/s(43.76%) [RD:1859.93MB/s(25.03%), WR:1391.30MB/s(18.72%), ACT(access :
active): 3.34, srex:0.54%, pdex:1.27%, clkstp:0.00%, lp:1.81%]
Вывод для RK3588:
ddr freq: 2133Mhz
===========ALL=============CH0===============CH1==============CH2===============CH3========
LOAD: 4.51MB/s(0.03%), 1.23MB/s(0.04%), 1.13MB/s(0.03%), 1.16MB/s(0.04%),
1.00MB/s(0.03%)
RD: 2.57MB/s(0.02%), 0.74MB/s(0.02%), 0.65MB/s(0.02%), 0.67MB/s(0.02%),
0.51MB/s(0.02%)
WR: 1.94MB/s(0.01%), 0.49MB/s(0.02%), 0.48MB/s(0.01%), 0.49MB/s(0.02%),
0.48MB/s(0.01%)
===========================================================================================
Пояснение статистических показателей:
| Поле вывода | Пояснение |
|---|---|
| ALL | Суммарная статистика пропускной способности всех каналов. |
| CHx | Статистика пропускной способности канала DDR x. |
| recorded LOAD (max, min, avg) |
Для всех банков DDR: максимальные, минимальные и средние значения пропускной способности и загрузки, зарегистрированные во время работы инструмента. |
| load/LOAD | Пропускная способность и загрузка данного канала по всем банкам DDR. |
| RD | Пропускная способность и процентная доля чтения DDR по всем банкам. |
| WR | Пропускная способность и процентная доля записи DDR по всем банкам. |
| PRE | Для всех банков DDR: доля команд precharge в общем числе команд. Команды precharge и active появляются попарно; отдельной аппаратной статистики precharge нет, поэтому используется статистика команд active. |
| ACT(access : active) |
Для всех банков DDR: среднее число чтений/записей после каждой команды active. Чем выше значение, тем более последовательны обращения к адресам DDR, что предпочтительнее. |
| srex | Доля времени DDR в состоянии self-refresh. |
| pdex | Доля времени DDR в состоянии power down. |
| clkstp | Доля времени DDR в состоянии clock stop. |
| srpdex | Доля времени DDR в состоянии self-refresh power down. |
| dsmex | Доля времени DDR в состоянии Deep Sleep Mode. |
| lp/ LOW POWER | Доля времени DDR в энергосберегающих состояниях, включая self-refresh, power down, clock stop и другие. |
5.7 Частые вопросы
1) Если при работе сообщается об отсутствии «/dev/mem», вывод выглядит следующим образом:
rk3568:/ # rk-msch-probe_vx.xx -c rk356x
open /dev/mem error: No such file or directory
Ошибка возникает, когда в конфигурации ядра выключен CONFIG_DEVMEM: инструмент не может обратиться к регистрам устройства.
Способ 1: добавьте CONFIG_DEVMEM=y в соответствующий файл конфигурации ядра, например android-11.config, и пересоберите прошивку.
Способ 2: выполните make menuconfig в дереве ядра, найдите DEVMEM, включите его и пересоберите ядро. Следите за тем, чтобы не перезаписать нужную конфигурацию.
Symbol: DEVMEM [=y]
Type : bool
Prompt: /dev/mem virtual device support
Location:
-> Device Drivers
(1) -> Character devices
Defined at drivers/char/Kconfig:10
...
[*] /dev/mem virtual device support
...
6. Глава 6. Руководство по DDR_UserTool — проверке пайки DDR
6.1 Обзор
DDR_UserTool предназначен для проверки пайки DDR.
Инструмент распространяется по адресу https://redmine.rock-chips.com/documents/49 в DDR相关资料_Verx.xx.7z -> 工具 -> DDR_UserTool_vx.xx.
Номер версии DDR_UserTool может долго не меняться, хотя внутренние конфигурационные файлы обновляются, например для поддержки новых платформ. Поэтому для каждого нового проекта необходимо получать свежую поставку DDR_UserTool с Redmine.
6.2 Этапы проверки
6.2.1 Переключение DDR_UserTool на английский язык
Откройте resource/config.ini и замените «Selected=1» на «Selected=2», чтобы выбрать английский язык.


Редактируемая расшифровка снимка (исходные поля и значения):
[Language]
Kinds=2
Selected=2
LangPath=Language\
Lang1File=Chinese.ini
Lang1FontName=宋体
Lang1FontSize=9
Lang1Tag=CHN
Lang1CHNTitle=中文
Lang1ENGTitle=Chinese
Lang2File=English.ini
Lang2FontName=Arial
Lang2FontSize=9
Lang2Tag=ENG
Lang2CHNTitle=英文
Lang2ENGTitle=English
[System]
6.2.2 Запуск DDR_UserTool.exe
Примечание: в Windows 7 щёлкните правой кнопкой и выберите «Run as Administrator».
6.2.3 Выбор TestFile

TestFile находится в папке TestFile каталога инструмента и имеет расширение .cfg. Выберите файл, соответствующий целевой платформе и сведениям об объёме DDR.
Обратите внимание:
Микросхему DDR4 x16 DDP (Dual Die Package) следует считать двумя микросхемами x8. Например, если исходная конфигурация — «4GB DDR4(1CS x 2pcs x 1Gb×16bit)», но установлены DDR4 x16 DDP, выберите TestFile для «4GB DDR4(1CS x 4pcs x 1Gb×8bit)». Определение DDR4 x16 DDP описано ниже.
Файлы TestFile для LPDDR4 и LPDDR4X не взаимозаменяемы.
Для DDR3L используйте TestFile для DDR3.
6.2.4 Подпись TestFile
Этот шаг нужен только для устройств с secure-boot. На устройствах без secure-boot пропустите его.

Для проверки устройства с secure-boot подпишите TestFile с помощью SecureBootTool, доступного по адресу https://redmine.rock-chips.com/documents/49. Настройте Chip, Key и другие параметры, затем нажмите «Sign DDR File». Подробности приведены в SecureBootTool_UserManual.
6.2.5 Перевод целевого устройства в состояние проверки
Подключите OTG-порт устройства. По возможности также подключите последовательный порт.
Перевести устройство в состояние проверки можно несколькими способами:
Устройство, на которое ещё не записана прошивка
Такое устройство уже находится в Maskrom и может проверяться непосредственно.
Перевод устройства в Maskrom
Исходник описывает замыкание CLK и GND накопителя при включении питания для входа в Maskrom. Конкретные контакты определяются схемой RK; обычно предусмотрена кнопка или тестовые точки. Не замыкайте произвольные контакты: способ зависит от схемы конкретной платы.
Перевод устройства в режим Loader
Когда устройство готово к проверке, инструмент показывает «Found one device».

6.2.6 Запуск проверки

Нажмите «StartTest». Индикатор начнёт двигаться, а журнал будет одновременно отображаться в окне инструмента. По данным исходника, проверка обычно занимает менее 2 минут; это не результат измерения на ArmSoM.
При включённом «AutoTest» проверка автоматически запускается при подключении устройства.
6.2.7 Получение результатов
6.2.7.1 Проверка PASS

6.2.7.2 Проверка FAIL
По сообщениям инструмента определите неисправные микросхемы DDR и SoC, требующие перепайки. Для определения конкретных сигнальных линий используйте раздел о соответствии сообщений об ошибках аппаратным линиям.
После ремонта устройство, не прошедшее проверку, обязательно проверяют повторно, пока проверка не завершится успешно.

6.2.7.3 Проверка прервана

Для поиска причины используйте раздел «Причины прерывания проверки».
6.3 Частые вопросы
6.3.1 Проверяет ли DDR_UserTool стабильность DDR?
Нет. DDR_UserTool сейчас проверяет только пайку DDR. Проверка стабильности описана в разделе о процессе проверки DDR этого документа.
6.3.2 Выявляет ли DDR_UserTool дефекты пайки всех контактов?
Нет. Это быстрый программный способ проверки пайки DDR, но программные средства имеют ограничения: они не проверяют все контакты DDR и не проверяют контакты других модулей.
Обычно выявляются дефекты пайки DQ и большинства CA. Дефекты контактов питания, CKE и ODT не обнаруживаются.
6.3.3 Определение микросхем DDR4 x16 DDP
1. Проверьте схему. Если вывод M9 микросхемы DDR4 подключён к BG1 со стороны SoC, это x16 DDP. Если M9 подключён к VSS, это не x16 DDP.

2. Проверьте журнал Loader при загрузке исправного устройства. Значение «Die BW=8» в сведениях об объёме DDR, согласно исходнику, подтверждает использование x16 DDP.
3. Проверьте datasheet: найдите прямое указание DDP (Dual Die Package). Также можно проверить назначение M9: BG1 означает x16 DDP, VSS — не x16 DDP.
6.3.4 Не удаётся найти TestFile для устройства
Проверьте наличие обновлений.
Если для новой платформы TestFile ещё отсутствует, дождитесь обновления инструмента.
Для платформ с опубликованными TestFile обычно имеются файлы для распространённых конфигураций DDR. Файлов много, поэтому проверьте список внимательно. Если конфигурация необычная и подходящий файл отсутствует, задайте вопрос на Redmine.
6.3.5 Причины прерывания проверки
1. В Windows 7 инструмент запущен без «Run as Administrator».
2. Неверно выбран TestFile: не совпадают платформа, тип DDR или сведения об объёме.
3. Повторная проверка запущена без повторного перевода устройства в состояние проверки.
4. Для устройства с secure-boot не подписан TestFile.
5. Не обновлены инструмент и TestFile.
6. Проблема питания устройства, например недостаточное питание USB.
7. Проблема соединения USB: попробуйте другой кабель или другой компьютер.
8. Если устройство находится в Loader, попробуйте проверку в Maskrom.
6.3.6 Соответствие сообщений об ошибках аппаратным сигнальным линиям
Перестановка линий CA не допускается, поэтому их соответствие обычно однозначно.
Ошибки DQ относятся к именам выводов со стороны SoC. Ориентируйтесь на общую часть имени, а не на часть, зависящую от типа DDR. На фрагменте схемы RK3528 DDR4 общая часть выделена зелёной рамкой. Если инструмент сообщает об ошибке DQ1_B, проблема относится к линии вывода DDRPHY_B_DQ1 SoC, то есть к сигналу DDR4_DQU0_B.

6.3.7 DDR_UserTool показывает FAIL, но рентген не выявляет дефектов пайки
Рентген не всегда обнаруживает все дефекты. Исходник рекомендует попробовать перепайку микросхем DDR и SoC.
6.3.8 После перепайки результат по-прежнему FAIL
1. Неверно выбран TestFile либо не обновлены инструмент и TestFile.
2. Непропай возможен одновременно на стороне DDR и SoC; требуется проверка и перепайка обеих сторон.
3. Дефекты изготовления PCB, например обрыв проводников.
4. Причины, не связанные с пайкой DDR: неисправность микросхемы DDR, ошибки схемы, проблемы питания и т. п.
6.3.9 FAIL у большого числа устройств
1. Неверно выбран TestFile либо не обновлены инструмент и TestFile.
2. Проблемы сборочного производства или изготовления PCB.
3. Причины, не связанные с пайкой DDR: неисправность микросхемы DDR, ошибки схемы, проблемы питания и т. п.
6.3.10 Дополнительные вопросы на Redmine
Чтобы ускорить анализ, вместе с чётким описанием проблемы предоставьте:
1. Обозначение DDR PN и datasheet.
2. Число установленных микросхем DDR, желательно со схемой.
3. Использованный TestFile.
4. Долю устройств с отклонениями.
5. DDR_Test_Log.txt из каталога инструмента, соответствующий журнал из resource\Log и журнал последовательного порта во время проверки. При наличии исправных устройств приложите такие же журналы для сравнения.
6. Журнал последовательного порта при включении питания. При наличии исправных устройств приложите также их журналы загрузки.
7. Глава 7. Руководство по DDR ECC в HAL
7.1 Область применения
Этот раздел применим только к системам с HAL и не относится к системам Linux.
7.2 Терминология
| Сокращение | Описание |
|---|---|
| ECC | Код исправления ошибок (Error Correcting Code) |
| SEC ECC | Код исправления одиночной однобитной ошибки (Single Bit Single Error Correction Code) |
| DED ECC | Код обнаружения двойной ошибки; исходная расшифровка: Double Error Detection Error Correction Code |
| DDR | SDRAM с удвоенной скоростью передачи данных (Double Data Rate SDRAM) |
| CE | Исправимая ошибка |
| UE | Неисправимая ошибка |
| cs | Выбор микросхемы |
| Row | Адрес строки DDR |
| Chip ID | Идентификатор микросхемы DDR; сейчас не используется, игнорируйте. |
| BankGroup | Адрес группы банков DDR4; для других типов DDR игнорируется. |
| Bank | Адрес банка DDR |
| Col | Адрес столбца DDR |
| Bit position | Позиция бита, исправленного при CE |
7.3 Введение
ECC означает Error Correcting Code. DDR ECC обнаруживает и исправляет ошибки данных DDR. RK3568 поддерживает SideBand ECC: к каналу данных DDR добавляется выделенный канал для данных ECC. Механизм исправляет однобитные ошибки и обнаруживает двухбитные ошибки — SEC/DED ECC (Single Error Correction/Double Error Detection).
7.4 Включение DDR ECC
1. Включение ECC: согласно исходнику, DDR ECC включается автоматически при подключении микросхемы к DDR_ECC_DQ0-7.
2. Назначение DDR_ECC_DQ0-7: используются 32 бита данных DQ и 7 бит ECC. На DDR_ECC_DQ0-7 хранятся данные ECC, вычисленные по DQ0-DQ31; для их хранения нужна дополнительная микросхема.
3. Дополнительная микросхема ECC должна совпадать с микросхемами DQ0-31 по типу, Row, Column и Bank.
4. Поддерживаемые типы DDR: в рамках описанной реализации исходник заявляет поддержку ECC для всех типов DDR. Это не утверждение о поддержке на всех платах ArmSoM.
7.5 Получение информации DDR ECC в HAL
Проверку и исправление ошибок выполняет аппаратный IP-блок DDR ECC. Программа может получить соответствующую информацию.
7.5.1 Конфигурация
Включите модуль DDR ECC в hal_conf.h проекта. Например, для rk3568 добавьте следующий код в project/rk3568/src/hal_conf.h.
#define HAL_DDR_ECC_MODULE_ENABLED
7.5.2 Код и API
lib/hal/src/hal_ddr_ecc.c
lib/hal/inc/hal_ddr_ecc.h
/* Initialize DDR ECC related information */
HAL_Status HAL_DDR_ECC_Init(struct DDR_ECC_CNT *p);
/*
* Get cumulative statistical information of DDR ECC, including the number of single-bit
* correctable errors and double-bit detectable but uncorrectable errors
*/
HAL_Status HAL_DDR_ECC_GetInfo(struct DDR_ECC_CNT *p);
7.5.3 Примеры использования
Верхний программный уровень получает сведения DDR ECC двумя способами: программным опросом или аппаратными прерываниями.
Программный опрос
Пример:
struct DDR_ECC_CNT eccInfo;
void HAL_DDR_ECC_TEST_POLL(void)
{
uint32_t cpuID;
cpuID = HAL_CPU_TOPOLOGY_GetCurrentCpuId();
if (cpuID == 0) { /* Use a CPU, thread, or other method to
initialize and poll DDR ECC status */
HAL_DDR_ECC_Init(&eccInfo);
while (1) { /* After initializing DDR ECC information,
poll to get DDR ECC information */
HAL_DDR_ECC_GetInfo(&eccInfo); /* Cumulative CE and UE counts are stored
in the eccInfo structure */
HAL_DelayMs(50);/* Polling interval, or other APIs to let the CPU idle */
}
}
}
Аппаратные прерывания
Пример:
struct DDR_ECC_CNT eccInfo;
void HAL_DDR_ECC_IRQHandler(uint32_t irq)
{
HAL_DDR_ECC_GetInfo(&eccInfo);
}
void HAL_DDR_ECC_TEST_INT(void)
{
uint32_t cpuID;
cpuID = HAL_CPU_TOPOLOGY_GetCurrentCpuId();
if (cpuID == 0) { /* Use a CPU, thread, or other method to initialize DDR ECC
related */
HAL_DDR_ECC_Init(&eccInfo);
HAL_GIC_SetHandler(DDR_ECC_CE_IRQn, HAL_DDR_ECC_IRQHandler); /* Attach CE
interrupt service routine */
HAL_GIC_SetHandler(DDR_ECC_UE_IRQn, HAL_DDR_ECC_IRQHandler); /* Attach UE
interrupt service routine */
HAL_GIC_Enable(DDR_ECC_CE_IRQn); /* Enable CE interrupt
service */
HAL_GIC_Enable(DDR_ECC_UE_IRQn); /* Enable UE interrupt
service */
}
}
При обнаружении ошибки ECC выведите полученные сведения DDR ECC.
# 2 CE (correctable errors) detected
[HAL WARNING] DDR ECC error: CE, 2 errors, the last is in DDR cs 0, Row 0xa0, ChipID
0x0, BankGroup 0x0, Bank 0x5, Col 0x318, Bit position 0x10000000
# 1 UE (uncorrectable error) detected
[HAL ERROR] DDR ECC error: UE, 1 errors, the last is in DDR cs 0, Row 0xa0, ChipID
0x0, bankGroup 0x0, Bank 0x5, Col 0x354
7.6 DDR ECC data poison
Для проверки работы DDR ECC предусмотрен режим data poison — намеренного внесения ошибки. После его включения запись и чтение по заданному физическому адресу вызывают DDR ECC CE/UE.
7.6.1 Код и API
lib/hal/src/hal_ddr_ecc.c
lib/hal/inc/hal_ddr_ecc.h
/* Enable DDR ECC error injection */
HAL_Status HAL_DDR_ECC_PoisonEnable(struct DDR_ECC_CNT *p);
/* Disable DDR ECC error injection */
HAL_Status HAL_DDR_ECC_PoisonDisable(struct DDR_ECC_CNT *p);
По умолчанию data poison создаёт обнаруживаемую и исправимую однобитную ошибку CE. Для перехода к
обнаруживаемой, но неисправимой двухбитной ошибке UE внесите следующее изменение:
static HAL_Status DDR_ECC_SMCPoison(uint32_t eccPoisonEn,
struct DDR_ECC_CNT *priv)
{
...
pShareMemCfg->eccPoisonMode = DDR_ECC_UE_DATA_POISON;
...
}
7.6.2 Пример использования
struct DDR_ECC_CNT eccInfo;
void DDR_ECC_PoisonTriger(struct DDR_ECC_CNT *priv)
{
uint32_t volatile *p = NULL;
printf("DDR_ECC debug: eccPoisonAddr = 0x%llx\n", priv->eccPoisonAddr);
if (priv->eccPoisonAddr) {
p = (uint32_t volatile *)priv->eccPoisonAddr;
*p = 0x5aa5f00f; /* Write to the DDR ECC data poison physical address */
HAL_DCACHE_CleanInvalidate(); /* If the address attribute is cacheable, flush Dcache
to ensure the write is successful */
printf("DDR_ECC debug: %p = 0x%x, reread = 0x%x\n", p, *p, *p);
}
}
void DDR_ECC_GetInfo(void)
{
HAL_DDR_ECC_GetInfo(&eccInfo);
}
void HAL_DDR_ECC_TEST_POLL(void)
{
uint32_t cpuID;
uint32_t i = 10;
cpuID = HAL_CPU_TOPOLOGY_GetCurrentCpuId();
if (cpuID == 0) {
HAL_DDR_ECC_Init(&eccInfo);
HAL_DDR_ECC_PoisonEnable(&eccInfo);/* Enable DDR ECC data poison, the physical
address for data poison will be saved in eccInfo.eccPoisonAddr */
while (i) {
DDR_ECC_GetInfo();
HAL_DelayMs(50);
i--;
if (i == 5) {
DDR_ECC_PoisonTriger(&eccInfo); /* Trigger DDR ECC error */
}
}
HAL_DDR_ECC_PoisonDisable(&eccInfo);
}
}
7.7 Примечания
1. DDR ECC использует пространство DDR [0x100000, 0x1F0000]. Если оно не отображено в MMU, добавьте отображение.
--- a/lib/CMSIS/Device/RK3568/Source/Templates/mmu_rk3568.c
+++ b/lib/CMSIS/Device/RK3568/Source/Templates/mmu_rk3568.c
@@ -41,6 +41,8 @@ void MMU_CreateTranslationTable(void)
// Define dram address space
...
+ MMU_TTSection(MMUTable, 0x100000, 0x100000 >> 20, Sect_Normal);
...
2. Физическое адресное пространство для data poison может быть не отображено в HAL. Добавьте отображение; пример ниже относится к адресу 0x13576c20.
--- a/lib/CMSIS/Device/RK3568/Source/Templates/mmu_rk3568.c
+++ b/lib/CMSIS/Device/RK3568/Source/Templates/mmu_rk3568.c
@@ -41,6 +41,8 @@ void MMU_CreateTranslationTable(void)
// Define dram address space
...
+ MMU_TTSection(MMUTable, 0x13500000, 0x100000 >> 20, Sect_Normal);
...
3. DED ECC вызывает исключение CPU data abort. По умолчанию HAL его не обрабатывает. Чтобы вывести сообщение об ошибке DDR ECC UE, внесите следующее изменение.
--- a/lib/CMSIS/Device/RK3568/Source/Templates/GCC/startup_rk3568.c
+++ b/lib/CMSIS/Device/RK3568/Source/Templates/GCC/startup_rk3568.c
@@ -237,6 +237,7 @@ void Reset_Handler(void)
*----------------------------------------------------------------------------*/
void Default_Handler(void)
{
+ DDR_ECC_GetInfo();
while(1);
}
