u-boot-2010.03在LT2440上的移植详解 (六)

2019-07-13 02:17发布

u-boot-2010.03在LT2440上的移植详解 (六) 郑重声明,这系列文章改写自博客园 黄刚先生的《嵌入式Linux之我行——u-boot-2009.08在2440上的移植详解》 转载时请注明出处 文章出处:http://www.lt-net.cn 编译系统 Ubuntu10.04 交叉编译器 arm-linux-gcc 4.3.3 硬件设备 LT2440开发板   测试软件 u-boot-2010.03 依赖库 无 uboot下载地址:http://ftp.denx.de/pub/u-boot/u-boot-2010.03.tar.bz2

本次移植在u-boot-2010.03原有功能的基础上增加如下特性:

  1.支持2KB  page Nand Flash读写
  2.支持Nand/Nor Flash启动自动识别
  3.支持DM9000AEP 10M/100M自适应网卡
  4.支持yaffs文件系统烧写
  5.支持USB下载功能
  6.支持一键式菜单
  7.支持启动Logo
  8.支持ubifs(待续)

上接:u-boot-2010.03在LT2440上的移植详解 (五)
实现u-boot对yaffs/yaffs2文件系统下载的支持。

    注意:此篇对Nand的操作是基于MTD架构方式, 通常一个Nnad Flash存储设备由若干块组成,1个块由若干页组成。一般128MB以下容量的Nand Flash芯片,一页大小为528B,被依次分为2个256B的主数据区和16B的额外空间;128MB以上容量的Nand Flash芯片,一页大小通常为2KB。由于Nand Flash出现位反转的概率较大,一般在读写时需要使用ECC进行错误检验和恢复。
    Yaffs/yaffs2文件系统的设计充分考虑到Nand Flash以页为存取单位等的特点,将文件组织成固定大小的段(Chunk)。以528B的页为例,Yaffs/yaffs2文件系统使用前512B存储数据和16B的额外空间存放数据的ECC和文件系统的组织信息等(称为OOB数据)。通过OOB数据,不但能实现错误检测和坏块处理,同时还可以避免加载时对整个存储介质的扫描,加快了文件系统的加载速度。以下是Yaffs/yaffs2文件系统页的结构说明:
           Yaffs页结构说明
==============================================
   字节                   用途
==============================================
0 - 511                存储数据(分为两个半部)
512 - 515               系统信息
   516                  数据状态字
   517                  块状态字
518 - 519               系统信息
520 - 522               后半部256字节的ECC
523 - 524               系统信息
525 - 527               前半部256字节的ECC
==============================================

    好了,在了解Nand Flash组成和Yaffs/yaffs2文件系统结构后,我们再回到u-boot中。目前,在u-boot中已经有对Cramfs、Jffs2等文件系统的读写支持,但与带有数据校验等功能的OOB区的Yaffs/Yaffs2文件系统相比,他们是将所有文件数据简单的以线性表形式组织的。所以,我们只要在此基础上通过修改u-boot的Nand Flash读写命令,增加处理00B区域数据的功能,即可以实现对Yaffs/Yaffs2文件系统的读写支持。

实现对Yaffs或者Yaffs2文件系统的读写支持步骤如下:
①、在include/configs/lt2440.h头文件中定义一个管理对Yaffs2支持的宏和开启u-boot中对Nand Flash默认分区的宏,如下:
#gedit include/configs/lt2440.h  //添加到文件末尾即可
/*
* FS options
*/
#define CONFIG_MTD_NAND_YAFFS2   1  //定义一个管理对Yaffs2支持的宏
//开启Nand Flash默认分区,注意此处的分区要和你的内核中的分区保持一致
#define MTDIDS_DEFAULT          "nand0=nandflash0"
#define MTDPARTS_DEFAULT     "mtdparts=nandflash0:384k(u-boot),"/
                                                 "640k(params),"/
                                                 "3m(kernel),"/
                                                 "-(yaffs2)"


在原来对Nand操作的命令集列表中添加Yaffs2对Nand的写命令,如下: #gedit common/cmd_nand.c   //在U_BOOT_CMD中添加 U_BOOT_CMD(nand, CONFIG_SYS_MAXARGS, 1, do_nand,
"NAND sub-system",
"info - show available NAND devices/n"
"nand device [dev] - show or set current device/n"
"nand read - addr off|partition size/n"
"nand write - addr off|partition size/n"
"    read/write 'size' bytes starting at offset 'off'/n"
"    to/from memory address 'addr', skipping bad blocks./n"

//注意:这里只添加了yaffs2的写命令,因为我们只用u-boot下载(即写)功能,所以我们没有添加yaffs2读的命令
#if defined(CONFIG_MTD_NAND_YAFFS2)
    "nand write[.yaffs2] - addr off|partition size - write `size' byte yaffs image/n"
    " starting at offset off' from memory address addr' (.yaffs2 NAND)/n"
#endif
"nand erase [clean] [off size] - erase 'size' bytes from/n"
"    offset 'off' (entire device if not specified)/n"
"nand bad - show bad blocks/n"
"nand dump[.oob] off - dump page/n"
"nand scrub - really clean NAND erasing bad blocks (UNSAFE)/n"
"nand markbad off [...] - mark bad block(s) at offset (UNSAFE)/n"
"nand biterr off - make a bit error at offset (UNSAFE)"
#ifdef CONFIG_CMD_NAND_LOCK_UNLOCK
"/n"
"nand lock [tight] [status]/n"
"    bring nand to lock state or display locked pages/n"
"nand unlock [offset] [size] - unlock section"
#endif
);

接着,在该文件中对nand操作的do_nand函数中添加yaffs2对nand的操作,如下: if (strncmp(cmd, "read", 4) == 0 || strncmp(cmd, "write", 5) == 0)
    {
        int read;        if (argc < 4)
            goto usage;        addr = (ulong)simple_strtoul(argv[2], NULL, 16);        read = strncmp(cmd, "read", 4) == 0; /* 1 = read, 0 = write */
        printf("/nNAND %s: ", read ? "read" : "write");
        if (arg_off_size(argc - 3, argv + 3, nand, &off, &size) != 0)
            return 1;        s = strchr(cmd, '.');
        if (!s || !strcmp(s, ".jffs2") || !strcmp(s, ".e") || !strcmp(s, ".i"))
        {
            if (read)
                ret = nand_read_skip_bad(nand, off, &size, (u_char *)addr);
            else
                ret = nand_write_skip_bad(nand, off, &size, (u_char *)addr);
        }//添加yaffs2相关操作,注意该处又关联到nand_write_skip_bad函数
#if defined(CONFIG_MTD_NAND_YAFFS2)
        else if (s != NULL && (!strcmp(s, ".yaffs2")))
        {
            nand->rw_oob = 1;
            nand->skipfirstblk = 1;
            ret = nand_write_skip_bad(nand,off,&size,(u_char *)addr);
            nand->skipfirstblk = 0;
            nand->rw_oob = 0;
        }
#endif
        else if (!strcmp(s, ".oob"))
        {
            /* out-of-band data */
            mtd_oob_ops_t ops =
            {
                .oobbuf = (u8 *)addr,
                .ooblen = size,
                .mode = MTD_OOB_RAW
            };            if (read)
                ret = nand->read_oob(nand, off, &ops);
            else
                ret = nand->write_oob(nand, off, &ops);
        }
        else
        {
            printf("Unknown nand command suffix '%s'./n", s);
            return 1;
        }        printf(" %zu bytes %s: %s/n", size, read ? "read" : "written", ret ? "ERROR" : "OK");        return ret == 0 ? 0 : 1;
    }

③、在include/linux/mtd/mtd.h头文件的mtd_info结构体中添加上面用到rw_oob和skipfirstblk数据成员,如下: #gedit include/linux/mtd/mtd.h   //在mtd_info结构体中添加 #if defined(CONFIG_MTD_NAND_YAFFS2)
    u_char rw_oob;
    u_char skipfirstblk;
#endif

④、在第二步关联的nand_write_skip_bad函数中添加对Nand OOB的相关操作,如下: #gedit drivers/mtd/nand/nand_util.c  //在nand_write_skip_bad函数中添加 int nand_write_skip_bad(nand_info_t *nand, loff_t offset, size_t *length,
   u_char *buffer)
{
int rval;
size_t left_to_write = *length;
size_t len_incl_bad;
u_char *p_buffer = buffer;

#if defined(CONFIG_MTD_NAND_YAFFS2) //add yaffs2 file system support
     if(nand->rw_oob==1)   
     {
        size_t oobsize = nand->oobsize;
        size_t datasize = nand->writesize;
        int datapages = 0;
        if (((*length)%(nand->oobsize+nand->writesize)) != 0)
         {
          printf ("Attempt to write error length data!/n");
          return -EINVAL;
       }
        datapages = *length/(datasize+oobsize);
        *length = datapages*datasize;
        left_to_write = *length;
     }
#endif

/* Reject writes, which are not page aligned */
if ((offset & (nand->writesize - 1)) != 0 ||
     (*length & (nand->writesize - 1)) != 0) {
  printf ("Attempt to write non page aligned data/n");
  return -EINVAL;
} len_incl_bad = get_len_incl_bad (nand, offset, *length); if ((offset + len_incl_bad) > nand->size) {
  printf ("Attempt to write outside the flash area/n");
  return -EINVAL;
}


#if !defined(CONFIG_MTD_NAND_YAFFS2) //add yaffs2 file system support
if (len_incl_bad == *length) {
  rval = nand_write (nand, offset, length, buffer);
  if (rval != 0)
   printf ("NAND write to offset %llx failed %d/n",
   offset, rval);  return rval;
}
#endif
while (left_to_write > 0) {
  size_t block_offset = offset & (nand->erasesize - 1);
  size_t write_size;  WATCHDOG_RESET ();  if (nand_block_isbad (nand, offset & ~(nand->erasesize - 1))) {
   printf ("Skip bad block 0x%08llx/n",
    offset & ~(nand->erasesize - 1));
   offset += nand->erasesize - block_offset;
   continue;
  }
  
  #if defined(CONFIG_MTD_NAND_YAFFS2) //add yaffs2 file system support
        if(nand->skipfirstblk==1)   
        {
            nand->skipfirstblk=0;
            printf ("Skip the first good block %llx/n", offset & ~(nand->erasesize - 1));
            offset += nand->erasesize - block_offset;
            continue;
        }
#endif

if (left_to_write < (nand->erasesize - block_offset))
   write_size = left_to_write;
  else
   write_size = nand->erasesize - block_offset;  printf("/rWriting at 0x%llx -- ",offset); //add yaffs2 file system support
  rval = nand_write (nand, offset, &write_size, p_buffer);
  if (rval != 0) {
   printf ("NAND write to offset %llx failed %d/n",
    offset, rval);
   *length -= left_to_write;
   return rval;
  }  left_to_write -= write_size;
  
  printf("%d%% is complete.",100-(left_to_write/(*length/100)));  

offset        += write_size;
  #if defined(CONFIG_MTD_NAND_YAFFS2) //add yaffs2 file system support
        if(nand->rw_oob==1)   
        {
            p_buffer += write_size+(write_size/nand->writesize*nand->oobsize);
        }
        else   
        {
            p_buffer += write_size;
        }
#else
        p_buffer += write_size;
#endif
} return 0;
}

⑤、在第四步nand_write_skip_bad函数中我们看到又对nand_write函数进行了访问,所以这一步是到nand_write函数中添加对yaffs2的支持,如下: #gedit drivers/mtd/nand/nand_base.c  //在nand_write函数中添加 static int nand_write(struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const uint8_t *buf)
{
    struct nand_chip *chip = mtd->priv;
    int ret;


#if defined(CONFIG_MTD_NAND_YAFFS2) //add yaffs2 file system support
    int oldopsmode = 0;
    if(mtd->rw_oob==1)   
    {
        int i = 0;
        int datapages = 0;

        size_t oobsize = mtd->oobsize;
        size_t datasize = mtd->writesize;

        uint8_t oobtemp[oobsize];
        datapages = len / (datasize);

        for(i = 0; i < (datapages); i++)   
        {
            memcpy((void *)oobtemp, (void *)(buf + datasize * (i + 1)), oobsize);
            memmove((void *)(buf + datasize * (i + 1)), (void *)(buf + datasize * (i + 1) + oobsize), (datapages - (i + 1)) * (datasize) + (datapages - 1) * oobsize);
            memcpy((void *)(buf+(datapages) * (datasize + oobsize) - oobsize), (void *)(oobtemp), oobsize);
        }
    }
#endif


    /* Do not allow reads past end of device */
    if ((to + len) > mtd->size)
        return -EINVAL;
    if (!len)
        return 0;

    nand_get_device(chip, mtd, FL_WRITING);
    chip->ops.len = len;
    chip->ops.datbuf = (uint8_t *)buf;


#if defined(CONFIG_MTD_NAND_YAFFS2) //add yaffs2 file system support
    if(mtd->rw_oob!=1)   
    {
        
chip->ops.oobbuf = NULL;
    }
    else   
    {
        chip->ops.oobbuf = (uint8_t *)(buf + len);
        chip->ops.ooblen = mtd->oobsize;
        oldopsmode = chip->ops.mode;
        chip->ops.mode = MTD_OOB_RAW;
    }
#else
    chip->ops.oobbuf = NULL;
#endif


    ret = nand_do_write_ops(mtd, to, &chip->ops);
    *retlen = chip->ops.retlen;
    nand_release_device(mtd);

#if defined(CONFIG_MTD_NAND_YAFFS2) //add yaffs2 file system support
    chip->ops.mode = oldopsmode;
#endif

    return ret;
}

OK,对yaffs2支持的代码已修改完毕,重新编译u-boot并下载到nand中,启动开发板
在u-boot的命令行输入:nand help查看nand的命令,可以看到多了一个nand write[.yaffs2]的命令,
这个就是用来下载yaffs2文件系统到nand中的命令了。
⑥、使用nand write[.yaffs2]命令把事前制作好的yaffs2文件系统下载到Nand Flash中,下载操作步骤和效果图如下:
tftp 0x30000000 root-fs-128m-256m.yaffs2  //用tftp将yaffs2文件系统下载到内存的0x30000000位置

nand erase 0x400000 0xFC00000 //擦除Nand的文件系统分区,下面的分区在前面定义过,要按照这个分区来烧写文件系统
//#define MTDPARTS_DEFAULT     "mtdparts=nandflash0:384k(u-boot),"/ //                                                                              "640k(params),"/
//                                                                             "3m(kernel),"/
//                                                                             "-(yaffs2)"   //我的文件系统放在最后,我的NandFlash是256MB的,除掉前面的4M,文件系统使用252MB,转换成16进制就是0xFC00000


nand write.yaffs2 0x30000000 0x400000 $(filesize)  //将内存中的yaffs2文件系统写入Nand的文件系统分区,注意这里的filesize是u-boot的一个全局变量,存放网络传输数据的大小,直接使用即可。这里的意思是yaffs2文件系统的实际大小,要写正确

下面是效果图

LT2440 # tftp 0x30000000 root-fs-128m-256m.yaffs2
dm9000 i/o: 0x18000300, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 08:00:3e:26:0a:5b
Using dm9000 device
TFTP from server 192.168.1.10; our IP address is 192.168.1.66
Filename 'root-fs-128m-256m.yaffs2'.
Load address: 0x30000000
Loading: ####################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################
done
Bytes transferred = 61340928 (3a7fd00 hex)
LT2440 # nand erase 0x400000 0xFC00000
NAND erase: device 0 offset 0x400000, size 0xfc00000
Skipping bad block at  0x5b8000000000000
Skipping bad block at  0x6b6000000000000
Skipping bad block at  0x8b6000000000000
Erasing at 0xffe00000fc00000 --   0% complete.
OK
LT2440 # nand write.yaffs2 0x30000000 0x400000 $(filesize)
NAND write: device 0 offset 0x400000, size 0x3a7fd00
Skip the first good block 40000000020000
Writing at 0x3cc000000020000 -- 100% is complete. 59482112 bytes written: OK


⑦、结合u-boot和内核来测试启动下载的yaffs2文件系统
设置u-boot启动参数bootargs,注意:这一长串参数要与内核配置里面的Boot options-->Default kernel command string的设置要一致。特别是mtdblock要根据内核具体的分区来设,在上一篇中讲到了内核中Nand的分区情况,u-boot属于mtdblock0,kernel属于mtdblock1,root-fs就属于mtdblock2,所以这里要设置成root=/dev/mtdblock2,否则文件系统无法启动成功,会出现一些什么I/O之类的错误


#  setenv bootargs noinitrd console=ttySAC0 root=/dev/mtdblock2 rootfstype=yaffs2

#  saveenv//如果您还没有烧写内核,按照如下步骤烧写

#  tftp 0x30000000 uimage43#  nand erase  0x100000  0x300000
下面是效果图
LT2440 # setenv bootargs noinitrd console=ttySAC0 root=/dev/mtdblock2 rootfstype=yaffs2
LT2440 # saveenv
Saving Environment to NAND...
Erasing Nand...
Erasing at 0x6000000000002 --   100% complete.
Writing to Nand... done

LT2440 # tftp 0x30000000 uimage43
dm9000 i/o: 0x18000300, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 08:00:3e:26:0a:5b
Using dm9000 device
TFTP from server 192.168.1.10; our IP address is 192.168.1.66
Filename 'uimage43'.
Load address: 0x30000000
Loading: ################################################################################################################################## #######################
done
Bytes transferred = 2223636 (21ee14 hex)
LT2440 # nand erase  0x100000  0x300000
NAND erase: device 0 offset 0x100000, size 0x300000
Erasing at 0x3e000001800000 --   0% complete.
OK
LT2440 # nand write 0x30000000 0x100000 0x300000
NAND write: device 0 offset 0x100000, size 0x300000
Writing at 0x3e000000020000 -- 100% is complete. 3145728 bytes written: OK

好了,最后重启开发板,命令行引导内核,yaffs2文件系统也成功挂载,命令行如下:
//命令输入如下nand read 0x33000000 0x100000 0x300000 bootm 33000000   
效果图如下
LT2440 #nand read 0x33000000 0x100000 0x300000
NAND read: device 0 offset 0x100000, size 0x300000
3145728 bytes read: OK
LT2440 # bootm 33000000
## Booting kernel from Legacy Image at 33000000 ...
   Image Name:   Linux-2.6.33.6
   Created:      2010-11-03   6:23:46 UTC
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    2223572 Bytes =  2.1 MB
   Load Address: 30008000
   Entry Point:  30008000
   Verifying Checksum ... OK
   Loading Kernel Image ... OK
OK
Starting kernel ...
Uncompressing Linux... done, booting the kernel.
Linux version 2.6.33.6 (pk@TFTech) (gcc version 4.3.3 (Sourcery G++ Lite 2009q1-
203) ) #10 Wed Nov 3 14:23:19 CST 2010
CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=00007177
CPU: VIVT data cache, VIVT instruction cache
Machine: LT2440
Memory policy: ECC disabled, Data cache writeback
CPU S3C2440A (id 0x32440001)
S3C24XX Clocks, Copyright 2004 Simtec Electronics
S3C244X: core 400.000 MHz, memory 100.000 MHz, peripheral 50.000 MHz
CLOCK: Slow mode (1.500 MHz), fast, MPLL on, UPLL on
Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 16256
Kernel command line: noinitrd console=ttySAC0 root=/dev/mtdblock2 rootfstype=yaf
fs2
PID hash table entries: 256 (order: -2, 1024 bytes)
Dentry cache hash table entries: 8192 (order: 3, 32768 bytes)
Inode-cache hash table entries: 4096 (order: 2, 16384 bytes)
Memory: 64MB = 64MB total
Memory: 60364KB available (3920K code, 355K data, 132K init, 0K highmem)
Hierarchical RCU implementation.
NR_IRQS:85
irq: clearing subpending status 00000003
irq: clearing subpending status 00000002
Console: colour dummy device 80x30
console [ttySAC0] enabled
Calibrating delay loop... 49.66 BogoMIPS (lpj=124160)
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
NET: Registered protocol family 16
S3C Power Management, Copyright 2004 Simtec Electronics
S3C2440: Initialising architecture
S3C2440: IRQ Support
S3C24XX DMA Driver, Copyright 2003-2006 Simtec Electronics
DMA channel 0 at c4808000, irq 33
DMA channel 1 at c4808040, irq 34
DMA channel 2 at c4808080, irq 35
DMA channel 3 at c48080c0, irq 36
S3C244X: Clock Support, DVS off
bio: create slab at 0
SCSI subsystem initialized
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
s3c-i2c s3c2440-i2c: slave address 0x10
s3c-i2c s3c2440-i2c: bus frequency set to 97 KHz
s3c-i2c s3c2440-i2c: i2c-0: S3C I2C adapter
Advanced Linux Sound Architecture Driver Version 1.0.21.
cfg80211: Calling CRDA to update world regulatory domain
NET: Registered protocol family 2
IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
TCP established hash table entries: 2048 (order: 2, 16384 bytes)
TCP bind hash table entries: 2048 (order: 1, 8192 bytes)
TCP: Hash tables configured (established 2048 bind 2048)
TCP reno registered
UDP hash table entries: 256 (order: 0, 4096 bytes)
UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
NET: Registered protocol family 1
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
RPC: Registered tcp NFSv4.1 backchannel transport module.
NetWinder Floating Point Emulator V0.97 (extended precision)
yaffs Oct 12 2010 10:18:34 Installing.
msgmni has been set to 118
alg: No test for stdrng (krng)
io scheduler noop registered
io scheduler cfq registered (default)
Console: switching to colour frame buffer device 60x34
fb0: s3c2410fb frame buffer device
s3c2440-backlight initialized
s3c2440-adc     initialized
s3c2440-pwm     initialized
s3c2440-led initialized
s3c2440-key initialized
s3c2440-uart.0: s3c2410_serial0 at MMIO 0x50000000 (irq = 70) is a S3C2440
s3c2440-uart.1: s3c2410_serial1 at MMIO 0x50004000 (irq = 73) is a S3C2440
s3c2440-uart.2: s3c2410_serial2 at MMIO 0x50008000 (irq = 76) is a S3C2440
S3C24XX NAND Driver, (c) 2004 Simtec Electronics
s3c24xx-nand s3c2440-nand: Tacls=1, 10ns Twrph0=3 30ns, Twrph1=2 20ns
s3c24xx-nand s3c2440-nand: NAND soft ECC
NAND device: Manufacturer ID: 0xec, Chip ID: 0xda (Samsung NAND 256MiB 3,3V 8-bi
t)
Scanning device for bad blocks
Bad eraseblock 732 at 0x000005b80000
Bad eraseblock 859 at 0x000006b60000
Bad eraseblock 1115 at 0x000008b60000
Creating 3 MTD partitions on "NAND 256MiB 3,3V 8-bit":
0x000000000000-0x000000100000 : "U-Boot"
0x000000100000-0x000000400000 : "kernel"
0x000000400000-0x000010000000 : "root"
PPP generic driver version 2.4.2
PPP Deflate Compression module registered
PPP BSD Compression module registered
PPP MPPE Compression module registered
NET: Registered protocol family 24
PPPoL2TP kernel driver, V1.0
dm9000 Ethernet Driver, V1.31
eth0: dm9000a at c4814000,c4818004 IRQ 51 MAC: 08:00:3e:26:0a:5b (chip)
usbcore: registered new interface driver zd1211rw
ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
s3c2410-ohci s3c2410-ohci: S3C24XX OHCI
s3c2410-ohci s3c2410-ohci: new USB bus registered, assigned bus number 1
s3c2410-ohci s3c2410-ohci: irq 42, io mem 0x49000000
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 2 ports detected
Initializing USB Mass Storage driver...
usbcore: registered new interface driver usb-storage
USB Mass Storage support registered.
usbcore: registered new interface driver libusual
usbcore: registered new interface driver ums-datafab
usbcore: registered new interface driver usbserial
USB Serial support registered for generic
usbcore: registered new interface driver usbserial_generic
usbserial: USB Serial Driver core
USB Serial support registered for FTDI USB Serial Device
usbcore: registered new interface driver ftdi_sio
ftdi_sio: v1.5.0:USB FTDI Serial Converters Driver
USB Serial support registered for pl2303
usbcore: registered new interface driver pl2303
pl2303: Prolific PL2303 USB to serial adaptor driver
s3c2440-usbgadget s3c2440-usbgadget: S3C2440: increasing FIFO to 128 bytes
mice: PS/2 mouse device common for all mice
s3c2410 TouchScreen successfully loaded
input: s3c2410 TouchScreen as /class/input/input0
S3C24XX RTC, (c) 2004,2006 Simtec Electronics
s3c2410-rtc s3c2410-rtc: rtc disabled, re-enabling
s3c2410-rtc s3c2410-rtc: rtc core: registered s3c as rtc0
i2c /dev entries driver
Linux video capture interface: v2.00
usbcore: registered new interface driver uvcvideo
USB Video Class driver (v0.1.0)
S3C2410 Watchdog Timer, (c) 2004 Simtec Electronics
s3c2410-wdt s3c2410-wdt: watchdog inactive, reset disabled, irq enabled
s3c-sdi s3c2440-sdi: powered down.
s3c-sdi s3c2440-sdi: mmc0 - using pio, sw SDIO IRQ
usbcore: registered new interface driver hiddev
usbcore: registered new interface driver usbhid
usbhid: USB HID core driver
No device for DAI UDA134X
No device for DAI s3c24xx-i2s
S3C24XX_UDA134X SoC Audio driver
UDA134X SoC Audio Codec
asoc: UDA134X <-> s3c24xx-i2s mapping ok
ALSA device list:
  #0: S3C24XX_UDA134X (UDA134X)
TCP cubic registered
NET: Registered protocol family 17
s3c2410-rtc s3c2410-rtc: hctosys: invalid date/time
yaffs: dev is 32505858 name is "mtdblock2"
yaffs: passed flags ""
yaffs: Attempting MTD mount on 31.2, "mtdblock2"
yaffs_read_super: isCheckpointed 0
VFS: Mounted root (yaffs2 filesystem) on device 31:2.

Freeing init memory: 132K
hwclock: settimeofday: Invalid argument
eth0: link up, 100Mbps, full-duplex, lpa 0x45E1
Please press Enter to activate this console.
[root@LuTong /]#

linux 内核成功启动,文件系统成功挂载!

下接:u-boot-2010.03在LT2440上的移植详解 (七)