免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2094 | 回复: 1
打印 上一主题 下一主题

ucos II+ucGUI+s3c2410+LCD+触摸屏整合 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-20 14:25 |只看该作者 |倒序浏览

[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

论坛徽章:
1
2015亚冠之胡齐斯坦钢铁
日期:2015-05-27 17:00:29
2 [报告]
发表于 2013-05-10 18:18 |只看该作者
好好:wink::wink::wink::wink::wink::wink::wink::wink:
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP