亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 2004 | 回復: 0
打印 上一主題 下一主題

移植u-boot到FL2440開發(fā)板(七)——引導linux內核啟動 [復制鏈接]

論壇徽章:
0
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2011-12-20 09:44 |只看該作者 |倒序瀏覽
8)實現(xiàn)u-boot引導Linux內核啟動。
 
在前面幾節(jié)中,我們講了u-boot對Nor Flash和Nand Flash的啟動支持,那現(xiàn)在我們就再來探討一下u-boot怎樣來引導Linux內核的啟動。
 
①、機器碼的確定
通常,在u-boot和kernel中都會有一個機器碼(即:MACH_TYPE),只有這兩個機器碼一致時才能引導內核,否則就會出現(xiàn)如下mach的錯誤信息:(如果沒有錯誤信息則不需要一下修改,我的就沒有,這些錯誤是摘錄的)
 
首先,確定u-boot中的MACH_TYPE。在u-boot的include/asm-arm/mach-types.h文件中針對不同的CPU定義了非常多的MACH_TYPE,可以找到下面這個定義:
  1. #define MACH_TYPE_SMDK2440 1008

那么我們就修改u-boot的MACH_TYPE代碼引用部分,確定u-boot的MACH_TYPE。如下:

  1. #vim board/samsung/yyq2440/yyq2440.c //修改board_init函數(shù)
  2. /* arch number of SMDK2410-Board */
  3. //gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;
  4. 改為:
  5. gd->bd->bi_arch_number = MACH_TYPE_SMDK2440;
其次,確定kernel中的MACH_TYPE。在kernel的arch/arm/tools/mach-types文件中也針對不同的CPU定義了非常多的MACH_TYPE,也可以找到下面這個定義:
  1. smdk2440 MACH_SMDK2440 SMDK2440 1008

那么我們就修改kernel的MACH_TYPE代碼引用部分,確定kernel的MACH_TYPE。如下:

  1. #vim arch/arm/mach-s3c2440/mach-smdk2440.c //修改文件最后面

  2. //MACHINE_START(S3C2440, "SMDK2440")
  3. 改為:
  4. MACHINE_START(SMDK2440, "SMDK2440")
  1. #gedit arch/arm/kernel/head.S //在ENTRY(stext)下添加如下代碼(紅色部分)

  2. ENTRY(stext)
  3.     mov r0, #0
  4.     mov r1, #0x3f0 //上面的MACH_TYPE值1008換成十六進制就是0x3f0
  5.     ldr r2, =0x30000100
  6.     msr cpsr_c, #PSR_F_BIT | PSR_I_BIT | SVC_MODE
  7.     .......

分別重新編譯u-boot和kernel。u-boot下載后,記得要saveenv;kernel用tftp下載到內存后使用go命令來測試引導內核,結果可以引導了。如下。

、準備能被u-boot直接引導的內核uImage
通常,kernel的啟動需要u-boot提供一些參數(shù)信息,比如ramdisk在RAM中的地址。經過編譯后的u-boot在根目錄下的tools目錄中,會有個叫做mkimage的工具,他可以給zImage添加一個header,也就是說使得通常我們編譯的內核zImage添加一個數(shù)據(jù)頭信息部分,我們把添加頭后的image通常叫uImage,uImage是可以被u-boot直接引導的內核鏡像。
 
mkimage工具的使用介紹如下:
  1. 使用: 中括號括起來的是可選的
  2. mkimage [-x] -A arch -O os -T type -C comp -a addr -e ep -n name -d data_file[:data_file...] image
  3. 選項:
  4. -A:set architecture to 'arch' //用于指定CPU類型,比如ARM
  5. -O:set operating system to 'os' //用于指定操作系統(tǒng),比如Linux
  6. -T:set image type to 'type' //用于指定image類型,比如Kernel
  7. -C:set compression type 'comp' //指定壓縮類型
  8. -a:set load address to 'addr' (hex) //指定image的載入地址
  9. -e:set entry point to 'ep' (hex) //內核的入口地址,一般為image的載入地址+0x40(信息頭的大。
  10. -n:set image name to 'name' //image在頭結構中的命名
  11. -d:use image data from 'datafile' //無頭信息的image文件名
  12. -x:set XIP (execute in place)

先將u-boot下的tools中的mkimage復制到主機的/usr/local/bin目錄下,這樣就可以在主機的任何目錄下使用該工具了,F(xiàn)在我們進入kernel生成目錄(一般是arch/arm/boot目錄),然后執(zhí)行如下命令,就會在該目錄下生成一個uImage.img的鏡像文件,把他復制到tftp目錄下,這就是我們所說的uImage。

  1. [skywalker@bogon tools]$ sudo cp mkimage /usr/local/bin/
  2. [skywalker@bogon tools]$ cd ..
  3. [skywalker@bogon u-boot-2009.08]$ mkimage -n 'linux-2.6.33.7' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008000 -d zImage uImage.img
  4. Image Name: linux-2.6.33.7
  5. Created: Fri Mar 4 20:35:51 2011
  6. Image Type: ARM Linux Kernel Image (uncompressed)
  7. Data Size: 2026844 Bytes = 1979.34 kB = 1.93 MB
  8. Load Address: 30008000
  9. Entry Point: 30008000
  10. [skywalker@bogon u-boot-2009.08]$

③、Nand Flash的分區(qū)。我們查看內核在arch/arm/plat-s3c24xx/common-smdk.c中的分區(qū)情況如下

  1.         [0] = {
  2.                 .name = "boot",
  3.                 .size = 0x00020000,
  4.                 .offset = 0
  5.         },
  6.         [1] = {
  7.                 .name = "bootParam",
  8.                 .size = 0x00060000,
  9.                 .offset = 0x00020000,
  10.         },
  11.         [2] = {
  12.                 .name = "Kernel",
  13.                 .size = 0x00300000,
  14.                 .offset = 0x00500000,
  15.         },
  16.         [3] = {
  17.                 .name = "fs_yaffs",
  18.                 .size = 0x03c00000,
  19.                 .offset = 0x00800000,
  20.         },
  21.         [4] = {
  22.                 .name = "eboot",
  23.                 .size = 0x00080000,
  24.                 .offset = 0x04400000,
  25.         },
  26.         [5] = {
  27.                 .name = "WINCE",
  28.                 .size = 0x03b80000,
  29.                 .offset = 0x04480000,
  30.         }

④、設置修改u-boot的啟動參數(shù),在u-boot命令行下輸入。設置啟動參數(shù),意思是將nand中0x500000(offset)-0x00800000(offset+size)(和kernel分區(qū)一致)的內容讀到內存0x31000000中,然后用bootm命令來執(zhí)行

  1. U-Boot 2009.08 ( 3.. 03 2011 - 20:48:30)

  2. DRAM: 64 MB
  3. Flash: 512 kB
  4. NAND: NAND_ECC_NONE selected by board driver. This is not recommended !!
  5. 128 MiB
  6. In: serial
  7. Out: serial
  8. Err: serial
  9. Net: dm9000 ' - try 'help'
  10. [yyq2440] # set bootcmd 'nand read 0x31000000 0x500000 0x800000;bootm 0x3100000
  11. [yyq2440] # saveenv
    Saving Environment to NAND...
    Erasing Nand...
    Erasing at 0x2 -- 262144% complete.
    Writing to Nand... done
    [yyq2440] #

⑤、把uImage.img用tftp下載到內存中,然后再固化到Nand Flash中,操作和執(zhí)行圖如下:

  1. [yyq2440] # tftp 0x30000000 uImage.img
  2. dm9000 i/o: 0x20000000, id: 0x90000a46
  3. DM9000: running in 16 bit mode
  4. MAC: 08:00:3e:26:0a:5b
  5. operating at 100M full duplex mode
  6. Using dm9000 device
  7. TFTP from server 192.168.7.11; our IP address is 192.168.7.1
  8. Filename 'uImage.img'.
  9. Load address: 0x30000000
  10. Loading: T T T T T T T #################################T######################
  11.          ##T T ###############################################################
  12.          ##T T #########
  13. done
  14. Bytes transferred = 2026908 (1eed9c hex)
  15. [yyq2440] #

在執(zhí)行擦除和燒寫的時候,卻出現(xiàn)了壞塊的提示,并失敗。

  1. [yyq2440] # nand erase 0x500000 0x800000
  2.                                                                                 
  3. NAND erase: device 0 offset 0x500000, size 0x800000
  4. Skipping bad block at 0x00000000
  5. Skipping bad block at 0x00000000
  6. Skipping bad block at 0x00000000
  7. Skipping bad block at 0x00000000
  8. Skipping bad block at 0x00000000
  9. Skipping bad block at 0x00000000
  10. Skipping bad block at 0x00000000
  11. Skipping bad block at 0x00000000
  12. Skipping bad block at 0x00000000
  13. Skipping bad block at 0x00000000
  14. Skipping bad block at 0x00000000
  15. Skipping bad block at 0x00000000
  16. Skipping bad block at 0x00000000
  17. Skipping bad block at 0x00000000
  18. Skipping bad block at 0x00000000
  19. Erasing at 0x8 -- 13500416% complete.
  20. OK
  21. [yyq2440] # nand write 0x30000000 0x500000 0x800000

  22. NAND write: device 0 offset 0x500000, size 0x800000
  23. Skip bad block 0x00000000
  24. Skip bad block 0x00000000
  25. Skip bad block 0x00000000
  26. Skip bad block 0x00000000
  27. Skip bad block 0x00000000
  28. Skip bad block 0x00000000
  29. Skip bad block 0x00000000
  30. Skip bad block 0x00000000
  31. Skip bad block 0x00000000
  32. Skip bad block 0x00000000
  33. Skip bad block 0x00000000
  34. Skip bad block 0x00000000
  35. Skip bad block 0x00000000
  36. Skip bad block 0x00000000
  37. Skip bad block 0x00000000
  38. NAND write to offset ffffffff failed 13631488
  39.  6422528 bytes written: ERROR
  40. [yyq2440] #

這個時候我擦除了整塊的nandflash就好了。

  1. [yyq2440] # nand scrub
  2.                                                                                 
  3. NAND scrub: device 0 whole chip
  4. Warning: scrub option will erase all factory set bad
  5.          There is no reliable way to recover them.
  6.          Use this command only for testing purposes if you
  7.          are sure of what you are
  8.                                                                                 
  9. Really scrub this NAND flash? <y/N>
  10. Erasing at 0x8 -- 24117248% complete..
  11. NAND 128MiB 3,3V 8-bit: MTD Erase failure: -5
  12. Erasing at 0x8000000 -- 52297728% complete.
  13. NAND 128MiB 3,3V 8-bit: MTD Erase failure: -5
  14. Erasing at 0x8000000 -- 134086656% complete.
  15. OK
  16. [yyq2440] # tftp 0x30000000 uImage.img
  17. dm9000 i/o: 0x20000000, id: 0x90000a46
  18. DM9000: running in 16 bit mode
  19. MAC: 08:00:3e:26:0a:5b
  20. operating at 100M full duplex mode
  21. Using dm9000 device
  22. TFTP from server 192.168.7.11; our IP address is 192.168.7.1
  23. Filename 'uImage.img'.
  24. Load address: 0x30000000
  25. Loading: #T T T T T ###################################T #######################
  26.          ###T T ####T ###########################################T #############
  27.          ##T T #######
  28. done
  29. Bytes transferred = 2026908 (1eed9c hex)
  30. [yyq2440] # nand erase 0x500000 0x800000
  31.                                                                                 
  32. NAND erase: device 0 offset 0x500000, size 0x800000
  33. Erasing at 0x8 -- 13500416% complete.
  34. OK
  35. [yyq2440] # nand write 0x30000000 0x500000 0x800000
  36.                                                                                 
  37. NAND write: device 0 offset 0x500000, size 0x800000
  38.  8388608 bytes written: OK
  39. [yyq2440] #

最后,我們重新啟動開發(fā)板,可以看到,內核被u-boot成功引導起來了,如圖:

  1. U-Boot 2009.08 ( 3.. 03 2011 - 20:48:30)
  2.                                                                                 
  3. DRAM: 64 MB
  4. Flash: 512 kB
  5. NAND: NAND_ECC_NONE selected by board driver. This is not recommended !!
  6. 128 MiB
  7. In: serial
  8. Out: serial
  9. Err: serial
  10. Net: dm9000
  11. Hit any key to stop autoboot: 0
  12.                                                                                 
  13. NAND read: device 0 offset 0x500000, size 0x800000
  14.  8388608 bytes read: OK
  15. ## Booting kernel from Legacy Image at 31000000 ...
  16.    Image Name: linux-2.6.33.7
  17.    Created: 2011-03-04 12:35:51 UTC
  18.    Image Type: ARM Linux Kernel Image (uncompressed)
  19.    Data Size: 2026844 Bytes = 1.9 MB
  20.    Load Address: 30008000
  21.    Entry Point: 30008000
  22.    Verifying Checksum ... OK
  23.    Loading Kernel Image ... OK
  24. OK
  25.                                                                                 
  26. Starting kernel ...
  27.                                                                                 
  28. Uncompressing Linux... done, booting the kernel.
  29. Linux version 2.6.33.7 (skywalker@localhost.localdomain) (gcc version 4.3.2 (So1
  30. CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=00007177
  31. CPU: VIVT data cache, VIVT instruction cache
  32. Machine: SMDK2410
  33. Warning: bad configuration page, trying to continue
  34. Memory policy: ECC disabled, Data cache writeback
  35. CPU S3C2440A (id 0x32440001)

 

 

2011-03-04

您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉載本站內容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP