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

来源:互联网 发布:网络食品安全管理办法 编辑:程序博客网 时间:2024/05/17 07:59

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 <bio-0> 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上的移植详解 (七)

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小孩在幼儿园摔骨折了怎么办 孩子在幼儿园摔骨折了怎么办 大腿被撞了很痛怎么办 马面褶子坏了怎么办 纱料衣服有褶怎么办 裙子如果后背那里小了怎么办 湖州耳朵鸣很严重怎么办 预授权撤销错了怎么办 打酒店里小卡片电话被骗怎么办 本科错过了选导师该怎么办 本科导师威胁学生不让毕业怎么办 意向导师名额满了怎么办? 扔的瓶子被限制怎么办 左钝缘支起始部重度狭窄怎么办 吃了抑郁症药困怎么办 如果股票退市持股人怎么办 电信身份信息审核失败怎么办 打完肌肉针肿了怎么办 refa掉了一个球怎么办 左腿比右腿粗怎么办 产妇上火怎么办吃什么下火呢 哺乳期上火怎么办吃什么下火 前扣内衣有点紧怎么办 橱柜做了小10厘米怎么办 一个月宝宝体检胸围35怎么办 月经量少脸上长斑怎么办 下压100上压160怎么办 怎么办去台湾新的驻签 学生去韩国旅游签证怎么办 猪的眼睛赛肿了怎么办 纹眉没有修复霜怎么办 衣服搞到走珠露香水洗不掉怎么办 涂牙膏把脸烧伤怎么办 月经血排不出来怎么办 猫眼角膜掉了一块怎么办 腰酸痛直不起腰怎么办 白血病移植后复发了怎么办 斐讯k2红灯常亮怎么办 洗衣机把烟洗了怎么办 吸烟吸的恶心想吐怎么办 显示双方信息的明细怎么办