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

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

9 минут назад, GenaSPB сказал:

Фоторамка делается?

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

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


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

55 minutes ago, sasamy said:

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

https://www.panelook.com/

Хороший сайт!  В своё время нашёл там IPS LCD 400x240 для консоли Cobura Portable на Parallel RGB interface.

Но вот на разрешение 320x240 IPS с интерфейсом Serial RGB выдаёт около десятка результатов, и ни один не ищется на aliexpress (((

screenshot_2024-01-28_lcd_panel_database

 

Поэтому - озадачился освоением 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.  И ничего менять нельзя:

1.thumb.jpg.7e3088bacee4466c6d23df45d40eb3dc.jpg2.thumb.jpg.7fc53b67090e822f698d307ba16d3d59.jpg

 

Исходя из описания: строб 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);
//...

 

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

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


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

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 какой нибуть выбрать - у них всегда были хорошие матрицы

 

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


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

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

1080 не кратно 16 )))

Но работает, проверил специально)))

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

то попробовал убрать требование кратности 16 по высоте - заработало.

Видимо и в jpeg-е тоже это распространяется.

19 минут назад, sasamy сказал:

только непонятно IPS ли он,

Как непонятно, написано ведь:

Display Mode Normally white/Transmissive  - это обычный TN

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


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

On 1/29/2024 at 1:59 PM, mantech said:

Как непонятно, написано ведь

это в дашите написано, в меню выбора panelook при поиске не написано

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


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

14 минут назад, sasamy сказал:

это в дашите написано, в меню выбора panelook при поиске не написано

Невнимательно смотрите)))

image.thumb.png.1510b791b6c5c4ce643fd4a838b97073.png

Да и по углам обзора все уже понятно, у IPS там > 80 град всегда

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

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


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

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".  Нано-девайс хочется :blush:

Как Nano-Player, который сделал в 2019 г.

 

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

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


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

On 1/29/2024 at 2:21 PM, mantech said:

Невнимательно смотрите

нет, это вы фантазируете - в меню выбора нельзя выбрать тип панели если выставить parallel/serial, возможно они все TN просто

 

menu.png

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


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

On 1/29/2024 at 2:26 PM, repstosw said:

И 3,5 дюйма диагональ - многовато...  Мне бы 2 - 2,4".  Нано-девайс хочется

тогда какая разница какие там углы обзора - всё равно прямо через лупу смотреть надо

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


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

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));

//...

 

 

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


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

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

нет, это вы фантазируете

Ну видать у меня panelook какой-то особенный, скрин я прилагал))) И вообще я там по партномерам в основном ищу...

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

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


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

20 hours ago, repstosw said:

Далее  надо освоить AUTO/FLUSH, чтобы заполнять картинки не через запись регистра, а автоматически с памяти.

Освоил. Всё работает.  Теперь кадр читается из видео-памяти автоматически без участия CPU. Кроме этого, доступны все навороты Display Engine: слои, альфа-блендинг и преобразование YUV в RGB. :dirol:

Из-за того, что дисплей от 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 ---\___/---
*/

 

 

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

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


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

19 hours ago, mantech said:

Но работает, проверил специально)))

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

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


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

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 и браузером в режиме киоска ? или тогда всю контору один вэб дизайнер заменит 🙂

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


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

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

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

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

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

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

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

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

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

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