Как шить RTL8710 под Linux (Ubuntu 16.04)?

Astren

New member
Добрового времени суток,

Собственно, после некоторых развлечений с esp8266 попал в руки rtl8710. Вот, как на картинке:



по форм фактору такой же как esp, и вроде как это тоже полноценный dev-board. Esp шился через esptool, тут тоже пробовал, но как и было ожидаемо, не вышло. Пытался через openocd c интерфейсами "stlink-v2-1.cfg" и "cmsis-dap.cfg".. падает на попытке подключения к устройству (не распознаёт). Права проверил :) запускал под рутом и chmod 666 на /dev/ttyUSB0 тоже делал.
Дрова стоят на ch341 и модуль загружен, в dmesg устройство тоже есть, как и в lsusb, могу подключится через screen /dev/ttyUSB0 38400 -- пишет много ошибок ioctl[SIOCSIWFREQ] error (беспрерывно) но тем ни менее AT команды выполняет.
Через lsusb выглядит как:
Bus 001 Device 022: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter

т.е. не как cmis-dap устройство.

Качал сдк без нда (которая 3.5а), там есть гайд для линукса (той-же убунты), но 1) устройство не появляется как mbed в файловом менджере, 2) оно не распознаётся как cmis-dap и тот-же openocd падает на попытке обнаружить cmis-dap устройство. Пробовал указать openocd конкретный порт -- писать отказался.

И, собственно сабж -- как же его таки шить?
 

sharikov

Active member
Arduino для RTL8710.

Вам нужно раздобыть (купить/спаять/украсть/родить/другое) JTAG адаптер. Подключить его по SWD или JTAG (все используют SWD потому что проводов меньше). Шить openocd. Перед тем как шить обязательно слейте дамп фуллфлэш для восстановления если что-то пойдет не так.

Без внешних приблуд RTL не шьется.

SDK сейчас скачивают отсюда:
GitHub - pvvx/RTL00MP3: RTL00(RTL8710AF) Test MP3
 

pvvx

Активный участник сообщества
И, собственно сабж -- как же его таки шить?
Через имеющуюся на модуле прошивку "AT", предварительно сделать-скомпилировать специальную версию файла OTA, и залить в модуль по WiFi.
Специальная версия файла OTA может иметь загрузчик по UART. Примеры давно даны, часть на rtlDuino, но rtlDuino не адаптирован под линух.
Другой вариант: Спросить у продавца, продавшего вам данную плату. Поставить ему минус, за то, что она не работает как заявлено. Описать ситуацию в отзывах, чтобы другие не нарвались на эти проблемы при покупке подделки под ESP8266. Модуль то другой и требует другого ПО и/или распайки с поставляемым ПО. Можно затребовать и прошивку совместимую с проданной платой (поддерживающую работу по напаянной USB-UART микросхеме).
К примеру модули от производителя RAK (Разнообразные модули с RTL871x и RTL8195.) имеют такие функции.
Но можно остаться "Буратиной" на Поле чудес в стране Китай-али-экспресс... :)
 
Последнее редактирование:

Astren

New member
Вам нужно раздобыть (купить/спаять/украсть/родить/другое) JTAG адаптер.
Так и сделал -- собрал из RaspberryPi, теперь могу писать через openocd, читать, подключаться через телнет. Сделал дамп всей памяти, собрал с СДК бинарник, но вот незадача, куда ни пишу его, ощущение, что от этого ничего не меняется.
Так что следующий вопрос, на какой адрес писать через openocd, чтобы прошивка таки возымела действие?

sudo openocd -d1 -f rtl8710.cfg -c "init" -c "reset halt" -c "load_image ram_all.bin 0x10001000 bin" -c "shutdown"

пробовал разные адреса, всюду пишет, говорит:
325560 bytes written at address 0x10001000
downloaded 325560 bytes in 2.789898s (113.957 KiB/s)

В rtl8710.cfg поместил конфигурацию от ameba, добавив только пару строк в начало, для совместисости с raspberryPi:

source [find interface/raspberrypi2-native.cfg]
transport select swd

# === Further the default ameba sdk openocd configuration for the RTL8710 ===
set CHIPNAME rtl8195a
set CHIPSERIES ameba1

# Adapt based on what transport is active.
source [find target/swj-dp.tcl]

if { [info exists CHIPNAME] } {
set _CHIPNAME $CHIPNAME
} else {
error "CHIPNAME not set. Please do not include ameba1.cfg directly."
}

if { [info exists CHIPSERIES] } {
# Validate chip series is supported
if { $CHIPSERIES != "ameba1" } {
error "Unsupported chip series specified."
}
set _CHIPSERIES $CHIPSERIES
} else {
error "CHIPSERIES not set. Please do not include ameba1.cfg directly."
}

if { [info exists CPUTAPID] } {
# Allow user override
set _CPUTAPID $CPUTAPID
} else {
# Ameba1 use a Cortex M3 core.
if { $_CHIPSERIES == "ameba1" } {
if { [using_jtag] } {
set _CPUTAPID 0x4ba00477
} {
set _CPUTAPID 0x2ba01477
}
}
}

swj_newdap $_CHIPNAME cpu -irlen 4 -expected-id $_CPUTAPID

set _TARGETNAME $_CHIPNAME.cpu
target create $_TARGETNAME cortex_m -chain-position $_TARGETNAME


# Run with *real slow* clock by default since the
# boot rom could have been playing with the PLL, so
# we have no idea what clock the target is running at.
adapter_khz 1000

# delays on reset lines
adapter_nsrst_delay 200
if {[using_jtag]} {
jtag_ntrst_delay 200
}


# Ameba1 (Cortex M3 core) support SYSRESETREQ
if {![using_hla]} {
# if srst is not fitted use SYSRESETREQ to
# perform a soft reset
cortex_m reset_config sysresetreq
}

$_TARGETNAME configure -event reset-init {ameba1_init}

# Ameba1 SDRAM enable
proc ameba1_init { } {
# init System
mww 0x40000014 0x00000021
sleep 10
mww 0x40000304 0x1fc00002
sleep 10
mww 0x40000250 0x00000400
sleep 10
mww 0x40000340 0x00000000
sleep 10
mww 0x40000230 0x0000dcc4
sleep 10
mww 0x40000210 0x00011117
sleep 10
mww 0x40000210 0x00011157
sleep 10
mww 0x400002c0 0x00110011
sleep 10
mww 0x40000320 0xffffffff
sleep 10
# init SDRAM
mww 0x40000040 0x00fcc702
sleep 10
mdw 0x40000040
mww 0x40005224 0x00000001
sleep 10
mww 0x40005004 0x00000208
sleep 10
mww 0x40005008 0xffffd000
sleep 13
mww 0x40005020 0x00000022
sleep 13
mww 0x40005010 0x09006201
sleep 13
mww 0x40005014 0x00002611
sleep 13
mww 0x40005018 0x00068413
sleep 13
mww 0x4000501c 0x00000042
sleep 13
mww 0x4000500c 0x700 ;# set Idle
sleep 20
mww 0x40005000 0x1 ;# start init
sleep 100
mdw 0x40005000
mww 0x4000500c 0x600 ;# enter memory mode
sleep 30

mww 0x40005008 0x00000000 ;# 0xf00
;# mww 0x40005008 0x00000f00
sleep 3
mww 0x40000300 0x0006005e ;# 0x5e
;# mww 0x40000300 0x0000005e
sleep 3
}
# === end of the ameba configuration ===

После того как записывает новую прошивку, всё так же позволяет выполнять AT команды, а эту новую прошивку будто бы и не замечает.. Может кто подскажет, как запустить новую прошивку?
 

Astren

New member
Похоже, оишибку что была в том скрпте я нашёл -- там я не писал в флеш:
sudo openocd -d3 -f rtl8719.cfg -c "init" -c "reset halt" -c "flash write_image erase ram_all.bin 0x98000000" -c "shutdown"

Но тут незадача тоже, падает с ошибкой:
User : 2039 409 command.c:687 command_run_line(): invalid subcommand "write_image erase ram_all.bin 0x98000000"

По телнету ответ на flash bank list, пустой. но настроить их не даёт, говоря, что flash bank command must be used before 'init'.
 

pvvx

Активный участник сообщества
но вот незадача, куда ни пишу его, ощущение, что от этого ничего не меняется.
1) что и куда пишите?
2) чем пишите? (Что OpenOCD уже ясно)
3) что записываете в 9-й сектор Flash? Может там стоит запуск OTA по состоянию пина, а вы пишите другую область (не OTA)?
 

pvvx

Активный участник сообщества
Похоже, оишибку что была в том скрпте я нашёл -- там я не писал в флеш:
sudo openocd -d3 -f rtl8719.cfg -c "init" -c "reset halt" -c "flash write_image erase ram_all.bin 0x98000000" -c "shutdown"

Но тут незадача тоже, падает с ошибкой:
User : 2039 409 command.c:687 command_run_line(): invalid subcommand "write_image erase ram_all.bin 0x98000000"

По телнету ответ на flash bank list, пустой. но настроить их не даёт, говоря, что flash bank command must be used before 'init'.
Вы пока говорите сами с собой - никто не сможет вам ответить пока не уточните вопросы выше.
 

Astren

New member
1) что и куда пишите?
2) чем пишите? (Что OpenOCD уже ясно)
3) что записываете в 9-й сектор Flash? Может там стоит запуск OTA по состоянию пина, а вы пишите другую область (не OTA)?
1)
Что: пока что скомпилировал прошивку, которая должна мне напечатать "Hello world".
Куда: Куда писать новую прошивку я не знаю. Хочу чтобы у меня вместо интерфейса AT команд при запуске просто напечаталось Hello world. Ну, следуя логике пишу на флеш.

2) По совету товарища выше "собрал" swd programmer из raspberry pi, у него уже есть gpio пины и мне понадобилось только три female-female кабеля для подключения чипа на прямую к PI. Не совсем понял Ваш вопрос, возможно мне ещё что-то нужно кроме openocd и swd programmer'a?

3) Сектор флэш, как я уже сказал выше, я выбираю наугад, т.к. совсем не знаю куда надо записать, чтобы заработало.
 

Astren

New member
Союственно, я собрал и прошил, оно заработало, использовал код вот этого деятеля:
rebane / rtl8710 / source / — Bitbucket
Минимально его изменив под Pi, т.к. из окробки он не работал. Смотря на него и на то как предлаегеат флащать СДК, складывается ощущение, что они все это делают кусками -- пилят бинарник на блоки и пишут уже по очереди их. Я пытался всё время просто через flash_write у openocd, и оно не работало. Может подскажете, в чём сакральный смысл распила на блоки, да и в целом посоветуете направление, где об этом всём в целом можно почитать (о прошивке микроконроллеров)?
 

pvvx

Активный участник сообщества
1)
Что: пока что скомпилировал прошивку, которая должна мне напечатать "Hello world".
Куда: Куда писать новую прошивку я не знаю. Хочу чтобы у меня вместо интерфейса AT команд при запуске просто напечаталось Hello world. Ну, следуя логике пишу на флеш.
По вашему логу вы "пишите" в RAM: "load_image ram_all.bin 0x10001000 bin"

2) По совету товарища выше "собрал" swd programmer из raspberry pi, у него уже есть gpio пины и мне понадобилось только три female-female кабеля для подключения чипа на прямую к PI. Не совсем понял Ваш вопрос, возможно мне ещё что-то нужно кроме openocd и swd programmer'a?
Пока не видел SWD программатора "из raspberry pi". Может существует и такой зверь... Типов программаторов JTAG/SWD много.
Вы его проверили - он работает?
3) Сектор флэш, как я уже сказал выше, я выбираю наугад, т.к. совсем не знаю куда надо записать, чтобы заработало.
Во первых, ещё раз - чем записать?
Пока выяснили:
ПО - OpenOCD.
Программатор: - пофиг какой, но должен работать.
Сама программа программирования Flash в чипе RTL8710: - Уже существует более трех вариантов:
a) Заливка специального кода программатора в RAM чипа и исполнение её с передачей данных ей по SWD (обычно в буфер RAM).
b) Программирование Flash через регистры по SWD
c) Программирование через SPIC (отображающий Flash в адресное пространство), предварительно проинициализировав контролер SPIC в чипе по SWD
Вы говорите, что пытаетесь запустить по варианту "a)", код от rebane... Но у него нет скрипта что и куда писать.

Что и куда шить в Flash: RTL871x Flash Memory Map
 
Последнее редактирование:

sharikov

Active member
Союственно, я собрал и прошил, оно заработало, использовал код вот этого деятеля:
rebane / rtl8710 / source / — Bitbucket
Минимально его изменив под Pi, т.к. из окробки он не работал. Смотря на него и на то как предлаегеат флащать СДК, складывается ощущение, что они все это делают кусками -- пилят бинарник на блоки и пишут уже по очереди их. Я пытался всё время просто через flash_write у openocd, и оно не работало. Может подскажете, в чём сакральный смысл распила на блоки, да и в целом посоветуете направление, где об этом всём в целом можно почитать (о прошивке микроконроллеров)?
RTL сейчас прошивают используя код
f28 / rtl8710_openocd — Bitbucket
В коде rebane есть ошибки.
Смысл распила: шьют из рам во флэш. Вся прошивка целиком в рам не помещается. Заливают в рам кусок и шьют и так далее.

Шить через flash_write можно те чипы поддержка которых вкомпилировна в openocd. Про rtl openocd естественно ничего не знает поэтому используется скрипт.
О прошивке микроконтроллеров читайте:
https://sourceforge.net/p/openocd/code/ci/master/tree/contrib/loaders/flash/
https://sourceforge.net/p/openocd/code/ci/master/tree/src/flash/nor/
 

pvvx

Активный участник сообщества
Шить через flash_write можно те чипы поддержка которых вкомпилировна в openocd.
А ваша версия "вкомпилировна в openocd" ?
Там "по стандарту" в CMSIS-DAP табличка адресов функций и адрес бреак, а не отслеживание состояний байтов в RAM. Подготовили параметры в регистрах CPU, поставили точку останова и запустили...
Пример DAPLink/flash_blob.c at nucleo_webusb · devanlai/DAPLink · GitHub

USB DFU
The firmware has an additional USB Device Firmware Upgrade interface that can be used to flash the target microcontroller instead of the mass-storage drag'n'drop interface.

WebUSB
The firmware reports descriptors for WebUSB support, allowing whitelisted websites to access certain USB interfaces. Currently, the only interface accessible is the new USB DFU interface, which can be used to reprogram the target directly from the browser.

In the future, CMSIS-DAP commands could be proxied through another USB interface to allow direct SWD debug access from the browser.


ист: Home · devanlai/DAPLink Wiki · GitHub

По этому указанный вами код программатора никому не нужен :p
C-интегрируйте в DAPLink... Ameba тоже сделала не по стандарту, теперь мучаются - Arduino/misc/dap_firmware at master · Ameba8195/Arduino · GitHub Но их ход понятен - чтобы вы купили только их отладочную плату :)
 
Последнее редактирование:

sharikov

Active member
Информация тем кто будет собирать openocd с git.

Свежий из git с флэшером Rebane не работает. Разработчики решили что поддержка стандартных команд tcl никому не понадобится и отключили их при конфигурировании jimtcl.
Чтобы заработало нужно перед пропатчить конфиг
патч
openocd.zylin Code Review - openocd.git/commitdiff
мэйллист
OpenOCD - Open On-Chip Debugger / Mailing Lists
 

A.V

New member
Буквально только что поправил "под себя" скрипты RtlDuino - через JLinkRAM шьется нормально. Мож кому пригодится (как идея)

Требования:
- JLink (перешитый STLink V2) с прописанными правилами в udev
- Установленные утилиты от Segger
- Настроенный почти по инструкции RtlDuino (пришлось сместить пути, чтобы папка rtl87xx оказалась там, где рекомендуется в мануале - git clone даёт пару лишних)
- (недо-)патченный rtl87xx/platform.txt (править вхождения jlink_upload.cmd на jlink_upload.sh)
- переписанный rtl87xx/jlink_upload.sh
выложил в gist: rtlDuino (RTL87xx dev) Arduino@linux upload (Note: only JLinkRAM tested) · GitHub
 

pvvx

Активный участник сообщества
В rtlDuino добавлены и cmsis-dap c загрузкой в SDRAM для RTL серии "A" с моим boot. Но ещё не опубликованы...
Снимок48.gif
Не доделал загрузку OPENOCD в Arduino, т.к. лень - у меня она стоит и установка скриптами не требуется :) Да и вообще rtlDuino тыкаю в самую последнюю очередь, когда уже других активных тем нет. :)

Примеры можно взять из RTL00_WEB/flasher.mk at master · pvvx/RTL00_WEB · GitHub
Серия RTL "B" Flash шьется и загружается/запускается код в SRAM через UART на 1.5Мбод скриптом Питона (выложено в соответствующей теме).
 
Последнее редактирование:
Сверху Снизу