Jump to content

    

__inline__

Участник
  • Content Count

    1012
  • Joined

Everything posted by __inline__


  1. Там очень мощные требования: поворот, отражения, альфа, маскирование бит цветовых каналов, перестановка RGB, очёрно-беливание , и многое-многое другое.... :)
  2. Это не беда. TE можно считать через регистр (или номер рисуемой линии). У меня LCD с ILI9341 работал "на ура" и без кривляний картинки. И заливка двумя цветами блынькала без диагональных линий
  3. можете умножить на 4, так как 4 плоскости :) ну и DMA использую в основном для фен-шуя, на самом деле одного CPU хватает пока.
  4. Мне бы для игр пригодилось! Копировать отрендерённый задний буфер на экран целиком весь: позиции X, Y = 0, ширина 400 пикселей, высота 240. В ограничения укладываюсь! Объектики для игры рисую через CPU: спрайты всякие, иконки, меню.... - в задний буфер. Потом копирую его на экран DMA.
  5. Перепробовал все комбинации битов. Нашёл ещё одну, которая даёт тоже самое максимальное быстродействие(для DST -приемник): TEX=4, C=0, B=0. скорость аналогична с: TEX=1, C=0, B=1 В доках очень мутно расписано, и надо быть профессором кислых щей ARM'ов, чтобы вообще понять что происходит. Тем более комбинация при TEX=001 C=0 B=1 - зарезервирована, а по факту - одна из быстрых при копировании. Мало того, документ умалчивает об Outer policy и Inner policy... Мутно как-то всё. Дополнительно пытался использовать L2 кеш, но я разницы в скорости вообще не вижу - складывется впечатление, что либо L2 уже работает, либо он так и не включился. L2 включаю таким кодом: @ ================================================================== @ Enable Cortex-A8 Level2 Unified Cache @ ================================================================== MRC p15, 0, r0, c1, c0, 1 @ Read Auxiliary Control Register ORR r0, r0, #2 @ L2EN bit, enable L2 cache @ ORR r0, r0, #(0x1 << 4) @ Enables speculative accesses on AXI @ ORR r0, r0, #(0x1 << 5) @ Enables caching NEON data within the L1 data cache MCR p15, 0, r0, c1, c0, 1 @ Write Auxiliary Control Register При этом если раскомментировать: Enables speculative accesses on AXI и Enables caching NEON data within the L1 data cache, то на выходе не вижу разницы в быстродействии копирования NEON-ом. Зато обязательно надо установить бит 6 вот здесь (писал в соседней теме, сдублирую): /* Enable SMP mode for CPU0, by setting bit 6 of Auxiliary Ctl reg */ asm volatile( "mrc p15, 0, r0, c1, c0, 1\n" "orr r0, r0, #1 << 6 \n" "mcr p15, 0, r0, c1, c0, 1\n" ); Иначе во внешней памяти программа будет крайне медленно работать, особенно когда будут читаться данные. Этот бит разрешает режим когерентности для CPU. Тут надо быть профессором кислых щей, чтобы разобраться как оно влияет на производительность.
  6. А для источника кеширование надо включать. Потому что у меня это задний буфер, и я из него читаю ещё... Если отключить кеширование в источнике, общая скорость проседает. И TEX для источника должен быть =0. Иначе мусор пойдёт. Объяснить не могу почему, так как не профессор в АРМ-ах :) Установил экспериментально
  7. :) я про то, что кеширование региона для приёмника наоборот надо ОТключить :) Ещё один плюс - делать clean/flush data cache при этом не нужно :)
  8. Я тоже из референса ничего там не понял ))) Вот, подтверждают, что регион должен быть с выключенным кешем(приемник) для NEON-memcpy: https://stackoverrun.com/ru/q/9617352 иначе с включенным битом кеша для региона приемника скорость просядет (писал об этом выше, замерял таймером с 6 МГц-разрешением)
  9. Ещё битовое поле TEX=1 в приемнике. Но об этом почему-то не пишут. Экспериментально обнаружил ускорение используя это поле. На ПК тоже были недокументированные вещи - типа MSR-регистров, включающие кеширование видеопамяти. В итоге CPU писал в 2,5 раза быстрее, чем при дефолтных настройках BIOS'а после загрузки :)
  10. А включенный бит буферизации? Он помогает конвееризировать бурсты? Ещё по теме быстрой отрисовки: https://stackoverflow.com/questions/11161237/fast-arm-neon-memcpy
  11. "VLDM %[src]!,{d0-d7} в область памяти с адреса src записывается содержимое 8-ми 8-байтовых регистров d0,d1,...,d7 за раз! Адреса должны быть выровнены на 64 байта и передача кратна 64-м. Для быстрой очистки экрана подходит
  12. Да, на A13 быстрее, чем у V3s! Да. Из-под цикла инструкцию можно вынести. Только в этом случае всеравно константа будет в памяти, а не как immediate.
  13. Восклицательный значок убрать в инструкции источника (инкрементор?). Только константа будет длиной разрядности всех регистров (64 байта)
  14. Добрый день. Продолжаю осваивать чип Allwinner V3s. Столкнулся с таким фактом. Нужно сделать переброс "память-память" самым наискорейшим способом, который возможен. Начал ковырять DMA и обнаружил несколько малоприятных вещей: 1) DMA не поддерживает переменные шаги приращения. Только программирование через дескрипторы. 2) Тактовая частота работы DMA всего 200 МГц !!! В сорцах линукса зачем-то для тактовой DMA используют AHB, которая получается делением на 2 частоты ядра: 1200/2 = 600 МГц. Затем эти 600 МГц делятся ещё на 3 для DMA. В итоге выходит всего-навсего 200 МГц. Таким DMA полезно делать только подкачку аудио-данных при воспроизведении или записи звука. Или ещё что-нибудь свя занное с забором-выводом данных в периферию! Для быстрого коприрования память-память не подходит! А теперь о хорошем! Если копировать с помощью инструкций NEON: void MEMCPY(u8 *dst,u8 *src,u32 size) { asm volatile( "1: \n" "VLDM %[src]!,{d0-d7} \n" "VSTM %[dst]!,{d0-d7} \n" "SUBS %[size],%[size],#0x40 \n" "BGT 1b \n" : [dst]"+r"(dst), [src]"+r"(src), [size]"+r"(size) : : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "cc", "memory" ); } то скорость получается самая максимальная. Если битовое поле TEX выставить равным "001", то получим ещё более высокий прирост в скорости (+20 %): //VIDEO MEMORY i=61; mmu_tlb_address[i + (dram_base>>20)] = (dram_base + (i << 20)) | (0 << 19) | (0 << 18) | (0 << 17) | (0 << 16) | (0 << 15) | (1 << 12) | //TEX (3 << 10) | (0 << 9) | (15 << 5) | (0 << 4) | (0 << 3) | //Cache (1 << 2) | //Buffer (2 << 0); При этом бит кеширования в дескрипторе приёмника в MMU-таблице должен быть выключен! Если его включить в приемнике, то скорость просядет. Тоесть: приемник: TEX=1, C=0, B=1 источник: TEX=0, C=1, B=1 При таком раскладе выходит около 8000 FPS при копировании буфера 240 x 160 x 16 бит. (ядро 1200 МГц, память 456 МГц ). С DMA выходит в 8 раз меньше! Если увеличить частоту DMA в 2,3 раза, то скорость нисколько не увеличивается. Действительно ли с DMA всё так печально, или есть способ его заставить работать быстрее?
  15. Идейно я его превзошёл, а вот финансово - нет. Но для меня это не главное. V3s будет лучше, чем F1C100S хотя бы из-за размера памяти вдвое. Она понадобится для запуска РОМов от эмуляторов CPS и NEO-GEO. Эзернет также как USB у меня в нон-грате. Так исторически сложилось, что не могу им найти применение. Скачать исходники u-boot на ваш камень. Затем долго медитировать и взять из них код, нужный вам. Слепить проджект и сбилдить. Но в убуте нет работы со звуком. Выручили даташит и линукс. В финале, должна прийти мысль, что оллвиннеры не сложнее STM32
  16. Ждём эмулятора SEGA MegaDrive от Xenia На STM32H7, с плавными 60 FPS, без пропуска кадров и с нелагающим звуком и музыкой.
  17. Сборка идёт тулчейном arm-none-eabi-gcc (последняя версия) Загрузка двумя путями: 1) Собственный загрузчик-инициализатор записывается с ПК в V3s через USB с помощью утилиты sunxi-fel. Затем этот загрузчик считывает с SD-карты приложение и копирует его во внешнюю память. Затем передаёт ему управление 2) Тоже самое, только без USB. Загрузчик сидит с 16-го сектора SD-карты и стартует при включении питания. 3) Фирмваря уже стартует во внешней памяти с настроенной периферией и стеками. 4) В экспериментальных целях: загрузка через USB, отладка по UART.
  18. Пускай думают те, кому это надо. Мне оно не нужно там. Использую 1,5-метровый кабель до VGA-монитора, картинка чистая, яркость нормальная (в мониторе стоит на минимуме). Больше мне ничего не надо.
  19. Нет. Они там для другого. Отключают каналы RGB во время бланка и синка. Это было сделать необходимо, так как линии портов не уходят в 0 во время бланка, что приводило к засветаи м отбрасыванию теней. Я писал об этом чуть раньше в этой теме. Нет там никакого усилителя мощности... Схема - чистая пассивка, питания нету. Где вы увидели усиление?
  20. Наконец-то сваял свой вариант видео-ЦАПа, который по качеству изображения НЕ УСТУПАЕТ решению от Olimex (плата olinuxino A13), но содержит гораздо меньше деталей. Пришлось немного модернизировать плату Lichee Pi zero : напаял 20-контактный разъём (снят с платы ноутбучной матрицы - вроде как LVDS ?): Потом ещё пришлось отдельно припаять штырёк для LCD_DEN, так как на расчёски он не был выведен: Сам ЦАП собран на макетке, VGA-разъём жестко закрутил болтами к плате: C VSync и HSync убрал ключи-инверторы - оказались не нужны. Только следует учесть, что в драйверах Линукса тогда придётся указывать прямую полярность H/V Sync'ов, а не инверсную, так как ключ на транзисторах инвертирует сигнал. Сборная солянка из двух плат: В итоге всё пока так... Cхема видео-ЦАП для подключения VGA-мониторов к плате Lichee Pi Zero (Allwinner V3s): Ряд резисторов выбран не совсем оптимально - собирал из того что под руку попалось. Но для игр приемлемо. Данный ЦАП хорошо кажет в разрешении 800x480. Вариант видео-ЦАПа от Olimex:
  21. Ещё можно видеобуфер обвести чёрной рамкой - этим обеспечивается 100% гарантия, что пикселы на бордюрах будут чёрные. Проверил, действительно, засветы исчезли - их как-будто и не было. Но этот метод сокращает высоту и ширину буфера на 2 пиксела.
  22. Нашёл калькулятор для расчётов моделайнов. Очень полезная штука, позволяет правильно расчитать параметры развёртки кадра: https://www.arachnoid.com/modelines/ Этим тоже разобрался. Засветы были из-за того, что оллвиннер не гасит порты каналов R,G,B когда идёт бланк. Если принудительно ставить RGB=0 когда DE=0, то всё нормально (это делается тактированием в схеме олимекса). Ещё можно видеобуфер обвести чёрной рамкой - этим обеспечивается 100% гарантия, что пикселы на бордюрах будут чёрные. Проверил, действительно, засветы исчезли - их как-будто и не было. Но этот метод сокращает высоту и ширину буфера на 2 пиксела. Можно ещё с регистрами TCON, Composer поиграться - сместить отображаемый кадр вправо вниз. В общем - большое пространство для маневров, что радует! А вот при попытке поставить 400 x 240 120 Гц, монитор выдал режим 400 x 480 с пропуском каждой чётной строки. По ходу, меньше чем 480 строк сделать нельзя без пропусков. Для того и дабл-скан был и придуман, чтобы дважды считывать каждую строку - к примеру чтобы получить 320x240, которое на самом деле 320x480. Печально, что V3s не поддерживает дабл-скан, хотя такая константа в драйвере линукса есть, но в V3s она нигде не используется. Но дышать уже проще: 400x240 делается из 400x480. Делаем 480 дескрипторов ДМА - на 480 строк и настраиваем так чтобы по 2 строки одинаковых копировалось. Зато хоть CPU в это время будет обсчитывать новый фрейм, пока старый рисуется и растягивается ДМА
  23. A20 Allwinner

    Я думал что там человекообразные роботы, а это автомат.
  24. A20 Allwinner

    Не видел таких роботов! Это наверное, в параллельном мире такие есть. Догадываюсь! Но это наверно скучная рутина с целью выжить.
  25. Вот я и о чём и говорю! Рано ещё списывать VGA на пенсию. Недавно приобрёл Geforce GT 710, так там тоже VGA выход ещё есть!