LINUXuboot移植济源职业技术学院.docx
- 文档编号:12911062
- 上传时间:2023-04-22
- 格式:DOCX
- 页数:33
- 大小:27.92KB
LINUXuboot移植济源职业技术学院.docx
《LINUXuboot移植济源职业技术学院.docx》由会员分享,可在线阅读,更多相关《LINUXuboot移植济源职业技术学院.docx(33页珍藏版)》请在冰豆网上搜索。
LINUXuboot移植济源职业技术学院
济源职业技术学院——计算机应用专业
/etc/udev/rules.d/70-persistent-net.rules
apt-getinstallsystem-config-samba
system-config-samba
一、获得U-Boot源码
将u-boot-1.3.2.tar.bz2拷贝了工作目录下,解压源码包:
[root@vm-devcpshare]#mkdiru-boot
[root@vm-devu-boot]#cp/mnt/shared/u-boot-1.3.2.tar.bz2./
[root@vm-devu-boot]#tarxjvfu-boot-1.3.2.tar.bz2
[root@vm-devu-boot]#cdu-boot-1.3.2
二、建立板级支持包
在board目录下,每一块开发板都有一个对应的目录,因此我们需要为我们的开发板建立一个目录,名字叫做up2410,并创建相应的文件:
[root@vm-devu-boot-1.3.2]#cdboard/
[root@vm-devboard]#mkdirup2410
[root@vm-devboard]#cpsmdk2410/*up2410
[root@vm-devboard]#cd../
上面的步骤中,我们把smdk2410目录下的所有文件都拷贝到了我们的up2410目录下,因为我们的开发板和smdk2410开发板的配置差不多。
每个开发板都有一个自己的配置文件,如smdk2410开发板的配置文件为include/configs/smdk2410.h,我们也需要为我们的开发板建立自己的配置文件。
可以直接从smdk2410开发板的配置文件中修改而来。
因此我们先把smdk2410的配置文件复制到我们开发板的配置文件当中:
[root@vm-devu-boot-1.3.2]#cpinclude/configs/smdk2410.hinclude/configs/up2410.h
然后,修改Makefile,使得可以配置我们的开发板:
[root@vm-devu-boot-1.3.2]#viMakefile
在Makefile中找到下面两行:
smdk2400_config:
unconfig
@$(MKCONFIG)$(@:
_config=)armarm920tsmdk2400NULLs3c24x0
紧接这这两行添加如下两行:
up2410_config:
unconfig
@$(MKCONFIG)$(@:
_config=)armarm920tup2410NULLs3c24x0
注意第二行开始部分的空白是按TAB键获得的!
红色的部分显示了不同处!
这样,我们自己的板级支持包就建好了。
三、添加代码,支持从NandFlash启动
由于我们的开发板上没有NorFlash,只能从NandFlash启动。
而U-Boot默认不支持从NandFlash启动,所以需要我们自己添加代码来实现从NandFlash启动。
1、修改start.S文件
位于cpu/arm920t/目录下的start.S文件是开发板上电后运行的第一段代码,需要在这个文件中添加内容,以支持从NandFlash启动。
[root@vm-devu-boot-1.3.2]#vicpu/arm920t/start.S
首先,删掉start.S中的第181行和201行的下面内容:
#ifdefCONFIG_AT91RM9200
...............................................................
#endif
如果有这两句,这两句之间的内容将不会被编译。
而我们的开发板需要执行这些内容。
然后,找到这一行:
#ifndefCONFIG_SKIP_RELOCATE_UBOOT
在紧接这这行的下面添加下面几行:
#ifdefCONFIG_S3C2410_NAND_BOOT
blcopy_myself
#else
再找到
blecopy_loop
在它的下面添加一行:
#endif
做这些工作就是要完成一个简单的功能:
如果我们定义了CONFIG_S3C2410_NAND_BOOT这个宏,那么就执行copy_myself这个子程序,否则就执行#else下面的程序。
copy_myself这个子程序的功能就是把U-Boot自身的代码从NandFlash拷贝到SDRAM中,需要我们自己实现,U-Boot自身并没有为我们实现。
我们把copy_myself也添加在start.S文件中。
找到下面的一行:
_start_armboot:
.wordstart_armboot
在这一行的下面添加如下的内容:
/*
*************************************************************************
*
*copyu-boottoram
*
*************************************************************************
*/
#ifdefCONFIG_S3C2410_NAND_BOOT
copy_myself:
movr10,lr@savereturnaddresstor10
ldrsp,DW_STACK_START@安装栈的起始地址
movfp,#0@初始化帧指针寄存器
blNF_Init@跳到复位C函数去执行
@readUBOOTfromNandFlashtoRAM
ldrr0,=UBOOT_RAM_BASE@设置第1个参数:
UBOOT在RAM中的起始地址
movr1,#0x0@设置第2个参数:
NandFlash的起始地址
movr2,#0x30000@设置第3个参数:
UBOOT的长度(192KB)
blnand_read_whole@调用nand_read_whole(),该函数在board/up2410/nand.c中
tstr0,#0x0@如果函数的返回值为0,表示执行成功.
beqok_nand_read@执行内存比较
1:
b1b
ok_nand_read:
movr0,#0x00000000@内部RAM的起始地址
ldrr1,=UBOOT_RAM_BASE@UBOOT在RAM中的起始地址
movr2,#0x400@比较1024次,每次4字节,4bytes*1024=4Kbytes
go_next:
ldrr3,[r0],#4
ldrr4,[r1],#4
teqr3,r4
bnenotmatch
subsr2,r2,#4
beqdone_nand_read
bnego_next
notmatch:
1:
b1b
done_nand_read:
movpc,r10
#endif
DW_STACK_START:
.wordSTACK_BASE+STACK_SIZE-4
上面是copy_myself的实现代码,添加完成以后,U-Boot启动时就会执行我们的这段代码,将U-Boot的内容从Flash中拷贝到SDRAM中。
这样,start.S这个文件就修改完成了,保存刚才的修改。
2、添加nand.c文件
在copy_mysel这段程序中,我们调用了nand_read_whole子程序。
这个程序是用C程序实现的,我们新建一个文件,board/up2410/nand.c,在这个文件中实现它:
#include
#include
#include
#defineTACLS0
#defineTWRPH03
#defineTWRPH10
#defineU32unsignedint
externunsignedlongnand_probe(unsignedlongphysadr);
staticvoidNF_Reset(void)
{
inti;
NF_nFCE_L();/*使能NandFlash*/
NF_CMD(0xFF);
for(i=0;i<10;i++);
NF_WAITRB();
NF_nFCE_H();
}
voidNF_Init(void)
{
rNFCONF=(1<<15)|(1<<14)|(1<<13)|(1<<12)|(1<<11)|(TACLS<<8)|(TWRPH0<<4)|(TWRPH1<<0);
NF_Reset();
}
intnand_read_whole(unsignedchar*buf,unsignedlongstart_addr,intsize)
{
inti,j;
if((start_addr&NAND_BLOCK_MASK)||(size&NAND_BLOCK_MASK))
return1;
NF_nFCE_L();
for(i=0;i<10;i++);
i=start_addr;
while(i rNFCMD=0;/*建立每次读写的地址,NANDFLASH按照扇区来进行读写*/ rNFADDR=i&0xff; rNFADDR=(i>>9)&0xff; rNFADDR=(i>>17)&0xff; rNFADDR=(i>>25)&0xff; NF_WAITRB(); for(j=0;j *buf=(rNFDATA&0xff); buf 在其下面添加下面几行: #defineCONFIG_CMD_REGINFO #defineCONFIG_CMD_NAND #defineCONFIG_CMD_PING #defineCONFIG_CMD_DLF #defineCONFIG_CMD_ENV #defineCONFIG_CMD_NET 这样就添加了一些我们需要的命令。 3、修改环境变量 环境变量是U-Boot运行时或者传递给内核的重要参数,需要正确设置。 找到下面的一行: #defineCONFIG_BOOTDELAY3 /*#defineCONFIG_BOOTARGS"root=ramfsdevfs=mountconsole=ttySA0,9600"*/ /*#defineCONFIG_ETHADDR08: 00: 3e: 26: 0a: 5b*/ #defineCONFIG_NETMASK255.255.255.0 #defineCONFIG_IPADDR10.0.0.110 #defineCONFIG_SERVERIP10.0.0.1 /*#defineCONFIG_BOOTFILE"elinos-lart"*/ /*#defineCONFIG_BOOTCOMMAND"tftp;bootm"*/ #ifdefined(CONFIG_CMD_KGDB) 注意上面的#ifdefined(CONFIG_CMD_KGDB)处,需要做的修改都在这之前进行修改。 修改后的代码如下: #defineCONFIG_BOOTDELAY3 #defineCONFIG_BOOTARGS"root=/dev/mtdblock2init=/linuxrcconsole=ttySAC0,115200" #defineCONFIG_ETHADDR08: 00: 3e: 26: 0a: 5b #defineCONFIG_NETMASK255.255.255.0 #defineCONFIG_IPADDR192.168.1.131 #defineCONFIG_SERVERIP192.168.1.132 #defineCONFIG_BOOTFILE"uImage" #defineCONFIG_BOOTCOMMAND"tftp;bootm" #defineCONFIG_CMDLINE_TAG1 #defineCONFIG_SETUP_MEMORY_TAGS1 #defineCONFIG_INITRD_TAG1 #ifdefined(CONFIG_CMD_KGDB) 上面添加的环境变量在U-Boot启动时作为U-Boot的默认环境变量,如果不执行saveenv命令,则这些变量只存在于SDRAM中;执行saveenv命令后,这些便量会保存到Flash中,下次上电,在从Flash中把它读出来,作为环境变量使用。 4、修改命令提示符 找到下面一行: #defineCFG_PROMPT"SMDK2410#"/*MonitorCommandPrompt*/ 修改为: #defineCFG_PROMPT"[UP-2410#]" 这样,U-Boot的命令提示符就是[UP-2410#]。 这样做只是为了使用的时候知道我们使用的是经典2410开发板上Bootloader,当然不改的话,也没有什么影响。 5、修改默认下载地址 找到下面的一行: #defineCFG_LOAD_ADDR0x33000000/*defaultloadaddress*/ 这个变量定义的是在使用串口或者网卡下载文件到SDRAM时,如果不指定下载地址,则下载到这个宏指定的默认地址。 我们用下面的两行来替代: #defineCFG_LOAD_ADDR0x30008000 #defineCFG_TFTP_LOAD_ADDR0x30008000 6、修改环境变量在Flash中的存储地址 找到下面的两行: #defineCFG_ENV_IS_IN_FLASH1 #defineCFG_ENV_SIZE0x10000/*TotalSizeofEnvironmentSector*/ 上面的定义说明环境变量是存在Flash中。 我们的板子上只有NandFlash,因此环境变量只能存在NandFlash中。 因此,注释掉上面的两行,用下面的几行代替: #defineCFG_ENV_IS_IN_NAND1 #defineCFG_ENV_SIZE0x4000 #defineCFG_ENV_OFFSET(0x80000-0x4000) 表示环境变量存储在NandFlash中,大小为16KB,起始地址是0.5M往下的16KB地址处。 这样的话,U-Boot占用的Flash地址是前0.5M,对U-Boot来说,已经足够了。 到这里,配置文件的修改就完成了。 四、修改网卡驱动 前面提到,我们的开发板上是DM9000A网卡,不能直接使用U-Boot提供的网卡驱动,我们提供了这个网卡的驱动,由于修改的地方比较多,就不作详细解释了,直接给出这个驱动的实现代码。 该驱动会在网络驱动课程中讲解。 共有两个文件: dm9000x.c和dm9000x.h。 这两个文件在我们的src目录中存放。 把这两个拷贝到u-boot源代码目录下的drivers/net下,替换掉U-Boot自身的驱动文件。 [root@vm-devu-boot-1.3.2]#cp/mnt/hgfs/e/dm9000x.cdrivers/net/ cp: 是否覆盖‘drivers/net/dm9000x.c’? y [root@vm-devu-boot-1.3.2]#cp/mnt/hgfs/e/dm9000x.hdrivers/net/ cp: 是否覆盖‘drivers/net/dm9000x.h’? y [root@vm-devu-boot-1.3.2]# 修改u-boot工程目录下lib_arm/board.c源文件,添加网卡初始化函数接口调用: 找到源码中如下语句: (第424行) #ifdefCONFIG_DRIVER_CS8900 cs8900_get_enetaddr(gd->bd->bi_enetaddr); #endif 在这段语句前面加入“eth_init(gd->bd);”语句,如下: eth_init(gd->bd); #ifdefCONFIG_DRIVER_CS8900 cs8900_get_enetaddr(gd->bd->bi_enetaddr); #endif 这样u-boot启动时候,将自动初始化网卡。 五、编译U-Boot 首先运行如下命令配置U-Boot: [root@vm-devu-boot-1.3.2]#makeup2410_config Configuringforup2410board... [root@vm-devu-boot-1.3.2]# 然后运行make命令编译: [root@vm-devu-boot-1.3.2]#make 编译完成后,会在U-Boot的源代码目录下生成u-boot.bin文件。 这个文件就是我们需要的二进制文件。 六、烧写U-Boot 将编译得到的u-boot.bin拷贝到XP的D盘下,将我们光盘中的sjf2410-s.exe文件也拷贝到D盘下。 连接好开发板的电源、JTAG下载线,打开开发板的电源。 在电脑桌面的左下角点击开始,找到运行: 在打开的菜单中输入cmd,并回车: 这样将会打开一个DOS对话框。 在打开的DOS对话框中进入D盘: MicrosoftWindowsXP[版本5.1.2600] (C)版权所有1985-2001MicrosoftCorp. C: \DocumentsandSettings\Administrator>D: D: \> 这样就进入了D盘,运行如下命令进行烧写: D: \>sjf2410-s.exe/f: u-boot.bin 这样就会启动烧写程序。 在烧写程序中需要我们做一些选择,要分别输入三次0,然后才开始真正的烧写,烧写完毕后,输入2推出程序。 如下面的内容: D: \>sjf2410-s.exe/f: u-boot.bin +------------------------------------+ |SECJTAGFLASH(SJF)v0.7| |(S3C2410X&SMDK2410B/D)| |PROVIDEDBYKENT20050628| |kent@up-| +------------------------------------+ Usage: SJF/f: >S3C2410X(ID=0x0032409d)isdetected. [SJFMainMenu] 0: K9S1208prog1: K9F2808prog2: 28F128J3Aprog3: AM29LV800Prog 4: MemoryRd/Wr5: Exit Selectthefunctiontotest: 0 [K9S1208NANDFlashJTAGProgrammer] K9S1208isdetected.ID=0xec76 0: K9S1208Program1: K9S1208PrBlkPage2: Exit Selectthefunctiontotest: 0 [SMC(K9S1208V0M)NANDFlashWritingProgram] Sourcesize: 0h~21237h Availabletargetblocknumber: 0~4095 Inputtargetblocknumber: 0 targetstartblocknumber=0 targetsize(0x4000*n)=0x24000 STATUS: Epppppppppppppppppppppppppppppppp Epppppppppppppppppppppppppppppppp Epppppppppppppppppppppppppppppppp Epppppppppppppppppppppppppppppppp Epppppppppppppppppppppppppppppppp Epppppppppppppppppppppppppppppppp Epppppppppppppppppppppppppppppppp Epppppppppppppppppppppppppppppppp Epppppppppppppppppppppppppppppppp 0: K9S1208Program1: K9S1208PrBlkPage2: Exit Selectthefunctiontotest: 2 D: \> 七、测试U-Boot 现在U-Boot已经烧写到开发板上了,可以启动开发板检测是否烧写好。 连接好开发板和主机之间的串口、网口,断开开发板的JTAG下载线,启动开发板。 如果烧写成功,会在串口终端上出现如下内容: U-Boot1.3.2(Dec52008-10: 35: 38) DRAM: 64MB Flash: 512kB NAND: 64MiB ***Warning-badCRCorNAND,usingdefaultenvironment In: serial Out: serial Err: serial Hitanykeytostopautoboot: 0 [UP-2410-S#] 注意上面内容中红色的部分,主要是因为我们没有把环境变脸写入Flash。 运行如下命令将环境变量写入Flash中: [UP-2410#]saveenv SavingEnvironmenttoNAND... ErasingNand...WritingtoNand...done [UP-2410#] 运行printenv查看环境变量: [UP-2410#]printenv bootargs=root=/dev/mtdblock3init=/linuxrcconsole=ttySAC0,115200 bootcmd=tftp;bootm bootdelay=3 baudrate=115200 ethaddr=08: 00: 3e: 26: 0a: 5b ipaddr=192.168.1.131 serv
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- LINUXuboot 移植 济源 职业技术学院