【学习笔记】OK6410的Linux Kernel 4.1.4移植 - 在线问答 - 电子技术论坛 - 最好最受欢迎电子论坛!

【学习笔记】OK6410的Linux Kernel 4.1.4移植

mop ( 楼主 ) 2015-8-13 16:35:07  只看该作者 倒序浏览
本帖最后由 MOPPLAYER 于 2015-8-13 23:37 编辑

<緣起>
本原創基於
OK6410Kernel4.1.4系統移植學習,由於飛凌官方提供的為Kernel 3.0.1yaffs2 filesystem,我較熟悉Ubuntu,所以進行這次的移植,並分享所有過程和原始碼,轉載時需表明作者

<關於Uboot>
由於官方所提供的samsung Uboot 1.1.6的原始碼編譯出的Uboot是無法啟動的,看了大小,編譯出的為140k,而官方為280k,因此推斷有進行填充和包含可能的spl,故本文章不進行Uboot的移植,使用官方提供的Uboot,但修改設置

讓我們開始吧!>
Kernel 4.1.4可由Kernel官方下載,為目前最新且穩定的版本,因此使用此版本做移植
0. 環境: (Host)Ubuntu 14.04 LTS 64bit Desktop (GCC)arm-linux-gnueabihf (linaro 4.9.2),從3.18以上的Kernel只能使用4.9以上的GCC

1. 解壓縮linux-4.1.4後.將飛凌官方提供的linux-3.0.1/FORLINX6410_CFG複製到linux-4.1.4/arch/arm/configs並改名為forlinx6410_defconfig,作為基礎的configuration

2. 編譯環境設置
  1. export ARCH=arm
  2. export CROSS_COMPILE=arm-linux-gnueabihf-   
复制代码

     

3.
添加dm9000的driver到原始碼中,打開linux-4.1.4/arch/arm/mach-s3c64xx/mach-smdk6410.c,添加原始碼如下:

  1. #ifdef CONFIG_DM9000
  2. #define S3C64XX_PA_DM9000        (0x18000000)
  3. #define S3C64XX_SZ_DM9000        SZ_1M
  4. #define S3C64XX_VA_DM9000        S3C_ADDR(0x03b00300)

  5. static struct resource dm9000_resources[] = {
  6.         [0] = {
  7.                 .start                = S3C64XX_PA_DM9000,
  8.                 .end                = S3C64XX_PA_DM9000 + 3,
  9.                 .flags                = IORESOURCE_MEM,
  10.         },
  11.         [1] = {
  12.                 .start                = S3C64XX_PA_DM9000 + 4,
  13.                 .end                = S3C64XX_PA_DM9000 + S3C64XX_SZ_DM9000 - 1,
  14.                 .flags                = IORESOURCE_MEM,
  15.         },
  16.         [2] = {
  17.                 .start                = IRQ_EINT(7),
  18.                 .end                = IRQ_EINT(7),
  19.                 .flags                = IORESOURCE_IRQ | IRQF_TRIGGER_HIGH,
  20.         },
  21. };

  22. static struct dm9000_plat_data dm9000_setup = {
  23.         .flags                        = DM9000_PLATF_16BITONLY,
  24.         .dev_addr                = { 0x08, 0x90, 0x00, 0xa0, 0x90, 0x90 },
  25. };

  26. static struct platform_device s3c_device_dm9000 = {
  27.         .name                        = "dm9000",
  28.         .id                                = 0,
  29.         .num_resources        = ARRAY_SIZE(dm9000_resources),
  30.         .resource                = dm9000_resources,
  31.         .dev                        = {
  32.                 .platform_data = &dm9000_setup,
  33.         }
  34. };
  35. #endif //#ifdef CONFIG_DM9000
复制代码

並修改開發板資源初始化結構static struct platform_device *smdk6410_devices[] __initdata

  1. #ifdef CONFIG_DM9000
  2.         &s3c_device_dm9000,
  3. #endif
  4.         //&smdk6410_smsc911x,
复制代码


其中//&smdk6410_smsc911x,是必要的,因為此資源定義了S3C64XX_XM0CSN1的實體地址為0x18000000會造成衝突,故要common
在檔案頭包含標頭檔

  1. #include
复制代码

4. 修改儲存後,開始進行初始化configuration

  1. make forlinx6410_defconfig
复制代码

若還要進行修改則輸入

  1. make menuconfig
复制代码

進行修改的設置有DMA,PM,FB,SOUND,NET等等的driver,修改完後要記得save,最終版本會包含在原始碼中給大家取用



Fig. 1 Kernel 設置

5.
開始編譯,這會花費一些時間,喝個茶休息一下吧!

  1. make -j8
复制代码

6. 編譯順利的話,會產生zImage,這是用來給SD卡啟動的Kernel檔案


Fig. 2 Kernel產生成功



飛凌官方並不提供SD啟動系統的方式,實際上是可行的,但要進行環境設置,就可以成功啟動SD卡上的系統,以下開始製作SD啟動卡,至少4G以上,推薦8G,我個人使用是32G SD卡
7. 安裝gparted磁碟分割好用的工具,如果熟悉fdisk的可使用fdisk,以下使用gparted的GUI

  1. sudo apt-get update
  2. sudo apt-get install gparted
复制代码

8. 安裝後執行sudo gparted,先將舊有分割區刪除,選取該分區滑鼠右鍵選擇umount即可操作該分區,按下禁止符號即可,並分割第一個分區為fat16,至少分配16MB的空間,此分區放置Kernel


9. 分割第二個分區為ext4,此分區用來放置filesystem,要注意的是Uboot會在磁區末端大約1M~2M的空間裡,所以至少要留2M以上,我個人是分配4M


10. 設置好後按下勾勾圖案即可執行剛剛的所有操作,最後SD卡Layout如下 (32G)


Fig. 3 SD Layout


11. 使用飛凌官方提供的Uboot燒寫工具,選擇mmc_ram256.bin進行燒寫,我個人是WIN7 64bit 測試OK


Fig. 4 Uboot燒寫


Ubuntu新版本開始已經不再支援armv6舊架構CPU,因此只能沿用舊版本9.04,網路上可以找到相關資源,這裡就做此版本的移植,讓Kernel 4.1.4可以成功掛載Ubuntu且登入使用!
12. 下載解壓Ubuntu 9.04的filesystem tree,到第二分區ext4,如下圖


Fig. 5 Ubuntu 9.04 filesystem

13. 開始修改Ubuntu設定值,讓Kernel可以成功掛載它,首先修改klogd,此為記錄Kernel的訊息,打開/etc/init.d/klogd,其中啟動的兩行命令包含了dd指令會造成錯誤而啟動失敗,因此common並增加一行


Fig. 6 klogd 啟動設置
  1. start-stop-daemon --start --quiet --exec $binpath -- /proc/kmsg
复制代码

14. 修改tty的認證,讓Ubuntu允許ttySAC0的登入,此為S3C6410模擬tty serial 的ttyS0為ttySAC0,打開/etc/securetty


Fig. 7 tty串口的安全認證

  1. ttySAC0
复制代码

15. 修改tty的建立,讓Ubuntu能嘗試重新建立tty連線,打開/etc/event.d/ttyS0,此為ttyS0模擬成ttySAC0的串口


Fig. 8 tty串口的重新建立
  1. start on runlevel 2
  2. start on runlevel 3
  3. start on runlevel 4
  4. start on runlevel 5

  5. stop on runlevel 0
  6. stop on runlevel 1
  7. stop on runlevel 6

  8. respawn
  9. exec /***in/getty -L 115200 ttySAC0
复制代码

16. 開始複製Kernel產生的檔案到Ubuntu中,首先複製linux-4.1.4/System.map到Ubuntu的boot/中,並修改成System.map-4.1.4,此檔案用來給klogd讀取用


17. 安裝linux 4.1.4的modules到指令資料夾,此包含了部分driver


  1. make INSTALL_MOD_PATH=./modules modules_install
复制代码

18.linux-4.1.4/modules/lib/modules/4.1.4複製到Ubuntu的lib/modules


19.linux-4.1.4/modules/lib/firmware的內容複製到Ubuntu的lib/firmware中,這裡只包含1個firmware


20.linux-4.1.4/arch/arm/boot/zImage複製到第一分區fat16,此為Kernel檔案




Fig. 9 zImage放置第一分區,Ubuntu第二分區,製作完成


21. 將製作好的SD卡插入OK6410,撥號開關0111設置為SD卡啟動,開啟serial console,我這裡是使用putty,當然也可以使用DNW,baudrate=115200,開機後迅速按下space鍵中斷autoboot,出現menu後按下5到command line


Fig. 10 Uboot command line

22. 設置bootcmd,取消nand燒寫的操作,改為從SD卡讀取zImage到memory指定位址,再由該位址啟動Kernel

  1. setenv bootcmd fatload mmc 0:1 0x50008000 zImage; bootm 0x50008000
复制代码

23. 設置bootargs,讓Kernel知道如何正確掛載filesystem,並成功boot

  1. setenv bootargs console=tty0 console=ttySAC0 root=/dev/mmcblk0p2 rw rootfstype=ext4 rootwait earlyprintk
复制代码

其中rootwait是告訴Kernel等待filesystem ready好了再進行,避免sync的問題,earlyprintk是Kernel debug訊息用


24. 打printenv確認設置都正確後,打saveenv儲存設置,當然您也可以這時候設置開發板的ip,mac,gateway等等設置

Fig. 11 Uboot printenv列印設置訊息,設置完成可自動啟動!
  1. saveenv
复制代码


25. 重新啟動開發板,會自動啟動SD卡上的系統,等待全部啟動完畢後會出現登入的游標

Fig. 12 Ubuntu login
  1. user=root,password=ubuntu
复制代码


26. 若出現下圖,恭喜啟動成功,可以開始體驗熟悉的Ubuntu操作環境和指令,和它的強大功能!


Fig. 13 Login as root!

27. Kernel資訊和CPU資訊


Fig. 14 armv6 CPU + Kernel 4.14

<小結>
藉由這次移植的工作,學習OK6410的底層架構和作業系統的運作方式,加深觀念,對於未來研究和開發有利,希望申請到OK210來比較ARM11跟ARM-CortexA8的差別,並將過程跟心得分享給大家學習,繼續研發新的應用和技術,感謝!

原始碼放置於github:https://github.com/mopplayer/OK6410-Kernel4.1.4-With-Ubuntu9.04
Ubuntu 9.04放置在filesystem目錄,先在Windows底下RAR解壓得到Ubuntu,重新改名為Ubuntu.tar.bz2即可給虛擬機第二次解壓
               


        

1个回复

a1231231234 发表于 2015-8-23 10:16:45
很详细啊,我先试试啊
回复

举报 使用道具

您需要登录后才可以回帖 登录 | 注册

本版积分规则


关闭

站长推荐上一条 /7 下一条

小黑屋|手机版|Archiver|电子发烧友 ( 湘ICP备2023018690号 )

GMT+8, 2024-12-27 05:40 , Processed in 0.401507 second(s), Total 39, Slave 28 queries .

Powered by 电子发烧友网

© 2015 bbs.elecfans.com

微信扫描
快速回复 返回顶部 返回列表