一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

uboot移植之nfs命令燒寫uboot,zImage.img,root

 XeonGate 2015-05-23
  1. 使用nor的supervivi燒寫uboot到nand:  
  2. 進(jìn)入supervivi,選擇a,absolute user application   
  3. /**************uboot下用命令下載uboot,內(nèi)核和文件系統(tǒng)********************/  
  4.   
  5. /* 
  6. 先將內(nèi)核zImage用mkimage轉(zhuǎn)換成uImage(叫zIMage.img) 
  7. mkimage 工具是uboot提供,在uboot源碼的tools/ 
  8. 在內(nèi)核源碼的arch/arm/boot/下執(zhí)行如下命令 
  9. */  
  10. mkimage -n 'tekkaman' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d zImage zImage.img  
  11. /* 
  12. Usage: mkimage -l image 
  13.           -l ==> list image header information 
  14.        mkimage [-x] -A arch -O os -T type -C comp -a addr -e ep -n name -d data_file[:data_file...] image 
  15.           -A ==> set architecture to 'arch' 
  16.           -O ==> set operating system to 'os' 
  17.           -T ==> set image type to 'type' 
  18.           -C ==> set compression type 'comp' 
  19.           -a ==> set load address to 'addr' (hex) 
  20.           -e ==> set entry point to 'ep' (hex) 
  21.           -n ==> set image name to 'name' 
  22.           -d ==> use image data from 'datafile' 
  23.           -x ==> set XIP (execute in place) 
  24. */  
  25.   
  26. //或者在制作內(nèi)核時(shí)用  
  27. make uImage //這樣生成的uImage和用mkimage工具將zImage轉(zhuǎn)換成的uImage的格式一樣,均可被uboot引導(dǎo)。  
  28. mv uImage zImage.img //為了和下面的命令統(tǒng)一,將uImage改名叫zImga.img  
  29. //但在試驗(yàn)中發(fā)現(xiàn)這樣制作的uImage有時(shí)uboot引導(dǎo)不起來  
  30. /***********************參數(shù)修改************************************/  
  31. mini2440  
  32.   
  33. setenv ipaddr 192.168.1.230  
  34. setenv serverip 192.168.1.103  
  35. setenv gatewayip 192.168.1.1  
  36.   
  37.   
  38. /*bootargs  uboot傳遞給內(nèi)核de*/  
  39. setenv bootargs  console=ttySAC0 noinitrd root=/dev/mtdblock3 init=/linuxrc  
  40.   
  41. /*bootcmd  uboot自動(dòng)啟動(dòng)時(shí)要執(zhí)行的任務(wù)*/  
  42. setenv bootcmd tftp 0x30008000 zImage.img\;bootm 0x30008000     /*從tftp服務(wù)器下載內(nèi)核到sdram,然后啟動(dòng)*/  
  43. setenv bootcmd nboot 30008000 0 0x60000\;bootm 0x30008000   /*從nand讀取內(nèi)核到sdram,然后啟動(dòng)*/  
  44. setenv bootcmd nand read 30008000 0x60000 0x500000\;bootm 0x30008000  /*從nand讀取內(nèi)核到sdram,然后啟動(dòng)*/  
  45.   
  46. saveenv  
  47.   
  48. /**********************從服務(wù)器燒寫文件到nand*************************************/  
  49.   
  50. //download uboot  
  51. tftp 0x30008000 u-boot.bin      //從ftp服務(wù)器將u-boot.bin文件讀到內(nèi)存0x30008000處  
  52. nand erase 0 0x40000            //清除nandflash的0-0x40000的數(shù)據(jù)  
  53. nand write 0x30008000  0  0x40000   //從內(nèi)存0x30008000寫入nandflash的0開始處,大小0x40000  
  54.   
  55. /*nand的0x40000--0x60000是參數(shù)區(qū) 
  56. 從板子啟動(dòng)現(xiàn)象判斷參數(shù)區(qū)和kernel去有沒重疊的方法:上電按空格進(jìn)入nand的uboot,如果沒有提示using default param并且 
  57. 執(zhí)行命令nboot 30008000 0 0x60000\;bootm 0x30008000可以成功進(jìn)入內(nèi)核,說明ok 
  58. 在saveenv時(shí),會(huì)顯示at 0x4000000如下,tekkman的源碼中CONFIG_ENV_OFFSET=0x60000,需要改成0x40000否則參數(shù)區(qū)和kernel區(qū)會(huì)重合 
  59. [u-boot@Song]# saveenv  
  60. Saving Environment to NAND... 
  61. Erasing Nand... 
  62. Erasing at 0x4000000000002 --   0% complete. 
  63. Writing to Nand... done 
  64.  
  65. */  
  66. //dowload kernel  
  67. tftp 0x30008000 zImage.img      //從ftp服務(wù)器將zImage.img文件讀到內(nèi)存0x30008000處  
  68. nand erase 0x60000 500000       //清除nandflash的0x60000-0x560000的數(shù)據(jù)  
  69. nand write 0x30008000 0x060000 0x500000 //從內(nèi)存0x30008000寫入nandflash的0x60000開始處,大小0x500000  
  70.   
  71.   
  72. //dowload rootfs,可以是友善提供的文件系統(tǒng)。比如root_qtopia-128M.img,不要超過63MB.因?yàn)閙ini2440的sdram才64MB.如果大于63MB,可以使用supvivi下載之。見下  
  73. tftp 0x30008000 root            //從ftp服務(wù)器將ysffs文件讀到內(nèi)存0x30008000處  
  74. nand erase 0x560000             //清除nandflash的0x560000到結(jié)尾的數(shù)據(jù)      
  75.   
  76. //nand write 0x30008000 0x560000 0x6000000    直接寫在nand上不行,需專門的命令向nand寫yaffs文件,因?yàn)樽x寫的時(shí)候還要有其他動(dòng)作  
  77. //nand read 0x30008000 0x560000 0x6000000     直接從nand讀不行,需專門的命令從nand讀yaffs文件  
  78.   
  79. nand write.yaffs 0x30008000 0x560000 0x3b36dc0  //從內(nèi)存0x30008000寫入nandflash的0x560000開始處,大小0x3b36dc0  
  80.   
  81. /*在只有64MB的sdram系統(tǒng)上,用tftp 0x30008000 root 加載的yaffs文件不得大于33f80000-30008000=3F7 8000=63.46875MB,否則會(huì)覆蓋掉處于33f80000的uboot 
  82. 在試驗(yàn)中發(fā)現(xiàn)只能指定size為0x3b36dc0,否則出錯(cuò),現(xiàn)還不知原因 
  83. 可參考http://bbs./thread-426-1-1.html 
  84. */  
  85.   
  86. /***********************************************************/  

上面將
uboot 下載到nand的起始位置為0                 (--0x40000)           256KB
kernel下載到nand的起始位置為0x60000   (--0x560000)          5MB
root    下載到nand的起始位置為0x560000 (--0x10560000)     250+MB

而nand上0x40000--0x60000是保存著nand的一些參數(shù)(128KB),起始地址0x40000由CONFIG_ENV_OFFSET指定,在mini2440.h中定義。所以用uboot寫內(nèi)核到nand時(shí)不要寫到0x400000的位置而把參數(shù)給覆蓋掉

既然uboot已經(jīng)將這些root 下載到nand的0x560000位置上了,內(nèi)核怎么知道yaffs文件系統(tǒng)處于nand的0x5600000上呢?當(dāng)然是uboot傳遞給內(nèi)核的參數(shù),如下
console=ttySAC0 noinitrd root=/dev/mtdblock3 init=/linuxrc,
uboot沒有直接告訴內(nèi)核 文件系統(tǒng)在0x560000,而是指定了mtdblock3
內(nèi)核怎么知道m(xù)tdblock3在哪呢?恩,mtdblock3本來就是內(nèi)核里的名詞,內(nèi)核當(dāng)然知道了,內(nèi)核可以查看nandflsh的分區(qū)表,定義在kernel/arch/arm/mach-s3c2440/mach-mini2440.c,如下,內(nèi)核會(huì)得知nand的mtdblock3起始位置是0x560000,然后去這個(gè)位置加載yaffs文件系統(tǒng),而這個(gè)位置處剛好放著yaffs文件系統(tǒng),即前面的命令
nand write.yaffs 0x30008000 0x560000 0x3b36dc0 (實(shí)際試驗(yàn)中我將yaffs下載到nand的0x580000處,內(nèi)核也能順利加載yaffs)

相反,uboot并不知道m(xù)tdblcok3為何東東,對(duì)uboot來講它只是一個(gè)字符串,
所以一般先在內(nèi)核的nand分區(qū)表中劃分一個(gè)開始于a位置的分區(qū)p,在uboot中若將文件系統(tǒng)下載到nand的a位置,然后uboot傳遞參數(shù)p給內(nèi)核以使內(nèi)核順利找到位置a來加載yaffs(內(nèi)核的分區(qū)表先定,用uboot命令參照內(nèi)核分區(qū)表去下載內(nèi)核和文件系統(tǒng)到nand正確的位置。uboot本來就是用來引導(dǎo)內(nèi)核的,內(nèi)核怎么表現(xiàn),它就跟著怎么變就行了)

  1. static struct mtd_partition friendly_arm_default_nand_part[] = {  
  2.     [0] = {  
  3.         .name   = "supervivi",  
  4.         .size   = 0x00040000,  
  5.         .offset = 0,  
  6.     },  
  7.     [1] = {  
  8.         .name   = "param",  
  9.         .offset = 0x00040000,  
  10.         .size   = 0x00020000,  
  11.     },  
  12.     [2] = {  
  13.         .name   = "Kernel",  
  14.         .offset = 0x00060000,  
  15.         .size   = 0x00500000,  
  16.     },  
  17.     [3] = {  
  18.         .name   = "root",  
  19.         .offset = 0x00560000,  
  20.         .size   = 1024 * 1024 * 1024, //  
  21.     },  
  22.     [4] = {  
  23.         .name   = "nand",  
  24.         .offset = 0x00000000,  
  25.         .size   = 1024 * 1024 * 1024, //  
  26.     }  
  27. };  


下面是nand的布局

uboot在啟動(dòng)之后加載內(nèi)核之前的sdram空間處于如下布局

①此處param區(qū)存放著uboot傳遞給kernel的標(biāo)記列表,(是uboot傳遞給內(nèi)核的,內(nèi)核去讀?。蚽andflash上的param存儲(chǔ)區(qū)(是uboot自己的)的內(nèi)容不一樣
nandflash的param存儲(chǔ)區(qū)存放的是如
bootargs=console=ttySAC0 noinitrd root=/dev/mtdblock3 init=/linuxrc
bootcmd=tftp zImage.img;bootm
bootdelay=1
baudrate=115200
ethaddr=08:08:11:18:12:27
ipaddr=192.168.1.2
serverip=192.168.1.103
gatewayip=192.168.1.1
netmask=255.255.255.0
tekkaman=bmp d 70000
 stdin=serial
stdout=serial
stderr=serial
ethact=dm9000
這樣的東東
sdram中param存儲(chǔ)區(qū)是下面形式的東東
params->hdr.tag = ATAG_MEM;//標(biāo)記類型:內(nèi)存標(biāo)記,hdr是struct tag_header類型結(jié)構(gòu)體,為tag一成員  
params->hdr.size = tag_size (tag_mem32);//標(biāo)記大小  
params->u.mem.start = bd->bi_dram[i].start;//內(nèi)存起始地址,u是union類型,為tag一成員  
params->u.mem.size = bd->bi_dram[i].size;//內(nèi)存結(jié)束地址  
params = tag_next (params); 

params->hdr.tag = ATAG_CMDLINE;//標(biāo)記類型:命令字符串  //這個(gè)tag的內(nèi)容是使用nand上param區(qū)的
bootcmd=tftp zImage.img;bootm填充的
params->hdr.size =  
(sizeof (struct tag_header) + strlen (p) + 1 + 4) >> 2;  
strcpy (params->u.cmdline.cmdline, p);  
params = tag_next (params);
而內(nèi)核在啟動(dòng)時(shí),會(huì)使用和uboot存儲(chǔ)tag時(shí)所用的一樣的數(shù)據(jù)類型即struct tag去讀這些tag
②uboot代碼段前面有malloc內(nèi)存區(qū)和堆棧,從uboot/cpu/arm920t/start.S的設(shè)置堆棧的代碼中可以看出

http://download.csdn.net/detail/songqqnew/3941980

  1. <span style="font-family:SimSun;">  
  2. //tiny6410的分區(qū)  
  3. Creating 3 MTD partitions on "NAND 2GiB 3,3V 8-bit":  
  4. 0x000000000000-0x000000400000 : "Bootloader"  
  5. 0x000000400000-0x000000c00000 : "Kernel"  
  6. 0x000000c00000-0x000080000000 : "File System"  
  7. </span>  
  1. <a >http://blog.csdn.net/songqqnew/article/details/6847032</a>  

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    男女激情视频在线免费观看| 99福利一区二区视频| 午夜资源在线观看免费高清| 亚洲五月婷婷中文字幕| 亚洲精选91福利在线观看 | 伊人久久青草地婷婷综合| 在线免费国产一区二区| 九九热国产这里只有精品| 午夜福利视频六七十路熟女| 日本三区不卡高清更新二区| 尹人大香蕉中文在线播放| 欧美日韩精品一区免费| 国产精品午夜小视频观看| 粉嫩国产美女国产av| 偷拍洗澡一区二区三区| 丰满熟女少妇一区二区三区| 亚洲国产四季欧美一区| 国产自拍欧美日韩在线观看| 亚洲成人黄色一级大片| 国产精品一区二区日韩新区| 加勒比日本欧美在线观看| 日本加勒比在线观看不卡| 这里只有九九热精品视频| 欧美午夜国产在线观看| 日韩亚洲精品国产第二页| 日韩精品视频香蕉视频| 亚洲欧美天堂精品在线| 大香蕉网国产在线观看av| 国产又大又黄又粗又免费| 99久久人妻精品免费一区| 亚洲男人的天堂就去爱| 欧美午夜一级特黄大片| 精品日韩国产高清毛片| 免费精品国产日韩热久久| 国产又大又硬又粗又湿| 亚洲国产成人久久99精品| 欧美亚洲综合另类色妞| 日韩精品视频高清在线观看| 国产又色又爽又黄的精品视频 | 国产日本欧美特黄在线观看| 国产一二三区不卡视频|