2.6.30.4内核在fs2410上的移植

        利用FS2410的BIOS,稍微修改了一下,然后就可以使用了(),我用的触摸屏是夏普的640*480的触摸屏,这屏幕比较大,用起来很爽,不过目前为止,我还不能将触摸功能加上去。

好了,正是开始移植吧,我本来也是新手,所以就必须参照别人的经验才能进行下去:首先,我选了天嵌对linux2.6.25.8在2440上移植的说明书。顺便参照网上其它的一些资料。

改动过程如下:

1,修改根目录下的Makefile文件,大概在192行:

  修改如下:

           ARCH            ?=arm
           CROSS_COMPILE   ?=arm-linux- //默认交叉编译器,我用的是天嵌的4.3.3交叉编译器,在这里可以具体指明自己的编译器路径

 大概1156行:

   在-type f -print | xargs rm -f 后面加上如下命令 rm -f zImage.bin,

2.修改arch/arm/boot/Makefile大概58行。

   在 @echo '  Kernel: $@ is ready'的上一行加上@cp -f arch/arm/boot/zImage zImage.bin,目的当然是为了将 arch/arm/boot/Makefile下的zImage文件移动到根目录下,并改名为zImage.bin

3. 修改arch/arm/plat-s3c24xx/common-smdk.c文件大概109行的分区信息(要与自己的bootloader分区信息保持一致)如下:

/* NAND parititon from 2.4.18-swl5 */
    108
    109 static struct mtd_partition smdk_default_nand_part[] = {
    110         [0] = {
    111                 .name   = "bootloader",
    112                 .size   = SZ_256K,
    113                 .offset = 0,
    114         },
    115         [1] = {
    116                 .name   = "kernel",
    117                 .offset = SZ_256K,
    118                 .size   = SZ_4M -SZ_256K,
    119         },
    120         [2] = {
    121                 .name   = "Rootfs",
    122                 .offset = 0x4000000,
    123                 .size   = 0x3c00000,
    124         }
    125 };

4.修改fs/Kconfig文件,增加对devfs文件系统的支持:在868行menu "Pseudo filesystems"
后面加入(你如果省事copy的话记着去掉前面的行号数字啊,^_^)这是为了增加对devfs的支持
    869
    870 config DEVFS_FS
    871         bool "/dev file system support (OBSOLETE)"
    872         default y
    873
    874 config DEVFS_MOUNT
    875         bool "Automatically mount at boot"
    876         default y
    877         depends on DEVFS_FS

5. 修改drivers/mtd/nand/s3c2410.c,禁用Flash ECC校验

    找到NAND_ECC_SOFT,

    将其改为:NAND_ECC_NONE。

6. cp arch/arm/configs/s3c2410_defconfig .config:使用2410默认的配置文件,然后适当的改动一下make Menuconfig,make,如果一切顺利,那么编译出的linux内核基本可以使用了。这个编译出的内核还不具备lcd驱动和触摸驱动,接下来,我将参照天嵌的说明书以及网络上其他人的讲解加入我自己的lcd驱动和触摸驱动。
7.lcd驱动的加入(主要参考对象http://hi.baidu.com/dancesimply/blog/item/4116fb8aa8ac741bc8fc7aab.html,因为我的lcd跟着篇博文介绍的一样,所以就为了图省事,^_^,很多是直接搬过来的)。

 首先,修改arch/arm/mach-s3c2410/mach-smdk2410.c
在其开始部分加入头文件:#include <asm-arm/arch-s3c2410/fb.h> //这个头文件的路径以及上面提到的mach-smdk2410.c的路径可能在不同的内核版本
中有所不同,要根据情况更改路径)
在mach-smdk2410.c中加入如下内容:

/*Configuration for 640x480 SHARP LQ080V3DG01 */
 
static struct s3c2410fb_display fs2410_lcd_cfg __initdata = {
 
/* lcd configuration registers */
.lcdcon5 = S3C2410_LCDCON5_FRM565 |
S3C2410_LCDCON5_INVVLINE |
S3C2410_LCDCON5_INVVFRAME |
S3C2410_LCDCON5_PWREN |
S3C2410_LCDCON5_HWSWP,
 
/* LCD type */
.type = S3C2410_LCDCON1_TFT,
 
/* Screen size */
.width = 640,
.height = 480,
 
/* Screen info */
.xres = 640,
.yres = 480,
.bpp = 16,
 
.pixclock = 40000,
//.setclkval = 0x01,
 
.left_margin = 17,
.right_margin = 49,
.hsync_len = 97,
 
.upper_margin = 32,
.lower_margin = 13,
.vsync_len = 3,
};
 
//LCD driver info
static struct s3c2410fb_mach_info fs2410_lcd_info __initdata = {
.displays = &fs2410_lcd_cfg,     /* attached diplays info */
.num_displays = 1,            /* number of defined displays */
.default_display = 0,
 
/* GPIOs */
//.gpccon = 0xaa8002a8,
//.gpccon_mask = 0xffc003fc,
//.gpcup = 0xf81e,
//.gpcup_mask = 0xf81e,
//.gpdcon = 0xaa80aaa0,
//.gpdcon_mask = 0xffc0fff0,
//.gpdup = 0xf8fc,
//.gpdup_mask = 0xf8fc,
 
/* lpc3600 control register */
.lpcsel = ((0xCE6) & ~7) | 1<<4,
};

 

static void __init smdk2410_init(void)函数中加入如下语句:

s3c24xx_fb_set_platdata(&fs2410_lcd_info);        //add code

内核配置大致如下(^_^,又是拷贝别人的,^_^,我嫌复制自己的优点麻烦)
Device Drivers --->
Character devices --->
[*] Virtual terminal
Graphics support --->
<*> Support for frame buffer devices --->
<*>   S3C2410 LCD framebuffer support
Console display driver support --->
     <*> Framebuffer Console support
[*] Bootup logo --->
[*]   Standard 224-color Linux logo


然后重新制作内核镜像,烧写并启动,就会出现如下的信息:

Set boot params = root=/dev/mtdblock2 init=/linuxrc console=ttySAC0,115200 devfs=mount display=shp240
Uncompressing Linux............................................................................................. done, booting the kernel.

................

Console: switching to colour frame buffer device 80x30
fb0: s3c2410fb frame buffer device //有这两句信息表明lcd驱动成功

................

Creating 3 MTD partitions on "NAND 64MiB 3,3V 8-bit":
0x000000000000-0x000000040000 : "Bootloader"
0x000000040000-0x000000400000 : "Kernel"
0x000000400000-0x000004000000 : "Rootfs"

............................................

Please press Enter to activate this console. [root@Days999 /]#
说明LCD驱动移植初步成功。

当然了,我们这里用的是640*480的lcd显示器,所以最好更改换一下默认的开机图片,
步骤如下,使用gimp软件打开图片: 图像->模式中选择索引,最大颜色数量设为224,保存为ppm格式,ascii数据格式,然后替换掉drivers/logo/logo_linux_clut224.ppm。重新制作内核,然后就会显示你自己的图片了。
最后,还差一个触摸出动,这个看天嵌说明书上比较多,我弄好了整理一下再贴到这里来。

8.背光灯控制,参照天嵌的说明书,我们暂时将背光灯移植打开。
修改drivers/video/s3c2410fb.c的一个s3c2410fb_blank函数如下:

static int s3c2410fb_blank(int blank_mode, struct fb_info *info)
{
        struct s3c2410fb_info *fbi = info->par;
/*      void __iomem *tpal_reg = fbi->io;
 
        dprintk("blank(mode=%d, info=%p)/n", blank_mode, info);
 
        tpal_reg += is_s3c2412(fbi) ? S3C2412_TPAL : S3C2410_TPAL;
 
        if (blank_mode == FB_BLANK_UNBLANK)
                writel(0x0, tpal_reg);
        else {
                dprintk("setting TPAL to output 0x000000/n");
                writel(S3C2410_TPAL_EN, tpal_reg);
        }
*/
 
void __iomem *regs = fbi->io;
        u_long flags;
        local_irq_save(flags);
 
        fbi->regs.lcdcon5  = __raw_readl(regs + S3C2410_LCDCON5);
        switch( blank_mode )
        {
                case 0:
                        fbi->regs.lcdcon5 &= ~S3C2410_LCDCON5_PWREN;
                        printk(KERN_INFO "Turn off The LCD Backlight/n");
                        break;
                case 1:
                        fbi->regs.lcdcon5 |= S3C2410_LCDCON5_PWREN;
                        printk(KERN_INFO "Turn on The LCD Backlight/n");
                        break;
                default:
                        break;
        }
        __raw_writel(fbi->regs.lcdcon5, regs + S3C2410_LCDCON5);
 
        local_irq_restore(flags);
 
 
        return 0;
}

9.对触摸屏驱动的移植。我大部分是按照天嵌的手册进行更改的。不同之处在于,我将arch/arm/mach-s3c2410/mach-smdk2410.c进行了更改,而不是
arch/arm/mach-s3c2440/mach-smdk2440.c,在这其中要注意的是ts.h头文件的路径要正确加入。接下来又是打补丁,又是配置内核就没啥新意了,按照天嵌的
说明书来就行了,最后,还是利用天嵌的带触摸屏的文件系统,经过稍微更改(我主要是去掉了/etc/inittab中的串口名称),以适合我的硬件,就可以运行了。
不过这里也出现了问题,用天嵌的文件系统,我的640*480的屏幕触摸矫正总是出问题,触摸位置经常出现很大的偏差,但屏幕显示却很正常,到现在也没有解决,
我怀疑这跟那个触摸的算法整体设计有bug,不过我还没有加以验证。由于单位要换2440了,对2410的移植我暂时就放一放,等有空了我再找这个原因吧。

 


10.现在还剩下触摸功能的完全实现。我后来改在2.6.40.4上实现触摸功能,其移植过程大家可以参照天嵌的新版(4.1版本)手册,但我没有完全按照手册上来,由于我没有网卡,在配置内核的时候我完全将网络这部分拿掉了,后来tslib1.4也加入文件系统了(网上的资料比较多,我就不写了)。然后上电将内核和文件系统下到板子上,于是就出现了那动人的触摸屏矫正页面了。然而,问题也就出现在这里,等触摸矫正过后,就一黑屏,上面一光标在闪,我期待的qt界面并没有出现,真是郁闷的了,开始的时候,我是怀疑我使用的文件系统的问题(因为我使用的是cramfs文件系统(优龙的BIOS只支持这个(我主要想利用USB下载的功能才选用这个BIOS的)),而cramfs是只读文件系统,我觉得是由于矫正数据无法写入文件系统造成的,于是就决定改用yaffs做根文件系统,同时还希望有USB下载的功能,在网上查了好长时间,发现能将二者完美结合起来的开源U-boot还真是少,不知道大家是不屑于这么做还是怎么的了,最后运气还不算太差,百问网上的一个U-boot可以基本符合我的需要,并且还是开源的,于是决定用这个U-boot验证我前面的怀疑。这个时候已经是2010面得1月15号了,临下班的时候我才得到这样的结果,我当时真是郁闷。。。。那天晚上一夜都没睡好,第二天是周六,我们还要上班,去到公司,马上投入对我昨天想法的验证,这次我有经验了,其实百问网南山大侠的U-boot基本不需要更改,我使用天嵌的3.4.5的交叉编译器一次将这个U-boot编译成功,然后下到板子当中!!!令我郁闷的问题出现了,每次下完内核,我的板子就不能再从U-boot启动了,上百问网查阅后才发现,原来这个u-boot默认是将u-boot写到nor flash了,所以就将内核从nand flash的 0地址开始写,所以每次就把我下载到nand flash中的u-boot给擦除了,发现这一问题后,更改分区(在include/configs/100ask24x0.h文件内找到:MTDPARTS_DEFAULT的定义(大概56行),然后进行更改即可),将前0x40000的空间存储bootloader,将0x40000开始的3840k空间存储kernel,剩下的空间都存储yaffs文件系统(共64m),相应的,内核代码也按照这个分区进行更改(应该在arch/arm/plat-s3c24xx/common-smdk.c里面找到smdk_default_nand-part[]这个结构体)。然后烧到板子当中,本以为令人期待的画面会出现,结果,只出现了,start kernel。。。。然后就不动了,真是郁闷,这个时候已经马上下班了,看来我周末的心情真要受影响了,没办法,下周再做吧。真是个郁闷的周末。

11.周日就一天的时间休息,我醒来都快中午了,正好有老乡越我去学校,我索性约她去紫金山转转,也好散散心情,为周一的工作做个好铺垫。周日真是个好天气,从白马公园一直爬到山顶,然后下到明孝陵转了一圈,这时候天差不多黑了,回市内吃个饭,然后就回江宁,此时已经晚上九点了。明天还要上班,好好休息吧。

12.周一。刚到公司,我就赶快开始我昨天想到得一些问题,结果都没有解决问题,start kernel。。。就一直停在那里,真他娘的郁闷。周一就在各种试验中度过,到最后还是这样的结果。哎,晚上加了一会班,终于得到一些提示,我直接将zImage.bin下到30008000的位置后利用命令go 30008000,结果就是说两个地址不一致啥的(error unrecognized unsupported machine id 0x.....),然后按照网上所说,在u-boot的命令里打入:bdinfo,显示如下消息:
arch_number = 0x000000C1
env_t       = 0x00000000
boot_params = 0x30000100
DRAM bank   = 0x00000000
网上搜了下解决方案,基本说是要更改u-boot或者内核啥的()。如果修改u-boot,则在common/cmd_boot.c中,在#if !defined(CONFIG_NIOS)后面加入:
/************** add here ******************/
        if(argc==2)
                rc = ((ulong (*)(int, char *[]))addr) (0, gd->bd->bi_arch_number);
        else
  rc = ((ulong (*)(int, char *[]))addr) (--argc, &argv[1]);
/*************** add end *****************/
如果修改内核:则在arch/arm/kernel/head.S中大概msr cpsr_c, #PSR_F_BIT | PSR_I_BIT | SVC_MODE @ ensure svc mode前面加入:
/********* add here *********/
   mov    r0, #0
   mov    r1, #0xc1
   ldr    r2, =0x30000100
/********* end add *********/
这真是黑暗中的一缕灯光,给了我点滴的希望,周一总算没有白过。先回去睡觉吧,等明天来的时候我再慢慢查找问题的根源。

13.周二,顺着昨天的想法,我更改了内核,然后将编译好的内核下到板子当中(我还是下到了地址0x30008000),然后,go 0x30008000,兴奋啊,内核终于启动了,^_^,不过遗憾的是,内核虽然能够挂载yaffs文件系统了,但还是没办法正常进入命令行启动,这是小问题,我可以慢慢改的。于是,我将这个内核制作成uImage.bin,所用命令为:mkimage -n 'Linux-2.6.25.8' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d zImage.bin uImage.bin(我仍这里用inux-2.6.25.8做实验是因为该内核已经能够带动cramfs文件系统进行正常启动,并且我已经加入了yaffs文件系统支持,仅做验证而已),然后下到板子当中,见鬼,竟然还是start kernel...后就没反应了,这肯定不是内核的问题了,也肯定不是u-boot的问题了。那问题出在哪里呢?我当时也不知怎么想到了地址的问题,于是就将上面的命令中入口地址和下载地址都改为0x30008000,然后将制作好的uImage.bin重新下到板子当中,结果,内核终于启动了,好了,只要u-boot能够启动内核,下面的问题就好解决了。我花了一个小时的时间将2.6.30.4内核重新改了一下以适应我的FS2410板子,然后制作uImage,下到板子当中,上电重启,^_^,令我期待的画面终于出现了,内核正常启动,并且控制台也能够启动了(这里要注意的是,我直接用的是天嵌的文件系统mkyaffsimage_2 root_qtopia_2.2.0_2.6.30.4/ root_qtopia_2.2.0_2.6.30.4.bin,顺便,还要更改一下文件系统中etc/inittab文件,去掉其中的那个串口名称,否则,我的控制台就无法启动(etc/inittab 中::askfirst:-/bin/sh前不要的名字一定要注意)),屏幕上的触摸矫正程序也出现了,矫正过触摸屏后,仍旧是一个黑屏,真是扫兴,我忙活了几天,看起来一点功劳都没有!!!,这也证明了我签名的怀疑是错误的,原因不在于文件系统,那到底是在哪里呢?还是通过网络吧,上午已经过去,那就下午找解决方案。我又开始怀疑是qt的问题了,那就换成qt4试试,结果,还是一样的结果,不过提示一个错误:

QWSServerSocket: could not bind to file /tmp/qtembedded-0/QtEmbedded-0
Error: Bad file descriptor
Failed to bind to /tmp/qtembedded-0/QtEmbedded-0
Aborted

有错误提示就是好事情,把问题google一下,就找到了<QT4-embedded-4.4.3使用tslib的编译>这篇文章。在文章中,作者说是由于网络的原因,必须在linux内核配置时,选中networking->networking options->Unix domain sockets选项才行,这就好了,从新配置并编译内核,下到板子当中,结果终于出现了qt4的界面了,问题解决,那我就将文件系统换成qt2吧,等制作好文件系统,下到板子当中,掉电重启,然后就是很顺利的进入到触摸矫正的画面,过了矫正程序,qt的界面终于出现了。由于我换成了yaffs2可读写的文件系统,这样我每次重启就不用矫正程序了,O(∩_∩)O哈哈哈~。这个移植暂时告一段落,下一阶段,我要学学qt了,做个我们公司自己的界面和文件系统。

前面有些地方我说的不太详细,有时间的话我会慢慢加入具体过程的(特别是在2.6.30.4上触摸功能那一块,虽然天嵌的说明书上有,我还是自己补全问好)。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值