[FreeScale]/KINETIS2013.11.10 23:30

K20 EVM - Kinetis Cortex-M4 TFT LCD 테스트

K20 EVM - Kinetis Cortex-M4 TFT LCD 테스트



Cortex-M4 코어를 가진 K20 EVM보를 이용하여 TFT-LCD 출력 테스트를 했다.

50Mhz에서 400x320 픽셀의 TFT LCD에 1프레임 출력하는데 18ms정도 소요된다.



[NET-EVB SM] 확장 테스트 보드를 이용하여 SD Card의 BMP이미지를 출력하도록 했다.









K20 EVM TFT LCD 출력 테스트 동영상




K20 TFT LCD 드라이버 소스코드정리
//-----------------------------------------------------------------------------
#define _SPI0_IO_INIT() PORTD_PCR0 = PORT_PCR_MUX(0x2);\
PORTD_PCR1 = PORT_PCR_MUX(0x2);\
PORTD_PCR2 = PORT_PCR_MUX(0x2);\
PORTD_PCR3 = PORT_PCR_MUX(0x2);
                                        
                                        
                                        

#define TFT_DRV_HD66791                 0
#define TFT_DRV_COM44                   1

#define LCD_LAT_BIT BIT16
#define LCD_LAT_PORT GPIOB
#define LCD_LAT_ON() sbi(LCD_LAT_PORT, LCD_LAT_BIT) 
#define LCD_LAT_OFF() cbi(LCD_LAT_PORT, LCD_LAT_BIT) 
#define LCD_DATA_LATCH() LCD_LAT_ON();LCD_LAT_OFF();

#define LCD_EN_BIT BIT17
#define LCD_EN_PORT GPIOB
#define LCD_ENABLE() cbi(LCD_EN_PORT, LCD_EN_BIT) 
#define LCD_DISABLE() sbi(LCD_EN_PORT, LCD_EN_BIT) 

#define LCD_RST_BIT //BIT8
#define LCD_RST_PORT //PORTB
#define LCD_RST_ON() //Sbi(LCD_RST_PORT, LCD_RST_BIT) 
#define LCD_RST_OFF() //Cbi(LCD_RST_PORT, LCD_RST_BIT) 

#define LCD_RS_BIT BIT0
#define LCD_RS_PORT GPIOA
#define LCD_RS_OFF() cbi(LCD_RS_PORT, LCD_RS_BIT) 
#define LCD_RS_ON() sbi(LCD_RS_PORT, LCD_RS_BIT)

#define LCD_WR_BIT BIT3
#define LCD_WR_PORT GPIOA
#define LCD_WR_OFF() cbi(LCD_WR_PORT, LCD_WR_BIT) 
#define LCD_WR_ON() sbi(LCD_WR_PORT, LCD_WR_BIT)

#define LCD_RD_BIT ///BIT9
#define LCD_RD_PORT //PORTB
#define LCD_RD_OFF() //Cbi(LCD_RD_PORT, LCD_RD_BIT) 
#define LCD_RD_ON() //Sbi(LCD_RD_PORT, LCD_RD_BIT)

#define LCD_BL_BIT BIT3
#define LCD_BL_PORT GPIOC
#define LCD_BL_OFF() cbi(LCD_BL_PORT, LCD_BL_BIT) 
#define LCD_BL_ON() sbi(LCD_BL_PORT, LCD_BL_BIT)

#define _LCD_DAT_OUT(Data) PORTD = (Data>>8);\
                                    LCD_DATA_LATCH();\
                                    PORTD = (Data&0xFF);

#define TFTGpioInit() SIM_SCGC5 |= SIM_SCGC5_PORTA_MASK;\
                                        SIM_SCGC5 |= SIM_SCGC5_PORTB_MASK;\
                                        SIM_SCGC5 |= SIM_SCGC5_PORTC_MASK;\
                                        SIM_SCGC5 |= SIM_SCGC5_PORTD_MASK;\
                                        PORTA_PCR0 = PORT_PCR_MUX(1);\
                                        PORTA_PCR3 = PORT_PCR_MUX(1);\
PORTB_PCR16 = PORT_PCR_MUX(1);\
                                        PORTB_PCR17 = PORT_PCR_MUX(1);\
                                        PORTC_PCR3 = PORT_PCR_MUX(1);\
                                        PORTD_PCR0 = PORT_PCR_MUX(1);\
                                        PORTD_PCR1 = PORT_PCR_MUX(1);\
                                        PORTD_PCR2 = PORT_PCR_MUX(1);\
                                        PORTD_PCR3 = PORT_PCR_MUX(1);\
                                        PORTD_PCR4 = PORT_PCR_MUX(1);\
                                        PORTD_PCR5 = PORT_PCR_MUX(1);\
                                        PORTD_PCR6 = PORT_PCR_MUX(1);\
                                        PORTD_PCR7 = PORT_PCR_MUX(1);\
                                        Sbi(GPIOA_PDDR, (BIT0|BIT3));\
                                        Sbi(GPIOB_PDDR, (BIT16|BIT17));\
                                        Sbi(GPIOD_PDDR, 0xFF);



Posted by nexp

댓글을 달아 주세요

[MCU]/adStar2013.03.24 00:52

adStar - SD Card 이용한 7" TFT LCD 테스트

adStar - SD Card 이용한 7" TFT LCD 테스트

 

 

adStar의 자장 큰 장점으로 MCU내에 TFT LCD 컨트롤러가 내장되어 있는 것이다. 때문에 7" TFT LCD도 쉽고 저렴하게 제어 할 수 있다.

 

 

adStar TFT LCD제어 초기화 코드

PORT6, PORT7, PORT8 이 TFT LCD데이터 포트 이므로 기능 설정 레지스터를 LCD 로 설정해 주면된다.

주의 사항으로 JTAG핀과 공통으로 사용하므로 개발할때 불편함이 있다. MUX칩으로 스위칭 할수 있도록 하면 좀더 쉽게 개발할수 있다.

void InitLcd()
{
 Cbi(*R_PAF5, 0xFFC0);//VSYNC,HSYNC,DISP_EN,CRTC_CLK_OUT
 BCKLIGHT_IO_INIT();
 BCKLIGHT_OFF();

 

 *R_PAF6 = 0; //LCD R
 *R_PAF7 = 0; //LCD G
 *R_PAF8 = 0; //LCD B
 
 crtc_clock_init(); 
}

 

 

LCD 종류에 따라 모드 설정이 필요한데 setscreen() 함수에서 설정 가능하다.

초기에 정상동작을 하지 않아 약간의 수정을 해 주니 잘 동작한다.

void setscreen(SCREENRES res,U32 scmode)
{
 switch(res)
 {
 case SCREEN_480x272:
  setscreenex(480,272,scmode,0x0000020D,0x0002002B,0x002D020D ,0x0000011E ,0x0002000C ,0x000E011E );
  break;
 case SCREEN_640x480:
  setscreenex(640,480,scmode,0x00000320,0x00130073,0x00A00320 ,0x0000020D ,0x0007000D ,0x002B020B );
  break;
 case SCREEN_800x480:
  //setscreenex(800,480,scmode,1000,(3<<16)|0,(24<<16)|1000 ,530 ,(23<<16)|2 ,(13<<16)|530 );
  break;
 case SCREEN_800x600:
  setscreenex(800,600,scmode,0x00000420,0x002300b0,0x01000420 ,0x00000274 ,0x0004000a ,0x001a0272 );
  break;
 default:
  debugstring("invalid screen size\r\n");
  return;
 }
}


void setscreenex(U32 width,U32 height,U32 scmode,U32 ht,U32 hs, U32 ha, U32 vt, U32 vs, U32 va)
{
 *R_CRTHT  = ht; //Horizontal Active와 Blank구간을 포함한 Horizontal Total Scan Value
 *R_CRTHS  = hs; //Horizontal Sync 구간의 Start(End) value
 *R_CRTHA  = ha; //Horizontal Active 구간의 Start(End) value
 *R_CRTVT  = vt; //Vertical Active와 blank 구간을 포함한 Vertical Total scan value
 *R_CRTVS  = vs; //Vertical Sync 구간의 Start(End) value
 *R_CRTVA  = va; //Vertical Active구간의 Start(End) value
 screen_w= width;
 screen_h = height;
 
 U32 conval=0;
 debugprintf(" CRTC %d x %d Setting Done\r\n",width,height);
 if(scmode&SCREENMODE_RGB888)
 {
  debugstring("RGB888 Mode\r\n");
  screen_bpp = 32;
  conval |= (1<<13);
 }
 else
 {
  debugstring("RGB565 Mode\r\n");
  screen_bpp = 16;
  conval |= (1<<12);
 }
 conval |= (1<<4);//line pitch not align 512,1024
 *R_CRTWIDTH = screen_w;
 *R_CRTCON = conval;
 drawsetclipwindow(0,0,screen_w,screen_h);
 set_interrupt(INTNUM_FRAMESYNC,framesync_isr);
 enable_interrupt(INTNUM_FRAMESYNC,FALSE);
}

 

 

 

asStar 7" TFT LCD 테스트 동영상

sdCard를 이용하여 7" TFT LCD에 BMP영상을 출력핟록 하고 있다. jpg파일도 가능하지만 JPG->BMP 변환 속도가 느려 BMP보다는 출력속도가 느린것 같다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Posted by nexp

댓글을 달아 주세요

[MCU]/adStar2012.12.25 23:00

[adStar EVM] TFT-LCD 테스트

 [adStar EVM] TFT-LCD 테스트

 

 

 

adStar의 가장 큰 장점은 TFT-LCD 컨트롤러와 16Mbyte의 SDRAM을 내장하고 있어 LCD제어에 있어 아주 편리하다. 특히 16Mbyte의 RAM을 활용하면 이미지 처리에 있어 장점이 많다.

우선 기존 코드를 활용하여 TFT-LCD 모듈을  GPIO방식으로 제어 해 보았다. (추후 내장된 TFT-LCD컨트롤러를 활용하여 어느정도의 성능 향상이 있은지 확인 할 예정이다.)

 

400x240 한프레임 출력 시간은 GPIO방식이지만 20ms 정도로 측정된다.

 

adStar TFT-LCD 테스트 동영상

 

 

adStar TFT LCD 드라이버 코드

//-----------------------------------------------------------------------------
// TFT LCD Driver
#define TFT_DRV_HD66791     0
#define TFT_DRV_COM44     1

#define LCD_LAT_BIT      
#define LCD_LAT_PORT     
#define LCD_LAT_ON()     
#define LCD_LAT_OFF()     
#define LCD_DATA_LATCH()    LCD_LAT_ON();LCD_LAT_OFF();

#define LCD_EN_BIT      BIT5
#define LCD_EN_PORT      GPIO6
#define LCD_ENABLE()     cbi(LCD_EN_PORT, LCD_EN_BIT)
#define LCD_DISABLE()     sbi(LCD_EN_PORT, LCD_EN_BIT)

#define LCD_RST_BIT      BIT2
#define LCD_RST_PORT     GPIO6
#define LCD_RST_OFF()     cbi(LCD_RST_PORT, LCD_RST_BIT)
#define LCD_RST_ON()     sbi(LCD_RST_PORT, LCD_RST_BIT)

#define LCD_RS_BIT      BIT3
#define LCD_RS_PORT      GPIO6
#define LCD_RS_OFF()     cbi(LCD_RS_PORT, LCD_RS_BIT)
#define LCD_RS_ON()      sbi(LCD_RS_PORT, LCD_RS_BIT)

#define LCD_WR_BIT      BIT3
#define LCD_WR_PORT      GPIO5
#define LCD_WR_OFF()     cbi(LCD_WR_PORT, LCD_WR_BIT)
#define LCD_WR_ON()      sbi(LCD_WR_PORT, LCD_WR_BIT)

#define LCD_RD_BIT      BIT2
#define LCD_RD_PORT      GPIO5
#define LCD_RD_OFF()     //cbi(*R_P2oLOW, LCD_RD_BIT)
#define LCD_RD_ON()      //sbi(*R_P2oHIGH, LCD_RD_BIT)

#define LCD_BL_BIT      BIT4
#define LCD_BL_PORT      GPIO6
#define LCD_BL_OFF()     cbi(LCD_BL_PORT, LCD_BL_BIT)
#define LCD_BL_ON()      sbi(LCD_BL_PORT, LCD_BL_BIT)

#define TFTGpioInit()     *R_PAF8 = 0xFFFF;*R_GP8ODIR = 0xFF;\
          *R_PAF7 = 0xFFFF;*R_GP7ODIR = 0xFF;\
          Sbi(*R_GP6ODIR,  BIT2|BIT3|BIT4|BIT5);Sbi(*R_PAF6, GP_CFG(2)|GP_CFG(3)|GP_CFG(4)|GP_CFG(5));\
          Sbi(*R_GP5ODIR,  BIT3);Sbi(*R_PAF5, GP_CFG(3));

 

 

 

 

 

 

Posted by nexp

댓글을 달아 주세요

[DSP]/DSP60002012.02.11 22:00

[TMS320C6720 EVM] TFT LCD테스트

 [TMS320C6720 EVM] TFT LCD테스트


TMS320C6720은 최대 200Mhz까지 동작한다. 속도가 빠르기 때문에 타이밍 조절하는데 좀 고생했다.
EMIF는 SDRAM, SRAM 모두 가능한데 SARM을 위한 CS가 하나밖에 없어 보드상의 Nor Flash CS인 CS2에서 점퍼를 이용해 [LCD_EXP_EVM] 보드 의 CS로 사용했다.

TFT LCD 400x240 한프레임 출력하는데 걸리는 시간은  4.2ms정도 이고(좀더 튜닝을 하면 더 오르겠지만.. EMIF속도가 빨라 Wait Time 설정이 필요하다), 안정적인 구동을 위해 7ms 설정 했다.


TMS320C672x TFT LCD 출력 테스트 동영상




TMS320C6720 SD Card 이미지 출력 예제 동영상
역시 SPI로 SD Card제어하기 때문에 속도는 그리 빠르지 않아 보인다. NAND를 이용하여 테스트 하면 속도가 빨라지지 않을까..




TMS320C6720 TFT LCD 구동 Read/Write 함수

#define LCD_DATA       *(volatile unsigned short*)(0x90000000)

//Write Command
void Lcd_Cmd(unsigned int Data)  
{
 LCD_RS_OFF();

  _LCD_DAT_OUT(Data);

LCD_RS_ON(); 
}

//Write Data
void Lcd_Data(unsigned int Data)  
{
 _LCD_DAT_OUT(Data);
}



TMS320C6720 SD Card 드라이버코드
//-----------------------------------------------------------------------------
// SD Card HAL
#define MMC_CS_PORT      SPI0_PC3
#define MMC_CS_BIT      BIT11

#define MMC_CS_INIT()     Cbi(SPI0_PC0, MMC_CS_BIT);Sbi(SPI0_PC1, MMC_CS_BIT);\
          MMC_CS_HIGH()
          
#define MMC_CS_HIGH()     Led1Off()
#define MMC_CS_LOW()     Led1On()
//#define MMC_CS_LOW()     Cbi(MMC_CS_PORT, MMC_CS_BIT)
//#define MMC_CS_LOW()     Cbi(MMC_CS_PORT, MMC_CS_BIT)

#define MMC_ASSERT_INIT()    MMC_CS_INIT();MMC_CS_HIGH()
#define MMC_ASSERT()     MMC_CS_LOW()
#define MMC_DEASSERT()     MMC_CS_HIGH()

#define MMC_SpiInit()     SPI1_Init()
#define MMC_SendByte     SPI1_WriteReadByte
#define MMC_Send(Data)      SPI1_WriteByte(Data)
#define MMC_Recv()      SPI1_WriteReadByte(0xFF)
#define MMC_RecvP(Data)     MMC_Send(0xFF); (*(Data)=SPI1_ReadByte())
#define MMC_SPISpeed     SPI1_SetSpeed
Posted by nexp

댓글을 달아 주세요

[AVR]/AT90USB2012.01.24 17:46

[AT90USB1287-EX] AT90USB1287 TFT-LCD 출력 속도 테스트

[AT90USB1287-EX] AT90USB1287 TFT-LCD 출력 속도 테스트



16bit 240x400 한프레임 출력 시간은 140ms 정도 걸린다. 8비트 IO 제어 방식이라 빠른 속도를 기대하기는 힘들것 같다.


[AT90USB-EX] TFT LCD출력 속도 테스트 동영상






확장 포트는 표준 8bit 모드 TFT-LCD 모듈제어 포트를 연결할 수 있다.





[AT90USB-EX] TFT LCD Driver 코드
//-----------------------------------------------------------------------------
//TFT LCD Driver
#define TFT_DRV_HD66791                 0
#define TFT_DRV_COM44                   1
#define TFT_DRV_ST7735                    0

#define LCD_LAT_BIT      BIT4
#define LCD_LAT_PORT     PORTB
#define LCD_LAT_ON()     Sbi(LCD_LAT_PORT, LCD_LAT_BIT)
#define LCD_LAT_OFF()     Cbi(LCD_LAT_PORT, LCD_LAT_BIT)
#define LCD_DATA_LATCH()    LCD_LAT_ON();LCD_LAT_OFF();

#define LCD_EN_BIT      BIT6
#define LCD_EN_PORT      PORTB
#define LCD_ENABLE()     Cbi(LCD_EN_PORT, LCD_EN_BIT)
#define LCD_DISABLE()     Sbi(LCD_EN_PORT, LCD_EN_BIT)

#define LCD_RST_BIT      //BIT8
#define LCD_RST_PORT     //PORTB
#define LCD_RST_ON()     //Sbi(LCD_RST_PORT, LCD_RST_BIT)
#define LCD_RST_OFF()     //Cbi(LCD_RST_PORT, LCD_RST_BIT)

#define LCD_RS_BIT      BIT7
#define LCD_RS_PORT      PORTB
#define LCD_RS_OFF()     Cbi(LCD_RS_PORT, LCD_RS_BIT)
#define LCD_RS_ON()      Sbi(LCD_RS_PORT, LCD_RS_BIT)

#define LCD_WR_BIT      BIT0
#define LCD_WR_PORT      PORTE
#define LCD_WR_OFF()     Cbi(LCD_WR_PORT, LCD_WR_BIT)
#define LCD_WR_ON()      Sbi(LCD_WR_PORT, LCD_WR_BIT)

#define LCD_RD_BIT      BIT9
#define LCD_RD_PORT      PORTB
#define LCD_RD_OFF()     //Cbi(LCD_RD_PORT, LCD_RD_BIT)
#define LCD_RD_ON()      //Sbi(LCD_RD_PORT, LCD_RD_BIT)

#define LCD_BL_BIT      BIT5
#define LCD_BL_PORT      PORTB
#define LCD_BL_OFF()     Cbi(LCD_BL_PORT, LCD_BL_BIT)
#define LCD_BL_ON()      Sbi(LCD_BL_PORT, LCD_BL_BIT)

#define _LCD_DAT_OUT(Data)    PORTA = (Data>>8);\
                                     LCD_DATA_LATCH();\
                                     PORTA = (Data&0xFF);

#define TFTGpioInit()     Sbi(DDRB, BIT4|BIT5|BIT6|BIT7); Sbi(DDRA, 0xFF); Sbi(DDRE, BIT0);
//-----------------------------------------------------------------------------

Posted by nexp

댓글을 달아 주세요