国产精品免费无遮挡无码永久视频-国产高潮视频在线观看-精品久久国产字幕高潮-国产精品99精品无码视亚

ARM+LINUX移植中一些需要注意的問(wèn)題

發(fā)布時(shí)間:2011-3-23 13:38    發(fā)布者:techshare
關(guān)鍵詞: arm , linux , 移植
注意的問(wèn)題總結(jié):

1.內(nèi)核參數(shù)傳遞

內(nèi)核中的參數(shù)是內(nèi)核提供的,在配置內(nèi)核時(shí)指定,而u-boot提供的則在u-boot啟動(dòng)時(shí)傳遞到內(nèi)核取代內(nèi)核提供的。u-boot的參數(shù)傳遞利用了三個(gè)通用寄存器R0,R1,R2。u-boot在啟動(dòng)的過(guò)程中把參數(shù)放到3個(gè)寄存器中,到內(nèi)核啟動(dòng)時(shí)再把寄存器中的參數(shù)取出。一般我們需要通過(guò)u-boot/tools/目錄下的mkimage制作uImage,使用bootm命令進(jìn)行加載,注意go命令是不傳遞內(nèi)核參數(shù)的。

mkimage[-x]-A arch-O os-T type-C comp-a addr-e ep-n name-d data_file[:data_file...]image

選項(xiàng):
-A:set architecture to'arch'//用于指定CPU類型,比如ARM
-O:set operatingsystemto'os'//用于指定操作系統(tǒng),比如Linux
-T:set image type to'type'//用于指定image類型,比如Kernel
-C:set compression type'comp'//指定壓縮類型
-a:set load address to'addr'(hex)//指定image的載入地址
-e:set entry point to'ep'(hex)//內(nèi)核的入口地址,一般為image的載入地址+0x40(信息頭的大小)
-n:set image name to'name'//image在頭結(jié)構(gòu)中的命名
-d:use image data from'datafile'//無(wú)頭信息的image文件名
-x:set XIP(execute in place)//設(shè)置執(zhí)行位置

例如:
mkimage-n'linux-2.6.30.4'-A arm-O linux-T kernel-C none-a 0x30008000-e 0x30008040-d zImage uImage.img

注意內(nèi)核的加載地址是內(nèi)存的起始地址+0x8000,0x40是64k的頭部,是mkimage加上去的,0x30008040是內(nèi)核第一條指令所在的地址。u-boot參數(shù)鏈表在內(nèi)存中的地址是0x30000100。r0的值是0,r1是u-boot傳遞過(guò)來(lái)的機(jī)器碼,r2是參數(shù)鏈表在內(nèi)存中的物理地址。

修改u-boot中我們的開發(fā)板的配置文件/include/configs/TE2440II.h,增加如下宏定義,使其能向內(nèi)核傳遞參數(shù)(在這里主要是console參數(shù),否則無(wú)法在控制臺(tái)看到啟動(dòng)信息):
#define CONFIG_SETUP_MEMORY_TAGS
#define CONFIG_INITRD_TAG
#define CONFIG_CMDLINE_TAG
#define CONFIG_BOOTARGS " noinitrd root=/dev/mtdblock3 init=/linuxrc mem=64M devfs=mount console=tty0 console=ttySAC0,115200"

上面的操作完成后,重新編譯u-boot,下載到nand中,重新啟動(dòng)u-boot后,把我們編譯生成的uImage文件下載到內(nèi)存的0x30008000地址處,就可以用bootm命令來(lái)手動(dòng)引導(dǎo)內(nèi)核了(執(zhí)行bootm 0x30008000)。

2.機(jī)器碼

內(nèi)核會(huì)在編譯鏈接過(guò)程中,將各種處理器內(nèi)核描述符組合成表,接著從機(jī)器描述符表中查詢有無(wú)r1寄存器指定的機(jī)器碼,如果沒(méi)有就將退出,所以這也說(shuō)明了為什么在u-boot中機(jī)器碼一定要和內(nèi)核中的機(jī)器碼一致,否則內(nèi)核就無(wú)法啟動(dòng)。

先看看u-boot的機(jī)器碼和linux的機(jī)器碼是由什么地方?jīng)Q定的,u-boot中的機(jī)器碼在u-boot的board/samsung/TE2440II/TE2440II.c中決定。

/* arch number of SMDK2410-Board */
gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;

查看u-boot/include/asm-arm/mach-type.h文件有:

#define MACH_TYPE_SMDK2410 193
#define MACH_TYPE_S3C2440  362

Linux中決定機(jī)器碼的就是下面那個(gè)機(jī)器描述符。

MACHINE_START(SMDK2440,"SMDK2440")
/* Maintainer: Ben Dooks <ben@fluff.org> */
.phys_io=S3C2410_PA_UART,
.io_pg_offst=(((u32)S3C24XX_VA_UART)>>18)&0xfffc,
.boot_params=S3C2410_SDRAM_PA+0x100,//注意:這個(gè)地址就是與u-boot中參數(shù)鏈表在內(nèi)存中的物理地址相對(duì)應(yīng)

.init_irq=s3c24xx_init_irq,
.map_io=smdk2440_map_io,
.init_machine=smdk2440_machine_init,
.timer=&s3c24xx_timer,
MACHINE_END

查看內(nèi)核目錄下的arch/arm/tools/mach-types.h文件,有:
smdk2410  ARCH_SMDK2410  SMDK2410  193
s3c2440  ARCH_S3C2440  S3C2440   362
smdk2440  MACH_SMDK2440  SMDK2440  1008

關(guān)鍵字是s3c2440,所以我們上面看到的是0x000000a8(362)。
所以,我們這里不去修改內(nèi)核,而是直接修改u-boot 的 board/samsung/ok2440v3/ok2440v3.c文件,如下:
/* arch number of SMDK2410-Board */
gd->bd->bi_arch_number = MACH_TYPE_S3C2440;

3.

[\u@\h \W]#

進(jìn)入控制臺(tái),\u會(huì)顯示成root,\h會(huì)顯示成hostname,\w會(huì)顯示成當(dāng)前路徑。

4. “Hit any key to stop autoboot:”

doc/README.autoboot里說(shuō)得很清楚,自動(dòng)引導(dǎo)只有需要最基本的兩個(gè)配置:CONFIG_BOOTDELAY和CONFIG_BOOTCOMMAND:
The basic autoboot configuration options are documented in the main
U-Boot README. See it for details. They are:
bootdelay
bootcmd
CONFIG_BOOTDELAY
CONFIG_BOOTCOMMAND
根目錄下的Readme文件里對(duì)這幾個(gè)參數(shù)有說(shuō)明:
Boot Delay: CONFIG_BOOTDELAY - in seconds
  Delay before automatically booting the default image;
  set to -1 to disable autoboot.
bootcmd see CONFIG_BOOTCOMMAND
Autoboot Command:
  CONFIG_BOOTCOMMAND
  Only needed when CONFIG_BOOTDELAY is enabled;
  define a command string that is automatically executed
  when no character is read on the console interface
  within "Boot Delay" after reset.
由此,我們只需要在自已的開發(fā)板的配置文件里/include/configs/TE2440II.h

#define CONFIG_BOOTDELAY 5
#define CONFIG_BOOTCOMMAND "nand read 0x30008000 0x00500000 0x00300000; bootm 0x30008000"

重新編譯u-boot,OK了,嘿嘿。

6.如果tftp出現(xiàn)T和#,那是tftp不斷重啟,據(jù)說(shuō)是網(wǎng)卡還沒(méi)準(zhǔn)備好的,所以將tftp超時(shí)的時(shí)間加大。

在net/tftp.c中,修改這句:

#define TIMEOUT 200000UL /* Millisecs to timeout for lost pkt */

7.我使用的命令

1)print或printenv可以打印出環(huán)境變量

2)setenv bootargs 'noinitrd root=/dev/mtdblock3 init=/linuxrc mem=64M devfs=mount console=tty0,ttySAC0,115200'

這樣使用setenv 可以設(shè)置環(huán)境變量

3)setenv bootargs 這樣使用setenv 直接加環(huán)境變量的名字可以刪除環(huán)境變量

4)saveenv 保存環(huán)境變量,否則復(fù)位后,上次用setenv設(shè)置的環(huán)境變量就不在了。

5)tftp 0x30008000 192.168.1.101:u-boot.bin

從IP地址為192.168.1.101的tftp服務(wù)器處下載 u-boo.bin文件到0x30008000處。

6)nand erase 0x0 0x30000

擦除0x0到0x30000范圍的nandflash

7)nand write 0x30008000 0x0 0x30000

從0x30008000將數(shù)據(jù)傳到0x0,長(zhǎng)度為0x30000

8)nand scrub

擦除整個(gè)nandflash,先按y,再按回車

9)nand write.yaffs2 0x30008000 0x00800000 0x03c00000

寫yaffs2文件系統(tǒng)用的


李萬(wàn)鵬
本文地址:http://www.4huy16.com/thread-59515-1-1.html     【打印本頁(yè)】

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點(diǎn)和對(duì)其真實(shí)性負(fù)責(zé);文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問(wèn)題,我們將根據(jù)著作權(quán)人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評(píng)論 登錄 | 立即注冊(cè)

廠商推薦

  • Microchip視頻專區(qū)
  • 技術(shù)熱潮席卷三城,2025 Microchip中國(guó)技術(shù)精英年會(huì)圓滿收官!
  • Microchip第22屆中國(guó)技術(shù)精英年會(huì)——采訪篇
  • Microchip第22屆中國(guó)技術(shù)精英年會(huì)上海首站開幕
  • 電動(dòng)兩輪車設(shè)計(jì)生態(tài)系統(tǒng)
  • 貿(mào)澤電子(Mouser)專區(qū)

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號(hào) | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表