Начало ремонта положено в статье "Bos-mini A8 невероятно тормозит", где была рассмотрена причина медленной работы магнитолы. Проблема как и ожидалось кроется в памяти устройства и её мне необходимо заменить. Однако чип хоть и определяется нормально, но читается крайне медленно. В итоге "слив" данных занял немногим более 11 часов. Откровенно говоря я думал будет хуже.
Полученный дамп я решил хотя бы проверить с помощью R-Linux на корректность. Всё это в любом случае условно, но лучше чем ничего. Должен заметить что и сама программа для работы с EMMC вполне нормально разобрала все разделы и показала заголовки, никаких ошибок в файловой таблице вроде как не нашла. Хорошо, но я решил ещё немного перестраховаться, именно поэтому решил дополнительно "скормить" дамп программе R-Linux.
Можно обратить внимание на нормальную структуру разделов. Затем я решил открыть дополнительно пользовательский раздел, как найболее часто подверженный разрушению и ошибкам.
Здесь тоже всё в порядке, видны все файлы и папки, так что структура думаю в порядке и дамп слился условно корректно. Теперь дело осталось за прошивкой нового чипа и установкой его на плату магнитолы. С этого места для меня начинаются непонятки.
Настоятельно прошу помощи у знатоков Линукс в совершенстве или хотя бы специалиста по отладке загрузчиков и заблокированных в том числе. Сообщите в комментарии, что вы думаете о проблеме, которую я озвучу далее по тексту!!!
Порылся я значит по сусекам и оказалось, что микросхемы памяти необходимого объема в 64Гб у меня в наличии нет, есть лишь 128Гб чип от Sandisk. Меня это не остановило и я решил использовать его. Предварительно убедившись что процессор Unisoc Tiger T610 (UMS512) (точнее SOC) должен и может с ним корректно работать, я без всякой опаски запрограммировал EMMC и запаял её на положенное место.
После чего подал питание на плату и убедился что магнитола не запускается. Проверки питания и прочего не нашли никаких проблем и я решил отыскать точки подключения отладчика UART. И вот теперь самое интересное, для меня информация полученная в консоли отладчика вызвала больше вопросов, чем я ожидал получить ответов.
######Старт логирования######
UUUUUERS
ROM
RBS
SHARKL5pro ddr init...
vref_adj_p0x00000050 0x00000050
ddr target freq:0x00000400 MHz
ddr target freq:0x00000400 MHz
bist test is pass!!!
ddr init end pass!!!
chip id : 0x6B4C3550 0x53686172 0x00000003
pmic id : 0x0000B000 0x00002730
option 1 : 0x00000000
option 2 : 0x00000001
option 3 : 0x00000000
option 4 : 0x00000000
option 5 : 0x00000001
option 6 : 0x00000001
NOTICE: BL31: v1.4-f529dd39(debug)
NOTICE: BL31: Built : 16:57:51, Oct 23 2020
U-Boot 2015.07-00032-ge58e1746d9 (Jul 03 2024 - 22:11:14 +0800)SHARKL5PRO
U-Boot code: 9F000000 -> 9F0F7F88 BSS: -> 9F6B8000
I2C: i2c0, sprd_i2c_init() freq=100000
ready
dram_init(): dram cs0 size 80000000
dram cs1 size 7ffff000
monitor len: 006B8000
ramsize: 20000000
TLB table from 9fff0000 to 9fff1000
Top of RAM usable for U-Boot at: 9fff0000
Reserving 7176k for malloc() at: 9f8ee000
Reserving 72 Bytes for Board Info at: 9f8edfb8
Reserving 320 Bytes for Global Data at: 9f8ede78
Reserving 6240 Bytes for FDT at: 9f8ec618
New Stack Pointer is: 9f8ec610
RAM Configuration:
Bank #0: 80000000 512 MiB
Bank #1: 180000000 512 MiB
relocation Offset is: 00000000
log base 0000000092400000
monitor flash len: 000EAB88
WARNING in /home/autobuild/develop/os_auto_build/a007_10/bsp/bootloader/u-boot15/drivers/misc/adi.c line 324
pmic_misc_init(): ue1 and/or value2 are
memory addresses (*)
setex_FLAG:0x70100000
2 are
memory addresses (*)
setex_FLAG:0x0
pmic_efuse_wait_clear(): name [*]value1 <op> [*]value2
- set environment variable 'name' to the result of the evaluated
expression specified by <op>. <op> can be &, |, ^, +, -, *, /, %
size argument is only meaningful if value1 and/or value2 are
memory addresses (*)
setex_FLAG:0x4
pmic_efuse_wait_clear(): name [*]value1 <op> [*]value2
- set environment variable 'name' to the result of the evaluated
expression specified by <op>. <op> can be &, |, ^, +, -, *, /, %
size argument is only meaningful if value1 and/or value2 are
memory addresses (*)
setex_FLAG:0x14
sprd_pmic_efuse_read(): specified by <op>. <op> can be &, |, ^, +, -, *, /, %
size argument is only meaningful if value1 and/or value2 are
memory addresses (*)
setex_FLAG:0xe
pmic_efuse_wait_clear(): name [*]value1 <op> [*]value2
- set environment variable 'name' to the result of the evaluated
expression specified by <op>. <op> can be &, |, ^, +, -, *, /, %
size argument is only meaningful if value1 and/or value2 are
memory addresses (*)
setex_FLAG:0x4
pmic_efuse_wait_clear(): name [*]value1 <op> [*]value2
- set environment variable 'name' to the result of the evaluated
expression specified by <op>. <op> can be &, |, ^, +, -, *, /, %
size argument is only meaningful if value1 and/or value2 are
memory addresses (*)
setex_FLAG:0x14
sprd_pmic_efuse_read(): specified by <op>. <op> can be &, |, ^, +, -, *, /, %
size argument is only meaningful if value1 and/or value2 are
memory addresses (*)
setex_FLAG:0xe
sprd_get_chipid(): chip id = 0x0, VID = 0x3
regu_ldo 000000009f0def70 (vddrf1v25) 1245 = 900 +345mv (trim=23 step=15000uv)
pmic_efuse_wait_clear(): name [*]value1 <op> [*]value2
- set environment variable 'name' to the result of the evaluated
expression specified by <op>. <op> can be &, |, ^, +, -, *, /, %
size argument is only meaningful if value1 and/or value2 are
memory addresses (*)
setex_FLAG:0x4
pmic_efuse_wait_clear(): name [*]value1 <op> [*]value2
- set environment variable 'name' to the result of the evaluated
expression specified by <op>. <op> can be &, |, ^, +, -, *, /, %
size argument is only meaningful if value1 and/or value2 are
memory addresses (*)
setex_FLAG:0x14
sprd_pmic_efuse_read(): specified by <op>. <op> can be &, |, ^, +, -, *, /, %
size argument is only meaningful if value1 and/or value2 are
memory addresses (*)
setex_FLAG:0x13
sprd_pmic_efuse_read_bits(): be &, |, ^, +, -, *, /, %
size argument is only meaningful if value1 and/or value2 are
memory addresses (*)
setex_FLAG:0x130
sprd_get_adc_small_scale_cal(): ror parsing config file
sprd_get_adc_small_scale_cal(): d to get and boot from syslinux filessprd_get_adc_small_scale_cal(): om syslinux filessprd_small_scale_adc_efuse_get(): p] <interface> <dev[:part]> <ext2|fat|any> [addr] [filename]
- load and parse syslinux menu file 'filename' from ext2, fat
or any filesystem on 'dev' on 'interface' to address 'addr'pmic_adc_Init(): ddr] [filename]
- load and parse syslinux menu file 'filename' from ext2, fat
or any filesystem on 'dev' on 'interface' to address 'addr'pmic_efuse_wait_clear(): name [*]value1 <op> [*]value2
- set environment variable 'name' to the result of the evaluated
expression specified by <op>. <op> can be &, |, ^, +, -, *, /, %
size argument is only meaningful if value1 and/or value2 are
memory addresses (*)
setex_FLAG:0x4
pmic_efuse_wait_clear(): name [*]value1 <op> [*]value2
- set environment variable 'name' to the result of the evaluated
expression specified by <op>. <op> can be &, |, ^, +, -, *, /, %
size argument is only meaningful if value1 and/or value2 are
memory addresses (*)
setex_FLAG:0x14
sprd_pmic_efuse_read(): specified by <op>. <op> can be &, |, ^, +, -, *, /, %
size argument is only meaningful if value1 and/or value2 are
memory addresses (*)
setex_FLAG:0x12
sprd_pmic_efuse_read_bits(): be &, |, ^, +, -, *, /, %
size argument is only meaningful if value1 and/or value2 are
memory addresses (*)
setex_FLAG:0x120
sprd_get_adc_bat_cal(): ror parsing config file
sprd_bat_scale_adc_efuse_get(): rse syslinux menu file 'filename' from ext2, fat
or any filesystem on 'dev' on 'interface' to address 'addr'pmic_adc_Init(): , fat
or any filesystem on 'dev' on 'interface' to address 'addr'[LED] init led]Now running in RAM - U-Boot at: 9f000000
using memory 0x9f8ee000-0x9fff0000 for malloc()
board_mmc_initialize(): @в–’jв–’в–’Rв–’sprd_host_init(): mmc ldo_core:vddemmccore, ldo_io:vddgen0
sprd_sdhci_init: host version: 4
sprd_host_init(): sprd_host_init return 0
mmc_set_bus_width(): mmc_set_bus_width width=1
sdhci_send_command: ret = -1, interrupt status: 0x18000
sdhci_send_command interrupt status: 0x18001, CMD8, delay: 0x0
sdhci_send_command: ret = -1, interrupt status: 0x18000
sdhci_send_command interrupt status: 0x18001, CMD55, delay: 0x0
mmc_startup(): entry
csd register(128 bit): d00f0032 8f5903ff ffffffef 8a404000
mmc_startup(): mmc->version =0x40000000
mmc_startup(): mmc_startup mmc->version=0x40040000
mmc_send_ext_csd(): mmc_send_ext_csd=0
mmc_startup(): mmc_startup mmc->version2=0x40040000
mmc_startup(): mmc->part_num = 0, erase_grp_size = 0x800
mmc_startup(): RST_n signal(0x1) has already be permanently *mmc_set_capacity(): capacity -user: 0x1d1ec00000, -boot: 0x400000, -rpmb: 0x1000000
mmc_send_ext_csd(): mmc_send_ext_csd=0
mmc_send_ext_csd(): mmc_send_ext_csd=0
mmc_change_freq(): в–’JH
в–’в–’в–’,в–’в–’dв–’Jв–’
J+mmc_startup():
J+mmc_set_bus_width(): mmc_set_bus_width width=8
mmc_send_ext_csd(): mmc_send_ext_csd=0
mmc_startup():
*в–’,4в–’J,Xв–’
Jh
D
в–’в–’@в–’в–’Iв–’Rв–’fdt_chosen_bootargs_replace(): fdt_chosen_bootargs_replace start!Error!fdt_chosen_bootargs_replace(): fdt_chosen_bootargs_replace: FDT_ERR_BADMAGIC
Error!(): set loglevel=7 failed!
/home/autobuild/develop/os_auto_build/a007_10/bsp/bootloader/u-boot15/common/dlmalloc.c:1666: do_check_chunk: Assertion `!chunk_is_mmapped(p)' failed.
resetting ...
######Конец логирования######
Я решил текстом будет визуальней, к тому же можно скопировать при желании.
Судя по логу, выходит что процессор читает данные с EMMC и загружает U-Boot, а далее начинается иницализация оборудования. Всё вроде бы даже неплохо, но в какой-то момент процесс обрывает ошибка "FDT_ERR_BADMAGIC" потом ещё какая-то и процессор уходит в перезагрузку. Итак бутлуп идёт по кольцу до бесконечности, хотя может я маловато ждал, вдруг ему надоест и он плюнет на ошибки и загрузит ПО магнитолы!?
Эта ситуация породила во мне вопрос: может быть загрузчик привязан к конкретному чипу или он защищён с помощью ключей используя специальную зону памяти RPMB?
Справедливости ради надо отметить, что программа, с которой я вполне неплохо справляюсь с программированием EMMC на некоторых аппаратах без защиты и блокировок, не может работать с зоной RPMB и даже не может считать её статус, т.е. выяснить используется такой механизм или нет мне попросту нечем, да и никогда не занимался такими вопросами.
В итоге вопрос ремонта данного аппарата у меня повис и куда двигаться дальше с ним пока не знаю. Возможно я попробую ещё на самсунговском чипе ёмкостью 64Гб, которые поступят через неделю, но это уже будет видимо в следующей статье или по результатам поиска информации о причине с которой я столкнулся.
В любом случае дополнение следует...