OK6410之linux-2.6.39.2核心的移植愚見

來源:互聯網
上載者:User

 

說明:(不好意思,前幾天寫的時候太慌了,漏了一個重要的細節,就是關於在編譯時間一定要讓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-

將標記紅色的注視掉,然後寫上你自己的編譯器位置,就是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核心Team Dev發郵件資訊,得到確認認可後,他們才會將其加入新的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就行了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.