• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Обсуждение MT7688AN HLK-7688A

pvvx

Активный участник сообщества
В menuconfig вы сами выбираете те пакеты, которые хотите видеть на прошивке.
Осталось разобраться что лишнее и выкинуть.
Что такое "для конкретного железа" не ясно, например я собрал из медиатека флешки и рам-а (ну и smd резисторы конденсаторы и стекляшка) свой контроллер, это конкретное железо или нет?
Это конкретное железо - "медиатека", "флешки", "рам-а" и т.д.
Нет никакого смысла иметь if-ы и прочие ветки для других типов. Всё равно КАЖДЫЙ код любого пакета будет переписан (от 10%) и ненужны никакие обновления от Ардуинщиков.
На исправление ошибок и обновление всё равно приедет специальный человек с необходимым оборудованием или сменой. Цена блока обычно составляет менее 0.001% от всего оборудования :)
 

pvvx

Активный участник сообщества
И чтобы блоки менять не задумываясь, нужно чтобы он стоил копейки в мелкосерийном производстве. Большие монстры дохнут как мухи – это из опыта… После четверти века производства нашего оборудования, когда парк перевалил за тысячи, стали очень часто дохнуть дорогие “фирменные” контроллеры… Наверно туда, в большие корпорации, добрались Ардуинщики. Дохнут в них встроенные модули с CPU – может flash протирается или ещё чего…
 

pvvx

Активный участник сообщества
Самые примитивные блоки управления (упрощенная версия установки), созданные ещё в начале 1990-х на PIC16, так и работают 24/7 на заводе... В 2012 вроде, потребовалось сменить основную циклограмму (за годы накопилось нововведений по физическому процессу)… Так и работают, без остановки, а с современной комплектухой так не выходит – что нибудь да вылетит за годы...
 

sharikov

Active member
init_baudrate() - не инит, а использует фиксед. И зачем это?
Состояние u-boot под mt7688 таково что вопросы "зачем..." неуместны. Там ужас-ужас, хорошо что хоть как-то запускается. Я пытался понять как оно инициализируется чтобы сделать версию загружаемую в ram через jtag. Фиг там разберешься в куче ifdef-ов.

Поддержку потихоньку запиливают в mainline u-boot
Mainline U-Boot Support for MT7688 and LinkIt Smart 7688 available
 

pvvx

Активный участник сообщества
Состояние u-boot под mt7688 таково что вопросы "зачем..." неуместны. Там ужас-ужас, хорошо что хоть как-то запускается. Я пытался понять как оно инициализируется чтобы сделать версию загружаемую в ram через jtag. Фиг там разберешься в куче ifdef-ов.
Я только вчера туда влез. Там хотели сделать универсальный boot - писать его в nvram, spi, mmc, usb, ... и от этого потеряли загрузку environment. При старте уже нет места в SRAM, а остальное не проинито. Выкинули environment, выкинули универсальность носителя и стали дописывать кусками -> теперь при разных def установках разные error и ничего не стыкуется.
Может этот код пройти авто предкомпиляцией и выкинуть все ifdef, т.к. остальные ветки всё равно "засохли"?
 

sharikov

Active member
Может этот код пройти авто предкомпиляцией и выкинуть все ifdef, т.к. остальные ветки всё равно "засохли"?
Я считаю что ковырять стоит только mainline u-boot. Проприетарный подшаманить чтобы как нибудь загружался и хорош. "доктор сказал в морг - значит в морг"
 

Алексей.

Active member
Тормозит загрузка и работа, а так более ничего
Начальный загрузчик работает 4-5 секунд, следующие 20 секунд просыпается ядро и запускаются службы.
В ядре уж и меняем скорость для консоли если нужно.
Оборудование выключается только в аварийных случаях, сократить время загрузки на 5 секунд, чтоб следующий раз через 2-3 месяца (а то и через полгода) быстро стартовали, а зачем?
Другой MCU использует uart для общения с консолью медиатека? Для чего консоль ему нужна?
если модуль "сочленен" с другим MCU
Для контроля флешки (а вдруг там что то подменили) другой mcu подключен к ней же, он зажимает ресет на медиатеке и читает флешку сам :) Считает хеши для разделов, не включая оверлей, он почему-то меняется с каждым включением.
 

pvvx

Активный участник сообщества
Начальный загрузчик работает 4-5 секунд, следующие 20 секунд просыпается ядро и запускаются службы.
Ну вот, а в это время все другие контроллеры уже проснулись и работают, а ваш модуль, выполняющий пусть логгирование ещё грузится :)
15..17 сек - предел.
Оборудование выключается только в аварийных случаях, сократить время загрузки на 5 секунд, чтоб следующий раз через 2-3 месяца (а то и через полгода) быстро стартовали, а зачем?
Оборудование выключается и выключается автоматически - резервирование и профил. работы. Где не пашут 24/7 - там всё вырубают каждый день.
Вы прикажите всем работникам
пока оборудование замигает лампочками при включении?

Другой MCU использует uart для общения с консолью медиатека? Для чего консоль ему нужна?
Пусть там будет RS-485 Modbus :)
а вдруг там что то подменили
Защиты практикуются только у школьников и Ардуинщиков.
 

pvvx

Активный участник сообщества
Считает хеши для разделов, не включая оверлей, он почему-то меняется с каждым включением.
Там меняются заголовки разделов - это такая специальная фича от Ардуиншиков в Linux дровах, чтобы протереть дырку в flash.
На ro разделах - аналогично, на всех новых носителях. Куда-то надо сохранять статистику и время обращения :)
По тому и говорю - надо каждый кусок кода редактировать...
 

Алексей.

Active member
Где не пашут 24/7 - там всё вырубают каждый день.
Не наш случай ;) При отключении основного электропитания оборудование должно работать на резервном минимум 4 часа, это обязательное условие.
Представите, у вас производство, отключили электропитание - производство остановилось, теряем деньги. Если поставщик электроэнергии постоянно отключается, используем не одного а нескольких. Иначе никак.
 

pvvx

Активный участник сообщества
Не наш случай ;) При отключении основного электропитания оборудование должно работать на резервном минимум 4 часа, это обязательное условие.
Представите, у вас производство, отключили электропитание - производство остановилось, теряем деньги. Если поставщик электроэнергии постоянно отключается, используем не одного а нескольких. Иначе никак.
Вся установка жрет от десяток до сотен кВт и часто стоит на производстве, где потребление конвеера или печи, или других мех.устройств ещё больше. Чем их питать? Местную АЭС поставить?
Часто простой получается когда пришли с обеда и врубили рубильник и ждут "загрузки"...
На пример на стекольном заводе - там за секунду одна линия штампует 10 стаканов... А если вырубилось эл-во - приезжают пожарные машины - тушить расплавившуюся печь, которая без обдува... и им уже не до нашей части...
 

pvvx

Активный участник сообщества
Бесперебойники ставятся только на электронную часть. Но это бывает очень редко и по спец заказу. Смысла в них нет. Только один - передавать в головной корпус, что система остановлена :) (что и так можно догадаться по отсутствию связи)
 

pvvx

Активный участник сообщества
Для морского и прочих взрыв/беда окружающая среда тоже иногда ставят бесперебойники. Типа чтобы сирена от датчиков сработала :) Но на такие заказы бюджет большой и тендер. Туда всегда требуют что-то типа Siemens и вообще всё пофиг – лиш-бы сдать, а потом трава не расти, т.к. см. “подрядчик”.
 

pvvx

Активный участник сообщества
@sharikov - mainline u-boot-ram.bin (338КБ):
Код:
U-Boot 2019.04-rc2 (Sep 18 2019 - 14:39:24 +0300)

CPU:   MT7628 Rev 1.2 - Boot from XTAL (3-Byte SPI Addr)
Model: LinkIt-Smart-7688
DRAM:  128 MiB
Loading Environment from SPI Flash... SF: Detected w25q256 with page size 256 Bytes, erase size 4 KiB, total 32 MiB
*** Warning - bad CRC, using default environment

Net:
Warning: eth@10110000 (eth0) using random MAC address - ca:d0:ec:57:1e:02
eth0: eth@10110000
=> ?
?       - alias for 'help'
base    - print or set address offset
bdinfo  - print Board Info structure
boot    - boot default, i.e., run 'bootcmd'
bootd   - boot default, i.e., run 'bootcmd'
bootm   - boot application image from memory
bootp   - boot image via network using BOOTP/TFTP protocol
cmp     - memory compare
coninfo - print console devices and information
cp      - memory copy
crc32   - checksum calculation
dhcp    - boot image via network using DHCP/TFTP protocol
dm      - Driver model low level access
echo    - echo args to console
editenv - edit environment variable
env     - environment handling commands
exit    - exit script
false   - do nothing, unsuccessfully
fdt     - flattened device tree utility commands
go      - start application at address 'addr'
gpio    - query and control gpio pins
help    - print command description/usage
iminfo  - print header information for application image
itest   - return true/false on integer compare
led     - manage LEDs
license - print GPL license text
loadb   - load binary file over serial line (kermit mode)
loadx   - load binary file over serial line (xmodem mode)
loady   - load binary file over serial line (ymodem mode)
loop    - infinite loop on address range
md      - memory display
mdio    - MDIO utility commands
meminfo - display memory information
mii     - MII utility commands
mm      - memory modify (auto-incrementing address)
mw      - memory write (fill)
nfs     - boot image via network using NFS protocol
nm      - memory modify (constant address)
ping    - send ICMP ECHO_REQUEST to network host
printenv- print environment variables
reset   - Perform RESET of the CPU
run     - run commands in an environment variable
saveenv - save environment variables to persistent storage
setenv  - set environment variables
setexpr - set environment variable as the result of eval expression
sf      - SPI flash sub-system
showvar - print local hushshell variables
sleep   - delay execution for some time
source  - run script from memory
sspi    - SPI utility command
test    - minimal test like /bin/sh
tftpboot- boot image via network using TFTP protocol
time    - run commands and summarize execution time
true    - do nothing, successfully
version - print monitor, compiler and linker version
=> printenv
baudrate=115200
bootdelay=2
fdtcontroladdr=87e9a10c
stderr=uart2@e00
stdin=uart2@e00
stdout=uart2@e00

Environment size: 103/16380 bytes
=> bdinfo
boot_params = 0x87ea1948
memstart    = 0x80000000
memsize     = 0x08000000
flashstart  = 0x00000000
flashsize   = 0x00000000
flashoffset = 0x00000000
ethaddr     = (not set)
IP addr     = <NULL>
baudrate    = 115200 bps
relocaddr   = 0x87fa0000
reloc off   = 0x07f90000
Половина команд не работает, половина виснет...
Зато есть команда "license" - print GPL license text. Выводит полную простыню лицензии.
reset тоже не работает - HLK виснет до передергивания кнопкой reset и подачи + на CS1.
 

pvvx

Активный участник сообщества
Короче, с HLK-7688A пока так:

Работает uboot переписанный от Linkit, tftp заработал, проверку загрузки с USB осуществить на даче не могу, но есть исходники варианта с usb от Onion Omega которые проверял (как-то работают). Так-же есть старенькие уже проверенные рабочие uboot для mips и если что, то переписать их для MT дело недели. На том пока оставил.

Далее надо разобраться с самой текущей версией OpenWRT – тут для сборки, коррекции, тестов и проверок минимальной системы требуется не менее полугода на одного человека и нескольких тестировщиков в реальной рабочей обстановке... Чтобы приступать к такому необходимо вдоль и поперек оценить возможности уже конкретно самого модуля для решения необходимых задач.

Думаю, что за полгода ничего нового в данной весовой категории на рынок не выйдет. Но для большинства задач производительности MT7688A уже не хватает, т.к. для ускорения разработки желательна поддержка языка высокого уровня, типа Питона. А данный модуль на нем тормозит и есть ограничения в объеме SPI-Flash... Т.е. задачи должны ограничиваться реализацией на СИ и мастерством-знаниями программиста.
 

pvvx

Активный участник сообщества
Для меня было большим разочарованием SPI
Количество битов для приема/передачи в half-duplex 0-256 и для full-duplex 0-128
Т.е. за транзакцию больше 32 или 16 байт не передать.
Я то думал, dma настрою и буду килобайтами обмениваться, а тут облом.
[inline]spi-config -d /dev/spidev0.1 -s 100000 | echo 0123456789abcdef | spi-pipe -d /dev/spidev0.1 -b 16[/inline]:
upload_2019-9-19_19-6-0.png

[inline]spi-config -d /dev/spidev0.1 -s 00000 | echo 0123456789abcdef0123456789abcdef | spi-pipe -d /dev/spidev0.1 -b 17[/inline]:
Код:
[ 1442.073615] ------------[ cut here ]------------
[ 1442.078342] WARNING: CPU: 0 PID: 1605 at drivers/spi/spi-mt7621.c:297 mt7621_spi_transfer_one_message+0x12c/0x600
[ 1442.088841] Modules linked in: pppoe ppp_async pppox ppp_generic nf_conntrack_ipv6 mt76x2e mt76x2_common mt76x02_lib mt7603e mt76 mac80211 iptable_nat ipt_REJECT ipt_MASQUERADE cfg80211 xt_time xt_tcpudp xt_state xt_nat xt_multiport xt_mark xt_mac xt_limit xt_conntrack xt_comment xt_TCPMSS xt_REDIRECT xt_LOG xt_FLOWOFFLOAD usbhid ums_usbat ums_sddr55 ums_sddr09 ums_karma ums_jumpshot ums_isd200 ums_freecom ums_datafab ums_cypress ums_alauda spidev slhc pwm_mediatek_ramips nf_reject_ipv4 nf_nat_redirect nf_nat_masquerade_ipv4 nf_conntrack_ipv4 nf_nat_ipv4 nf_nat nf_log_ipv4 nf_flow_table_hw nf_flow_table nf_defrag_ipv6 nf_defrag_ipv4 nf_conntrack_rtcache nf_conntrack iptable_mangle iptable_filter ip_tables hid_generic crc_ccitt compat hid evdev input_core i2c_mt7621 i2c_smbus i2c_dev i2c_core ip6t_REJECT
[ 1442.161248]  nf_reject_ipv6 nf_log_ipv6 nf_log_common ip6table_mangle ip6table_filter ip6_tables x_tables mmc_block usb_storage mtk_sd mmc_core leds_gpio uhci_hcd ohci_platform ohci_hcd ehci_platform sd_mod scsi_mod ehci_hcd gpio_button_hotplug ext4 jbd2 mbcache usbcore nls_base usb_common crc16 crc32c_generic crypto_hash
[ 1442.190276] CPU: 0 PID: 1605 Comm: spi-pipe Tainted: G        W       4.14.131 #0
[ 1442.197876] Stack : 80483660 803792a4 00000000 00000000 803de6c4 87323c2c 87372edc 8042d8e7
[ 1442.206377]         803da9e8 00000645 80483660 00000129 02625a00 00000001 87323be0 1301f2dd
[ 1442.214881]         00000000 00000000 80480000 00000000 000001b6 00000000 312e3420 33312e34
[ 1442.223383]         6d6d6f63 00000020 00000040 63206e6f 80000000 00000000 802131fc 803fa080
[ 1442.231887]         00000009 00000129 02625a00 78a9b000 00000000 801dc8b0 00000000 80480000
[ 1442.240376]         ...
[ 1442.242869] Call Trace:
[ 1442.245376] [<8000e514>] show_stack+0x74/0x104
[ 1442.249908] [<80024f50>] __warn+0x110/0x118
[ 1442.254173] [<80024fec>] warn_slowpath_null+0x1c/0x30
[ 1442.259307] [<802131fc>] mt7621_spi_transfer_one_message+0x12c/0x600
[ 1442.265767] [<802113b0>] __spi_pump_messages+0x2c4/0x510
[ 1442.271158] [<80212aa8>] __spi_sync+0x15c/0x1a0
[ 1442.275771] [<80212b1c>] spi_sync+0x30/0x58
[ 1442.280038] [<8761e4b4>] 0x8761e4b4
[ 1442.283595] ---[ end trace 6d2164359a03caa8 ]---
SPI_IOC_MESSAGE: I/O error
 

pvvx

Активный участник сообщества
Решение от Onion:
OnionIoT has released a new firmware version b176 in Brand New OS Release! & Solar Power Heater on 2-Bullet Tuesday – Onion in which it is stated that:
  • SPI Improvements
    • maximum transfer sizes increased to 4096 bytes
    • MSB corruption fixed for "some" devices ("We’ve observed that some SPI devices still show data corruption but others do not")
заключается в этом:
Код:
    mt7621_spi_set_cs(spi, 1);

    //Go trough all transfers
    list_for_each_entry(t, &m->transfers, transfer_list) {
        //We don't support full duplex
        //but in most cases, this is not necessary anyay
        if(t->tx_buf && t->rx_buf){
            //printk(KERN_ERR "The MT7621-SPI does not support full bidirectional SPI, only doing TX!");
            //There are ways to overcome this limitation partially, but no really clean solution
        }
       
        if(t->tx_buf) {           
            const u8 *buf = t->tx_buf;
            //printk(KERN_INFO "Doing TX");
            m->actual_length += t->len;

            for(i = 0; i < t->len; i+=MT7621_MAX_TX_BUFFER)
                mt7621_spi_transmit(spi, rs, buf+i, min_t(int, t->len-i, MT7621_MAX_TX_BUFFER));
        }
        else if(t->rx_buf) {
            u8 *buf = t->rx_buf;
            //printk(KERN_INFO "Doing RX");
            m->actual_length += t->len;
            for(i = 0; i < t->len; i+=MT7621_MAX_RX_BUFFER)
                mt7621_spi_receive(spi, rs, buf+i, min_t(int, t->len-i, MT7621_MAX_RX_BUFFER));
        }
        //We don't transfer if we neither got read or write buffer, is that ok?!
    }

    mt7621_spi_set_cs(spi, 0);
:) :)
 

Алексей.

Active member
Видел я эти костыли.
"We’ve observed that some SPI devices still show data corruption but others do not"
Типа попробуйте, может вам повезет, а может и нет, а если повезло один раз, то нет гарантий что дальше будет работать.
 

pvvx

Активный участник сообщества
Видел я эти костыли.
"We’ve observed that some SPI devices still show data corruption but others do not"
Типа попробуйте, может вам повезет, а может и нет, а если повезло один раз, то нет гарантий что дальше будет работать.
Не в том дело. Просто никто не хочет написать нормальный драйвер в открытый доступ !.
Смотрите реализацию Onion - там если назначен TX буфер то только TX, а RX нет в full duplex :)
У самого MediaTek SPI содержит и DMA.
Мир заполонили Ардуинщики, а они умеют только копировать.
 
Сверху Снизу