您的位置 首页 新能源

ucos II+ucGUI+s3c2410+LCD+触摸屏整合

环境:ads2.2+ARM9 +s3c2410注意:由于编译器(ads1.2或2.2)对全局变量初始化为0的不完全支持,有时必须手动初始化为0,切记!!!一、ucos II移植到ARM9 s3c241

环境:ads2.2+ARM9 +s3c2410

留意:因为编译器(ads1.2或2.2)对全局变量初始化为0的不完全支撑,有时有必要手动初始化为0,牢记!!!

一、ucos II移植到ARM9 s3c2410

可从官网下载移植代码,根本无需改动。

在os_cpu_a.s中的函数UCOS_IRQHandler中的bl OSIntEnter和bl C_IRQHandler之间刺进如下代码(见邵贝贝,第2版,第104页的阐明:L3.18(4) ):

ldr r0, =OSIntNesting

ldrb r0,[r0]

cmp r0,#1

bne XX

ldr r0,=OSTCBCur

ldr r1,[r0]

str sp,[r1] ; store sp in preempted tasks’s TCB

XX

二、ucGui 390移植到ARM9 s3c2410

1. Lcd驱动:

1) 画点函数:

对dm2410试验板上的lcd,左上为原点(0,0),函数如下:

void LCD2410_SetPixel(int xp, int yp, U16 color, int dindex)

{

*(pLCDBuffer565 + SCREEN_WIDTH*yp + xp) = color;

}

为了到达更快的显现速度,别忘了敞开Cache!!!

2)LCD控制器的初始化,对2410函数如下:

int LCD2410_Init(void)

{

if(!isLcdInit)

{

InitLcdPort();

InitLcdRegs();

isLcdInit = 1;

return 0;

}

return 1;

}

void InitLcdPort(void)

{

// LCD port initialize.

s2410IOP->GPCUP = 0xFFFFFFFF;

s2410IOP->GPCCON = 0xAAAAAAAA;

s2410IOP->GPDUP = 0xFFFFFFFF;

s2410IOP->GPDCON = 0xAAAAAAAA;

s2410IOP->GPGCON = ~(3 8); /* Set LCD_PWREN as output */

s2410IOP->GPGCON |= (1 8);

s2410IOP->GPGDAT |= (1 4); //* Backlight ON

}

void InitLcdRegs(void)

{

s2410LCD->LCDCON1 = (CLKVAL_TFT 8) | //* VCLK = HCLK / ((CLKVAL + 1) * 2) -> About 7 Mhz

(EACH_FRAME 7) | //* 0 : Each Frame

(3 5) | // TFT LCD Pannel

(12 1) | //Y: // 16bpp Mode

(0 0) ; // Disable LCD Output

s2410LCD->LCDCON2 = (VBPD 24) | //* VBPD : ((32-1)0xff) = 0x1f

(LINEVAL_TFT 14) | //* LINEVAL_TFT : 480 – 1

(VFPD 6) | //* VFPD : ((11-1)0xff) = 0xa

(VSPW 0) ; //* VSPW : ((2-1) 0x3f) = 0x1

s2410LCD->LCDCON3 = (HBPD 19) | //* HBPD : ((88-1)0x7f)

(HOZVAL_TFT 8) | //* HOZVAL_TFT : 800 – 1

(HFPD 0) ; //* HFPD : ((40-1)0xff)

s2410LCD->LCDCON4 = (MVAL 8) | //* MVAL : 13

(HSPW 0) ; //* HSPW : ((128-1)0xff)

s2410LCD->LCDCON5 = (0 12) | // BPP24BL : LSB valid

(1 11) | // FRM565 MODE : 5:5:5:1 Format

(0 10) | // INVVCLK : VCLK Falling Edge

(1 9) | // INVVLINE : Inverted Polarity

(1 8) | // INVVFRAME : Inverted Polarity

(0 7) | // INVVD : Normal

(0 6) | // INVVDEN : Normal

(0 5) | // INVPWREN : Normal

(0 4) | // INVENDLINE : Normal

(1 3) | // PWREN : Disable PWREN

(0 2) | // ENLEND : Disable LEND signal

(0 1) | // BSWP : Swap Disable

(1 0) ; // HWSWP : Swap Enable

s2410LCD->LCDSADDR1 = ((FRAMEBUF_DMA_BASE >> 22) 21) |

((M5D(FRAMEBUF_DMA_BASE >> 1)) 0);

s2410LCD->LCDSADDR2=M5D( (FRAMEBUF_DMA_BASE+(LCD_XSIZE_TFT*LCD_YSIZE_TFT*2))>>1 );

s2410LCD->LCDSADDR3=(((LCD_XSIZE_TFT-LCD_XSIZE_TFT)/1)11)|(LCD_XSIZE_TFT/1);

s2410LCD->LCDINTMSK|=(3); // MASK LCD Sub Interrupt

s2410LCD->LPCSEL=(~7); // Disable LPC3600

s2410LCD->TPAL=0; // Disable Temp Palette

s2410LCD->LCDCON1 |= 1;

}

其间,部分变量、常量界说如下:

#define LCD_XSIZE_TFT (800)

#define LCD_YSIZE_TFT (480)

#define HOZVAL_TFT (LCD_XSIZE_TFT-1)

#define LINEVAL_TFT (LCD_YSIZE_TFT-1)

#define MVAL (13)

#define MVAL_USED (1)

#define EACH_FRAME (0)

//STN/CSTN timing parameter for LCBHBT161M(NANYA)

#define WLH (3)

#define WDLY (3)

#define LINEBLANK (1 0xff)

#define VBPD ((32-1)0xff)

#define VFPD ((11-1)0xff)

#define VSPW ((2-1) 0x3f)

#define HBPD ((88-1)0x7f)

#define HFPD ((40-1)0xff)

#define HSPW ((128-1)0xff)

#define CLKVAL_TFT (0)

#define M5D(n) ((n) 0x1fffff)

#define SCREEN_WIDTH 800 //800

#define SCREEN_HEIGHT 480 //480

#define FRAMEBUF_DMA_BASE (0x35000000)

U16* pLCDBuffer565=(U16*)FRAMEBUF_DMA_BASE;

3)填写配置文件LCDConf.h

#define LCD_XSIZE (800) /* X-resolution of LCD, Logical coor. */

#define LCD_YSIZE (480) /* Y-resolution of LCD, Logical coor. */

#define LCD_BITSPERPIXEL (16)

#define LCD_CONTROLLER 1

#define LCD_SWAP_RB_0 1

2.触摸屏驱动:

触摸屏驱动计算出触摸屏的坐标(x,y),对dm2410试验板上的触摸屏,左下为原点,但不一定是(0,0)。两个函数:

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/xinnengyuan/297741.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部