原创 移植Linux2.6.22.6到s3c2410/2440开发板成功

2009-9-18 15:26 4680 4 4 分类: MCU/ 嵌入式

主要还是参考tekkaman的文章http://blog.chinaunix.net/u1/34474/showart.php?id=369449自己修改了网卡移植这一部分。交叉编译器用的是arm-linux-<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />3.4.1版本。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


一、将Linux2.6.22.6内核源码放到工作目录的kernel文件夹下,并解压。
#tar xzvf linux2.6.22.6.tar.gz
#pwd
/home/work/hzh1024n
# cd linux2.6.22.6
进入内核解压后的目录,以后示例中,只要是相对路径全部是相对于
/home/work/hzh1024n/linux2.6.22.6/
此目录





二、修改内核源码根目录下的Makefile文件(CROSS_COMPILE    =的值因个人情况而定,其他可以照做。)
#
vi Makefile


#ARCH        ?= $(SUBARCH)
#CROSS_COMPILE    ?=


ARCH        = arm
CROSS_COMPILE    = /usr/local/arm/3.4.1/bin/arm-linux-






三、修改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 flash ECC
 
我的内核是通过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; ”


 


    搜索关键字NAND_ECC_SOFT,在s3c2410_nand_init_chip函数里,修改NAND_ECC_SOFTNAND_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


    /home/work/hzh1024n/linux-2.6.22.6


    # 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文件。





    七、编译内核


        #make zImage 


        正常来说编译是不会出错的,只有一些警告。


     

     、移植到s3c2440


       首先,Linux2.6.22.6本身就支持s3c2440处理器,由于2410和2440基本兼容,所以在linux源码里2440的很多文件是和2410共用的。所以在按照我移植2410记录的基础上,主要修改如下:

     

    一、开发板选项的选择。


    System Type  --->      

       S3C2440 Machines  --->  

       
  • SMDK2440

  •    
  • SMDK2440 with S3C2440 CPU module

  • 留下这两项就够了,S3C2400 Machines  ---> 、S3C2410 Machines  --->、S3C2412 Machines  --->、S3C2442 Machines  --->、S3C2443 Machines  --->里的项目全部“N”掉。

     

    这两个选项是区分你的目标芯片是2410还是2440的关键选项!!


    二、系统初始化时的芯片晶振频率的修改,修改arch/arm/mach-s3c2440/mach-smdk2440.c

     ......
        static void __init smdk2440_map_io(void)
    {
        s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
        s3c24xx_init_clocks(12000000);
        s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
    }

     ......

    如果没有改这个参数,系统启动时到了"done, booting the kernel."之后就会出现乱码现象或是没有输出。我一开始就碰到了这个麻烦。出现此类乱码或没有输出现象的另一个原因可能是你的bootloader对CPU的主频和分频的设置不正确。SBC2440V4的设置最好是时钟频率405MHz,分频比为1:4:8,不然有可能出现上述现象。

     

    #make zImage编译的内核就支持s3c2440了。

     

    网卡的移植以后再讲。
    PARTNER CONTENT

    文章评论0条评论)

    登录后参与讨论
    我要评论
    0
    4
    关闭 站长推荐上一条 /3 下一条