|
搞了很久,因为对硬件不熟悉,我仔细啃了一下源代码,将我实现的结果记录一下,有热心人将它们加到将来的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 编辑 ] |
|