编译linux2.6.32以适合s3c2410的NandFlash(64M)

来源:互联网 发布:北京企业老板数据 编辑:程序博客网 时间:2024/05/17 04:05

源码从friendlyArm网站下来:linux-2.6.32.2-mini2440-20110413.tar(内含s3c2410_defconfig)

编译参考:http://bbs.ednchina.com/BLOG_ARTICLE_261688.HTM

同时参考:http://blog.163.com/jant126@126/blog/static/12008366200791110249642/(补充配置选项)

三、修改arch/arm/plat-s3c24xx/common-smdk.c文件,修改Nand Flash的分区信息和Nand Flash的硬件信息。

 ......
/* NAND parititon from 2.4.18-swl5 */


static struct mtd_partition smdk_default_nand_part[] = {
 [0] = {
  .name =
"U-Boot-1.2.0",
  .size  =
SZ_128K,
  .offset = 0,
 },
 [1] = {
  .name =
"U-Boot-1.2.0 Parameter",
  .offset =
SZ_128K,
  .size =
SZ_64K,
 },
 [2] = {
  .name =
"Linux2.6.22.2 Kernel",
  .offset =
SZ_128K+SZ_64K,
  .size =
SZ_4M+(SZ_1M-SZ_128K-SZ_64K),
 },
 [3] = {
  .name =
"Root-JFFS2",
  .offset = SZ_1M * 5,
  .size = SZ_1M * 5,
 },
 [4] = {
  .name =
"Boot-Root(cramfs)",
  .offset =
SZ_1M * 10,
  .size = SZ_1M * 10,
 },
 [5] = {
  .name =
"YAFFS",
  .offset = SZ_1M * 20,
  .size = SZ_1M * 44,
 }
/*,
 [6] = {
  .name = "S3C2410 flash partition 6",
  .offset = SZ_1M * 24,
  .size = SZ_1M * 24,
 },
 [7] = {
  .name = "S3C2410 flash partition 7",
  .offset = SZ_1M * 48,
  .size = SZ_16M,
 }
*/
};
......


static struct s3c2410_platform_nand smdk_nand_info = {
    .tacls        =
0,
    .twrph0        =
30,
    .twrph1        =
0,
    .nr_sets    = ARRAY_SIZE(smdk_nand_sets),
    .sets        = smdk_nand_sets,
};


四、修改drivers/mtd/nand/s3c2410.c,去掉nand flashECC
 
我的内核是通过UBOOT写到Nand Flash, UBOOT 通过的软件ECC算法产生ECC校验码,这与内核校验的ECC码不一样,内核中的ECC码是由S3C2410Nand Flash控制器产生的。所以,我在这里选择禁止内核ECC校验。

 (不过我不了解内核中的ECC码生成原理,在查资料的过程中我看到了《成功移植最新的2.6.22.3linux kernelS3C2410上》,链接是http://www.cnitblog.com/zouzheng/archive/2007/08/28/32545.htmlhttp://hi.baidu.com/wangy0919/blog/item/0058652ae8c3133b5343c1cf.html,都是转载的,但都没找到原作者是谁。其中有这样一段活:


第三步:修改ECC校验:
根据kernel官方网站上的说明,从2.6.22.3已经修改了ECC校验的问题(这也是我移植2.6.22.3的一个重要原因)。但实验下来发现,不管是用软件ECC还是硬件ECC都不行。只好改成NAND_ECC_NONE
driver/mtd/nand/s3c2410.c中找到s3c2410_nand_init_chip()函数,将其中的
chip->ecc.mode=NAND_ECC_SOFT;
改成
chip->ecc.mode=NAND_ECC_NONE; ”

 五、增加Yaffs2文件系统的支持
  
对于YAFFS文件系统,我在移植时查阅了许多资料。有的博客上说没有必要移植YAFFS2,因为它是为每页大于1024BNAND Flash设计的。即使移植了YAFFS2,如果你的NAND Flash是每页51216B的那系统也会自动挂载YAFFS。所以在这里要移植YAFFS2或是YAFFS随你的便。我移植的是YAFFS2
 1、下载Yaffs2
       URL:http://www.aleph1.co.uk/cgi-bin/viewcvs.cgi/
 2、解压Yaffs2并将其加入Linux内核(打补丁的方式)
       #cd yaffs2
       #./patch-ker.sh c /home/work/hzh1024n/linux-2.6.22.6/


配置内核

   在配置内核前,先拷贝s3c2410开发板的默认配置到内核根目录下,以简化配置过程。

    #pwd


    /usr/src/linux-2.6.32.2


    # cp arch/arm/configs/s3c2410_defconfig .config


    # make menuconfig以下是 s3c2410_defconfig基础上要配置的选项(有一些必须的选项在s3c2410_defconfig里已经选上了,所以我没有写出来。以下的选项非特别说明,可能不用选,我没有做实验证明哪些要、哪些不要,所以有兴趣的可以自己做实验看看,欢迎发EMail告诉我结果。谢谢)

General setup  ---> 

    [*] Configure standard kernel features (for small systems)  --->   

    选上这项,否则文件系统中的一些选项不会出现

System Type  --->      

   S3C2410 Machines  --->  

    [*] SMDK2410/A9M2410    留下这项就够了,其他全部“N”

   “N” S3C2412 Machines  ---> S3C2440 Machines  ---> S3C2443 Machines  --->里的所有选项,都是和2410无关的选项。

Boot options  --->

      (root=/dev/hda1 ro init="/bin/bash" console="ttySAC0") Default kernel command string

改成   (noinitrd root="/dev/mtdblock3"  rootfstype="jffs2"  console="ttySAC0",115200 init="/linuxrc" mem="64M") Default kernel command string

#说明:

#mtdblock3代表第4flash分区,用来作根文件系统rootfs

# console="ttySAC0",115200使kernel启动期间的信息全部输出到串口0上,波特率为115200

# 2.6内核对于串口的命名改为ttySAC0,但这不影响用户空间的串口编程。

# 用户空间的串口编程针对的仍是/dev/ttyS0

# mem=64M表示内存是64M,如果是32则设为32M

    在实践中,我发现“rootfstype=jffs2”这句还是挺重要的。如果没有这句,系统启动时即使分区挂载正确了,但是文件系统的类型有可能出错。在这里定义过,就不会出错了。这里的选项也和根文件系统的配置有关。(我先使用jffs2做跟文件系统,以后再换YAFFS


Userspace binary formats  --->

    < > Kernel support for a.out and ECOFF binaries(去除该选项,a.outECOFF是两种可执行文件的格式,在ARMLinux下一般都用ELF,所以这两种基本用不上。)

Networking  --->
Networking options  --->  

    <*> Packet socket

    [*]   Packet socket: mmapped IO


-我移植华硕无限网卡,所以我选了WLAN802.11)的选项,不需的可以不选-


     Wireless  --->


        --- Improved wireless configuration API


        --- Wireless extensions 


        <*> Generic IEEE 802.11 Networking Stack (mac80211)


       [*]   Enable LED triggers


       [ ]   Enable debugging output (NEW)


       <*> Generic IEEE 802.11 Networking Stack 


       [ ]   Enable full debugging output (NEW)


        ---   IEEE 802.11 WEP encryption (802.1x)


       < >   IEEE 802.11i CCMP support (NEW) 


       < >   IEEE 802.11i TKIP encryption (NEW) 


       <*>   Software MAC add-on to the IEEE 802.11 networking stack


       [ ]     Enable full debugging output (NEW)


Device Drivers  --->  


         “N”   Parallel port support  --->里的所有选项。


       Plug and Play support  --->里的所有选项一定要“N”掉,不然编译会出错!!!!!!!!


   Network device support  --->


        Ethernet (10 or 100Mbit)  --->


        选上<*> DM9000 support< >   Generic Media Independent Interface device support


-------——————————————————------


            我用的是DM9000A网卡,网卡驱动移植后面介绍


-----------------------------


        “N” [ ]   Ethernet (1000 Mbit)  ---> [ ]   Ethernet (10000 Mbit)  --->


        Wireless LAN  ---> 


            [*] Wireless LAN (pre-802.11)


                 [*] Wireless LAN (IEEE 802.11)


        USB Network Adapters  --->


            <*> Multi-purpose USB Networking Framework


    <*> MMC/SD card support  --->


    Real Time Clock  --->


        “N” [ ]   Set system time from RTC on startup and resume


 


#接下来做的是针对文件系统的设置!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


(注意:不要试图按照旧内核的方法增加 devfs的支持,因为在这个内核里已经彻底删除了


devfs的源代码。我曾试图将旧内核的devfs源代码复制过来,不过编译会出错!


   补救的办法就是用BusyBoxmdev来代替,在讲根文件系统的建立时我会说明,你也可以到网上找mdev的资料。)
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


File systems -->

    < > Second extended fs support #去除对ext2的支持

    < > Ext3 journalling file system support #去除对ext3的支持

    <*> Kernel automounter support

    <*> Kernel automounter version 4 support (also supports v3)

    <*> Filesystem in Userspace support

    Pseudo filesystems -->

       [*] Virtual memory file system support (former shm fs)

       <*> Userspace-driven configuration filesystem (EXPERIMENTAL)

      Miscellaneous filesystems -->


       <*> YAFFS2 file system support


        “N”[ ]Autoselect yaffs2 format


[ ]Cache short names in RAM ,因为这是给每页大于1024BNAND Flash设计的


<*> Journalling Flash File System v2 (JFFS2) support

    (0)   JFFS2 debugging verbosity (0 = quiet, 2 = noisy)

    [*]   JFFS2 write-buffering support

    [ ]   JFFS2 summary support (EXPERIMENTAL)

    [ ]   JFFS2 XATTR support (EXPERIMENTAL)

    [*]   Advanced compression options for JFFS2

    [*]     JFFS2 ZLIB compression support

    [*]     JFFS2 RTIME compression support

    [*]     JFFS2 RUBIN compression support

    JFFS2 default compression mode (priority)  --->

 Network File Systems -->

           <*> NFS file system support

--以下最好选上,因为在挂载NFS时可能出现protocol不支持的情况--

           [*]Provide NFSv3 client support

           [*]Provide client support for the NFSv3 ACL protocol extension

           [*]   Provide NFSv4 client support (EXPERIMENTAL)

           [*]   Allow direct I/O on NFS files

------------------------------------------------------------------------- 

     <*> NFS server support 

       [*]   Provide NFSv3 server support

       [*]Provide server support for the NFSv3 ACL protocol extension    

       [*]     Provide NFSv4 server support (EXPERIMENTAL)        

       ---   Provide NFS server over TCP support                  

       [*] Root file system on NFS

    保存退出,产生.config文件。

补充配置选项:http://blog.163.com/jant126@126/blog/static/12008366200791110249642/
A)在 以上配置 基础上,我所增删的内核配置项如下:
Loadable module support  ­­­>
                           [*] Enable loadable module support 
                                      [*] Automatic kernel module loading
System Type  ­­­> [*] S3C2410 DMA support
Boot options  ­­­> Default kernel command string:
         noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0,115200     
         #说明:mtdblock2 代表我的第 4 个 flash 分区,它是我的 rootfs
         #     console=ttySAC0,115200 使 kernel 启动期间的信息全部输出到串口 0 上.
         #     2.6 内核对于串口的命名改为 ttySAC0,但这不影响用户空间的串口编程。
         #     用户空间的串口编程针对的仍是/dev/ttyS0 等
         #     如果你的bootLoader可以向内核传递启动参数,则这一项可以不设置,如果我的就是在VIVI中设置上面的参数的
Floating point emulation  ­­­>
                           [*] NWFPE math emulation
                               This is necessary to run most binaries!!!
#接下来要做的是对内核 MTD 子系统的设置
Device Drivers  ­­­>
         Memory Technology Devices (MTD)  ­­­>
                           [*] MTD partitioning support 
                               #支持 MTD 分区,这样我们在前面设置的分区才有意义
                           [*] Command line partition table parsing
                               #支持从命令行设置 flash 分区信息,灵活
                                      RAM/ROM/Flash chip drivers  ­­­>
                                         <*> Detect flash chips by Common Flash
                                                Interface (CFI) probe
                                         <*> Detect non­CFI AMD/JEDEC­compatible flash chips
                                         <*> Support for Intel/Sharp flash chips
                                         <*> Support for AMD/Fujitsu flash chips
                                         <*> Support for ROM chips in bus mapping
                                      NAND Flash Device Drivers  ­­­>
                                         <*> NAND Device Support
                                         <*> NAND Flash support for S3C2410/S3C2440 SoC
         Character devices  ­­­>
                           [*] Non­standard serial port support
                           [*] S3C2410 RTC Driver
#接下来做的是针对文件系统的设置,本人实验时目标板上要上的文件系统是 cramfs,故做如下配置
File systems  ­­­>
                          <> Second extended fs support   #去除对 ext2 的支持
                  Pseudo filesystems  ­­­>
                          [*] /proc file system support
                          [*] Virtual memory file system support (former shm fs)
                          [*] /dev file system support (OBSOLETE)
                          [*] Automatically mount at boot (NEW)
                              #这里会看到我们前先修改 fs/Kconfig 的成果,devfs 已经被支持上了
                  Miscellaneous filesystems  ­­­>
                          <*> Compressed ROM file system support (cramfs)
                              #支持 cramfs
                  Network File Systems  ­­­>
                          <*> NFS file system support

B). 这里还有一个方面要注意的,就是ECC问题,如果不把

    Device Drivers  --->
     Memory Technology Devices (MTD)  --->
        NAND Flash Device Drivers  --->
            [*]   S3C2410 NAND Hardware ECC
    去掉会出现如下的问题:
end_request: I/O error, dev mtdblock3, sect


七、编译内核


    #make zImage

制作cramfs



原创粉丝点击