S3C2440Linux内核移植

来源:互联网 发布:网络在线电话免费版 编辑:程序博客网 时间:2024/06/05 12:49

Step 1 环境变量

  建立交叉编译工具链,并设定工作目录
  解压交叉编译工具至目标目录
  #tar xvfj EABI-4.3.3_EmbedSky.tar.bz2
  将文件转移到/opt中放置
  设定工作目录
  #export PATH=/opt/EmbedSky/4.4.3/bin:$PATH

Step 2 ARM支持

  解压系统源码
  添加ARM编译环境支持
  修改Makefile文件,表明体系结构是ARM,编译器是arm-linux-gcc
  ARCH = arm
  CROSS_COMPILE = arm-linux-

Step 3 修改平台时钟

  arch/arm/mach-s3c2440/mach-smdk2440.c
  修改参数16934400->12000000(12MHz外部时钟输入)
  s3c24xx_init_clocks(16934400);

Step 4 配置内核


  #make menuconfig
  出错:Unable to find the ncurse libraries or the required header files
  说明缺少一个ncurse库,貌似是图形终端相关,下载ncurses-5.7并解压
  生成Makefile并编译
  #./configure
  #make
  发生错误/bin/sh: -I../c++: not found
  重新生成Makefile并再次编译
  #./configure --without--cxx--binding
  #make
  安装
  #make install
  再次执行make menuconfig成功,进入图形配置界面
  调用默认配置单arch/arm/configs/s3c2410_defconfig
  Load an Alternate Configuration File
  配置内核并保存为.config
  千万在S3C2440选项里面选中SMDK2440,否则会出现机器码不匹配

Step 5 修改机器码

  arch/arm/tools/mach-types
  将s3c2440这一行的机器码改为168,这样可以与uboot中设定的机器码匹配

Step 6 编译镜像

  #make zImage
  生成的镜像保存在arch/arm/boot里
 
Step 7 NANDFlash驱动移植

  arch/arm/plat-s3c24xx/common-smdk.c
  修改结构smdk_default_nand_part[],设定分区表
  static struct mtd_partition smdk_default_nand_part[] ={    [0] = {        .name    = "Uboot",        .offset = 0x00000000,        .size    = 0x00040000,          },    [1] = {        .name    = "Kernel",        .offset = 0x00200000,        .size    = 0x00300000,          },    [2] = {        .name    = "Yaffs2",        .offset = 0x00500000,        .size    = MTDPART_SIZ_FULL,          },    };

  禁止ECC校验

  打开drivers/mtd/nand/s3c2410.c

  chip->ecc.mode = NAND_ECC_SOFT

  改为

  chip->ecc.mode = NAND_ECC_NONE
  在内核配置中Device Drivers中选中NAND Device的支持

Step 8 添加YAFFS2支持

  下载yaffs2补丁cvs-root.tar.gz,解压,打上补丁
  #./pathc-ker.sh /opt/EmbedSky/linux-2.6.30.4/
  在内核配置中选中YAFFS2支持

Step 9 编译BusyBox

  下载busybox-1.20以上版本(低版本似乎有问题),解压,修改Makefile
  CROSS_COMPILE = arm-linux-
  ARCH = arm
  #make menuconfig
  似乎配置中要选择静态链接库,不然会有问题,还有关于不同shell的,这次移植没碰到(-_-)
  获得busybox文件系统目录
  make;make install

Step 10 构建文件系统


  创建root作为文件系统目录,里面新建一些重要目录,把busybox里_install目录里的bin,sbin,usr和linuxrc拷贝过来,在usr下面创建lib和share目录


  /dev
  内核挂载完文件系统后会用mdev建立,不过mdev调用init进程启动,而init需要用到/dev/console和/dev/null,所以要在制作文件系统时静态创建
  #mknod console c 5 1
  #mknod null c 1 3

  /etc
  存放系统配置文件
 
  --fstab
  挂载的文件系统
  #device    mount-point    type     options     dump    fsckorder
  proc       /proc          proc     defaults    0       0
  tmpfs      /tmp           tmpfs    defaults    0       0
  sysfs      /sys           sysfs    defaults    0       0
  tmpfs      /dev           tmpfs    defaults    0       0
  var        /dev           tmpfs    defaults    0       0
  ramfs      /dev           ramfs    defaults    0       0

  --group
  组信息
  root:*:0:
  daemon:*:1:
  bin:*:2:
  sys:*:3:
  adm:*:4:
  tty:*:5:
  disk:*:6:
  lp:*:7:lp
  mail:*:8:
  news:*:9:
  uucp:*:10:
  proxy:*:13:
  kmem:*:15:
  dialout:*:20:
  fax:*:21:
  voice:*:22:
  cdrom:*:24:
  floppy:*:25:
  tape:*:26:
  sudo:*:27:
  audio:*:29:
  ppp:x:99:
  500:x:500:sky
  501:x:501:sky

  --inittab
  #/etc/inittab
  ::sysinit:/etc/init.d/rcS
  tq2440_serial0::askfirst:-/bin/sh
  ::ctrlaltdel:/sbin/reboot
  ::shutdown:/bin/umount -a -r
  需要可执行权限
  #chmod 777 inittab

  --passwd
  root::0:0:root:/:/bin/sh
  ftp::14:50:FTP User:/var/ftp
  bin:*:1:1:bin:/bin
  daemon:*:2:2:daemon:/sbin:
  nobody:*:99:99:Nobody:/:
  sky::502:502:Linux User:/home/sky:/bin/sh

  --profile
  #Ash profile
  #vim:syntax=sh
  USER="`id -un`"
  LOGNAME=$USER
  PS1='[\u@\h\W]#'
  PATH=$PATH
  HOSTNAME=`/bin/hostname`
  export USER LOGNAME PS1 PATH

  --mdev.conf
  sd[a-z]*[0-9]        0:0    0600    @(mount -t vfat -o iocharset=utf8 /dev/$MDEV/udisk
  sd[a-z]*[0-9]        0:0    0600    @(umount /udisk)
  mmcblk[0-9]*p[0-9]   0:0    0600    @(mount -t vfat -o iocharset=utf8 /dev/$MDEV/sddisk
  mmcblk[0-9]*p[0-9]   0:0    0600    @(umount /sddisk)

  --/init.d/rcS
  开机脚本
  #!/bin/sh
  PATH=/sbin:/bin:/usr/sbin:/usr/bin
  runlevel=S
  prevlevel=N
  umask 022
  export PATH runlevel prevlevel
  mount -a
  mkdir /dev/pts
  mount -t devpts devpts /dev/pts
  echo /sbin/mdev > /proc/sys/kernel/hotplug
  mkdir -p /var/lock
  /bin/hostname -F /etc/sysconfig/HOSTNAME
  需要可执行权限
  #chmod 777 inittab

  --/init.d/httpd
  #!/bin/sh
  base=boa
  case "$1" in
    start)
    /sbin/$base
    ;;
    stop)
    pid=`/bin/pidof $base`
    if [ -n "$pid" ]; then
      kill -9 $pid
    fi
      ;;
  esac
  exit 0

  --sysconfig/HOSTNAME
  EmbedSky

  /lib
  将交叉编译工具链库文件拷贝过来

Step 11 修改串口驱动

  内核支持2个串口UART0和UART1,UART2的驱动是针对红外接口的,须作修改
  arch/arm/macn-s3c2440/mach-smdk2440.c第100行
  .ulcon = 0x03
  drivers/serial/samsung.c第53行添加#include <mach/regs-gpio.h>
  第433行添加
  if (port->line == 2)  {    s3c2410_gpio_cfgpin(S3C2410_GPH6, S3C2410_GPH6_TXD2);    s3c2410_gpio_pullup(S3C2410_GPH6, 1);    s3c2410_gpio_cfgpin(S3C2410_GPH7, S3C2410_GPH6_RXD2);    s3c2410_gpio_pullup(S3C2410_GPH7, 1);    //设置UART2为串口功能  }
  第888行修改为
  static struct uart_driver s3c24xx_uart_drv = {    ...    .dev_name = "tq2440_serial",    ...    }

  这样,可以引导内核,然后进入文件系统。

  这次移植后来系统不断重启,原来是配置中没有禁止看门狗,配置一下即可。


原创粉丝点击