• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

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

sharikov

Active member
У меня
[inline]io -4 0x10000010
10000010: 00156146[/inline]
HLK7688 аппаратно задан 4-х байтный режим.
 

pvvx

Активный участник сообщества
Я пока этот кошмар пытался разгрести MediaTek-Labs/linkit-smart-7688-uboot
Не совпадает с HLK и надо исправлять минимум в 3-х местах:
  • Номер UART в board\rt2880\serial.h #define CFG_RT2880_CONSOLE
  • Скорость UART в include\configs\rt2880.h #define CONFIG_BAUDRATE желательно в 115200, #define CONFIG_SERVERIP на желаемые и т.д.
  • Установки регистров в lib_mips\board.c связанные с GPIOMODE2 и прочим. Найти можно по поиску слова "ARDUINO"
Ещё не работает tftp.
Не правильно работают светодиоды, но это исправляется в lib_mips\board.c (связанные с GPIOMODE2).
Для платы HLK-7688A-SUIT-V1.3 надо провести кнопку gpio 38 PAD_WDT_RST_N
Так-же на ней нет транса для ethernet - разъем RJ45 припаян напрямую к модулю через конденсаторы и резисторы :) Т.е. возможно использовать только для отладки с коротким шнуром сопряжения - развязки нет...
Ну и вообще этот Linkit-smart-7688-boot - хуже моей web-свалки. Мешанина с кучей ненужного и неиспользуемого кода который дает только доп. глюки и неразбериху. Удивляет, что это ещё как-то работает....
При зашивке напрямую, без редакции загрузка OpenWRT с ним на HLK будет, но стартовый лог на другом UART...
 

pvvx

Активный участник сообщества
U-boot, который был в модуле отличается от Linkit-smart-7688-boot размером - раза в полтора меньше, но mtd отведена на 3*64KiB и туда лезет любой из клонов Linkit-smart-7688-boot (можно наверно от Omega2 попробовать, но там неинтересные опции).
В общем простого HTTP в них нет, с usb и с SD карты не грузятся (много кривости), tftp глючный, опции (env) для галочки - не работают... Работает только UART загрузка и на 57600 :)
Необходимо писать свой или взять какой нормальный. Для себя потом перепишу старенький но со всеми перечисленными возможностями и укладывающийся в 128 килобайт...
 

pvvx

Активный участник сообщества
Итоги по клонам Linkit-smart-7688-boot - не годятся для пром.применения и жирная точка.
Jtag отключают. GPIO не настроить, не отключить вывод UART, сбивают все GPIO настройки, отладку не произвести, перезалить что в полевых условиях невозможно и т.д. Единственное от них - занимают 192 килобайта и как-то, раз на раз, загружают образ kernel...
 

pvvx

Активный участник сообщества
Кто знает, как это работает? MediaTek-Labs/linkit-smart-7688-uboot :)
Код:
void smart7688_led_blink(void)
{
    if (smart7688_led_state) {
        RALINK_REG(RALINK_PIO_BASE+PIO_SET1) |= (1 << 12);
        smart7688_led_state = 0;
    } else {
        RALINK_REG(RALINK_PIO_BASE+PIO_CLEAR1) |= (1 << 12);
        smart7688_led_state = 1;
    }
}
Если чтение этих регистров RALINK_REG(RALINK_PIO_BASE+PIO_SET1) или RALINK_REG(RALINK_PIO_BASE+PIO_CLEAR1) всегда дает 0xFFFFFFF.
Код:
MT7628 # md 10000600
10000600: 00000800 00001000 00000000 ffffffff    ................
10000610: 00000000 00000000 00000000 ffffffff    ................
10000620: ff203470 0000705f 00000000 ffffffff    p4 ._p..........
10000630: ffffffff ffffffff ffffffff ffffffff    ................
10000640: ffffffff ffffffff ffffffff ffffffff    ................
10000650: 00000000 00000000 00000000 ffffffff    ................
10000660: 00000000 00000000 00000000 ffffffff    ................
10000670: 00000000 00000000 00000000 ffffffff    ................
10000680: 00000000 00000000 00000000 ffffffff    ................
10000690: 00000000 00000000 00000000 ffffffff    ................
100006a0: 00000000 00000000 00000000 ffffffff    ................
Ардуинщики писали?
И так там везде....
 

Алексей.

Active member
Я пока этот кошмар пытался разгрести MediaTek-Labs/linkit-smart-7688-uboot
Не совпадает с HLK и надо исправлять минимум в 3-х местах:

Номер UART в board\rt2880\serial.h #define CFG_RT2880_CONSOLE
Скорость UART в include\configs\rt2880.h #define CONFIG_BAUDRATE желательно в 115200, #define CONFIG_SERVERIP на желаемые и т.д.
Установки регистров в lib_mips\board.c связанные с GPIOMODE2 и прочим. Найти можно по поиску слова "ARDUINO"
На linkit smart решили использовать console=ttyS2,57600 это их выбор, что в этом плохого не ясно.
Что касается режимов gpio то тут всё очевидно, linkit smart работает в "Device Mode", а hilink в "Gateway Mode", т.е. те пины которые шарятся с LAN портами работают иначе. Для режима роутера они аналоговые, а для режима девайса - цифровые ;)
Итоги по клонам Linkit-smart-7688-boot - не годятся для пром.применения и жирная точка.
Начальный загрузчик предназначен для разворачивания образа прошивки и для аварийного восстановления. Т.е. уметь работать с установленным флешем и для аварийного восстановления с lan-ом, что касается восстановления с usb - это скорее недостаток чем преимущество, его нужно куда-то выводить, а порт ethernet хотя бы один всегда выведен.
В полях полученный образ прошивки или отдельных пакетов меняется, обязательно в момент обновления обеспечить гарантированным электропитанием. Менять начальные загрузчики, например для оптимизации старта, в устройствах, работающих в режиме 24/7 думаю нет большого смысла.
 

Алексей.

Active member
Кто знает, как это работает? MediaTek-Labs/linkit-smart-7688-uboot :)
  • void smart7688_led_blink(void)
  • {
  • if (smart7688_led_state) {
  • RALINK_REG(RALINK_PIO_BASE+PIO_SET1) |= (1 << 12);
  • smart7688_led_state = 0;
  • } else {
  • RALINK_REG(RALINK_PIO_BASE+PIO_CLEAR1) |= (1 << 12);
  • smart7688_led_state = 1;
  • }
  • }
Если чтение этих регистров RALINK_REG(RALINK_PIO_BASE+PIO_SET1) или RALINK_REG(RALINK_PIO_BASE+PIO_CLEAR1) всегда дает 0xFFFFFFF.
А что вы хотели там увидеть?
Эти регистры предназначены для записи (установки) битов
10000630 | GPIO_DSET_0 | GPIO0 to GPIO31 data set register These data set registers are used to set bits in the GPIO_DATA_x registers.
Для сброса битов используются другие регистры
10000640 | GPIO_DCLR_0 | GPIO0 to GPIO31 data clear register These data set registers are used to clear bits in the GPIO_DATA_x registers.
А для чтения состояния используются третьи регистры :)
10000620 | GPIO_DATA_0 | GPIO0 to GPIO31 data register These data registers store current GPIO data value for GPIO input mode, or output driven value for GPIO output mode. Bit position stand for correspondent GPIO pin.
Код:
static void* _map_base = (void *) -1;

static inline void set_gpio_direction(int num, int is_output) {
        uint32_t v = *((volatile uint32_t*) (_map_base + GPIO_CTRL_0));
        *((volatile uint32_t*) (_map_base + GPIO_CTRL_0)) = is_output ? (v | (1 << num)) : (v & ~(1 << num));
}

static inline void set_gpio_value(int num, uint32_t value) {
        if (value) {
                *(volatile uint32_t*) (_map_base + GPIO_DSET_0) = (uint32_t)(1 << num);
        } else {
                *(volatile uint32_t*) (_map_base + GPIO_DCLR_0) = (uint32_t)(1 << num);
        }
}

static inline uint32_t get_gpio_value(int num) {
        uint32_t v = *((volatile uint32_t*) (_map_base + GPIO_DATA_0));
        return v & (1 << num);
}
 

pvvx

Активный участник сообщества
На linkit smart решили использовать console=ttyS2,57600 это их выбор, что в этом плохого не ясно.
Тормозит загрузка и работа, а так более ничего :)
Менять начальные загрузчики, например для оптимизации старта, в устройствах, работающих в режиме 24/7 думаю нет большого смысла.
Смысл во всём есть, если модуль "сочленен" с другим MCU и/или, к примеру, используются все UART. Иногда приходится глушить вывод в UART и доступа к boot через него нет и не возможен. Городить дополнительные кнопки, разъемы и прочее для переключения режимов boot так-же не имеет смысла.
Основные причины, почему требуется перепрошивка всего на свете - разгильдяйство сервисного обслуживания. Прошьют что не так при смене каких датчиков и кирдык = менять плату = вторичная командировка и длительный простой. Запасную плату тоже могут не взять, т.к. всё образуется "находу" - ехали сменить что-то другое, но полезли не туда :) ...
 

Алексей.

Active member
Для меня было большим разочарованием SPI
Количество битов для приема/передачи в half-duplex 0-256 и для full-duplex 0-128
Т.е. за транзакцию больше 32 или 16 байт не передать.
Я то думал, dma настрою и буду килобайтами обмениваться, а тут облом.
 

sharikov

Active member
Для меня было большим разочарованием SPI
А для меня разочарованием было обнаружить что штатный драйвер I2C не поддерживает Repeated start. Без него сенсор не работает. Хорошо что нашелся альтернативный драйвер.
И еще разочаровала дохлая нагрузочная способность выводов I2C. Подтяжку 3К уже еле тянет (ноль поднимается).
 

pvvx

Активный участник сообщества
@Алексей. - не в курсе, есть какой пакет "или как", чтобы из помойки дистра OpenWRT создать чистый SDK только для конкретного железа и конкретных пакетов (выкинуть лишний хлам и оставить только нужные исходники пакетов)?
 

sharikov

Active member
Основные причины, почему требуется перепрошивка всего на свете - разгильдяйство сервисного обслуживания. Прошьют что не так при смене каких датчиков и кирдык = менять плату =
При таких "работниках" вам MT7688 противопоказан. В этом процессоре нет boot rom и если ему убили загрузчик остается только шить флэшку программатором. (в плате обязательно нужно предусмотреть разъем для прошивки).
Вам нужен чип который из состояния "кирпич" шьется по usb .
Для нас это тоже был одним из пунктов против MT*.
 

pvvx

Активный участник сообщества
А для меня разочарованием было обнаружить что штатный драйвер I2C не поддерживает Repeated start. Без него сенсор не работает. Хорошо что нашелся альтернативный драйвер.
И еще разочаровала дохлая нагрузочная способность выводов I2C. Подтяжку 3К уже еле тянет (ноль поднимается).
Для I2C, SPI и т.д. есть драйверы-удлинители с диф.сигналами - хоть на 100 метров...
C Repeated start проблем не заметил (они вроде были на начальном освоении этих чипов "сообществом"), а сам контроллер I2C в MT7688A - ужасно примитивен - требует много от CPU и не пашет на МГц-ы.
 

pvvx

Активный участник сообщества
При таких "работниках" вам MT7688 противопоказан. В этом процессоре нет boot rom и если ему убили загрузчик остается только шить флэшку программатором. (в плате обязательно нужно предусмотреть разъем для прошивки).
Вам нужен чип который из состояния "кирпич" шьется по usb .
Для нас это тоже был одним из пунктов против MT*.
Это решается проще: В доке напишу - всегда возить с собой запасной блок. И псё - не взяли -= премия. :)
 

Алексей.

Active member
@Алексей. - не в курсе, есть какой пакет "или как", чтобы из помойки дистра OpenWRT создать чистый SDK только для конкретного железа и конкретных пакетов (выкинуть лишний хлам и оставить только нужные исходники пакетов)?
В menuconfig вы сами выбираете те пакеты, которые хотите видеть на прошивке.
Осталось разобраться что лишнее и выкинуть.
Что такое "для конкретного железа" не ясно, например я собрал из медиатека флешки и рам-а (ну и smd резисторы конденсаторы и стекляшка) свой контроллер, это конкретное железо или нет?
 
Сверху Снизу