GenaSPB 11 1 июля, 2022 Опубликовано 1 июля, 2022 (изменено) · Жалоба ДА, выдача бита 31 в регистре SMHC_CMD (CMD_LOAD) требует дождаться пока он снимется. Потом ждем разных статусов. То что там нигде на дожидаются сброса FIFO_RST или SOFT_RST после выдачи SDXC_HARDWARE_RESET - включающей эти биты - сразу бросается в глаза. т.е. одиночная ошибка - вызывающая отработку ветки со сбросом - следующая быстрая выдача команды встретит нерабочий host. Вот про SPI - где помечено красным надо ждать сброса бита запуска - иначе быстро не работает. Изменено 1 июля, 2022 пользователем GenaSPB Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 1 июля, 2022 Опубликовано 1 июля, 2022 · Жалоба 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; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 1 июля, 2022 Опубликовано 1 июля, 2022 · Жалоба Ожидание сбросов двух reset битов требуется. И после выдачи команды перед тем как ожидать статуса надо бы дождаться сброса бита запуска. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 1 июля, 2022 Опубликовано 1 июля, 2022 · Жалоба On 7/1/2022 at 5:58 PM, GenaSPB said: ДА, выдача бита 31 в регистре SMHC_CMD (CMD_LOAD) требует дождаться пока он снимется. Потом ждем разных статусов. То что там нигде на дожидаются сброса FIFO_RST или SOFT_RST после выдачи SDXC_HARDWARE_RESET - включающей эти биты - сразу бросается в глаза. т.е. одиночная ошибка - вызывающая отработку ветки со сбросом - следующая быстрая выдача команды встретит нерабочий host. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 1 июля, 2022 Опубликовано 1 июля, 2022 · Жалоба Или хотя-бы не начинать следующую пока ранее начатая не закончится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 1 июля, 2022 Опубликовано 1 июля, 2022 · Жалоба Продолжаю приукрашивать https://github.com/ua1arn/hftrx/blob/develop/src/sdram/t113_ddr_decompiled.c Проставляю где надо volatile - когда идет обращение к регистрам Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 2 июля, 2022 Опубликовано 2 июля, 2022 (изменено) · Жалоба 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) - работают замечательно и без сбоев. Изменено 2 июля, 2022 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 2 июля, 2022 Опубликовано 2 июля, 2022 (изменено) · Жалоба Причина сбоя карты найдена и устранена. Теперь все мои 4 карты работают как часы. Проблема была из-за этих кусков кода. Ставился тайм-аут на 1 милли-секунду, в какие-то моменты карта не успевала выдать актуальный статус и далее вся работа с ней рушилась. Заменил на вечные циклы, которые всегда разрываются, если карта исправная. Изменено 2 июля, 2022 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 2 июля, 2022 Опубликовано 2 июля, 2022 (изменено) · Жалоба В 02.07.2022 в 13:03, repstosw сказал: Заменил на вечные циклы, которые всегда разрываются, если карта исправная. Не рекомендовал бы такое. Был опыт, еще с ИМХ6, там была аналогичная шляпа, потом пользователи начали жаловаться, что система зависает при установке карты. Оказалось, что зависала она со всякими смартбаями и куимо и пр... На рекомендации покупать качественные карты было сказано, "в планшетах и компах они работают, если вы хороший программист - сделайте, чтобы работало и у вас", в принципе они правы... Сделал так, что если при первом ините уходит в "завис", то делается ресет и еще попытка, если уж совсем "не оно" - тогда выводит сообщение,что карта неисправна, стало гораздо лучше))) Ну и такие циклы еще очень не любят, когда карту вынимают в процессе инициализации - большая вероятность намертво завесить систему... В 02.07.2022 в 03:12, repstosw сказал: A13, V3s (SDIO) - работают замечательно и без сбоев. Т.е. я правильно понял, что контроллер СД у Т113 несовместим с v3s? Изменено 2 июля, 2022 пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 2 июля, 2022 Опубликовано 2 июля, 2022 (изменено) · Жалоба Сделал так, что если при первом ините уходит в "завис", то делается ресет и еще попытка, если уж совсем "не оно" - тогда выводит сообщение,что карта неисправна, стало гораздо лучше))) Ну и такие циклы еще очень не любят, когда карту вынимают в процессе инициализации - большая вероятность намертво завесить систему... Моё мнение таково, что SD-карта это не COM-порт, у которого могут сыпаться ошибки из-за асинхронности. SD-карта должна работать как часы. Или как оперативная память. Всю жизнь в моих проектах карты исправно работают и ни одного сбоя во время работы. Не планируется вставлять-вынимать карту во время работы. Что касается тайм-аутов и сброса после него - это как мёртвому припарка. Не поможет. Лично проверено. Во всяком случае, тот код с которым работал. И сбой возникает не при ините, а во время очень быстрых чтений секторов. Если написать простой цикл чтения рэндомных секторов без задержек, то с теми фрагментами кода - карта вернёт ошибку в течение первой минуты. Дальнейший пере-инит не поможет. Quote Т.е. я правильно понял, что контроллер СД у Т113 несовместим с v3s? Точно не уверен. Но портянку от V3s (точнее от A13) не удалось перенести на T113-s3. Она слишком сложная, код с x-boot намного оказался проще и понятнее. Изменено 2 июля, 2022 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 2 июля, 2022 Опубликовано 2 июля, 2022 · Жалоба В 02.07.2022 в 14:53, repstosw сказал: Но портянку от V3s (точнее от A13) не удалось перенести на T113-s3. Она слишком сложная, Странно, я брал от rdmix512, буквально за пару часов в проект вставил и заработало... В 02.07.2022 в 14:53, repstosw сказал: Не планируется вставлять-вынимать карту во время работы. Ну тогда ясно, в моих задачах как раз нужно вынимать и вставлять на горячую. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 2 июля, 2022 Опубликовано 2 июля, 2022 (изменено) · Жалоба 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-разъема компа, то комп моментально уходит в ребут! Изменено 2 июля, 2022 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 2 июля, 2022 Опубликовано 2 июля, 2022 · Жалоба В 02.07.2022 в 17:24, repstosw сказал: После завершения чтения-записи, или можно даже во время? Да фиг их поймешь, этих пользователей, могут и во время записи дернуть, но чаще просто передергивают, из-за плохого контакта в холдере или адаптере сд карты... В 02.07.2022 в 17:24, repstosw сказал: На горячую - пины не отвалятся? Нет, там предусмотрена горячая замена. В 02.07.2022 в 17:24, repstosw сказал: А если статикой долбанёт? Это проблематично, карта пластиковая, это не металлические усб флешки))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 3 июля, 2022 Опубликовано 3 июля, 2022 (изменено) · Жалоба Запустил BitBlt с растяжкой изображения. Фильтр есть - сглаживает: Ланцош и Билинейный на выбор. Какие коэффициенты фильтру задашь - такие и будут. Прозрачность можно делать либо через альфу, либо через цветовой ключ. В режиме растяжки - прозрачность почему-то не работает: ни альфа, ни ключ. Возможно из-за того, что задействован скейлер (VSU). В видео задержки искусственны: вначале 150 мс, потом VSync, а потом максимум. Изменено 3 июля, 2022 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 3 июля, 2022 Опубликовано 3 июля, 2022 (изменено) · Жалоба Прикрутил G2D к ТВ-декодеру (аналоговая камера). Теперь конверсией YUV420 в RGB занимается графический ускоритель. Мало того, VSU растягивает исходный кадр камеры 720x576(PAL50) на дисплей 800x480. Сделал замеры сколько конвертитcя кадр с помощью G2D и софтово. G2D справляется за 1,254 мс CPU софт-алгоритм справляется за 10,638 мс Разница в 8,5 раз! Мало того, настроил 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 - лучшее, что есть сегодня! Изменено 3 июля, 2022 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться