OK6410之linux-2.6.39.2内核的移植愚见

2019-07-13 03:53发布

  说明:(不好意思,前几天写的时候太慌了,漏了一个重要的细节,就是关于在编译时一定要让mach-ok6410.c文件编译进去,否则内核编译会跑步起来的,也就是在修改Kconfig时还需要修改相应的Makefile,我已经在相应的位置加上了)   对于嵌入式LINUX,本人基本属于还不入流的一类,本来也没打算自己去移植LINUX内核的,毕竟基本移植再加搞定所有驱动移植是一个很需要时间的过程,但是由于飞凌的售后技术客服服务实在让我无语了,由于买开发板时,飞凌官方给的是LINUX2.6.28内核,当时用起来还是蛮不错的,至少满足我的NFS_ROOT挂载启动,好方便开发,前几天无意看到官网的OK6410的LINUX内核更新到了LINUX2.6.36,于是尝尝鲜嘛,可哪知NFS启动死活就不成功,在飞凌论坛上问技术人员又没人理,没办法,算了,还是自己动手先玩玩呗,好了,野棉花扯多了,还是步入正题吧。    开发环境,还是和前面的UBOOT移植的一样,没有变化。         1,笔记本主机系统WINDOWS XP SP3系统             2,虚拟机采用的是 VMware Workstation ACE版本          3,虚拟机内采用的LINUX系统是UBUNTU10.10版本          4,交叉编译工具是CROSS_COMPILE4.2.2版本 对于LINUX内核移植,和UBOOT移植一样,先需要获取源代码,源代码网址http://www.kernel.org/,在我写这篇愚见的时候,最新版是linux2.6.39.3,新的技术肯定一般都是好的嘛 呵呵,所以还是挑了最新的LINUX2.6.39.2来开刀,刚打完linux2.6.39.3补丁。    对于LINUX内核移植,方法还是和UBOOT一样的思路,一步一步的有目的的进行,边思考边进行,这样才能做到心中有数,不要盲目,好了,步入正题,开工了。 将下载的LINUX内核linux-2.6.39.2.tar.bz2随便放入虚拟机UBUNTU下的一个目录下,解压:tar -jxvf  linux-2.6.39.2.tar.bz2,然后就得到了我们所要的linux内核源代码了,这个是必须的哦,呵呵,没有源代码就无法进行下去了啊。 第一步,和前面的UBOOT移植的思路一样,一切尽量简单化,所以还是cd linux-2.6.39.2进去,看个文件架构布局,做到心中有数嘛:root@hewenqiang-ubuntu:/SHARE/linux-2.6.39.2# ls
arch     Documentation  init     lib               samples   usr
block    drivers        ipc      MAINTAINERS  README             scripts   virt
COPYING  firmware       Kbuild   Makefile     REPORTING-BUGS     security
CREDITS  fs             Kconfig  mm             sound
crypto   include        kernel   net               tools
这里,首先当然还是先设置自己的交叉编译器了,看到根目下的Makefile没, export KBUILD_BUILDHOST := $(SUBARCH)
#ARCH  ?= $(SUBARCH)
#CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)
ARCH  ?=arm
CROSS_COMPILE ?=/usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-
将标记红 {MOD}的注视掉,然后写上你自己的编译器位置,就是CROSS_COMPILE这个选项。 好了,简单吧。这是首要的第一步,交叉编译器环境设置好了就开始开发板的移植了。 第二步,看到根目下的所有文件夹,与移植目标有关的一个主要文件就是arch目录,cd arch 然后会看到 root@hewenqiang-ubuntu:/SHARE/linux-2.6.39.2/arch# ls
alpha     cris   Kconfig     mips     s390   tile       xtensa
arm       frv    m32r        mn10300  score  um
avr32     h8300  m68k        parisc   sh     unicore32
blackfin  ia64   microblaze  powerpc  sparc  x86
而与我们移植有关的CPU体系架构则在arm目录下,所以还需cd arm,会看到boot             mach-h720x       mach-mxs       mach-s5p6442    mm
common           mach-imx         mach-netx      mach-s5p64x0    nwfpe
configs          mach-integrator  mach-nomadik   mach-s5pc100    oprofile
include          mach-iop13xx     mach-ns9xxx    mach-s5pv210    plat-iop
Kconfig          mach-iop32x      mach-nuc93x    mach-sa1100     plat-mxc
Kconfig.debug    mach-iop33x      mach-omap1     mach-shark      plat-nomadik
Kconfig-nommu    mach-ixp2000     mach-omap2     mach-shmobile   plat-omap
kernel           mach-ixp23xx     mach-orion5x   mach-spear3xx   plat-orion
lib              mach-ixp4xx      mach-pnx4008   mach-spear6xx   plat-pxa
mach-at91        mach-kirkwood    mach-pxa       mach-stmp378x   plat-s3c24xx
mach-bcmring     mach-ks8695      mach-realview  mach-stmp37xx   plat-s5p
mach-clps711x    mach-l7200       mach-rpc       mach-tcc8k      plat-samsung
mach-cns3xxx     mach-loki        mach-s3c2400   mach-tegra      plat-spear
mach-davinci     mach-lpc32xx     mach-s3c2410   mach-u300       plat-stmp3xxx
mach-dove        mach-mmp         mach-s3c2412   mach-ux500      plat-tcc
mach-ebsa110     mach-msm         mach-s3c2416   mach-versatile  plat-versatile
mach-ep93xx      mach-mv78xx0     mach-s3c2440   mach-vexpress   tools
mach-exynos4     mach-mx3         mach-s3c2443   mach-vt8500     vfp
mach-footbridge  mach-mx5         mach-s3c24a0   mach-w90x900
mach-gemini      mach-mxc91231    mach-s3c64xx   Makefile
对于上面的文件夹,你需要知道mach就是CPU_SOC目标的板件相关代码所在路径,而PLAT则是相关平台的公用代码的所在路径,好了,这里我们是移植OK6410单板,属于SOC6410,所以肯定是cd mach-s3c64xx了,然后将会看到clock.c         irq.c            mach-smartq5.c   s3c6410.c
cpu.c           irq-eint.c       mach-smartq7.c   setup-fb-24bpp.c
cpufreq.c       irq-pm.c         mach-smartq.c    setup-i2c0.c
dev-audio.c     Kconfig          mach-smartq.h    setup-i2c1.c
dev-onenand1.c  mach-anw6410.c   mach-smdk6400.c  setup-ide.c
dev-spi.c       mach-hmt.c       mach-smdk6410.c  setup-keypad.c
dev-uart.c      mach-mini6410.c  Makefile         setup-sdhci.c
dma.c           mach-ncp.c       Makefile.boot    setup-sdhci-gpio.c
gpiolib.c           pm.c             sleep.S
include         mach-real6410.c  s3c6400.c
终于看到板级文件了吧,呵呵。就像我移植UBOOT那篇说的那样,板级移植的技术含量并不高,我们也没有必要去破坏别人的代码,所以还是就与自己开发板最相近的一块板子做原型,来另起炉灶,看到没,现在LINUX内核版本S3C64XX里面已经加入了好多6410SOC的板件了,所以对于我们的OK6410单板来说,就更简单了,这里我并没有选SMDK6410或是SMDK6400,感觉离我们的开发板上的硬件资源还是相差比较大,看到mini6410的单板文件里已经加入了DM9000还有LCD等支持,所以就选了mini6410为原型,于是直接cp mach-mini6410.c mach-ok6410.c,复制一份代码,记住,这样还不行,一定要再把mach-ok6410.c文件里面的涉及到的mini6410的名字也换过来,当然了,不改也没问题,不过,另起炉灶就做到底嘛,对吧,其实,直接编译mini6410肯定也是没问题的,在你的OK6410单板上也能跑,由于我是基于飞凌官方的UBOOT1.16来实验的,所以需要修改mach-ok6410.c文件里面的 struct mtd_partition ok6410_nand_part[] = {
 {
  .name  = "Bootloader",
  .offset  = 0,
  .size  = (1 * SZ_1M),
  .mask_flags = MTD_CAP_NANDFLASH,
 },
 {
  .name  = "Kernel",
  .offset  = (1 * SZ_1M),
  .size  = (5*SZ_1M) ,
  .mask_flags = MTD_CAP_NANDFLASH,
 },
 {
  .name  = "User",
  .offset  = (6 * SZ_1M),
  .size  = (120*SZ_1M) ,
 },
 {
  .name  = "File System",
  .offset  = MTDPART_OFS_APPEND,
  .size  = MTDPART_SIZ_FULL,
 }
};
其实这个就是一个你开发板上的NAND文件分区信息,想怎么分随你,你只要记住文件系统的下载位置与这个关系密切。分几个随你,但是至少得2个(必须NFS_ROOT),毕竟第一个是UBOOT代码区,第二个是LINUX内核区,第三个,第四个等就随你了,不过一般都是至少3个嘛,毕竟文件系统还是需要写到NAND上启动方便啥! 第三步,不要以为板级文件CP好了就可以编译了哦,呵呵,还差一道工序,就是你在make menuconfig的时候,你会发现是发现不了我们create的那个ok6410的,为啥子呢?因为配置文件还需要我们修改一哈哈,恩,然后看到目下下Kconfig这个文件没,这个就是配置文件,gedit Kconfig config MACH_MINI6410
 bool "MINI6410"
 select CPU_S3C6410
 select S3C_DEV_HSMMC
 select S3C_DEV_HSMMC1
 select S3C64XX_SETUP_SDHCI
 select S3C_DEV_USB_HOST
 select S3C_DEV_NAND
 select S3C_DEV_FB
 select S3C64XX_SETUP_FB_24BPP
 select SAMSUNG_DEV_ADC
 select SAMSUNG_DEV_TS
 help
   Machine support for the FriendlyARM MINI6410 config MACH_OK6410
 bool "OK6410"
 select CPU_S3C6410
 select S3C_DEV_HSMMC
 select S3C_DEV_HSMMC1
 select S3C64XX_SETUP_SDHCI
 select S3C_DEV_USB_HOST
 select S3C_DEV_NAND
 select S3C_DEV_FB
 select S3C64XX_SETUP_FB_24BPP
 select SAMSUNG_DEV_ADC
 select SAMSUNG_DEV_TS
 help
   Machine support for the Feilin OK6410 我们只需要按照mini6410的配置复制一段ok6410的就行了,当然了,这里的select还不是很完全对于OK6410来说,以后添加新的驱动的时候,这里也是需要添加的,不然你的make menuconfig时是看不到的,所以就无法选着,好了,保存Kconfig,与之相应的,然后同样在相同的目录下找到Makefile文件,在#machine support 下面的任意位置添加obj-$(CONFIG_MACH_OK6410) += mach-ok6410.o,保证Kconfig与Makefile文件一致,这样在编译时才能被编译进去。 第四步,其实到这一步,如果你编译修改的OK6410的内核时会发现编译无法通过,为什么呢?因为我们是create了一个原来官方linux内核里没有的板级文件,而对于新加板级文件的话,需要给LINUX内核开发团队发邮件信息,得到确认认可后,他们才会将其加入新的linux内核中,这样编译才会得到允许,呵呵,是有点奇怪,通过我的发现,其实归根到底就是LINUX内核里面没有和我们增加的OK6410单板匹配的MACH-TYPE而已了,修改2.6.39.2/arch/arm/tools#下面的mach-types文件,在文件最后添加 ok6410   MACH_OK6410  OK6410   3425,当然了这里的机器码是我们自己给的一个,并非官方给的,目的只是为了让编译通过而已啦,并没有刻意破坏源代码的意思哦! 其实到这一步,基本就已经结束了,但是由于LINUX2.6.38及以后的版本的NFS文件系统发生了很大的变化,导致挂载NFS文件系统也会失败,即使你在make menuconfig里面配置了NFS也会挂载失败,其实这应该是一个BUG,这里 提供两个2个方案供大家选择,当然LINUX2.6.38以前的就不需要修改这个文件的,在linux2.6.39.2/fs/nfs/下面的一个nfsroot.c    gedit nfsroot.c,   找到 /* Default NFSROOT mount options. */
#define NFS_DEF_OPTIONS  "udp"
1,修改#define NFS_DEF_OPTIONS  "tcp"(默认NFS采用UDP协议,改为TCP协议即可) 或是2,修改#define NFS_DEF_OPTIONS  "vers=2,udp,rsize=4096,wsize=4096" 通过修改次文件之后,挂载NFS时 Freeing init memory: 128K nfs: server 192.168.0.103 not responding, still trying nfs: server 192.168.0.103 ok的问题就解决了 好了,到这一步,这个OK6410的LINUX2.6.39.2版本基本移植就完成了,说是移植,其实我们没做啥,毕竟是CP mini6410的嘛呵呵,当然了,这移植成功后,DM9000网卡正常工作,LCD(该版本支持4.3寸,8寸屏)正常显示,挂载NFS启动,NAND FILE SYSTEM 启动 一切正常 ,对于以后的触摸屏等一些列的驱动移植就需要自己去搞定了,我是一个比较偷懒的人,呵呵,所以移植也一样,再说了,有现成的官方给出的mini6410板级文件不用,这样乐意缩短移植周期嘛 !由于截图会丢失,不知道咋回事,直接粘贴出来吧 mmc1: mmc_rescan_try_freq: trying to init card at 100000 Hz
dm9000 dm9000: eth0: link down
IP-Config: Complete:
     device=eth0, addr=192.168.0.103, mask=255.255.255.0, gw=192.168.0.233,
     host=DM9000B, domain=, nis-domain=(none),
     bootserver=192.168.0.104, rootserver=192.168.0.104, rootpath=
dm9000 dm9000: eth0: link up, 100Mbps, full-duplex, lpa 0x4DE1
VFS: Mounted root (nfs filesystem) on device 0:11.
Freeing init memory: 128K
hwclock: can't open '/dev/rtc': No such file or directory
*************************************
     http://www.witech.com.cn       
*************************************
mkdir: cannot create directory '/mnt/disk': File exists
mount: mounting /dev/mtdblock3 on /mnt/disk failed: No such device
Try to bring eth0 interface up......ifconfig: SIOCSIFHWADDR: Device or resource busy
Done
                                 
Starting Qtopia, please waiting... Please press Enter to activate this console. touch... [root@FORLINX6410 /]#   这是挂载NFS,ROOT启动信息   看到了吧,OK6410的选项是不是也有了啊 ,当然了。启动NAND文件系统也是没问题的,只要保证文件系统下载对应NAND位置与上面讲到的分区信息一致就行。  好了,可能会有人会问make menuconfig的时候如何去配置内核,在这里你可以根据configs/里面的s3c6400的默认配置基础上再去配置,会简单点,这里,我直接给出了我的ok6410_config配置文件,由于无法上传,如果有需要的朋友的话请到我空间里去下载吧,相同的日志,只不过空间里可以上传文件,只需要右键点击相同日志里面的那张图片迅雷下载,然后更改后缀名为RAR,解压就可以得到ok6410_config了,下方是我的那篇日志的空间地址 http://user.qzone.qq.com/1057481936/infocenter ,只需要复制到linux2.6.39.2的根目录下,cp ok6410_config .config  然后 直接make zImage 或是make uImage(前提是要/bin/目录下有uboot的makeaimage工具)就行,如果 还需要别的配置的话 直接make menuconfig就行了。