当前时区 GMT+8, 现在时间是 2008-5-17 09:24 游客: 注册 登录 仅登录论坛 | 搜索 帮助


标题: skyeye上的s3c2410 lcd移植
liren0
新手上路
Rank: 1



UID 245842
精华 0
积分 2
帖子 3
阅读权限 10
注册 2008-1-6
状态 离线
发表于 2008-1-9 12:34  资料  短消息  加为好友 
skyeye上的s3c2410 lcd移植

今天终于把s3c2410的lcd在skyeye上搞出来了。看到网上还有朋友在发贴询问,所以在这里与大家分亨一下。

    首先,我的skyeye是1.2.3版的,linux内核版本是2.6.16.21-0.8 ,suse 10.0自带的。u-boot-1.1.6为引导程序。u-boot在skyeye
上的移植网上有,我也是在网上学来的,如果你还不清楚,可以到网上google一下。具体的地址我也不记得了。

    下面主要说下我自己在skyeye上移植s3c2410的经历。
  
     先声明一下本人也是初学者,有很多东西都 不是很清楚。在配置内核的时候l看到 linux2.6 自带了s3c2410的驱动,以为只要把它编译进
内核就可以了,可是在启动的时候检测不到设备,后来到网上找了下lcd的移植过程,原来还要在平台初始化文件中对lcd进行设置,初始
化即可。
修改文件为arch/arm/mach-s3c2410/mach-smdk2410.c
添加头文件:
#inlcude <asm/arch/regs-lcd.h>
#include <asm/srch-s3c2410/fb.h>
添加初始化代码:
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结构体的初始化在网上找的,着了点修改。
其中主要是寄存器的问,在skyeye中只使用了其中4个寄存器
lcdcon1的第1位  启动和关闭lcd功能
lcdcon2  中有关lcd 高度的设置
lcdcon3  中有关lcd 宽度的设置
lcdsaddr1 中有关显存地址的值
查看skyeye的源代码发现,在s3c2410的lcd的模拟中将颜色的深度直接设置成了16,所以,以上代码中bpp的值也为16,
如果你感兴趣,可以查看s3c2410的手册中有关lcd寄存器的说明,对skyeye修改一下。
skyeye的lcd模拟中没有用到两个寄存器,所以在lcd的初始化过程中会有以下两个错误:
ERROR: s3c2410x_io_write_word(0x4d000060) = 0x00000000
ERROR: s3c2410x_io_write_word(0x4d000050) = 0x00000000
这对skyeye的模拟和以驱动程序不会有影响。
基本上就这些了。

顺便提下,不知各位在skyeye下模拟的s3c2410的主频是多少?
我一开始用u-boot引导的时候有有3个s3c2410x_io_write_word错误,s3c2410的主频也只有62MZ多。
后来看了下s3c2410x_io_write_word的代码,发现有三个寄存器LOCKTIME,MPLLCON, UPLLCON在头文件中定义了
,但在skyeye的
switch语句中并没有相关的写操作。具体的寄存器作用我并不清楚,也没有查手册,但应该与时钟用关。所以就在switch
语句里添加了以下代码:
    case LOCKTIME:
        io.clkpower.locktime = data;
        break;
    case MPLLCON:
        io.clkpower.mpllcon = data;
        break;
    case UPLLCON:
        io.clkpower.upllcon = data;
        break;
现在我的skyeye模拟出来s3c2410的主频是202.800MZ了。
下一步打算把触摸屏的驱动也移植上来,还有网络。
如果你还有什么问题可以跟我联系。liren0@126.com
也可直接在此回复。
以下是skyeye上s3c2410的截图
[attach]30315[/attach]



 附件: 您所在的用户组无法下载或查看附件
顶部
lvcoffee
新手上路
Rank: 1


UID 244620
精华 0
积分 13
帖子 26
阅读权限 10
注册 2007-11-13
来自 浙江.杭州
状态 离线
发表于 2008-1-9 16:29  资料  短消息  加为好友  QQ
楼主很强啊,佩服,回去照学着做,有问题再请教

顶部
lvcoffee
新手上路
Rank: 1


UID 244620
精华 0
积分 13
帖子 26
阅读权限 10
注册 2007-11-13
来自 浙江.杭州
状态 离线
发表于 2008-1-9 22:35  资料  短消息  加为好友  QQ
终于把LCD给整出来了

我是在2.6.14下,按楼主的做法,修改了mach-smdk2410.c,楼主的2个include要改下,应该是#include <asm/arch/regs-lcd.h>
#include <asm/arch-s3c2410/fb.h>
我的2.6.14没有s3c24xx_fb_set_platdata()这个函数,在arch/arm/mach-s3c2410/devs.c中加入该函数定义
void __init s3c24xx_fb_set_platdata(struct s3c2410fb_mach_info *pd)
{
   struct s3c2410fb_mach_info *npd;

   npd = kmalloc(sizeof(*npd), GFP_KERNEL);
   if (npd) {
      memcpy(npd, pd, sizeof(*npd));
      s3c_device_lcd.dev.platform_data = npd;
   } else {
      printk(KERN_ERR "no memory for LCD platform data\n");
   }
}
EXPORT_SYMBOL(s3c24xx_fb_set_platdata);
然后make menuconfig
[Device Driver] [Graphics support] [S3C2410 frambuffer support]
make  
得到vmlinux
skyeye -e vmlinux

顶部
buffaloliu
新手上路
Rank: 1



UID 245978
精华 0
积分 1
帖子 1
阅读权限 10
注册 2008-1-12
状态 离线
发表于 2008-1-12 13:56  资料  短消息  加为好友 
very good ,thanks for your sharing!

顶部
dongminghao
新手上路
Rank: 1


UID 50781
精华 0
积分 5
帖子 10
阅读权限 10
注册 2003-7-15
来自 China.gif
状态 离线
发表于 2008-1-14 10:35  资料  短消息  加为好友  QQ
楼主有QQ不?大家有问题可以相互交流下

顶部
liren0
新手上路
Rank: 1



UID 245842
精华 0
积分 2
帖子 3
阅读权限 10
注册 2008-1-6
状态 离线
发表于 2008-1-15 13:55  资料  短消息  加为好友 
回复 #5 dongminghao 的帖子

qq:408990992
不过很少在线,希望用邮箱与你取得联系.

顶部
shailq
新手上路
Rank: 1


UID 67035
精华 0
积分 1
帖子 1
阅读权限 10
注册 2003-10-7
来自 China.gif
状态 离线
发表于 2008-1-19 17:43  资料  短消息  加为好友 
你好,LCD是出来了,但是还有别的问题

VFS: Unable to mount root fs via NFS, trying floppy.
VFS: Cannot open root device "hda1" or unknown-block(2,0)
Please append a correct "root=" boot option
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)
出现这些错误,如何纠正阿,多谢

顶部
lvcoffee
新手上路
Rank: 1


UID 244620
精华 0
积分 13
帖子 26
阅读权限 10
注册 2007-11-13
来自 浙江.杭州
状态 离线
发表于 2008-1-21 17:27  资料  短消息  加为好友  QQ
找不到跟文件系统系统啊,要看你的运行环境传递参数给内核,比如root=/dev/block2,block2就是我放根文件系统的地方

顶部
duzhig
新手上路
Rank: 1


UID 179908
精华 0
积分 75
帖子 53
阅读权限 10
注册 2005-1-26
状态 离线
发表于 2008-2-3 16:56  资料  短消息  加为好友 
按照帖子里的修改源代码后可以跳出来lcd的屏幕了但是没有fb的logo内核配置里开启了
而且停在
ERROR: s3c2410x_io_write_word(0x4d000060) = 0x00000000
ERROR: s3c2410x_io_write_word(0x4d000050) = 0x00000000
就不能走下去了 模拟LCD的背景是粉红色的不知道为什么
我的linux 2.6.20的内核
1.2.4的skyeye
请指教一下谢谢

顶部
ttcchh
新手上路
Rank: 1



UID 247313
精华 0
积分 2
帖子 3
阅读权限 10
注册 2008-3-3
状态 离线
发表于 2008-3-4 21:59  资料  短消息  加为好友 
关于根文件系统,请教

我的系统是linux2.6.18.8的,Kernel command line: root=/dev/ram initrd=0xc1000000,0x00600000 rw console=tty0 console=ttySAC0
在启动的时候,出现No filesystem could mount root, tried:  ext2 cramfs msdos vfat jffs romfs
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(1,0)
不能挂接文件系统,请指教:
附上我的skyeye.conf文件:
cpu: arm920t
mach: s3c2410x
mem_bank: map=M, type=RW, addr=0xc0000000, size=0x01000000
mem_bank: map=M, type=RW, addr=0xc1000000, size=0x00600000, file=./initrd.img
mem_bank: map=I, type=RW, addr=0x48000000, size=0x20000000

#net: type=cs8900a, base=0x19000300, size=0x20,int=9, mac=0:4:3:2:1:f, ethmod=tuntap, hostip=10.0.0.1

lcd: type=s3c2410x, mod=gtk
#dbct:state=on

顶部
albert198511
新手上路
Rank: 1



UID 246711
精华 0
积分 28
帖子 56
阅读权限 10
注册 2008-2-12
状态 离线
发表于 2008-3-17 17:08  资料  短消息  加为好友 
回复 #3 lvcoffee 的帖子

您好,我想请问一下镜像文件initrd.img是如何生成的(是用测试包中的吗?)还有skyeye.conf是怎么写的?谢谢!

顶部
fengjl026
新手上路
Rank: 1



UID 248514
精华 0
积分 4
帖子 7
阅读权限 10
注册 2008-4-4
状态 离线
发表于 2008-4-6 21:07  资料  短消息  加为好友 
我的倒是都启动起来了,可是skyeye只有 62 M可怜的,我看到搂住的方法,可是居然不太一样,我看到s3c2410x.h文件中的定义
#define LCD_CTL_BASE           (0x4D000000)
#define LCD_CTL_SIZE           (0x60)
跟搂主的似乎不一样,就是找不到怎么处理
ERROR: s3c2410x_io_write_word(0x4d000060) = 0x00000000
ERROR: s3c2410x_io_write_word(0x4d000050) = 0x00000000

顶部
wwwwwaj
新手上路
Rank: 1



UID 249004
精华 0
积分 1
帖子 2
阅读权限 10
注册 2008-4-15
状态 离线
发表于 2008-4-15 17:00  资料  短消息  加为好友 
不同版本,问题是不一样的,但思路是一样的

顶部
 


Powered by Discuz! 5.5.0  © 2001-2007 Comsenz Inc.
清除 Cookies - 联系我们 - 中国Linux公社 - WAP