今天終于把s3c2410的lcd在skyeye上搞出來了??吹骄W(wǎng)上還有朋友在發(fā)貼詢問,所以在這里與大家分亨一下。
首先,我的skyeye是1.2.3版的,linux內(nèi)核版本是2.6.16.21-0.8 ,suse 10.0自帶的。u-boot-1.1.6為引導(dǎo)程序。u-boot在skyeye
上的移植網(wǎng)上有,我也是在網(wǎng)上學來的,如果你還不清楚,可以到網(wǎng)上google一下。具體的地址我也不記得了。
下面主要說下我自己在skyeye上移植s3c2410的經(jīng)歷。
先聲明一下本人也是初學者,有很多東西都 不是很清楚。在配置內(nèi)核的時候l看到 linux2.6 自帶了s3c2410的驅(qū)動,以為只要把它編譯進
內(nèi)核就可以了,可是在啟動的時候檢測不到設(shè)備,后來到網(wǎng)上找了下lcd的移植過程,原來還要在平臺初始化文件中對lcd進行設(shè)置,初始
化即可。
修改文件為arch/arm/mach-s3c2410/mach-smdk2410.c
添加頭文件:
#inlcude
#include
添加初始化代碼:
static struct s3c2410fb_mach_info s3c2410_lcd_info __initdata = {
.fixed_syncs = 0,
.regs = {
.lcdcon1 = S3C2410_LCDCON1_TFT16BPP |
S3C2410_LCDCON1_TFT |
//S3C2410_LCDCON1_ENVID |
S3C2410_LCDCON1_CLKVAL(6),
.lcdcon2 = S3C2410_LCDCON2_VBPD(0) |
S3C2410_LCDCON2_LINEVAL(239) |
S3C2410_LCDCON2_VFPD(10) |
S3C2410_LCDCON2_VSPW(1),
.lcdcon3 = S3C2410_LCDCON3_HBPD(6) |
S3C2410_LCDCON3_HOZVAL(319) |
S3C2410_LCDCON3_HFPD(15),
.lcdcon4 = S3C2410_LCDCON4_MVAL(13) |
S3C2410_LCDCON4_HSPW(28),
.lcdcon5 = S3C2410_LCDCON5_FRM565 |
S3C2410_LCDCON5_INVVLINE |
// S3C2410_LCDCON5_INVVCLK |
S3C2410_LCDCON5_INVVFRAME |
//S3C2410_LCDCON5_INVLEND|
S3C2410_LCDCON5_PWREN |
S3C2410_LCDCON5_HWSWP,
},
.lpcsel = 0,// ((0xCE6) & ~7) | 1<<4,
.gpccon= 0xaaaaaaaa,
.gpccon_mask= 0xffffffff,
.gpcup= 0xffffffff,
.gpcup_mask= 0xffffffff,
.gpdcon= 0xaaaaaaaa,
.gpdup= 0xFFFFFFFF,
.gpdup_mask= 0xffffffff,
.width = 320,
.height = 240,
.yres = {
.min = 240,
.max = 240,
.defval = 240,
},
.xres = {
.min = 320,
.max = 320,
.defval = 320,
},
.bpp = {
.min = 16,
.max = 16,
.defval = 16,
},
};
static void __init smdk2410_lcd_init(void)
{
s3c24xx_fb_set_platdata(&s3c2410_lcd_info);
}
最后在MACHINE_START與MACHINE_END中添加如下代碼:
.init_machine = smdk2410_lcd_init,
//到此修改完畢
以上s3c2410_lcd_info結(jié)構(gòu)體的初始化在網(wǎng)上找的,著了點修改。
其中主要是寄存器的問,在skyeye中只使用了其中4個寄存器
lcdcon1的第1位啟動和關(guān)閉lcd功能
lcdcon2中有關(guān)lcd 高度的設(shè)置
lcdcon3中有關(guān)lcd 寬度的設(shè)置
lcdsaddr1 中有關(guān)顯存地址的值
查看skyeye的源代碼發(fā)現(xiàn),在s3c2410的lcd的模擬中將顏色的深度直接設(shè)置成了16,所以,以上代碼中bpp的值也為16,
如果你感興趣,可以查看s3c2410的手冊中有關(guān)lcd寄存器的說明,對skyeye修改一下。
skyeye的lcd模擬中沒有用到兩個寄存器,所以在lcd的初始化過程中會有以下兩個錯誤:
ERROR: s3c2410x_io_write_word(0x4d000060) = 0x00000000
ERROR: s3c2410x_io_write_word(0x4d000050) = 0x00000000
這對skyeye的模擬和以驅(qū)動程序不會有影響。
基本上就這些了。
順便提下,不知各位在skyeye下模擬的s3c2410的主頻是多少?
我一開始用u-boot引導(dǎo)的時候有有3個s3c2410x_io_write_word錯誤,s3c2410的主頻也只有62MZ多。
后來看了下s3c2410x_io_write_word的代碼,發(fā)現(xiàn)有三個寄存器LOCKTIME,MPLLCON, UPLLCON在頭文件中定義了
,但在skyeye的
switch語句中并沒有相關(guān)的寫操作。具體的寄存器作用我并不清楚,也沒有查手冊,但應(yīng)該與時鐘用關(guān)。所以就在switch
語句里添加了以下代碼:
case LOCKTIME:
io.clkpower.locktime = data;
break;
case MPLLCON:
io.clkpower.mpllcon = data;
break;
case UPLLCON:
io.clkpower.upllcon = data;
break;
現(xiàn)在我的skyeye模擬出來s3c2410的主頻是202.800MZ了。
下一步打算把觸摸屏的驅(qū)動也移植上來,還有網(wǎng)絡(luò)。
如果你還有什么問題可以跟我聯(lián)系。liren0@126.com
也可直接在此回復(fù)。
以下是skyeye上s3c2410的截圖