Перейти к содержанию
    

Allwinner T113-s3 уделал HiFi4 DSP. Смеяться или плакать?

1 час назад, vasilius сказал:

ну типа да

Если не сложно будет, попробуйте по быстродействию сравнить обычный код и vliw, будет интересно посмотреть...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 минуты назад, mantech сказал:

Если не сложно будет, попробуйте по быстродействию сравнить обычный код и vliw, будет интересно посмотреть...

у меня пока проблемы с пониманием как-то это собирать и как запускать....

Вижу противоречия - в линкере и т.д. Там компилится не бинарник, а эльф.... его надо еще распотрашить и запустить...

FREERTOS кстати базируется на конфигах олвинера, но там тоже "по-своему" сделано.... не совсем так....

пока разбираюсь... хочется правильно это собрать и запускать

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 2/7/2024 at 12:40 AM, mantech said:
On 2/7/2024 at 12:31 AM, repstosw said:

есть RTFM на GCC тулчейн.

связываться особо нет желания.

Использование эклипса (впрочем, как и другие IDE) не освободит от раскуривания ключей компилятора/ассемблера/линковщика.

Иначе, вот этих ошибок мы бы от вас не услышали:

Quote
In file included from ../sys/drivers/GUI/Gui_ll.c:40:0:
../sys/drivers/GUI/Gui_ll.c: In function 'GrayRotation90_NEON':
d:\program works\gnu\sourcery_arm_eabi\lib\gcc\arm-none-eabi\6.3.1\include\arm_neon.h:541:1: error: inlining failed in call to always_inline 'vadd_u8': target specific option mismatch
 vadd_u8 (uint8x8_t __a, uint8x8_t __b)
 ^~~~~~~

 

 

On 2/7/2024 at 4:01 AM, vasilius said:

Зачем все писать самому? Я нашел(купил) оригинальный пакет конфига от олвинера для hifi4. Получил лицензию на xplorer. 

Есть смысл использовать реальный тулчейн, со всеми плюшками... да - сложно и не все понятно, но...

 

Затем, чтобы избежать проблем вроде ваших:

Quote

у меня пока проблемы с пониманием как-то это собирать и как запускать....

Вижу противоречия - в линкере и т.д. Там компилится не бинарник, а эльф.... его надо еще распотрашить и запустить...

FREERTOS кстати базируется на конфигах олвинера, но там тоже "по-своему" сделано.... не совсем так....

пока разбираюсь... хочется правильно это собрать и запускать

 

Наличие лицензии на компилятор и полного конфига(оверлея) на HiFi4 DSP от T113-s3  не отменяет того факта, что придётся разбираться с этим ядром и понять что  и по каким адресам памяти  должно быть.

Кроме того, вангую, что это всё завязано на FREERTOS, а это значит, чтобы использовать это на BareMetal, необходимо будет выкорчёвывать RTOS произвести рефакторинг кода и переделку стартапа.  У меня эти шаги уже позади. :biggrin:

Возможно, у меня тоже скоро появится лицензия на компилятор Cadence (XCC/Clang) и полноценный конфиг (оверлей).

Будет интересно натравить эти компиляторы на мой SDK и сравнить скорости выполнения некоторых критичных фрагментов кода от выхлопов компиляторов:

Free GCC

XGCC

Clang

 

Изменено пользователем repstosw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 часов назад, repstosw сказал:

не освободит от раскуривания ключей компилятора/ассемблера/линковщика.

Ну можно еще просто спросить у того, кто уже расковырял, для этого и форум, чтоб не мариноваться каждому в "собственном соку")))

9 часов назад, repstosw сказал:

Наличие лицензии на компилятор и полного конфига(оверлея) на HiFi4 DSP от T113-s3  не отменяет того факта,

Ну да, по уму производитель должен предоставить еще и SDK для этого, чтоб не оставлять покупателя один на один с непонятным чудом, ИМХО...

В свое время для IMX6 производитель предоставлял кроме линукса и вполне неплохой SDK бареметал - очень хороший пример заботы об потребителях из не только линуксового сообщества.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 minutes ago, mantech said:

Ну да, по уму производитель должен предоставить еще и SDK для этого, чтоб не оставлять покупателя один на один с непонятным чудом, ИМХО...

В свое время для IMX6 производитель предоставлял кроме линукса и вполне неплохой SDK бареметал - очень хороший пример заботы об потребителях из не только линуксового сообщества

Для сосременных мощных камней - мэйнстрим - это Linux.  Поэтому все SDK производителя будут крутиться вокруг Линукса.

Xtensa - не исключение. Производитель предлагает использовать и писать программы под FREERTOS.

На планете найдутся не так много извращенцев любителей писать код в BareMetal:  я, вы, Геннадий и может ещё пара человек с форума. Всё.

 

Quote

В свое время для IMX6 производитель предоставлял кроме линукса и вполне неплохой SDK бареметал

В своё время интересовался IMX6. Но к тому времени, они уже убрали с сайта фирменный SDK.  Нашёл только любительский SDK, в котором было не всё.

Изменено пользователем repstosw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 2/8/2024 at 12:06 PM, mantech said:

В свое время для IMX6 производитель предоставлял кроме линукса и вполне неплохой SDK бареметал - очень хороший пример заботы об потребителях

так вы ценник сравните на процессоры - "любой каприз за ваши деньги", Linux в первую очередь есть из-за андроида а голые процессоры без примеров кода никому не нужны

Изменено пользователем sasamy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Xtensa - она не навязывает RTOS, но логично, что ее предлагает... как и все, впрочем.

Если брать линукс - то, кстати, вот именно в S3, ядро XTENSA и решает проблему прямого доступа к железу.

Там смысл в том, что оно запускается отдельно и имеет прямой доступ к железу (например аудио) и если надо то берет ресурсы с кортекс ядер.

Впрочем в Т113 СДК оно так и используется. Мне линукс не оч нравится тем, что мне нужны мощности всех ядер кортекса и еще ядро ДСП на всю катушку.

И не хочется никакой ОС отдавать ресурсы. Да, это из-за жлобского подхода : все хочется на одном камне сделать и дешево. 

Вся суть с этим ДСП, в том, что надо иметь все сразу и  СДК от олвинера, и лицензию от каденсы, чтобы понять как это работает.

Без конфигов олвинера лицензия не поможет. По-умолчанию конфиги для hifi4 там совсем абстрактные. Но стоит иметь и СДК чтобы видеть как олвинер это применяет.

Конфиг от олвинера почти полностью представлен на гите по ФРИИРТОС. Файл линкера там от min-rtos. Хотя конфиг обознает конфигурацию sim.

Но пример с СДК использует свой вариант... хз 

Allwiner SDK

MEMORY
{
  iram0_0_seg :                       	org = 0x00400000, len = 0x660
  iram0_1_seg :                       	org = 0x00400660, len = 0x9A0
  iram0_2_seg :                       	org = 0x00401000, len = 0x17C
  iram0_3_seg :                       	org = 0x0040117C, len = 0x20
  iram0_4_seg :                       	org = 0x0040119C, len = 0x20
  iram0_5_seg :                       	org = 0x004011BC, len = 0x20
  iram0_6_seg :                       	org = 0x004011DC, len = 0x20
  iram0_7_seg :                       	org = 0x004011FC, len = 0x20
  iram0_8_seg :                       	org = 0x0040121C, len = 0x20
  iram0_9_seg :                       	org = 0x0040123C, len = 0xEDC4
  dram0_0_seg :                       	org = 0x00420000, len = 0x8000
  dram1_0_seg :                       	org = 0x00440000, len = 0x8000
  ddr1_0_seg :                        	org = 0x32000000, len = 0x100000
}

Config Allwiner

MEMORY
{
  sram0_seg :                         	org = 0x00020000, len = 0x2E0
  sram2_seg :                         	org = 0x00020400, len = 0x178
  sram3_seg :                         	org = 0x00020578, len = 0x4
  sram4_seg :                         	org = 0x0002057C, len = 0x1C
  sram5_seg :                         	org = 0x00020598, len = 0x4
  sram6_seg :                         	org = 0x0002059C, len = 0x1C
  sram7_seg :                         	org = 0x000205B8, len = 0x4
  sram8_seg :                         	org = 0x000205BC, len = 0x1C
  sram9_seg :                         	org = 0x000205D8, len = 0x4
  sram10_seg :                        	org = 0x000205DC, len = 0x1C
  sram11_seg :                        	org = 0x000205F8, len = 0x4
  sram12_seg :                        	org = 0x000205FC, len = 0x1C
  sram13_seg :                        	org = 0x00020618, len = 0x4
  sram14_seg :                        	org = 0x0002061C, len = 0x1C
  sram15_seg :                        	org = 0x00020638, len = 0x4
  sram16_seg :                        	org = 0x0002063C, len = 0x1C
  sram17_seg :                        	org = 0x00020658, len = 0x1F9A8
  iram0_0_seg :                       	org = 0x00400000, len = 0x20000
  dram0_0_seg :                       	org = 0x00420000, len = 0x20000
  dram1_0_seg :                       	org = 0x00440000, len = 0x20000
}

FreeRTOS git

MEMORY
{
  iram0_1_seg :                       	org = 0x00400000, len = 0x1000
  iram0_2_seg :                       	org = 0x00401000, len = 0x17C
  iram0_3_seg :                       	org = 0x00401178, len = 0x20
  iram0_4_seg :                       	org = 0x00401198, len = 0x20
  iram0_5_seg :                       	org = 0x004011B8, len = 0x20
  iram0_6_seg :                       	org = 0x004011D8, len = 0x20
  iram0_7_seg :                       	org = 0x004011F8, len = 0x20
  iram0_8_seg :                       	org = 0x00401218, len = 0x20
  iram0_9_seg :                       	org = 0x00401238, len = 0xEDC4
  ddr1_0_seg :                        	org = 0x37900000, len = 0x400000
}

ну и т.д.

 

Изменено пользователем makc
Удалён оффтопик

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, vasilius сказал:

И не хочется никакой ОС отдавать ресурсы. Да, это из-за жлобского подхода : все хочется на одном камне сделать и дешево. 

Так вроде задумано было, что линукс сидит только на кортексах, а ДСП работает в бареметал, ибо линукс на него не поставить в принципе, ну и это решает задачу реалтайма.  Если б линукс можно было поставить только на одно ядро кортекса, а второе под реалтайм, тогда этот ДСП уже можно было отдать целиком под аудио или еще что... 

Ну а в случае отказа от линукса можно делать вообще что хочешь)))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 minutes ago, mantech said:

Если б линукс можно было поставить только на одно ядро кортекса, а второе под реалтайм

Никто не запрещал )

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Admin: Продолжение оффтопика приведёт к предупреждениям и закрытию темы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, mantech said:

Так вроде задумано было, что линукс сидит только на кортексах, а ДСП работает в бареметал, ибо линукс на него не поставить в принципе

Под ADSP BlackFin есть μClinux.   При этом у Blackfin нет даже MMU.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 07.02.2024 в 13:19, mantech сказал:

Если не сложно будет, попробуйте по быстродействию сравнить обычный код и vliw, будет интересно посмотреть...

CALL0 vs WINDOWED - людское объяснение

image.thumb.png.e31fa093e1e1fe0e2f27e5677d036cb8.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 29.01.2024 в 12:14, mantech сказал:

Неа, просто программно декодить на фулл-хд не быстро получается((

Не подскажет кто, нужно сделать поворот картинки на 90 град, программно получается медленно, а g2d чет не могу заставить это делать, что я делаю не так:

int G2D_ImageRotate(uint16_t *width,uint16_t *height)
{


	uint16_t w;
	uint32_t width1;uint32_t height1;
	*width=640;
	*height=640;

	            G2D_BLT.flag=G2D_BLT_ROTATE90;
	            G2D_BLT.src_image.w=*width; //размер исходного фрейма
	            G2D_BLT.src_image.h=*height;
	          	G2D_BLT.src_image.format=G2D_FMT_ABGR_AVUY8888;
	            G2D_BLT.src_image.pixel_seq=G2D_SEQ_NORMAL;
	          	G2D_BLT.src_rect.x=0; //координаты вырезки
	            G2D_BLT.src_rect.y=0;
	            G2D_BLT.src_rect.w=*width; //размер области вырезки
	            G2D_BLT.src_rect.h=*height;
	            G2D_BLT.dst_image.addr[1]=0;
	            G2D_BLT.dst_image.addr[2]=0;
	           	G2D_BLT.dst_image.w=*width; //размер конечного фрейма (должен совпадать с размерами исходного фрейма для BLT)
	            G2D_BLT.dst_image.h=*height;
	            G2D_BLT.dst_image.format=G2D_FMT_ABGR_AVUY8888;
	            G2D_BLT.dst_image.pixel_seq=G2D_SEQ_NORMAL;
	            G2D_BLT.color=0x000000;
	            G2D_BLT.alpha=0xFF;
	            	 //Адреса откуда копировать для G2D
	            G2D_BLT.src_image.addr[0]= (u32)TMPIMG_BASE; //Y яркостная составляющая
	            	  //куда выводить
	            	  //координаты
	            G2D_BLT.dst_x=0;
	            G2D_BLT.dst_y=0;

	            G2D_BLT.dst_image.addr[0]=(u32)SAVEFG_BASE;// ПОЛУЧАТЕЛЬ !!!
	            cache_flush_range((u32)TMPIMG_BASE ,(u32)(TMPIMG_BASE+TEMP_IMAGESIZE)); //инвалидация кеша - декодер записал в память

	            vsync_flag=g2d_blit(&G2D_BLT);

	            cache_flush_range((u32)SAVEFG_BASE ,(u32)(SAVEFG_BASE+TEMP_IMAGESIZE)); //инвалидация кеша - декодер записал в память

	           /*
	            w=*width;
	            *width=*height;
	            *height=w;
*/
}

 

Изменено пользователем mantech

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1) Поворот и масштабирование не могут одновременно выполняться

2) Поворот и конверсия цветов не могут одновременно выполянться

3) Инвалидация кеша вызывается другой функцией

4) Если процессор не участвует в обработке данных, то инвалидация(invalidate) и сброс с кеша(flush/clean)  не нужны (цепочка: Декодер => G2D) .

 

Ниже - рабочий  поворот на 270 градусов:

void G2D_Run(struct pipeline_dev *pd)
{
 g2d_blt G2D_Rot;

 G2D_Rot.flag=G2D_BLT_ROTATE270;

 G2D_Rot.src_image.w=pd->rm->first_dimension;
 G2D_Rot.src_image.h=pd->rm->second_dimension;

 G2D_Rot.src_rect.w=pd->rm->first_dimension;
 G2D_Rot.src_rect.h=pd->rm->second_dimension;

 G2D_Rot.src_image.format=G2D_FMT_PYUV420UVC;
 G2D_Rot.src_image.pixel_seq=G2D_SEQ_NORMAL;

 G2D_Rot.src_image.addr[0]=(u32)((u8*)pd->rm->address+(((pd->rm->first_dimension*pd->rm->second_dimension)/2)*(((pd->swap^1)*3)+0))); //Y
 G2D_Rot.src_image.addr[1]=(u32)((u8*)pd->rm->address+(((pd->rm->first_dimension*pd->rm->second_dimension)/2)*(((pd->swap^1)*3)+2))); //UV

 G2D_Rot.src_rect.x=0;
 G2D_Rot.src_rect.y=0;

 G2D_Rot.dst_image.addr[0]=(u32)((u8*)pd->wm->address+(((pd->wm->first_dimension*pd->wm->second_dimension)/2)*((pd->swap*3)+0))); //Y
 G2D_Rot.dst_image.addr[1]=(u32)((u8*)pd->wm->address+(((pd->wm->first_dimension*pd->wm->second_dimension)/2)*((pd->swap*3)+2))); //UV

 G2D_Rot.dst_image.w=pd->wm->first_dimension;
 G2D_Rot.dst_image.h=pd->wm->second_dimension;

 G2D_Rot.dst_image.format=G2D_FMT_PYUV420UVC;
 G2D_Rot.dst_image.pixel_seq=G2D_SEQ_NORMAL;

 G2D_Rot.dst_x=WINDOW0_X;
 G2D_Rot.dst_y=WINDOW0_Y;

 G2D_Rot.color=0x000000;
 G2D_Rot.alpha=0xFF;

 g2d_blit(&G2D_Rot);

//...
}

 

Изменено пользователем repstosw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 часов назад, repstosw сказал:

4) Если процессор не участвует в обработке данных, то инвалидация(invalidate) и сброс с кеша(flush/clean)  не нужны (цепочка: Декодер => G2D) .

Данные могут приходить от программного PNG декодера, поэтому сброс кэша нужен, и выходной поток тоже может быть использован в постобработке. 

5 часов назад, repstosw сказал:

1) Поворот и масштабирование не могут одновременно выполняться

2) Поворот и конверсия цветов не могут одновременно выполянться

Об этом я в курсе)

5 часов назад, repstosw сказал:

Ниже - рабочий  поворот на 270 градусов:

Спасибо!

5 часов назад, repstosw сказал:

3) Инвалидация кеша вызывается другой функцией

Странно, но она работает)))

5 часов назад, repstosw сказал:
G2D_Rot.src_image.w=pd->rm->first_dimension;
 G2D_Rot.src_image.h=pd->rm->second_dimension;

Вот тут чет затупил, что это такое? first_dimension - это ширина источника, или что? Или это высота*ширину источника?

5 часов назад, repstosw сказал:
G2D_FMT_PYUV420UVC

Вот здесь, я так понял, что нужно поставить G2D_FMT_ABGR_AVUY8888, т.к. плоскость RGB ?

5 часов назад, repstosw сказал:
G2D_Rot.src_image.addr[0]=(u32)((u8*)pd->rm->address+(((pd->rm->first_dimension*pd->rm->second_dimension)/2)*(((pd->swap^1)*3)+0))); //Y
 G2D_Rot.src_image.addr[1]=(u32)((u8*)pd->rm->address+(((pd->rm->first_dimension*pd->rm->second_dimension)/2)*(((pd->swap^1)*3)+2))); //UV

Тут как понимаю 2 адреса из-за плоскости Y\C  в RGB нужен только первый?

5 часов назад, repstosw сказал:
G2D_Rot.dst_x=WINDOW0_X;
 G2D_Rot.dst_y=WINDOW0_Y;

Ну и вот тут бы пояснительную бригаду)))

Изменено пользователем mantech

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...