- 论坛徽章:
- 0
|
[color="#0000ff"]环境:ads2.2+ARM9 +s3c2410
[color="#ff0000"]注意:由于编译器(ads1.2或2.2)对全局变量初始化为0的不完全支持,有时必须手动初始化为0,切记!!!
一、ucos II移植到ARM9 s3c2410
可从官网下载移植代码,基本无需改动。
在os_cpu_a.s中的函数UCOS_IRQHandler中的bl OSIntEnter和bl C_IRQHandler之间插入如下代码([color="#0000ff"]见邵贝贝,第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;
}
[color="#0000ff"]为了达到更快的显示速度,别忘了开启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 GPGCON |= (1 GPGDAT |= (1 LCDCON1 = (CLKVAL_TFT About 7 Mhz
(EACH_FRAME LCDCON2 = (VBPD LCDCON3 = (HBPD LCDCON4 = (MVAL LCDCON5 = (0 LCDSADDR1 = ((FRAMEBUF_DMA_BASE >> 22) > 1)) LCDSADDR2=M5D( (FRAMEBUF_DMA_BASE+(LCD_XSIZE_TFT*LCD_YSIZE_TFT*2))>>1 );
s2410LCD->LCDSADDR3=(((LCD_XSIZE_TFT-LCD_XSIZE_TFT)/1)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)。两个函数:
1) 设置中断向量,开中断:
void SetTSInterrupt(void)
{
rADCDLY = (50000);
rADCCON = (1pLCD_HL = &LCD_HL_APIList;
pContext->pAFont = GUI_DEFAULT_FONT;
pContext->pClipRect_HL = &GUI_Context.ClipRect;
pContext->PenSize = 1;
[color="#ff0000"] pContext->DrawMode = GUI_DRAWMODE_NORMAL;//add
pContext->TextMode = GUI_TEXTMODE_NORMAL;//add
pContext->TextAlign = GUI_TA_LEFT|GUI_TA_TOP;//add
pContext->AA_HiResEnable = 0;//add
/* Variables in WM module */
#if GUI_WINSUPPORT
pContext->hAWin = WM_GetDesktopWindow();
#endif
/* Variables in GUI_AA module */
pContext->AA_Factor = 3;
LCD_SetBkColor(GUI_DEFAULT_BKCOLOR);
LCD_SetColor(GUI_DEFAULT_COLOR);
}
修改如下函数为:(位于[color="#ff0000"]GUIAlloc.c)
[color="#0000ff"]void GUI_ALLOC_Init(void) {
........
GUI_ALLOC.NumUsedBytes = 0;
[color="#ff0000"] memset(&aBlock,0,sizeof(aBlock[0])*GUI_MAXBLOCKS);/////self
aBlock[0].Size = (1OSTCBPrio));
}
void GUI_X_WaitEvent (void)
{
INT8U err;
(void)OSMboxPend(EventMbox, 0, &err);
}
void GUI_X_SignalEvent (void)
{
(void)OSMboxPost(EventMbox, (void *)1);
}
void GUI_X_InitOS(void)
{
DispSem = OSSemCreate(1);
EventMbox = OSMboxCreate((void *)0);
}
void GUI_X_ExecIdle(void) {GUI_X_Delay(1);}
[color="#0000ff"]void GUI_X_Init(void) {
SetTSInterrupt();//此处接入触摸屏的中断设置
GUI_TOUCH_SetDefaultCalibration();//用默认值校准触摸屏
}
四、与触摸屏有关的函数:
1、4个功能函数:
void GUI_TOUCH_X_ActivateX(void) {//空}
void GUI_TOUCH_X_ActivateY(void) {//空}
int GUI_TOUCH_X_MeasureX(void) {
return TX;//返回触摸坐标x
}
int GUI_TOUCH_X_MeasureY(void){
return TY; //返回触摸坐标y
}
2、触摸屏校准任务(进程, 来自示例程序:TOUCH_Calibrate.c):
#if TOUCH_NEED_CALIBRATE
static const char * _acPos[] = {
"(upper left position)",
"(lower right position)"
};
static void _WaitForPressedState(int Pressed) {
GUI_PID_STATE State;
/* Wait until touch is pressed */
do {
GUI_TOUCH_GetState(&State);
if (State.Pressed == Pressed) {
break;
}
GUI_Delay (100);
} while (1);
}
static void _DispStringCentered(const char * pString) {
GUI_RECT Rect;
Rect.x0 = Rect.y0 = 0;
Rect.x1 = LCD_GetXSize() - 1;
Rect.y1 = LCD_GetYSize() - 1;
GUI_DispStringInRect(pString, &Rect, GUI_TA_HCENTER | GUI_TA_VCENTER);
}
static void _GetPhysValues(int LogX, int LogY, int * pPhysX, int * pPhysY, const char * pString) {
char acText[] = "Press here";
GUI_RECT Rect;
int FontSizeY, Align;
FontSizeY = GUI_GetFontSizeY();
GUI_Clear();
GUI_SetColor(GUI_BLACK);
_DispStringCentered("Runtime calibration,\n"
"please touch the screen\n"
"at the center of the ring."); /* Ask user to press the touch */
/* Calculate the rectangle for the string */
Rect.y0 = LogY - FontSizeY;
Rect.y1 = LogY + FontSizeY;
if (LogX xMax) | (y yMax)) {
GUI_TOUCH_StoreUnstable(-1,-1);
} else {
x = AD2X(x);
y = AD2Y(y);
GUI_TOUCH_StoreUnstable(x,y);
}
/* Reset state machine */
[color="#ff0000"] //ReadState=0;
// break;
//}
#endif /* WIN32 */
}
五、 GUI多任务测试:
测试程序:MT_MultiTasking.c
欢迎来信交流:
hongyhm@hotmail.com
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/96145/showart_1933696.html |
|