GenaSPB 11 29 января Опубликовано 29 января · Жалоба Фоторамка делается? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 29 января Опубликовано 29 января · Жалоба 9 минут назад, GenaSPB сказал: Фоторамка делается? Неа, просто программно декодить на фулл-хд не быстро получается(( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 29 января Опубликовано 29 января (изменено) · Жалоба 55 minutes ago, sasamy said: а какой смысл - современные панели давно не используют свою память и разрешения уже на порядки больше. Нашёл очередной хороший вариант, сначала через https://www.panelook.com/ Хороший сайт! В своё время нашёл там IPS LCD 400x240 для консоли Cobura Portable на Parallel RGB interface. Но вот на разрешение 320x240 IPS с интерфейсом Serial RGB выдаёт около десятка результатов, и ни один не ищется на aliexpress ((( Поэтому - озадачился освоением TCON в режиме CPU IF i8080. Так как для маленьких разрешений подавляющее большинство дисплеев на i8080. И на телефонах типа Nokia E71/E72, Samsung S5230 - отличные IPS дисплеи, но все на i8080 :))) 39 minutes ago, mantech said: Походу так и придется, неудобные эти округления больно((( Хорошо, хоть в 1920х1080 все норм без округлений... Когда делал H264 кодер для V3s, то попробовал убрать требование кратности 16 по высоте - заработало. 1080 не кратно 16 ))) 4 hours ago, repstosw said: Это всё хорошо, но я не увидел где устанавливается ширина стробов чтения, записи. И прочие вещи, которые немаловажны Итак, я запустил TCON в режиме i8080 🙂 По крайней мере, инит контроллера дисплея(от телефона Philips Xenium X503) и картинка выводится. Пока в "ручном" режиме - запись данных через регистр. В перспективе - довести до ума: сделать чтобы кадр читался из видео-памяти и автоматически рисовался на дисплей. Что касается времянок(запись в регистры с помощью CPU i8080), то они завязаны на DCLK. И ничего менять нельзя: Исходя из описания: строб WR - проинвертированная копия DCLK. Остальные сигналы привязаны к нему. Тоесть, пространства для манёвра - нет. А строб RD всё время =1. Тоесть чтение запрещено. И это непонятно: как тогда делать чтение? Пробовал считать ID с регистра 0 дисплея - не возвращается код 0x9328, возвращается 0. Максимальная частота DCLK = 24 МГц. Выше, данный дисплей уже не работает. Далее надо освоить AUTO/FLUSH, чтобы заполнять картинки не через запись регистра, а автоматически с памяти. В спойлере рабочий код для дисплея X503 (контроллер ILI9328) через TCON CPU/i80 (не включая настройку TCON): Spoiler #include "Picture.h" void ILI9328_Reset(u8 r) { if(r)PD_DAT|= (1<<17); else PD_DAT&=~(1<<17); dsb(); } void LCD_Reset(void) { ILI9328_Reset(1); DelayMS(1); ILI9328_Reset(0); DelayMS(10); ILI9328_Reset(1); DelayMS(1); } #define LCD_CPU_IF_REG (*((IO u32*)(T113_TCONLCD_BASE+0x60))) #define LCD_CPU_WR_REG (*((IO u32*)(T113_TCONLCD_BASE+0x64))) #define LCD_CPU_RD0_REG (*((IO u32*)(T113_TCONLCD_BASE+0x68))) #define LCD_CPU_RD1_REG (*((IO u32*)(T113_TCONLCD_BASE+0x6C))) #define CONVERT(b) ((((b)&0x1F)<<3)|(((b)&0xE0)<<5)) static inline void LCD_WRWait(void) { while(LCD_CPU_IF_REG&(1<<23)); //WR wait } void LCD_Index(u32 index) { LCD_CPU_IF_REG&=~(1<<25); //CA=0 LCD_CPU_WR_REG=CONVERT(index>>8); //High Byte LCD_WRWait(); LCD_CPU_WR_REG=CONVERT(index&0xFF); //Low Byte LCD_WRWait(); } void LCD_Data(u32 data) { LCD_CPU_IF_REG|=(1<<25); //CA=1 LCD_CPU_WR_REG=CONVERT(data>>8); //High Byte LCD_WRWait(); LCD_CPU_WR_REG=CONVERT(data&0xFF); //Low Byte LCD_WRWait(); } void LCD_Out(u32 index,u32 data) { LCD_Index(index); LCD_Data(data); } void LCD_DataPacket(u16 *d,u32 n) { LCD_CPU_IF_REG|=(1<<25); //CA=1 while(n--) { LCD_CPU_WR_REG=CONVERT(*d>>8); //High Byte LCD_WRWait(); LCD_CPU_WR_REG=CONVERT(*d&0xFF); //Low Byte LCD_WRWait(); d++; } } #define LCD_REG_0 0x00 #define LCD_REG_1 0x01 #define LCD_REG_2 0x02 #define LCD_REG_3 0x03 #define LCD_REG_4 0x04 #define LCD_REG_7 0x07 #define LCD_REG_8 0x08 #define LCD_REG_9 0x09 #define LCD_REG_10 0x0A #define LCD_REG_12 0x0C #define LCD_REG_13 0x0D #define LCD_REG_15 0x0F #define LCD_REG_16 0x10 #define LCD_REG_17 0x11 #define LCD_REG_18 0x12 #define LCD_REG_19 0x13 #define LCD_REG_32 0x20 #define LCD_REG_33 0x21 #define LCD_REG_34 0x22 #define LCD_REG_41 0x29 #define LCD_REG_43 0x2B #define LCD_REG_48 0x30 #define LCD_REG_49 0x31 #define LCD_REG_50 0x32 #define LCD_REG_53 0x35 #define LCD_REG_54 0x36 #define LCD_REG_55 0x37 #define LCD_REG_56 0x38 #define LCD_REG_57 0x39 #define LCD_REG_60 0x3C #define LCD_REG_61 0x3D #define LCD_REG_80 0x50 #define LCD_REG_81 0x51 #define LCD_REG_82 0x52 #define LCD_REG_83 0x53 #define LCD_REG_96 0x60 #define LCD_REG_97 0x61 #define LCD_REG_106 0x6A #define LCD_REG_128 0x80 #define LCD_REG_129 0x81 #define LCD_REG_130 0x82 #define LCD_REG_131 0x83 #define LCD_REG_132 0x84 #define LCD_REG_133 0x85 #define LCD_REG_144 0x90 #define LCD_REG_146 0x92 #define LCD_REG_147 0x93 #define LCD_REG_149 0x95 #define LCD_REG_151 0x97 #define LCD_REG_152 0x98 #define LCD_REG_161 0xA1 #define LCD_REG_162 0xA2 #define LCD_REG_165 0xA5 #define ILI9328_LCD_PIXEL_WIDTH ((u16)320) #define ILI9328_LCD_PIXEL_HEIGHT ((u16)240) void ili9328_DisplayOn(void) { /* Power On sequence ---------------------------------------------------------*/ LCD_Out(LCD_REG_16, 0x0000); /* SAP, BT[3:0], AP, DSTB, SLP, STB */ LCD_Out(LCD_REG_17, 0x0000); /* DC1[2:0], DC0[2:0], VC[2:0] */ LCD_Out(LCD_REG_18, 0x0000); /* VREG1OUT voltage */ LCD_Out(LCD_REG_19, 0x0000); /* VDV[4:0] for VCOM amplitude */ DelayMS(20); LCD_Out(LCD_REG_16, 0x14B0); /* SAP, BT[3:0], AP, DSTB, SLP, STB */ DelayMS(5); LCD_Out(LCD_REG_17, 0x0007); /* DC1[2:0], DC0[2:0], VC[2:0] */ DelayMS(5); LCD_Out(LCD_REG_18, 0x0018); /* VREG1OUT voltage */ DelayMS(5); LCD_Out(LCD_REG_19, 0x1000); /* VDV[4:0] for VCOM amplitude */ LCD_Out(LCD_REG_41, 0x0015); /* VCM[4:0] for VCOMH */ DelayMS(5); /* Display On */ LCD_Out(LCD_REG_7, 0x0133); /* 262K color and display ON */ DelayMS(50); } void ili9328_DisplayOff(void) { /* Display Off */ LCD_Out(LCD_REG_7, 0x0); /* Power Off sequence ---------------------------------------------------------*/ LCD_Out(LCD_REG_16, 0x0000); /* SAP, BT[3:0], AP, DSTB, SLP, STB */ LCD_Out(LCD_REG_17, 0x0000); /* DC1[2:0], DC0[2:0], VC[2:0] */ LCD_Out(LCD_REG_18, 0x0000); /* VREG1OUT voltage */ LCD_Out(LCD_REG_19, 0x0000); /* VDV[4:0] for VCOM amplitude*/ LCD_Out(LCD_REG_41, 0x0000); /* VCM[4:0] for VCOMH */ } void ili9328_SetDisplayWindow(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height) { /* Horizontal GRAM Start Address */ LCD_Out(LCD_REG_80, (Xpos)); /* Horizontal GRAM End Address */ LCD_Out(LCD_REG_81, (Xpos + Height - 1)); /* Vertical GRAM Start Address */ LCD_Out(LCD_REG_82, (Ypos)); /* Vertical GRAM End Address */ LCD_Out(LCD_REG_83, (Ypos + Width - 1)); } void ili9328_SetCursor(uint16_t Xpos, uint16_t Ypos) { LCD_Out(LCD_REG_32, Xpos); LCD_Out(LCD_REG_33, Ypos); } void LCD_Init(void) { /* Start Initial Sequence ------------------------------------------------*/ LCD_Out(LCD_REG_0, 0x0001); /* Start internal OSC. */ LCD_Out(LCD_REG_1, 0x0100); /* Set SS and SM bit */ LCD_Out(LCD_REG_2, 0x0400 /*0x0700*/ ); /* Set 1 line inversion */ LCD_Out(LCD_REG_3, 0x1018); /* Set GRAM write direction and BGR=1. */ LCD_Out(LCD_REG_4, 0x0000); /* Resize register */ LCD_Out(LCD_REG_8, /*0x0302*/ 0x0808); /* Set the back porch and front porch */ LCD_Out(LCD_REG_9, 0x0000); /* Set non-display area refresh cycle ISC[3:0] */ LCD_Out(LCD_REG_10, 0x0000); /* FMARK function */ LCD_Out(LCD_REG_12, 0x0000); /* RGB interface setting */ LCD_Out(LCD_REG_13, 0x0000); /* Frame marker Position */ LCD_Out(LCD_REG_15, 0x0000); /* RGB interface polarity */ ili9328_DisplayOn(); /* Adjust the Gamma Curve (ILI9328)---------------------------------------*/ LCD_Out(LCD_REG_48, 0x0000); LCD_Out(LCD_REG_49, 0x0107); LCD_Out(LCD_REG_50, 0x0000); LCD_Out(LCD_REG_53, 0x0203); LCD_Out(LCD_REG_54, 0x0402); LCD_Out(LCD_REG_55, 0x0000); LCD_Out(LCD_REG_56, 0x0207); LCD_Out(LCD_REG_57, 0x0000); LCD_Out(LCD_REG_60, 0x0203); LCD_Out(LCD_REG_61, 0x0403); /* Set GRAM area ---------------------------------------------------------*/ ili9328_SetDisplayWindow(0, 0, ILI9328_LCD_PIXEL_WIDTH, ILI9328_LCD_PIXEL_HEIGHT); LCD_Out(LCD_REG_96, 0xA700); /* Gate Scan Line(GS=1, scan direction is G320~G1) */ LCD_Out(LCD_REG_97, 0x0003); /* NDL,VLE, REV */ LCD_Out(LCD_REG_106, 0x0000); /* set scrolling line */ /* Partial Display Control -----------------------------------------------*/ LCD_Out(LCD_REG_128, 0x0000); LCD_Out(LCD_REG_129, 0x0000); LCD_Out(LCD_REG_130, 0x0000); LCD_Out(LCD_REG_131, 0x0000); LCD_Out(LCD_REG_132, 0x0000); LCD_Out(LCD_REG_133, 0x0000); /* Panel Control ---------------------------------------------------------*/ LCD_Out(LCD_REG_144, 0x0010); LCD_Out(LCD_REG_146, 0x0000); LCD_Out(LCD_REG_147, 0x0003); LCD_Out(LCD_REG_149, 0x0110); LCD_Out(LCD_REG_151, 0x0000); LCD_Out(LCD_REG_152, 0x0000); /* set GRAM write direction and BGR = 1 */ /* I/D=00 (Horizontal : increment, Vertical : decrement) */ /* AM=1 (address is updated in vertical writing direction) */ LCD_Out(LCD_REG_3, 0x1018); //Refresh Rate 120 Hz LCD_Out(LCD_REG_43,0x000E); /* Set the Cursor */ ili9328_SetCursor(0,-1); //почему-то -1 вместо 0 должно быть, иначе картинка перекручивается /* Prepare to write GRAM */ LCD_Index(LCD_REG_34); } int main(void) { LowLevelInit(); lcd_init(); //init TCON LCD_Reset(); LCD_Init(); LCD_DataPacket((u16*)Picture,320*240); while(1); //... Изменено 29 января пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 0 29 января Опубликовано 29 января · Жалоба On 1/29/2024 at 12:29 PM, repstosw said: Но вот на разрешение 320x240 IPS с интерфейсом Serial RGB выдаёт около десятка результатов, c Parallel/Serial выдает 108, первый попавшйися LQ035NC111 http://aitendo3.sakura.ne.jp/aitendo_data/product_img/lcd/tft/AT035DL01/LQ035NC111.pdf на али две страницы предложений, только непонятно IPS ли он, так можно просто LG какой нибуть выбрать - у них всегда были хорошие матрицы Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 29 января Опубликовано 29 января · Жалоба 1 час назад, repstosw сказал: 1080 не кратно 16 ))) Но работает, проверил специально))) 1 час назад, repstosw сказал: то попробовал убрать требование кратности 16 по высоте - заработало. Видимо и в jpeg-е тоже это распространяется. 19 минут назад, sasamy сказал: только непонятно IPS ли он, Как непонятно, написано ведь: Display Mode Normally white/Transmissive - это обычный TN Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 0 29 января Опубликовано 29 января · Жалоба On 1/29/2024 at 1:59 PM, mantech said: Как непонятно, написано ведь это в дашите написано, в меню выбора panelook при поиске не написано Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 29 января Опубликовано 29 января (изменено) · Жалоба 14 минут назад, sasamy сказал: это в дашите написано, в меню выбора panelook при поиске не написано Невнимательно смотрите))) Да и по углам обзора все уже понятно, у IPS там > 80 град всегда Изменено 29 января пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 29 января Опубликовано 29 января (изменено) · Жалоба 46 minutes ago, sasamy said: c Parallel/Serial выдает 108, первый попавшйися LQ035NC111 Уже запускал его: Он не IPS. Обычный TN. Но контраст хороший 400:1, достаточно яркий 350 кд/м^2. даже анти-бликовое покрытие есть (обнаружил не сразу - была наклеена защитная плёнка). Но не дотягивает до идеала углами обзора. Если смотреть сбоку, то цвета немного меняются и освещение падает. На Али есть модификации этого дисплея, и даже с пометкой "IPS". Но к сожалению, контакты на шлейфе урезаны - его в Serial RGB надо загонять через инит SPI. Оригинал LQ035NC111 можно использовать в Serial RGB специальными контактами на шлейфе. 8 minutes ago, mantech said: Да и по углам обзора все уже понятно, у IPS там > 80 град всегда Да. Подтверждаю: особенно малый угол выходит снизу (если смотреть со стороны шлейфа). С IPS такого безобразия нет. Я бы его поставил в конструкцию, если не найду решения лучше. И 3,5 дюйма диагональ - многовато... Мне бы 2 - 2,4". Нано-девайс хочется Как Nano-Player, который сделал в 2019 г. Изменено 29 января пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 0 29 января Опубликовано 29 января · Жалоба On 1/29/2024 at 2:21 PM, mantech said: Невнимательно смотрите нет, это вы фантазируете - в меню выбора нельзя выбрать тип панели если выставить parallel/serial, возможно они все TN просто Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 0 29 января Опубликовано 29 января · Жалоба On 1/29/2024 at 2:26 PM, repstosw said: И 3,5 дюйма диагональ - многовато... Мне бы 2 - 2,4". Нано-девайс хочется тогда какая разница какие там углы обзора - всё равно прямо через лупу смотреть надо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 29 января Опубликовано 29 января · Жалоба 1 hour ago, sasamy said: тогда какая разница какие там углы обзора - всё равно прямо через лупу смотреть надо Завитки на денежных купюрах без лупы видите? Я вижу. ))) 4 hours ago, repstosw said: Исходя из описания: строб WR - проинвертированная копия DCLK. Остальные сигналы привязаны к нему. Тоесть, пространства для манёвра - нет. А строб RD всё время =1. Тоесть чтение запрещено. И это непонятно: как тогда делать чтение? Сделал чтение ID чипа из регистра. Нужно было запретить вывод на линии D0..D23 перед чтением: Spoiler #define LCD_CPU_RD0_REG (*((IO u32*)(T113_TCONLCD_BASE+0x68))) #define LCD_CPU_RD1_REG (*((IO u32*)(T113_TCONLCD_BASE+0x6C))) #define LCD_IO_TRI_REG (*((IO u32*)(T113_TCONLCD_BASE+0x8C))) #define DECONVERT(b) ((((b)&0x00F8)>>3)|(((b)&0x1C00)>>5)) static inline void LCD_RDWait(void) { while(LCD_CPU_IF_REG&(1<<22)); //RD wait } u32 LCD_In(u32 index) { LCD_Index(index); LCD_CPU_IF_REG|=(1<<25); //CA=1 LCD_IO_TRI_REG|=0x00FFFFFF; //D0..D23 output disable (void)LCD_CPU_RD0_REG; LCD_RDWait(); u32 data=DECONVERT(LCD_CPU_RD1_REG)<<8; //High Byte (void)LCD_CPU_RD0_REG; LCD_RDWait(); data|=DECONVERT(LCD_CPU_RD1_REG); //Low Byte LCD_IO_TRI_REG&=~0x00FFFFFF; //D0..D23 output enable return data; } int main(void) { LowLevel_Init(); lcd_init(); //TCON init LCD_Reset(); printf("Controller ID: 0x%04X\n",(u16)LCD_In(0x0000)); //... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 29 января Опубликовано 29 января (изменено) · Жалоба 5 часов назад, sasamy сказал: нет, это вы фантазируете Ну видать у меня panelook какой-то особенный, скрин я прилагал))) И вообще я там по партномерам в основном ищу... Изменено 29 января пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 30 января Опубликовано 30 января (изменено) · Жалоба 20 hours ago, repstosw said: Далее надо освоить AUTO/FLUSH, чтобы заполнять картинки не через запись регистра, а автоматически с памяти. Освоил. Всё работает. Теперь кадр читается из видео-памяти автоматически без участия CPU. Кроме этого, доступны все навороты Display Engine: слои, альфа-блендинг и преобразование YUV в RGB. Из-за того, что дисплей от X503 не имеет ножки FMARK или VSYNC, не могу синхронизировать вывод кадра с TCON на дисплей. Поэтому вывод пикселей на дисплей идёт автоматически без синхронизации . Spoiler int main(void) { LowLevel_Init(); //Write Picture to Video Memory u16 *P=(u16*)Picture; for(int i=0;i<LCD_PIXEL_WIDTH*LCD_PIXEL_HEIGHT;i++)*(u16*)(VIDEO_MEMORY0+(i*2))=*P++; xthal_dcache_all_writeback(); lcd_init(); //init TCON LCD_Reset(); LCD_Init(); LCD_CPU_IF_REG|=(1<<26); //DA=1 LCD_CPU_IF_REG|=(1<<17); //AUTO=1 while(1); } //240x320 LCD /* pdat.timing.pixel_clock_hz = 5806080*2; //Serial - need 2x Clock: 5806080/(240+0+24+24)/(320+0+8+8) = 60 FPS (real: 61.4 Hz) pdat.timing.h_sync_len = 0; pdat.timing.h_back_porch =24; pdat.timing.h_front_porch =24; pdat.timing.v_sync_len = 0; pdat.timing.v_back_porch = 8; pdat.timing.v_front_porch = 8; pdat.timing.h_sync_active = 1; //RD ---\___/--- pdat.timing.v_sync_active = 1; //CS ---\___/--- pdat.timing.den_active = 1; //RS pdat.timing.clk_active = 1; //WR ---\___/--- */ Изменено 30 января пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 30 января Опубликовано 30 января · Жалоба 19 hours ago, mantech said: Но работает, проверил специально))) На счёт кратности высоты 16. На всякий случай лучше проверить, что декодер не пишет в память за пределы буфера. Возможна порча памяти при декодировании, если проигнорировать требование кратности 16: декодер может записать недостающие строки ниже (за пределами выделенного буфера). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 0 30 января Опубликовано 30 января · Жалоба On 1/29/2024 at 11:35 AM, sasamy said: с таким контроллером HSD070PWW1 https://datasheetspdf.com/pdf-file/1098796/HannStar/HSD070PWW1-B01/1 Asus MeMO Pad ME172V перепутал модель, Asus MeMo Pad ME171 без доставки 500 руб https://asus-battery.ru/prod/matrica-s-tachskrinom-modul-dlya-asus-eee-pad-memo-me171 On 1/29/2024 at 12:14 PM, mantech said: Неа, просто программно декодить на фулл-хд не быстро получается(( почему просто не поставить одноплатник с Linux и браузером в режиме киоска ? или тогда всю контору один вэб дизайнер заменит 🙂 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться