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

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

ДА, выдача бита 31 в регистре SMHC_CMD (CMD_LOAD) требует дождаться пока он снимется. Потом ждем разных статусов.

То что там нигде на дожидаются сброса FIFO_RST или SOFT_RST после выдачи SDXC_HARDWARE_RESET - включающей эти биты - сразу бросается в глаза.
т.е. одиночная ошибка - вызывающая отработку ветки со сбросом - следующая быстрая выдача команды встретит нерабочий host.

image.thumb.png.6b545203a7e1afe11c9a16a1a56bfe20.png

Вот про SPI - где помечено красным надо ждать сброса бита запуска - иначе быстро не работает.

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

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


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

On 7/2/2022 at 12:58 AM, GenaSPB said:

ДА, выдача бита 31 в регистре SMHC_CMD (CMD_LOAD) требует дождаться пока он снимется. Потом ждем разных статусов.

То что там нигде на дожидаются сброса FIFO_RST или SOFT_RST после выдачи SDXC_HARDWARE_RESET - включающей эти биты - сразу бросается в глаза.
т.е. одиночная ошибка - вызывающая отработку ветки со сбросом - следующая быстрая выдача команды встретит нерабочий host.

 

Не совсем хорошо понял,  где нужны дополнительные проверки.  С SDXC_HARDWARE_RESET  всего несколько фрагментов кода :

bool_t t113_transfer_command(struct sdhci_cmd_t * cmd, struct sdhci_data_t * dat)
{
	u32_t cmdval = SDXC_START;
	u32_t status = 0;
	ktime_t timeout;

	if(cmd->cmdidx == MMC_STOP_TRANSMISSION)
	{
		timeout = ktime_add_ms(ktime_get(), 1);
		do {
			status = read32(SMHC0_BASE + SD_STAR);
			if(ktime_after(ktime_get(), timeout))
			{
				write32(SMHC0_BASE + SD_GCTL, SDXC_HARDWARE_RESET);
				write32(SMHC0_BASE + SD_RISR, 0xffffffff);
				return FALSE;
			}
		} while(status & SDXC_CARD_DATA_BUSY);
		return TRUE;
	}
  
  
  timeout = ktime_add_ms(ktime_get(),1);
	do {
		status = read32(SMHC0_BASE + SD_RISR);
		if(ktime_after(ktime_get(), timeout) || (status & SDXC_INTERRUPT_ERROR_BIT))
		{
			write32(SMHC0_BASE + SD_GCTL, SDXC_HARDWARE_RESET);
			write32(SMHC0_BASE + SD_RISR, 0xffffffff);
			return FALSE;
		}



	} while(!(status & SDXC_COMMAND_DONE));
  
  if(cmd->resptype & MMC_RSP_BUSY)
	{
		timeout = ktime_add_ms(ktime_get(), 1);
		do {
			status = read32(SMHC0_BASE + SD_STAR);
			if(ktime_after(ktime_get(), timeout))
			{
				write32(SMHC0_BASE + SD_GCTL, SDXC_HARDWARE_RESET);
				write32(SMHC0_BASE + SD_RISR, 0xffffffff);
				return FALSE;
			}



		} while(status & (1 << 9));
	}

  
  
bool_t sdhci_t113_reset(struct sdhci_t * sdhci)
{
	write32(SMHC0_BASE + SD_GCTL, SDXC_HARDWARE_RESET);
	return TRUE;
}

 

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


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

Ожидание сбросов двух reset битов требуется.
И после выдачи команды перед тем как ожидать статуса надо бы дождаться сброса бита запуска.

 

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


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

On 7/1/2022 at 5:58 PM, GenaSPB said:

ДА, выдача бита 31 в регистре SMHC_CMD (CMD_LOAD) требует дождаться пока он снимется. Потом ждем разных статусов.

То что там нигде на дожидаются сброса FIFO_RST или SOFT_RST после выдачи SDXC_HARDWARE_RESET - включающей эти биты - сразу бросается в глаза.
т.е. одиночная ошибка - вызывающая отработку ветки со сбросом - следующая быстрая выдача команды встретит нерабочий host.

 

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


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

Или хотя-бы не начинать следующую пока ранее начатая не закончится.

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


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

Продолжаю приукрашивать https://github.com/ua1arn/hftrx/blob/develop/src/sdram/t113_ddr_decompiled.c
Проставляю где надо volatile - когда идет обращение к регистрам

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


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

Quote

Ожидание сбросов двух reset битов требуется.

 

Сделал сброс этих двух бит после каждого reset:

 

void WaitAfterReset(void)
{
 u32 s;
 do
 {
  s=read32(SMHC0_BASE + SD_GCTL);
 }
 while((s&SDXC_FIFO_RESET)||(s&SDXC_SOFT_RESET)); //ждём пока оба бита FIFO_RST и SOFT_RST не сбросятся
}

 

Quote

И после выдачи команды перед тем как ожидать статуса надо бы дождаться сброса бита запуска.

 

Сделал после каждой команды:

 

void WaitAfterCmd(void)
{
 while(read32(SMHC0_BASE + SD_CMDR)&(1UL<<31));
}

 

Ничего не помогло:  карта может зависнуть в любой момент после циклического чтения.  И не проходит и  пол-минуты.   Карта зависает так, что ре-инит SDHCI не всегда помогает.

Но файловая система работает нормально, картинки выводятся,  до первого зависания.....

 

На всякий случай:

 

#define read32(r)    (*(volatile u32*)(r))
#define write32(r,v) (*(volatile u32*)(r))=(v)

 

Игрался с настройками пинов: на все линии выставил подтяжки к питанию.  Сила драйверов - самая слабая.

Иначе повисания происходили ещё чаще.

 

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

 

Использую эти карты в разных своих проектах: STM32 (SDIO), C6745 (SPI), A13, V3s (SDIO) - работают замечательно и без сбоев.

 

 

1.thumb.jpg.3cae20e78a5dcd03987baf2b2b1dd88c.jpg

 

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

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


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

Причина сбоя карты найдена  и устранена.  Теперь все мои 4 карты работают как часы. :sun_bespectacled:

 

Проблема была из-за этих кусков кода.   Ставился тайм-аут на 1 милли-секунду, в какие-то моменты карта не успевала выдать актуальный статус и далее вся работа с ней рушилась.

 

Заменил на вечные циклы, которые всегда разрываются, если карта исправная.

 

1.thumb.jpg.48f92de46fb5240a09372c6de3409b30.jpg

 

2.thumb.jpg.dc496464cc8711684aed323eda40fd91.jpg

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

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


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

В 02.07.2022 в 13:03, repstosw сказал:

Заменил на вечные циклы, которые всегда разрываются, если карта исправная.

Не рекомендовал бы такое. Был опыт, еще с ИМХ6, там была аналогичная шляпа, потом пользователи начали жаловаться, что система зависает при установке карты. Оказалось, что зависала она со всякими смартбаями и куимо и пр... На рекомендации покупать качественные карты было сказано, "в планшетах и компах они работают, если вы хороший программист - сделайте, чтобы работало и у вас", в принципе они правы...

Сделал так, что если при первом ините уходит в "завис", то делается ресет и еще попытка, если уж совсем "не оно" - тогда выводит сообщение,что карта неисправна, стало гораздо лучше)))

Ну и такие циклы еще очень не любят, когда карту вынимают в процессе инициализации - большая вероятность намертво завесить систему...

В 02.07.2022 в 03:12, repstosw сказал:

A13, V3s (SDIO) - работают замечательно и без сбоев.

Т.е. я правильно понял, что контроллер СД у Т113 несовместим с v3s?

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

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


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

 Сделал так, что если при первом ините уходит в "завис", то делается ресет и еще попытка, если уж совсем "не оно" - тогда выводит сообщение,что карта неисправна, стало гораздо лучше)))

Ну и такие циклы еще очень не любят, когда карту вынимают в процессе инициализации - большая вероятность намертво завесить систему... 

 

Моё мнение таково, что SD-карта это не COM-порт, у которого могут сыпаться ошибки из-за асинхронности.  SD-карта должна работать как часы.  Или как оперативная память.  Всю жизнь в моих проектах карты исправно работают и ни одного сбоя во время работы.

 

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

 

Что касается тайм-аутов и сброса после него - это как мёртвому припарка. Не поможет. Лично проверено. Во всяком случае, тот код с которым работал.  И сбой возникает не при ините, а во время очень быстрых чтений секторов.  Если написать простой цикл чтения рэндомных секторов без задержек, то с теми фрагментами кода - карта вернёт ошибку в течение первой минуты. Дальнейший пере-инит не поможет.

 

Quote

Т.е. я правильно понял, что контроллер СД у Т113 несовместим с v3s?

 

Точно не уверен.  Но портянку от V3s (точнее от A13) не удалось перенести на T113-s3. Она слишком сложная, код с x-boot намного оказался проще и понятнее.

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

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


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

В 02.07.2022 в 14:53, repstosw сказал:

Но портянку от V3s (точнее от A13) не удалось перенести на T113-s3. Она слишком сложная,

Странно, я брал от rdmix512, буквально за пару часов в проект вставил и заработало...

В 02.07.2022 в 14:53, repstosw сказал:

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

Ну тогда ясно, в моих задачах как раз нужно вынимать и вставлять на горячую.

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


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

On 7/2/2022 at 11:17 PM, mantech said:

Странно, я брал от rdmix512, буквально за пару часов в проект вставил и заработало...

 

Это для T113-s3 ?  Или для V3s?

 

То что для A13 было, на V3s взлетела за пол-часа, там только de-assert ресета клоков дописать пришлось.  И учесть что данные не выровнены.

 

Но для T113 этот код приводил в состояние Abort.  Дальнейшие ковыряния я не проводил, мне захотелось новизны - и я взял код SD-карты из x-boot. Ссылки давал на предыдущей странице.

 

  

On 7/2/2022 at 11:17 PM, mantech said:

Ну тогда ясно, в моих задачах как раз нужно вынимать и вставлять на горячую.

 

После завершения чтения-записи, или можно даже во время?   На горячую - пины не отвалятся?  А если статикой долбанёт?  Суппрессоры защитные на линиях есть?  Вспомнил, попадались такие ПК, если в зимнее время с мороза занести флешку и коснуться ей USB-разъема компа, то комп моментально уходит в ребут! :focus:

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

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


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

В 02.07.2022 в 17:24, repstosw сказал:

После завершения чтения-записи, или можно даже во время? 

Да фиг их поймешь, этих пользователей, могут и во время записи дернуть, но чаще просто передергивают, из-за плохого контакта в холдере или адаптере сд карты...

В 02.07.2022 в 17:24, repstosw сказал:

На горячую - пины не отвалятся?

Нет, там предусмотрена горячая замена.

В 02.07.2022 в 17:24, repstosw сказал:

А если статикой долбанёт? 

Это проблематично, карта пластиковая, это не металлические усб флешки)))

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


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

Запустил BitBlt с растяжкой изображения.  Фильтр есть - сглаживает:  Ланцош и Билинейный на выбор.  Какие коэффициенты фильтру задашь - такие и будут.

 

Прозрачность можно делать либо через альфу, либо через цветовой ключ.

 

В режиме растяжки - прозрачность почему-то не работает: ни альфа, ни ключ.  Возможно из-за того, что задействован скейлер (VSU).

В видео задержки искусственны:  вначале 150 мс,  потом VSync,  а потом максимум.

  

 

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

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


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

Прикрутил G2D к ТВ-декодеру (аналоговая камера).  Теперь конверсией YUV420 в RGB занимается графический ускоритель.  Мало того, VSU растягивает исходный кадр камеры 720x576(PAL50) на дисплей 800x480.

  

Сделал замеры сколько конвертитcя кадр с помощью G2D и софтово.

 

G2D справляется за 1,254 мс

CPU софт-алгоритм справляется  за 10,638 мс

 

Разница в 8,5 раз! :biggrin:

 

Мало того, настроил GIC на вложенные прерывания (наконец-то уделил этому время) и установил приоритеты прерываниям:  прерывание TV-декодера по завершению декодирования фрейма (высокий приоритет) и прерывание LCD TCON во время обратного хода луча (низкий приоритет) когда видеопамять не читается видео-контроллером.

    

В первом прерывании - инвалидация кеша и копирование буферов YUV через NEON.   Во втором - запуск G2D: конверсия YUV в RGB и вывод на дисплей.  Никакие VSync() теперь ждать не надо!  Основной цикл программы пустой.

 

Код G2D:

 

 u32 t=AVS_CNT0_REG; //разрешение таймера 6 МГц

 G2D_STRETCHBLT.flag=G2D_BLT_NONE;

 G2D_STRETCHBLT.src_image.addr[0]= (u32)YBUF;            //адрес копии кадра
 G2D_STRETCHBLT.src_image.addr[1]=((u32)CBUF)+1;
 G2D_STRETCHBLT.src_image.addr[2]=((u32)CBUF)+0;

 G2D_STRETCHBLT.src_image.w=TVD_WIDTH;                  //размеры кадра
 G2D_STRETCHBLT.src_image.h=TVD_HEIGHT;

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

 G2D_STRETCHBLT.src_rect.x=0;                           //смещение
 G2D_STRETCHBLT.src_rect.y=0;

 G2D_STRETCHBLT.src_rect.w=TVD_WIDTH;                   //размер
 G2D_STRETCHBLT.src_rect.h=TVD_HEIGHT;

 G2D_STRETCHBLT.dst_image.addr[0]=VIDEO_MEMORY1;        //выводить на плоскость 1 (UI), так как плоскость 0 (VI) не имеет пиксельной альфы (будет шов на краях)
 G2D_STRETCHBLT.dst_image.addr[1]=VIDEO_MEMORY1;
 G2D_STRETCHBLT.dst_image.addr[2]=VIDEO_MEMORY1;

 G2D_STRETCHBLT.dst_image.w=LCD_PIXEL_WIDTH;
 G2D_STRETCHBLT.dst_image.h=LCD_PIXEL_HEIGHT;

 G2D_STRETCHBLT.dst_image.format=G2D_FMT_ABGR_AVUY8888;
 G2D_STRETCHBLT.dst_image.pixel_seq=G2D_SEQ_NORMAL;

 G2D_STRETCHBLT.dst_rect.x=0;                           //коодинаты вывода
 G2D_STRETCHBLT.dst_rect.y=0;

 G2D_STRETCHBLT.dst_rect.w=LCD_PIXEL_WIDTH;             //размер
 G2D_STRETCHBLT.dst_rect.h=LCD_PIXEL_HEIGHT;

 G2D_STRETCHBLT.color=0x000000;                         //цветовой ключ RGB
 G2D_STRETCHBLT.alpha=0xFF;                             //альфа плоскости

 g2d_stretchblit(&G2D_STRETCHBLT);

 UART0_putn(AVS_CNT0_REG-t); //выводим замерянное время

 

Софт-код:

 

 u32 t=AVS_CNT0_REG;

 #define clip(x) __USAT(x,8)  //отсечение значений меньше 0 и больше 255

 //для центрирования кадра на дисплее
 #define X_OFFSET ((LCD_PIXEL_WIDTH-TVD_WIDTH)/2)

 //начало видеопамяти
 static u32 *RGB=(u32*)VIDEO_MEMORY1;

 //конверсия YUV в RGB и запись в видеопамять
 for(u32 y=0;y<LCD_PIXEL_HEIGHT;y++)
 {
  u8 *YB=&YBUF[( y    *TVD_WIDTH)];
  u8 *CB=&CBUF[((y>>1)*TVD_WIDTH)];

  u32 *C=&RGB[(800*y)+X_OFFSET];

  for(u32 x=0;x<TVD_WIDTH;x++)
  {
   s32 Y=((YB[x     ]- 16)*298)+128;
   s32 U=  CB[x&(~1)]-128          ;
   s32 V=  CB[x|  1 ]-128          ;

   u32 R=clip((Y        +(409*V))>>8);
   u32 G=clip((Y-(100*U)-(208*V))>>8);
   u32 B=clip((Y+(516*U)        )>>8);

   *C++=0xFF000000|(B<<16)|(G<<8)|R;
  }
 }

 UART0_putn(AVS_CNT0_REG-t);

 #undef X_OFFSET

 

Здесь R и B компоненты переставлены местами. Сделано это для того, чтобы обеспечить совместимость с PNG-файлами.

 

Резюмируя: чип T113-s3 - лучшее, что есть сегодня! :yes:

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

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


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

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

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

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

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

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

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

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

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

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