Jump to content

    

__inline__

Участник
  • Content Count

    915
  • Joined

Everything posted by __inline__


  1. Всем известно, что задница кроется в мелочах... Так и тут. В общем, перенёс я эмулятор GBA на V3s. Попутно вылезли проблемы, которые успешно разрешились через какое-то время. 1) Без этого обмен с внешней памятью будет крайне медленным: /* 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" ); 2) Перед тем как ставить частоту ядру процессора по-выше, необходимо проинициализировать LDO новым значением напряжения (по-выше дефолтного). Иначе V3s будет работать на очень малой частоте. Кусок кода: void clock_init_safe(void) { struct sunxi_ccm_reg * const ccm = (struct sunxi_ccm_reg *)SUNXI_CCM_BASE; struct sunxi_prcm_reg * const prcm = (struct sunxi_prcm_reg *)SUNXI_PRCM_BASE; /* Set PLL ldo voltage without this PLL6 does not work properly */ clrsetbits_le32(&prcm->pll_ctrl1, PRCM_PLL_CTRL_LDO_KEY_MASK, PRCM_PLL_CTRL_LDO_KEY); clrsetbits_le32(&prcm->pll_ctrl1, ~PRCM_PLL_CTRL_LDO_KEY_MASK, PRCM_PLL_CTRL_LDO_DIGITAL_EN | PRCM_PLL_CTRL_LDO_ANALOG_EN | PRCM_PLL_CTRL_EXT_OSC_EN | PRCM_PLL_CTRL_LDO_OUT_H(1370) | PRCM_PLL_CTRL_IN_PWR_HIGH ); //LDO 3.3V, установка 1.37V для повышенной частоты ядра CPU clrbits_le32(&prcm->pll_ctrl1, PRCM_PLL_CTRL_LDO_KEY_MASK); clock_set_pll1(1200000000); //........ 3) Перезапуск DMA для память-память должен включать в себя не только разрешение на запуск DMA, но и перед этим нужно повторно делать запись дескриптора в соответствующий регистр. Иначе более одного канала одновременно DMA не сможет работать. Сейчас одновременно работают два DMA - один для аудиокодека (кольцевой буфер) , второй - копирование из заднего буфера в видеопамять. void MDMA_Start(void) { MDMA_DESC_ADDR_REG=(u32)&MDMA_Descriptor; //DMA Channel 1 Descriptor Address MDMA_EN_REG=1; //DMA Channel 1 Enable } Видео сниму чуть-позже, когда выглянет солнце.
  2. Это кто такие? У меня тоже такой персонаж завёлся с недавнего времени на другом форуме. Тоже орёт про малину, но сам как сидел на STM32, так и остаётся сидеть. Дисплей с сочными цветами или фото удачное? Заинтересовал! Можете написать марку дисплея? Или разрешение в пикселах, тип матрицы и какие интерфейсы поддерживает? Можно в личку или в телегу. Ищу замену штатному дисплею с Lichee Pi Zero, штатный не устраивает из-за плохих углов обзора. Да потому что ленивые и/или тупые. Allwinner - самое тяжёлое, что удалось расковырять.
  3. Я пока над этим не думал, так как всё на стадии экспериментов с BareMetal. Предыдущую модель на DSP укатал в корпус портативной приставки SEGA.
  4. На самом деле оказалось не всё так плачевно! Я думал, будет хуже. Главное - разобраться в исходниках Линукса и у-бута под тот камень, который нужен - и всё будет замечательно. Сбацал SDK под камушек V3s в стиле BareMetal. V3s удобен по следующим причинам: - паяемый корпус - встроенная память на 64 мегабайта Плата - Lichee Pi Zero. Взять плату можно тут: https://aliexpress.ru/item/33021459494.html Сама плата выглядит так: Испытывал V3s на 1200 МГц (ядро) + 456 МГц (память). Работа ведётся автономно, без всяких ОС и у-бутов. Стиль написания программ: процедурно-ориентированное программирование на C. Что может и что делает SDK? : 1) Воспроизведение звука с помощью встроенного аудио-кодека 2) Настройка канала ДМА для аудиокодека 3) Настройка прерываний от ДМА для аудиокодека (по окончанию половины буфера и полного буфера) 4) Настройка аудио-параметров кодека 5) Работа с таймером: задержки, считывание значение тика 6) Инициализация видеосистемы: установка логического разрешения, формата пиксела, установка базового адреса видеопамяти. Под LCD 800x480. 7) Подсветка LCD через ШИМ (PWM) 8) Функция VSync для синхронизации вывода изображения с отрисовкой на LCD. 9) Настройка второго канала ДМА для копирования "память-память". Функция проверки готовности пересылки ДМА. 10) Быстрый MEMCPY с помощью NEON 11) Инициализация UART для обмена данными с ПК (удобно для отладки). 12) Инициализация портов GPIO для периферии. Светодиоды на PG0,PG1,PG2 + для управления джойстиком (см. следующий пункт). 13) Инициализация джойстика от SEGA MegaDrive. Доступны все 12 кнопок: U,D,L,R,START,A,B,C,X,Y,Z,MODE. Возможна одновременность нажатия всех кнопок в любых сочетаниях. 14) Инициализация системы прерываний: GIC, GIC distributor. Установка любого вектора прерываний. Разрешение-запрет прерываний. 15) Настройка MMU, регионов кеширования. Разрешение кеширования для кода, данных. Включение предсказания ветвлений, NEON, VFP. 16) Инициализация встроенной DDR2 (64 МБ), установка тактовой частоты памяти. 17) Установка частоты ядра процессора. Открытие всех нужных гейтов для тактирования шин, периферии. 18) Рантайм для C/C++ : инициализация BSS секции, копирование LMA => VMA (для переменных с начальным значением, которые не константы), инициализация конструкторов классов (до main). 19) Инициализация порта SDIO для подключения карточек SD. Инициализация и низкоуровневая работа с SD-картой 20) Драйвер файловой системы Petit FS от Chan. Поддержка FAT 12,16,32. 21) Поддержка Fat FS для внешних приложений. 22) Работа с кешами: invalidate, flush и другие. 23) Функции для рисования спрайтов. Задний буфер для отрисовки. 24) Скрипты для создания SPL-программы (elf to bin, встраивание хедера для загрузчика, подсчёт контрольной суммы). 25) Загрузчик внешнего приложения в начало DDR2 по адресу 0x40000000 и передача управления загруженному коду 26) ещё чего-нибудь, что забыл написать или сделаю. Есть три реализации SDK : 1) тулчейн GCC (arm-none-eabi-gcc, последняя версия) 2) IAR EWARM v.7.7. (можно и 8.5) 3) ARMCLANG v.6 По вопросам приобретения SDK, пишите в личку или на почту: repstosw2018 СОБАКА gmail ТОЧКА com Чуть позже сделаем видео с работой эмулятора на V3s.
  5. Спасибо за разъяснения. Мне вот стало интересно, откуда берут такую подробную информацию писатели линукса? Подозреваю, что не из того куцего даташита, название которого приводил выше. Потому что алгоритмов там не приводится. Вспомнить хотя-бы теже самые аудио-регистры, где надо щёлкать битами, и не зная порядка установки-сбросов битов, работать не получится.
  6. Ничего странного. Исходный кадр игры 400x240 и если ничего не делать, то он займёт четверть экрана! Я конечно уже SaI2x подключил чтобы раздуть на всю площадь экрана, но дополнительно хочется ещё аппаратное решение (пусть даже и без фильтра). Глянул доки, на 128 стр., там формат YUV, не RGB, так что не подходит. А если поиграться с настройками TCON, Pixel Clock? Для увеличения в 2 раза - надо уменьшить скорость чтения пиксела из видеопамяти в 2 раза и заставить TCON повторно читать каждую строку. VGA видеокарты так и работали (к примеру, разрешение 320x240 там получалось за счёт повторного сканирования каждой строки видеопамяти + замедленное чтение каждого пиксела в 2 раза, при этом развёртка соответствует кадру 640x480)
  7. Запустил видео-систему в Allwinner V3s (DE2), сделал вывод кадра на LCD дисплей. Разрешение 800x480, 16 бит на точку 5:6:5 (по умолчанию в Линуксе 24 бита 8:8:8). Скачал документацию на графический движок V3s: "Allwinner_DE2.0_Spec_V1.0.pdf", стоит задача уменьшить исходный кадр в 4 раза, тоесть в буфере будет картинка разрешением 400x240 пикселей, и при выводе на LCD, она должна растягиваться в 2 раза по обоим осям (можно без фильтра). Проще говоря, нужно чтоб размер одного пиксела увеличился на LCD в 2 раза. Но не нашёл как это сделать в V3s, чтение вышеупомянутой доки не привело к просветлению, и в линуксовых сорцах на видео такой возможности я не увидел. Тем временем, в A13 это решалось достаточно легко, в настройках бэк-энда там где устанавливался режим по цвету, были биты для простого апскейла(без фильтра) - в 2 и в 4 раза. В какую сторону копать? Нужен апскейл исходного кадра в 2 раза по каждой оси, можно без фильтра. Пробовал тайминги дисплея поменять , ничего не вышло, по ходу нельзя заставить матрицу 800x480 работать в режиме 400x240, тут только на сканирование пиксела и линии влиять как-то надо. Вопрос - как?? Метод с программным ДМА, который повторяет шаг по пикселу и линии - не предлагать! Так как это потребует аж 480 дескрипторов и усложнит конвеер графической обработки. Это нужно сделать именно в видео-движке V3s. Ещё забыл, при апскейле программист не должен переводить RGB 5:6:5 в 8:8:8 и не дай бог в YUV. Исходный кадр и конечный - RGB 5:6:5 !
  8. Так и есть. Глянул мануал на OMAP-L138 и немного огорчился - там DDR на 150 МГц максимум. Так что шансов тягаться с оллвиннером у него нет. На тот момент, когда не знал оллвиннеры, DDR на 150 МГц считал лучшим вариантом (в 2 раза по сравнению с SDRAM 150 МГц у С6745). А с олвиннером скорость памяти в 6 раз быстрее: = 456*2/152. Множитель 2, так как DDR. Но на практике включенные кеши сглаживают разницу: выставлял 456 МГц и 360 МГц - прирост был всего на 4% где-то. Тест смешанный. так и есть
  9. Ну к примеру код эмуляторов на ядро ARM9, а графика - на DSP. За счёт параллельности теплится надежда, что OMAP-L138 сможет приблизиться к V3s. Кстати, у обоих память 16 бит DDR2. Отдал около 450 долларов. Много затрат вышло на таможню и пересылку.
  10. Пришла плата с OMAP-L138. Интересно, есть ли у OMAP-L138 456 МГц шанс обогнать Allwinner V3s ? Сюда тоже линукс запихали, потому что ARM9 ядро:
  11. Нашёл причину такого поведения. Если не настраивать GIC и сразу же разрешать прерывания, то происходит вечное циклическое попадание в обработчика прерывания IRQ. Поэтому DMA обрабатывался даже при запрещённых флагах. Настроил GIC, разрешил только прерывания DMA, сразу заработало всё как надо. И : DMA_IRQ_EN_REG0 = DMA0_PKG_IRQ_EN | DMA0_HLAF_IRQ_EN оказалось очень нужным! В V3s DMA через дескрипторы. В принципе терпимо. Для случая с SRAM я завёл два дескриптора: первый ссылается на второй и наоборот. В первом дескрипторе - начальный адрес буфера, во втором - адрес половины буфера. При таком раскладе - прерывание от половины буфера становится не нужным. Я просто ловлю дважды прерывание по полному завершению (на самом деле это сигнализирует о половине буфера). Для DDR достаточно одного дескриптора, ссылающегося на самого себя. Прерывание по завершению чтения половины буфера там работает.
  12. Столкнулся с аномальным поведением DMA, при освоении V3s. Если источником будет SRAM, то не приходит прерывание по заполнению половины буфера, прихдит только прерывание по заполнению всего буфера: DMA_IRQ_PEND_REG При этом если читать вышеуказанный регистр, то в момент прихода прерывания - оба бита установлены в 1 - половина и полный: DMA0_PKG_IRQ_ PEND | DMA0_HLAF_IRQ_PEND При этом игнорируются установки регистра разрешения прерываний: DMA_IRQ_EN_REG0 = DMA0_PKG_IRQ_EN | DMA0_HLAF_IRQ_EN Причём, если запретить все прерывания от DMA, то всёравно прерывание идёт после заполнения всего буфера. Далее попробовал в качестве источника - память DDR (которая успешно проинициализирована) - с ней поведение корректное: приходят оба прерывания : половина заполненного буфера и затем когда буфер заполнен полностью. При этом установки регистра разрешения прерываний DMA всёравно игнорируются! Смахивает на эррату для V3s. С A13 такого поведения не было (приходили оба прерывания и только тогда, когда они разрешены в регистре + с любого региона памяти). В чём может быть дело?
  13. :) Дело в том, что плата Olinuxino-A13 была куплена пару лет назад, и я хотел плотно ими заняться ещё тогда. На этом форуме есть тема, где я выкладывал мини-проект под A13 с загрузкой с SD-карты. Но сложились определённые обстоятельства, помешавшие мне дальше работать в этой области, поэтому был большой по времени перерыв. Ну я ещё человек настроения, сегодня хочу, а завтра уже перегорает. После перерыва решил DSP C6745 освоить, понравилась его открытость и очень хотелось VLIW на своих задачах испытать. C6745 оказался лучше, чем BlackFin BF532/533 и STM32H743. Мои основные требования к процессорам: - Открытость, возможность писать под голое железо - паяемый корпус - приветствуется наличие сопроцессоров или хорошего DMA (у C6745 отличный ДМА: 3 измерения и за раз может качать несколько мегабайт. Кортексам с их куцым ДМА такое и не снилось!) - отсутствие системы охлаждения (вентиляторы радиаторы очень НЕ приветствуются!) Непонятны стереотипы большинства и помешанность на "Малинках". Тот же Allwinner - это Lichee Pi Zero. Ягода из той же серии... Личпи взял потому что он соответствует требованиям выше. Если говорить конкретно о "малинках", то броадкомовские чипы самые закрытые (так говорит интернет). Не вижу смысла их брать, так как там уже мощный теплоотвод и большое токопотребление. Мне кажется, это вопрос религии. У меня своя религия, у вас - своя. Без Линуса или ЛинуКса? Линус бы не помешал, много бы полезного подсказал, а то пока в репах найдёшь нужное, несколько часов потратишь Вот этого я не понял. Мои платы тоже заказные, изготавливали на заводе по моему чертёжу. Вы же вроде как лекарства для ИАРа пишете... Значит всего этого не должны бояться по определению. Меня немного настораживает ваш закос "под блондинку" Ваш хост 77.72.19.19 не хочет со мной соединяться, картинки не открылись. Смотря какие эти игровые цели. Писать свои игры - одно, эмуляторы - другое, 3D-игры - третье. Мощность железа здесь требуется в зависимости от того, что вы хотите. Для примера: C6745 : нативная игра - 170 - 200 FPS, эмулятор СЕГа - 90 FPS, эмулятор GBA 25 FPS. A13: нативная игра - 450 - 500 FPS, эмулятор GBA - 60..70 FPS. На практике достаточно 60 FPS и оно должно быть принудительно по VSYNC. Но запас по FPS должен быть чтоб не проседало на "тяжёлых" местах. Ах, да. Напоследок скажу важную вещь! Рубить бабки на "играх" не выйдет. Так как ниша очень специфическая! Only for fan! Огромное спасибо! Этого как раз не хватало. До этого обыскал в сорцах все файлы в названиях которых были подстроки: audio, codec, находилось не то. Древние ситары - это ж голый ARM без сопроцессоров и ничего... Ну и санкции + дикие затраты на растаможку... Хотя в качестве трофейного остался один чип C6745 в прозрачной упаковке - чисто для получения эстетического удовольствия от созерцания!
  14. Подскажите, как обращаться к этим регистрам? Пытался записывать и читать, ничего не выходит - каждый раз всё разное... Для записи я устанавливаю: RST=1, RW=1, ADDR, Write Data. Следующая запись с другим ADDR (другой регистр) затирает предыдущую. Срабатывает только последняя запись в регистр, предыдущие накрываются Как эти регистры заполнить корректно? Это они так в V3s аналоговую часть аудио-кодека вынесли. В A13 были полноценные регистры в общем адресном пространстве, а тут какое-то куцее окно из одного регистра......
  15. В процессе освоения. Результаты уже кое-какие есть. Чип V3s не совместим с A13 - миграция "в лоб" не получится. Более подробно написал в личку. Экспериментирую на таком агрегате. Чипы v3s у меня тоже отдельно есть. Брал у этого продавца: https://aliexpress.ru/item/33021459494.html За 2 недели пришло (через DPD). P.S. Я рядом с Китаем
  16. Собственно, я про умение пользоваться поиском спрашивал, в контексте хотя бы этого форума. Всё уже здесь есть, как сказал jcxz. Здесь два варианта вывода графики: 1) Через LCD от GX500 - для носимого варианта: 2) Через внешний графический видеоконтроллер, с выводом на TV: В QFP корпусе у C6745 нет никакого видеоконтроллера! Только 2 шины - 16 битная и 8 битная. У A13 и V3s есть встроенная видеосистема. Это называется фреймбуффер. И совсем необязательно иметь адресное пространство, пойдёт и буфер дисплея с автоинкрементом (последовательный доступ). На счёт рисования, все игры имеют свой собственный софт-рендерер, отрисовка идёт просто в обычный массив памяти. Причём софтово можно сделать много слоёв отрисовки с приоритетами, со своими цветами прозрачности и альфой. Поэтому как минимум, достаточно простого видео-порта, который мог бы разом отплюнуть кадр в дисплей, засинхронизировавшись по VSYNC. Отправку в дисплей можно делать DMA или сопроцессором для параллельности. Так как игры имеют свой рендерер, то всякие видео-ускорители здесь мало пригодны, так как расчитаны на работу с оверлеями. Это надо будет код рендерера игры оптимизировать под конкретную модель процессора. А это потеря портируемости кода на другие платформы. Да и оно нафиг не нужно, так как DSP C6745 на эмуляторах даёт несколько сотен FPS, а надо всего 60 ! Исключение составляют "тяжёлые эмуляторы": в первую очередь - GBA. На Blackfine'е он еле ворочал - 15 FPS, на C6745 - 25 FPS, на A13 - уже больше чем 60 FPS. Отрисовкой кадра на экран занимается DMA или PRU параллельно основному алгоритму. Можете просто вычеркнуть время отрисовки, так как время остального превышает время отрисовки. На эмуляторе GBA, Allwinner оказался лучше. Платы есть, а вот с DSP облом. Из-за санкций. Так что теперь вынужден ориентироваться на Allwinner V3s. отличный камень - QFP с шагом 0,4 (такое паяю) + встроенных 64 МБ DDR2, 1200 МГц. Лучших камней пока я не вижу (чтобы сочетали в себе ядро+звук+видео + память , и паяемый корпус с отсутствием заморочек разводки плат с DDR)
  17. Просьба сделать кадр видео ютуба хотя бы в 2-3 раза меньше, а то растягивает на весь экран и в мыло превращает. Некрасиво смотрится!
  18. А чего бы не спаять? От индусов ответа не получил, спаял сам и не одну. Ну и до кучи всё разом: https://www.youtube.com/channel/UCmVFYDZEcJ3sVFal5K42F-Q/videos Вы поиском пользоваться умеете?
  19. Есть такое хобби - ковырять камни в Bare Metal. Занимаюсь этим не пару лет, а несколько десятков. Не спрашивайте, зачем. Просто интересно. И эмуляторы - не самоцель. Сейчас пишем свои игры. Но об этом немного позже. Заслуга Линукса в том, что человек скачал с репы бранч игры, заустил make-файл и собрал игру под Линукс с поддержкой фреймворка SDL. Получился порт игры под Линукс собранный за 5 минут (если не меньше!). Тоже самое я делал с этой игрой под Windows с помощью mingw (это GCC под винду для портирования Linux приложений на Винду). А вот штоб на Bare Metal такое сделать, мне пришлось обрубок SDL писать на C6745. И это круто! И пусть обломятся те, кто дмает что страдаю фигнёй! Зато мне интересно!
  20. А теперь то же самое, только без линукса и без ОС. С линуксом и дурак сможет.
  21. Много чего известно :) Даже писал под неё. С эмуляторами великолепно! Здесь убран VSYNC, чтобы можно было посмотреть максимальную производительность: Это Punisher под CPS. Я его тоже снимал: На A13 это всё в разы будет летать! +100. Мне нравится!
  22. Уже не актуально. перешёл на V3s. У него там свой линукс есть.
  23. Тухлый вброс Tyrian под Dingoo A320: https://www.youtube.com/watch?v=Ij5oHuere64 Полупрозрачность у облаков отключена и звук местами хрипит, так как не хватило ума сделать обработку звука правильно )) Особо люто лагает с 2:12 во время демонстрации опций игры в качественном режиме: https://www.youtube.com/watch?v=Ij5oHuere64&t=132 Вот вам Dingoo и Линукс )) Боюсь представить, сколько там пропускается фреймов в других эмуляторах, чтоб успеть подкачать очередную порцию звука, чтоб не лагало. P.S. и видео между уровнями выпилены (глядел исходники порта Dingoo ). Выпилены - потому что там CPU кидает эксепшн из-за обращения к невыровненным данным памяти во время парсинга видео )) в своих железках я это пофиксил) А вот OpenTyrian под ведроид - https://www.youtube.com/watch?v=G-D8KKg0tpo Как говорится, тухлость очевидна: идёт медленно и выпилена музыка. Ещё одним примером больше - как всякие вёдра, ардуины снижают производительность железа Даже на C6745 у меня эта игра идёт превосходно, не говоря уже об A13 На всех моих портах эмуляторов и играх - плавный фреймрейт без пропусков и с нормальным звуком. Чего не скажешь о поделии A320, ретропаях, распбианах и прочей тухлоты, что штатно идёт вместе с линуксом. Это всё не то, если коллега спрашивал про ARM-архитектуру конкретно. Зачем ему дескрипторы урода-x86, они ведь совсем не совместимы с дексрипторами ядра того же Cortex-A8 ? Книжек действительно много написали. Но всё-же самое ценное - это свой собственный опыт. Только в ходе экспериментов над конкретной задачей можно найти оптимальное сочетание битов в дескрипторах ММU для ускорения работы программы
  24. Всё соблюдено. Стартап для IAR писал самостоятельно. Так как поддержки Allwinner A13 "искаропки" там нет. На счёт ARMCC v.6 только из Кейла брать. И писать свой батник, вызывая armclang из командной строки. Причина та же - Кейл ИДЕ не поддерживает девайс A13 "искаропки"