LINUXuboot移植济源职业技术学院Word文件下载.docx
- 文档编号:1478157
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:33
- 大小:27.92KB
LINUXuboot移植济源职业技术学院Word文件下载.docx
《LINUXuboot移植济源职业技术学院Word文件下载.docx》由会员分享,可在线阅读,更多相关《LINUXuboot移植济源职业技术学院Word文件下载.docx(33页珍藏版)》请在冰点文库上搜索。
而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
*/
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:
done_nand_read:
movpc,r10
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<
common.h>
s3c2410.h>
config.h>
#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;
i<
i++);
i=start_addr;
while(i<
start_addr+size){
rNFCMD=0;
/*建立每次读写的地址,NANDFLASH按照扇区来进行读写*/
rNFADDR=i&
0xff;
rNFADDR=(i>
>
9)&
17)&
25)&
for(j=0;
j<
NAND_SECTOR_SIZE;
j++,i++){/*读取每个扇区的所有指令*/
*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:
5b
#defineCONFIG_NETMASK255.255.255.0
#defineCONFIG_IPADDR192.168.1.131
#defineCONFIG_SERVERIP192.168.1.132
#defineCONFIG_BOOTFILE"
uImage"
#defineCONFIG_BOOTCOMMAND"
#defineCONFIG_CMDLINE_TAG1
#defineCONFIG_SETUP_MEMORY_TAGS1
#defineCONFIG_INITRD_TAG1
上面添加的环境变量在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/
是否覆盖‘drivers/net/dm9000x.h’?
[root@vm-devu-boot-1.3.2]#
修改u-boot工程目录下lib_arm/board.c源文件,添加网卡初始化函数接口调用:
找到源码中如下语句:
(第424行)
#ifdefCONFIG_DRIVER_CS8900
cs8900_get_enetaddr(gd->
bd->
bi_enetaddr);
在这段语句前面加入“eth_init(gd->
bd);
”语句,如下:
eth_init(gd->
这样u-boot启动时候,将自动初始化网卡。
五、编译U-Boot
首先运行如下命令配置U-Boot:
[root@vm-devu-boot-1.3.2]#makeup2410_config
Configuringforup2410board...
然后运行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盘,运行如下命令进行烧写:
sjf2410-s.exe/f:
u-boot.bin
这样就会启动烧写程序。
在烧写程序中需要我们做一些选择,要分别输入三次0,然后才开始真正的烧写,烧写完毕后,输入2推出程序。
如下面的内容:
+------------------------------------+
|SECJTAGFLASH(SJF)v0.7|
|(S3C2410X&
SMDK2410B/D)|
|PROVIDEDBYKENT20050628|
|kent@up-|
Usage:
SJF/f:
filename>
/d=<
delay>
S3C2410X(ID=0x0032409d)isdetected.
[SJFMainMenu]
0:
K9S1208prog1:
K9F2808prog2:
28F128J3Aprog3:
AM29LV800Prog
4:
MemoryRd/Wr5:
Exit
Selectthefunctiontotest:
[K9S1208NANDFlashJTAGProgrammer]
K9S1208isdetected.ID=0xec76
K9S1208Program1:
K9S1208PrBlkPage2:
Selectthefunctiontotest:
[SMC(K9S1208V0M)NANDFlashWritingProgram]
Sourcesize:
0h~21237h
Availabletargetblocknumber:
0~4095
Inputtargetblocknumber:
targetstartblocknumber=0
targetsize(0x4000*n)=0x24000
STATUS:
Epppppppppppppppppppppppppppppppp
2
七、测试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:
Err:
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:
5b
ipaddr=192.168.1.131
serv
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- LINUXuboot 移植 济源 职业技术学院