QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2307|回复: 2

搞定ucosii4skyeye LCD的实现

[复制链接]
发表于 2008-9-15 12:09:03 | 显示全部楼层 |阅读模式
搞了很久,因为对硬件不熟悉,我仔细啃了一下源代码,将我实现的结果记录一下,有热心人将它们加到将来的ucos4skyeye中去吧
实现环境:
ubuntu8.04
arm-elf-gcc2.95.3
skyeye1.2.6 rc1
ucos4skyeye 1.93

以上清自己在网络上找吧呵呵,因为ucos4skyeye都是以AT91为基础了,所以我的改造就也用at91。
skyeye 并不能完成支持at91 lcd.所以需要更改一下源代码
在文件dev_lcd_ep7312.c中(这个里面已经实现了一部分的at91lcd)
函数 void lcd_ep7312_init()中增减一行

register_device_module ("at91", mod_set, &lcd_ep7312_setup);

编译好(原先我使用的是skyeye1.2.5版本,可是怎么也搞不好,网络上搜了一下,原来是skyeye1.2.5支持lcd有点问题,所以就换成了skyeye1.2.6 rc1呵呵

实现ucos中的lcd需要增加一个lcd驱动,所以在ucos4skyeye中文件夹下的arch/atmel-arch下增加两个文件 at91_lcd.c at91_lcd.h

at91_lcd.h
#ifndef _AT91_LCD_H_
#define _AT91_LCD_H_

#define LCDCON        0xfffc002c0        /* LCD Control register ---------------------------- */
#define VBUFSIZ        0x00001fff        /* Video buffer size (bits/128-1) */
#define LINELEN        0x0007e000        /* Line length (pix/16-1) */
#define LINELEN_SHIFT        13
#define        PIXPSC        0x01f80000        /* Pixel prescale (526628/pixels-1) */
#define PIXPSC_SHIFT        19
#define ACPSC        0x3e000000        /* AC prescale */
#define ACPSC_SHIFT        25
#define GSEN        0x40000000        /* Grayscale enable (0: monochrome) */
#define GSMD        0x80000000        /* Grayscale mode (0: 2 bit, 1: 4 bit) */

#define FBADDR 0xc0000000
void at91_lcd_init();

#endif

at91_lcd.c
#include "at91_lcd.h"

#define __arch_putb(v,a)        (*(volatile unsigned char *)(a) = (v))
#define __arch_putl(v,a)        (*(volatile unsigned int  *)(a) = (v))

void at91_lcd_init()
{
     unsigned long i;
     unsigned long linelin = 320 / 16 -1;
     unsigned long vbufsize = 240 * 320 * 8 / 128 -1;
     __arch_putl(( linelin << LINELEN_SHIFT) +  vbufsize, LCDCON);
     
     for( i=0; i<320*240; i++)
     {
        __arch_putb(0xFF, FBADDR+i);
     }
}

要正确运行skyeye 还需要修改skyeye.conf,我是在samples/ucos_test下实现的,所以更改这个文件夹下的文件
skyeye.conf
#skyeye config file sample
cpu: arm7tdmi

mach: at91

#mem_num: 7

mem_bank: map=M, type=RW, addr=0x00000000, size=0x00004000
mem_bank: map=M, type=RW, addr=0x01000000, size=0x00400000
mem_bank: map=M, type=R,  addr=0x01400000, size=0x00400000
mem_bank: map=M, type=RW, addr=0x02000000, size=0x00400000
mem_bank: map=M, type=RW, addr=0x02400000, size=0x00008000
mem_bank: map=M, type=RW, addr=0x04000000, size=0x00400000
mem_bank: map=M, type=RW, addr=0xc0000000, size=0x00020000
mem_bank: map=I, type=RW, addr=0xf0000000, size=0x10000000

lcd: type=at91, mod=gtk

注意增加了framebuffer的内存和lcd的选项

同时要修改
#memory size (KB)
#4096
# memory bank num
8
#memory/IO bank map :
M   RW      0x01000000   0x00400000
M   R       0x01400000   0x00400000
M   RW      0x02000000   0x00400000
M   RW      0x02400000   0x00001000
M   R       0x04000000   0x00400000
M   RW      0x00000000   0x00004000
M   RW      0xc0000000   0x00020000
I   RW      0xf0000000   0x10000000

要在启动的时候激活lcd就需要更改arch/atmel-arch/at91_init.c
将刚此的lcd的初始化函数在at91_init中调用
void at91_init()
{
        // here Must put at91_init_usart() at the very beginning of init !
        at91_init_usart();
        at91_init_aic();       
        at91_init_timer();
        at91_lcd_init(); //增加这一行
}
当然要加上头文件,不然可能编译不过
ok就这样,试着运行吧,是不是出来lcd窗口了?

另:可能是由于gcc版本的兼容性问题,推荐使用2.95.3版本,我以前用别的gcc版本感觉运行不稳定,呵呵

[ 本帖最后由 fengjl026 于 2008-9-15 12:45 编辑 ]
 楼主| 发表于 2008-9-15 12:11:15 | 显示全部楼层
把工程文件一并打包传上来,大家参考

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复

使用道具 举报

发表于 2008-9-15 14:39:23 | 显示全部楼层
好,向你学习!
近些天没有Skyeye~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-2 08:33 , Processed in 0.041267 second(s), 17 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表