Chinaunix首页 | 论坛 | 博客
  • 博客访问: 380048
  • 博文数量: 56
  • 博客积分: 1449
  • 博客等级: 中尉
  • 技术积分: 822
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-08 10:24
文章分类

全部博文(56)

文章存档

2014年(7)

2012年(13)

2011年(10)

2010年(26)

分类:

2010-12-06 17:00:42

   这个代码写的让我有点抓况... 很混乱... 算了... 反正只是实验阶段... 玩玩硬件.能够驱动就可以了...

得到一点教训... 寄存器的配置要额外的小心...
我把LCDCON1寄存器中的PNRMODE字段#define错了... 郁闷... TFT屏应该是11B. 而我看了一下...直接给写成0x11了...
我嘞个去.... 屏幕还是居然能亮呢.. 郁闷....

   这个比VGA还复杂一些... 几个寄存器我硬是一边看手册一边计算一边写移位... 但还是出错了...悲哀...

贴一下LCD部分的代码.

/* some  are hard coded.it's not that good, i know! */

static const unsigned short def_palette[]={
    0x0b5e,0xce9a,0xffd9,0x9d99,0xb63a,0xae7c,0xdd71,0x6c57,0xfd4d,0x00ae,0x9c4d,0xb5f8,0xad96,0x0131,0x0176,0xefff,0xcedd,0x9556,0xe4bf,0x00b6,0x22b7,0x002b,0x89de,0x002c,0x57df,0xab5f,0x3031,0x14bf,0x797e,0x5391,0x93ab,0x7239,0x7453,0xafdf,0x71b9,0x8c92,0x014d,0x302e,0x5175,0x0029,0x0969,0x004e,0x2a6d,0x0021,0x3155,0x4b6e,0xd677,0xf6b6,0x9b5f,0x4bb5,0xffd5,0x0027,0xdfdf,0x74d8,0x1256,0x6bcd,0x9b08,0x2ab2,0xbd72,0x84b5,0xfe52,0xd4ad,0x00ad,0xfffc,0x422b,0x73b0,0x0024,0x5246,0x8e5e,0x28b3,0x0050,0x3b52,0x2a4a,0x3a74,0x8559,0x3356,0x1251,0x9abf,0x4034,0x40b1,
    0x8cb9,0x00b3,0x5c55,0xdf3d,0x61b7,0x1f5f,0x00d9,0x4c59,0x0926,0xac3f,0x925f,0x85bc,0x29d2,0xc73f,0xef5c,0xcb9f,0x827b,0x5279,0x4af5,0x01b9,0x4290,0xf718,0x126d,0x21a6,0x515e,0xefbd,0xd75e,0x42ab,0x00aa,0x10b3,0x7349,0x63b5,0x61a3,0xaadf,0xcb27,0x87df,0x6359,0xc7df,0x4876,0xb5bc,0x4114,0xfe2e,0xef5e,0x65be,0x43b9,0xe5df,0x21c9,0x7d16,0x6abb,0x5c11,0x49f7,0xbc0b,0x9e1a,0x3b0f,0x202b,0xff12,0x821b,0x842f,0xbccf,0xdefb,0x8a3e,0x68fa,0xa4f1,0x38ae,0x28b7,0x21ad,0x31d7,0x0073,0x182b,0x1831,0x3415,0xbdf6,0x2dbf,0x0a5d,0xc73d,0x182c,0x293e,0x7b3d,0x643d,0x3cbd,
    0x92dd,0x09d4,0x1029,0x7cdd,0x6239,0x182e,0x5aea,0x11eb,0x8abc,0x7bfa,0x00a7,0x2153,0x1853,0x1318,0x0109,0x54fa,0x72a7,0x89e3,0x01cf,0x3a07,0x7b17,0x1a14,0x2150,0x23dc,0x4142,0x1b33,0x00a4,0xf6df,0x08fc,0x18ae,0x3a7e,0x18d1,0xa51c,0xff5a,0x1a0f,0x28fa,0xdfbe,0x82de,0x60d7,0x1027,0x48fa,0x5150,0x6213,0x89d6,0x110d,0x9bbb,0xbedd,0x28e1,0x1925,0xf449,0xaa79,0xd5f4,0x693c,0x110a,0x2889,0x08a2,0x923d,0x10a6,0xd9bc,0x5b2e,0x32ec,0xcf7f,0x1025,0x2148,0x74b4,0x6d59,0x9d14,0x0132,0x00f0,0x56bf,0x00f1,0xffff,0x0173,0x0133,0x00b0,0x00b1,0xf7ff,0x08b1,0xfffe,0x08b0,
    0x0171,0xf7bf,0x10f3,0xf7fe,0x08ef,0x1192,0xefbe,0x1131,0x2177,0xff9f,0x1116,0xffbc,0x5914,0x22ef,0xb285,0xa6df,
};

#define XSIZE    320
#define YSIZE    240



#define GPCCON    (*(volatile unsigned long *)0x56000020)
#define GPCUP    (*(volatile unsigned long *)0x56000028)
#define GPDCON    (*(volatile unsigned long *)0x56000030)
#define GPDUP    (*(volatile unsigned long *)0x56000038)

#define GPGCON (*(volatile unsigned long *)0x56000060)
#define GPGUP    (*(volatile unsigned long *)0x56000068)

#define LCDCON1    (*(volatile unsigned long *)0x4d000000)
#define LCDCON2    (*(volatile unsigned long *)0x4d000004)
#define LCDCON3    (*(volatile unsigned long *)0x4d000008)
#define LCDCON4    (*(volatile unsigned long *)0x4d00000c)
#define LCDCON5    (*(volatile unsigned long *)0x4d000010)

#define CLKVAL        (6 << 8)
#define TFT_LCD    (0x3 << 5)
#define TFT_8BPP    (0xb << 1)
#define ENVID        (0x1)


#define VBPD        (7 << 24)
#define LINEVAL    ((YSIZE - 1)<< 14)
#define VFPD        (6 << 6)
#define VSPW        (14)

#define HBPD        (22 << 19)
#define HOZVAL        ((XSIZE - 1)<< 8)
#define HFPD        (33)

#define HSPW        (44)


#define TPAL    (*(volatile unsigned long *)0x4d000050)
#define LCDSADDR1    (*(volatile unsigned long *)0x4d000014)
#define LCDSADDR2 (*(volatile unsigned long *)0x4d000018)
#define LCDSADDR3    (*(volatile unsigned long *)0x4d00001c)

#define PALETTE (unsigned long *)0x4d000400
unsigned char *frame_base;

static void lcd_gpiopin_init(void)
{
    GPCUP = 0x00000000;     /* disable pull-up */
    GPCCON = 0xaaaaaaaa;  /* VD7 - 0. signal */
    GPDUP = 0x00000000;
    GPDCON = 0xaaaaaaaa;  /* VD23 - VD8 */
}

static void lcd_con_init(void)
{
    /*
     * vclk = HCLK / ((clkval + 1) * 2)
     * Frame Rate = 1/[{(VSPW+1)+(VBPD+1)+(LIINEVAL+1)+(VFPD+1)}x
    *              {(HSPW+1)+(HBPD+1)+(HFPD+1)+(HOZVAL+1)}x
    *              {2x(CLKVAL+1)/(HCLK)}]
    *            = 60Hz
     *  VSPW = 14; VBPD = 7; VFPD = 6; HSPW = 44; HBPD = 33; HFPD = 22;
     * CLKVAL = 6.  HCLK = 100MHz, Then Frame Rate is about 60Hz
     * this configuration should be working. I hope
     */
    LCDCON1 = CLKVAL | TFT_LCD | TFT_8BPP;
    LCDCON2 = VBPD | LINEVAL | VFPD | VSPW;
    LCDCON3 = HBPD | HOZVAL | HFPD;
    LCDCON4 = HSPW;
    LCDCON5 = (1<<11) | (0<<10) | (1<<9) | (1<<8) | (0<<7) | (0<<6) | (1<<3) | (1<<1) | 0;
    TPAL = 0;
}

#define GETLOWER21BIT(addr) \
    ((addr) & 0x1fffff)


#define OFFSIZE 0
void set_frame_addr(unsigned long addr)
{
    LCDSADDR1 = (((addr >> 22)) << 21)| (GETLOWER21BIT(addr) >> 1);
    LCDSADDR2 = GETLOWER21BIT((addr + (XSIZE + OFFSIZE) * (YSIZE)) >> 1);
    LCDSADDR3 = (OFFSIZE << 11) | (XSIZE>>1);
}

void lcd_power_on(void)
{

    GPGCON = (GPGCON & ~(3 << 8)) | (3 << 8);
    GPGUP |= 1 << 4;
   
//    LCDCON5 |= (1 << 5);
    LCDCON5 |= 1 << 3;
}

#define ENVID_ENABLE    (1)
#define ENVID_DISABLE    ((~1) & 0x3ffffff)

static void __lcd_envid_con(int enable)
{
    if(enable) {
        LCDCON1 |= ENVID_ENABLE;
    } else {
        LCDCON1 &= ENVID_DISABLE;
    }
}

void lcd_envid_enable(void)
{
    __lcd_envid_con(1);
}

void lcd_envid_disable(void)
{
    __lcd_envid_con(0);
}

void lcd_init(void)
{
    lcd_gpiopin_init();
    lcd_con_init();
    lcd_power_on();
}

#define VSTATUS_ACTIVE    (3 << 15)
#define HSTATUS_ACTIVE    (3 << 13)

static inline void wait_palette(void)
{
    while(LCDCON5 & (VSTATUS_ACTIVE | HSTATUS_ACTIVE)) ;
}

void default_palette_init(void)
{
    int i;
    unsigned long *palette = PALETTE;
    for(i = 0; i < 256; i++) {
        wait_palette();
        palette[i] =  def_palette[i];
    }
}


void putpixel(int x, int y, int color)
{
    unsigned char *pixel = (unsigned char *)frame_base;
    pixel[y*XSIZE + x] = (unsigned char)color;
}

void clr_lcd(unsigned char color)
{
    int i, j;
    for(i = 0; i < YSIZE; i++)
        for(j = 0; j < XSIZE; j++)
            putpixel(j, i, color);
}
阅读(2010) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~