Обсуждение 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.
Мир заполонили Ардуинщики, а они умеют только копировать.
 
Сверху Снизу