Chinaunix首页 | 论坛 | 博客
  • 博客访问: 947055
  • 博文数量: 104
  • 博客积分: 1919
  • 博客等级: 上尉
  • 技术积分: 1910
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-21 16:33
文章分类
文章存档

2016年(4)

2015年(1)

2014年(6)

2013年(16)

2012年(27)

2011年(49)

2010年(1)

分类: LINUX

2011-05-13 15:32:34

    由于要准备linux内核升级,首先要先将原来2.6.16版本的内核移植到2.6.16.13版本上,由于以前并没有进行过类似的操作,故此次首先按照前辈们的做法先来练练。

1、首先参考阿虚师兄的2.16.16版本的移植方法:

     http://hi.baidu.com/aokikyon/blog/item/a806363b7da3a0e315cecbd9.html

     下载里面的压缩包,并按照里面的步骤来进行操作至第三步。

    在第四步:

     修改 /arch/arm/Kconfig文件
     第95行 添加:
     config ARCH_SEP4020
         bool "sep4020"
         help
             Support for Southeast University sep4020 boards.

    第 258 行 添加:

    source "arch/arm/mach-sep4020/Kconfig"

    第五步:

    修改 /arch/arm/Makefile文件
    第 94 行 添加:
    machine-$(CONFIG_ARCH_SEP4020)    := sep4020

   第六步:

   修改 /arch/arm/mm/Kconfig
   第 45 行 替换所有arm720t内容:  

  # ARM720T
  config CPU_ARM720T
  bool "Support ARM720T processor" if !ARCH_CLPS711X && !ARCH_SEP4020 && !ARCH_L7200 && !ARCH_CDB89712 && ARCH_INTEGRATOR
  default y if ARCH_CLPS711X || ARCH_L7200 || ARCH_CDB89712 || ARCH_H720X ||ARCH_SEP4020
  select CPU_32v4
  select CPU_ABRT_LV4T
  select CPU_CACHE_V4
  select CPU_CACHE_VIVT
  select CPU_COPY_V4WT
  select CPU_TLB_V4WT
  help
    A 32-bit RISC processor with 8kByte Cache, Write Buffer and
    MMU built around an ARM7TDMI core.

    Say Y if you want support for the ARM720T processor.
    Otherwise, say N.

  第七步:

   修改/arch/arm/tools/mach-types
   最后一行添加
  sep4020                 ARCH_4020             GFD4020                 194

  修改第 211 行
   i519 ARCH_I519 I519 1940

   第八步:

   复制sep4020_defconfig到arch/arm/configs中

   第九步:
   执行make sep4020_defconfig 套用默认内核配置   

  第十步:
   执行make编译内核
   在编译时会发生错误:

   CC      arch/arm/mach-sep4020/irq.o
   arch/arm/mach-sep4020/irq.c:35: error: variable ‘sep4020_chip’ has initializer but incomplete type
   arch/arm/mach-sep4020/irq.c:37: error: unknown field ‘ack’ specified in initializer
   arch/arm/mach-sep4020/irq.c:37: warning: excess elements in struct initializer
   arch/arm/mach-sep4020/irq.c:37: warning: (near initialization for ‘sep4020_chip’)
   arch/arm/mach-sep4020/irq.c:38: error: unknown field ‘mask’ specified in initializer
   arch/arm/mach-sep4020/irq.c:38: warning: excess elements in struct initializer
   arch/arm/mach-sep4020/irq.c:38: warning: (near initialization for ‘sep4020_chip’)
   arch/arm/mach-sep4020/irq.c:39: error: unknown field ‘unmask’ specified in initializer
   arch/arm/mach-sep4020/irq.c:39: warning: excess elements in struct initializer
   arch/arm/mach-sep4020/irq.c:39: warning: (near initialization for ‘sep4020_chip’)
   arch/arm/mach-sep4020/irq.c: In function ‘sep4020_init_irq’:
   arch/arm/mach-sep4020/irq.c:54: error: ‘handle_level_irq’ undeclared (first use in this function)
   arch/arm/mach-sep4020/irq.c:54: error: (Each undeclared identifier is reported only once
   arch/arm/mach-sep4020/irq.c:54: error: for each function it appears in.)
   arch/arm/mach-sep4020/irq.c:55: warning: passing argument 2 of ‘set_irq_chip’ from incompatible pointer type
   make[1]: *** [arch/arm/mach-sep4020/irq.o] Error 1
   make: *** [arch/arm/mach-sep4020] Error 2
   第十一步:
   修改arch/arm/mach-sep4020/irq.c

   第 35 行:修改为

   static struct irqchip sep4020_chip=             //irqchip kyon
   第 54 行:修改为

   set_irq_handler(i, do_level_IRQ);

   此时编译会出现:

  In file included from arch/arm/mach-sep4020/time.c:7:
   include/linux/irq.h:94:55: error: asm/hw_irq.h: No such file or directory
   arch/arm/mach-sep4020/time.c: In function ‘sep4020_timer_interrupt’:
   arch/arm/mach-sep4020/time.c:30: error: too few arguments to function ‘timer_tick’
   arch/arm/mach-sep4020/time.c: At top level:
   arch/arm/mach-sep4020/time.c:39: error: ‘IRQF_DISABLED’ undeclared here (not in a function)
   arch/arm/mach-sep4020/time.c:39: error: ‘IRQF_TIMER’ undeclared here (not in a function)
   arch/arm/mach-sep4020/time.c:39: error: ‘IRQF_IRQPOLL’ undeclared here (not in a function)
   make[1]: *** [arch/arm/mach-sep4020/time.o] Error 1
   make: *** [arch/arm/mach-sep4020] Error 2
   第十一步:
   修改arch/arm/mach-sep4020/time.c

   第 30 行:修改为

   timer_tick(regs);

   第 39 行:修改为:

   .flags  = SA_INTERRUPT | SA_TIMER,

   删除掉 第 7 行:

   此时编译会出现:

   LD      arch/arm/boot/compressed/vmlinux
   arch/arm/boot/compressed/misc.o: In function `error':
   misc.c:(.text+0x3f0): undefined reference to `putstr'
   misc.c:(.text+0x3f8): undefined reference to `putstr'
   misc.c:(.text+0x404): undefined reference to `putstr'
   arch/arm/boot/compressed/misc.o: In function `flush_window':
   misc.c:(.text+0xd44): undefined reference to `putstr'
   arch/arm/boot/compressed/misc.o: In function `decompress_kernel':
   misc.c:(.text+0x2b1c): undefined reference to `putstr'
   arch/arm/boot/compressed/misc.o:misc.c:(.text+0x2b2c): more undefined references to `putstr' follow
   make[2]: *** [arch/arm/boot/compressed/vmlinux] Error 1
   make[1]: *** [arch/arm/boot/compressed/vmlinux] Error 2
   make: *** [zImage] Error 2
   第十二步:

   修改  include/asm/arch/uncompress.h

   第 20 行以下全部替换为:  

   #include
   #include
   #include   
   /*
   * This does not append a newline
   */
  static void putstr(const char *s)
  {
    char c;

    while ((c = *s++) != '\0')
    {
        while(!((*(volatile unsigned char *)(0x10005014))& 0x40)); /*deleted by shixq*/
       *(volatile unsigned long*)UART0_TXFIFO = (int)c;
       if (c == '\n')
       {
           while(!((*(volatile unsigned char *)(0x10005014))& 0x40)); /*deleted by shixq*/
           *(volatile unsigned long*)UART0_TXFIFO = (int)('\r');
       }
     }
  }

  /*
    * nothing to do
  */
   #define arch_decomp_setup()

   #define arch_decomp_wdog()

   此时编译,通过生成zImage文件。

   下面挂载 ramfs 镜像:

    第十三步:

    在我的目录下执行以下操作:

    # mkdir initrd
    #dd if=/dev/zero of=initrd.img bs=1k count=3072
    # mke2fs -F -v -m0 initrd.img
    # mount -o loop initrd.img initrd
    # cp -av nfs/* initrd
    # umount initrd
    # gzip -9 initrd.img
  这样我就在当前目录下得到了一个名为initrd.img.gzramdisk的文件系统镜像(看来它是一个压缩的镜像),这个镜像在下面我们会用到的。

  第十四步:

 制作内核和文件系统同一的镜像bootpImage: 

 a、在device driver中进入block device中选中中间四个

 

 b、进入file system中,选中ext2文件系统的支持。

 

 c、如果你是一般挂载ramdisk文件系统你还得在Boot options  --->中填上自己的启动参数

 

  root=/dev/ram0 console=ttyS0,115200 initrd=0x31000000,0x300000
  其中:
  root=/dev/ram0:使用RAMFS
  console=ttyS0,115200:默认控制台为串口0,使用115200的波特率
  initrd=0x31000000,0x300000:RAMFS文件系统位于0x31000000处,大小为3M

  保存配置并退出。

  步骤二:编译内核,并将文件系统映像编译进去
  make bootpImage INITRD_PHYS=0x31000000 INITRD=/home/yourenpa/initrd.img.gz PARAMS_PHYS=0x30000100

  其中:
  make:编译指令
  bootpImage:编译选项,固定
  INITRD_PHYS=0x31000000:RAMFS文件系统的位置,与bootargs对应(FP的文章里有不对应的小错误)
  INITRD=/home/yourenpa/initrd.img.gz:RAMFS映像在PC上的位置,就是楼主生成的Image
  PARAMS_PHYS=0x30000100:Bootargs的位置,这句感觉有点没必要,bootm引导内核的时候会传参数
  此时就会生成我们所需要的bootpImage文件,路径为:arch/arm/boot/bootpImage。
  步骤三:运行内核

 修改板子的bootatgs参数:

  SEP4020=>set bootargs root=/dev/ram0 rw console=ttyS0,115200 initrd=0x31000000,0x300000 mem=32mb
  这因为使用bootm时会将bootargs传参到内核,所以尽管在内核中指定的默认的参数,但有可能会被忽略掉,最好还是修改一下bootargs。

  SEP4020=>set bootcmd tftp 30008000 bootpImage\; bootm 30008000

  SEP4020=>save

  重启开发板,效果如下图:

  
   ramfs 挂载成功。

阅读(2600) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~