uboot移植详细教程

4星(超过85%的资源)
所需积分/C币:50 2015-08-29 10:16:47 2.23MB PDF
207
收藏 收藏
举报

uboot移植详细教程,建议看完前面几个脚本分析文档,再接下来看uboot。
8.修改时钟的初始化 cpu/arm920U/start.S 注销掉 samsung demo板关于LED灯的初始化部分,因为我们的板子LED灯的引脚可能和它的不同。 bU coloured led init bL ed led on 修改Ⅰ NTSUBMSK寄存器的配置,因为2440关于这个寄存器有14个位。 if defined (CoNFIG 53C2410) ldr r1, =0x7fff ldr r③,= INTSUBM st广 [] f endif 注销掉原来的时钟设置添加我们自己的设置。 LK:HCLK: PCI 2:4 x default fclk is 120 MHzIt ldr TO, =CLKDIVN ,#3 r1, [ro] Define MPLLCoN 0x4c000004 define UPLLCON 0x4C000008 设置 CLKDIVN=0x5即设置了分频比 ldr rO, =CLKDIVN FCLK: HCLK: PCLK=1: 4 8 POV StTE ,[e mrc p15 orrr1,「1,# Oxc0000000 这里是手册上要求的。 ncrp15,0,r1,c1,c0,0 ldr PLLCON ldr 38022 str [ro] nop nop nop no p 同时修改 MPLLCON, UPLLCON,需要先 nop 修改 UPLLCON且直接必须隔开7个nop DO p ldr CO, =MPLLCON ldr 1,=8了F⊙21 str [rol #endif/* CONFIG 53C24X0 t 手当HDⅠVN不为0时,需要添加下面的代码,这个是手册上要求,我们照着做就可以了 If divn is not 0, the Cpu bus mode has to be changed from the fast bus mode to the asynchronous bus mode using following instructions(S3C2440 does not support synchronous bus mode). MMU_SetAsync Bus Mode mrc p15,0, rD, c1, c0,0 orr ro, ro, #R1_nF: OR: R1_iA mrp15,r0,c1,c0,0 9.修改 uboot获取时钟的计算公式,上要修改 gct PLLCLKO, gct HCLKO.这两个函数。 vi cpu/arm920U's3c24x0/speed c static ulong get_PLLCLK(int pllreg) rootahuzebin: /home/samba/u-b struct s3c24x0 clock_ power *cLk_ power s3c24x0 get base clockpower (; ulong 内,p,s arm117b arm920t arm20515 root(huzebin: /home /mamba/u-b if (pllreg ==MPLI rootahuzebin: /home /samba/u-b r= readl(&cLk_power->MPLLCON); fig. mk LFICLUE else if (pllreg = UPLL) rootahuzebin: /home/samba/u eadl(&clk power->UPLLCON); root(huzebin:/home/samba/u-b Lse hang(); rootinuzrk. blac 386 rootahuz n ((r OxFFooo) ((r&6x03F)>>4)+2 fs/reiserfs/Libreisel a disk/libdisk, a dry s=r&e×3 board drivers/dma/ltbdmaa return (CONFIG_SYS_CLK_FREQ *m 2)/(p <c s); 5.c/libhwmon, a drivers/y fig. d uLong get_HCLK(VOL cono drivers/mmc/lib struct s3c24x0 clock_power *cLk_power 53c24x0 get base_ clock_ power( return get FCLk()/: phy. a drivers/net/sk98 mcia. a drivers/spi/lib ers/usb/Libusb. a driver 因为2410的分频比和2440的不同,这里无非是设置一些分频,在我的《 uboot源码分析》中有做说明。 10.测试,将编译好的ubo下载到板子的 SDRAM中运行。 Press space key to Download Mode Boot for nor flash main menu####= [1 Down load u-boot or sTEPLDR nbl or other boot loader to nand Flash Down load eboot to nand flash Down load linux kerne to nand flash to and 61 own load YAFFs image to Nand Flash下载到 SDRAM并运行 Download Progr am (ucos-II or 2440_-Test) to SDRAM and Run it 8 Boot the system [9 For mat the Nand Flash [O] Set the boot parameters al Download User Progr am (eq: ucoS-II or 2440_-Test) to Nand Flash Download LOGo Picture (.bin to Nand Flash et LCD ameter s 0] Download u-boot to Nor Flash r Reboot u-boot [q]uiL「 roll EIIL Enter your selection: 7 USB host is connected. waiting a down load NoW,Downloading [ADDRESS: 3000000oh, TOTAL: 96702 RECEIVED FILE SIZE: 96702(94KB/5, 15) # starting application at 0x 30000000 Boot2009.03(2綞12015-10:54:17) 1sh:512k8sdam和1ash我们板子上的不同 warning bad CRC, using default environment serial ut sea Err serial SMDK2410 11.修改命令行 vi include/configs/hzb2440 h #define CONFIG_SYS_PROM HZB2440F print boote l ay baudrate=115200 i paddr=10.0.0.11 I serverip=10.0.0.1 netmask=255255255.0 stdin=seria stdout=serial stderr=serial ethact=Cs$900-0 Environment size: 143/65532 bytes ZB2440# 12.支持从 NANDFLASH启动 因为在上电的时候2440会自动的拷贝 nandflash前面4K的内容到片内的SRAM里去执行,当涉及的代码人 于4K的时候,有很有必要去学习 nandflash的操作。 我的 nandflash是K9F2G08U0A,它是8位的 nandflash。K9F2G08U0A的一页为(2K+64)字节,它的一 块为64页,而整个设备包括了2048个块。要实现用8个10口来要访问这么大的容量,查看了K9F2G08U0A 的数据手册,它规定了用5个周期来实现。 Figure 2. K9 F2G08X0A Array Organization 1 Block=B4 Pages (128K 4k)Byte 1 Page =(2K+ 64)Byt 128K Pages 222225223242342222622243344 1 Block =(2K 64 B x 64 Pages (128K +4K)Bytes (2,048 Blocks 1 Device =(2K+64 B x 64 Pages x 2,048 Blocks =2.112 Mbits 8 bit 2K Bytes 64 Bytes 区 i/Page Register. Q0~7 2K Bytes 64 Bytes VO0 NO 1 2 IO W/04 IO 51/06 IO 7 1st Cycle AoAt A3 A AR A Column Address 2nd Cycle A10 A11 Column address 3rd Cycle A12 A13 A14 A15 A1 A17 A18 A19 Row Address 4th Cycle A20A A22A23A2 A26 A2 Row Address 5th Cycle A "L Row Address VDD33Y U2 K9Fx03 LDATA7 w/On 43 LDATA8 LDATA5 RnB R/B 1O4H41LDATAA nICE CLE CLE 1O331 LDATA3 LDATA2 ALE ALE LDATA nFWE vo0 LDATAO nFRE VDD33v WP卫 VCC VCC C10 01uF <1>.00~1O7:用于输入地址/数据/命令,输出数据 <2>.CLE:命令锁存使能,在输入命令之前,要先在模式寄存器中,设置CLE使能 <3>.ALE:地址锁存使能,在输入地址之前,要先在模式寄存器中,设置ALE使能 <4>.CE#:芯片使能,在操作 Nand flash之前,要先选中此芯片,才能操作 <5>.RE#:读使能,在读取数据之前,要先使CE#有效。 <6>.WE#:写使能,在写取数据之前,要先使WE#有效 <7>.RB#就绪/忙,主要用于在发送完编程/擦除命令后,检测这些操作是否亢成,忙,表示编程/擦除操作仍在进行 中,就绪表示操作完成 由于所有的命令、地址和数据全部从8位IO∏传输,所以 nandflash定义了个命令集来完成各种操作 有的操作只需要一个命令(即一个周期)即可,而有的操作则需要两个命令(即两个周期)米实现 Table 1 command sets Function 1st Cycle 2nd cycle Acceptable Command during Busy Read 0OF Read for Copy Back oOh 357 Read D 90h Reset FFh Page Program 80h 10h TwD-Plane Page Program sh 8Oh-11 81h-10h Copy-Back Program 85h 10h TwD-Plane Cory-Back Program 3) 85h--11 81h--10h Block erase 60 Doh Two-Plane Block erase 605---60h Doh Random Data Input1 85h Random Data Output() Eoh Read status 70h Read edc status() 7Bh 例如要读⑩D则在 NFCMMD这个寄存器里写入0x90,而读操作则需要两个周期来实现,第一个周期写入 0x00,第个周期写入0x30。 #define cmd read 1 0x00 ∥读命令周期1 #define cmd read2 0x30 ∥读命令周期2 #define cmd redid 0x90 ∥/ NAND FLASH|D命令 #define cmd reset 0x斤f ∥命令 NAND FLASH重起 #define cmd page write1 0x80 ∥)写命令周期1 #define cmd page write2 0x10 页写命令周期2 #define cmd block erase 0x60 ∥块擦除命令周期1 #define cmd block erase2 Oxdo ∥块擦除命令周期2 #define cmd readstatus 0x70 ∥读状态命令 #define cmd readrandom1 0x05 ∥随意读命令周期1 #define cmd readrandom2 Oxe0 ∥随意读命令周期2 #define cmd writerandom 0x85 ∥随意写命令 2440的 nandflash控制器,通过设置内部的一些寄存器来实现 nandflash的一些操作。其中 NECMMD, NFADDR和 NFDATA分别用」传输命令,地址和薮据。 NESTAT是 nandtlash操作状态寄存器。 #define NF CMD(data RrNFCMD=(data); 1 ∥操作 NANDFLASH的命令语句 #define NF_ ADdR(addr) rNFADDR=(addr); ∥传专输地址 #define NF RDDATA (rNFDATA) ∥读32位数据 #define NF RDDATA80 (rNFDATA8 ∥读8位数据 # define NF WRDATA(data){ NFDATA=data}W写32位数据 # define NE Rdata8(data){ NFDATA8=data;}/写8位数据 NECONF( nandflash配置寄存器)上要用到了 TACLS(13:12)、 TWRPH0(10:8)、 TWRPH1(6:4) 这三个变量用于配置 nandflash的时序,可以通过查看它的时序图来设置相应的参数,般设置为(1,2,0) 然也要考虑到你的HCLK我这是100MHz。。NFC○NF的第0位表示的是外接的 nandflash是8位|O还 是16位O,根据相应的 nandflash设置对应的值。 NECONT( nandflash控制寄存器),也是要事先初始化 的一个寄存器,根据各个位的定义来设置相应的值。下面是 nandflash初始化的一个程序。 #define TAcls 1 #define TWRPHo 2 #define TWRPH1 0: void nandtlash inito rGPACON= rGPACON|(0×3f<<17);∥设置VO∏1=nFCE //1=nRSTOUT //1=nFRE /11=nFWE /1=ALE //1=CLE 「 NFCONF=( TACLS<<12)( TWRPH0≤8川( TWRPH1<4)(0<0) NFCONT=(0<13)(0<12)(0<<10)(0<<9)(0<<8)(1<≤6 (1<<5)(1<<4川(1<<1)(1<<0); NESTAT( nandflash状态寄存器)是另一个比较重要的寄存器,它的第0位可以用于判断 nandflash是 否在忙,第2位用于检测RnB引脚信号。 # define NE waitre0Whe(( NESTAT&(1<0))}等待 nandflash不忙 #define NF CLEAR RBO rNFSTAT =(1<<2);5 ∥清除RnB信号 # define ne_ DETECT_RB(){hle( NESTAT&(1<<2))}W等待RnB信号变高。 接下来就是对 nandflash的一些操作了, 1复位 复位是比较简单的操作了,只要向 NFCMMD寄存器写入复位命令就可以了。就是要打开片选,等待 nandflash 准各就绪( while(( NESTAT&(1<<0))今),然后写入命令0Xf,在等待,最后关闭片选就可以了 void nandflash reset(void) NF CE LO: ∥选定片选 NF CLEAR RBO 清RNB NF_CMD( cmd reset;发送重启命令0xf NF DETECT RBO: ∥待RNB变高, NF CE_ HO ∥关闭片选 2、读操作 在读过程中,我没有对其进行ECC校验。所也是比较简单的操作,读是按页读的,读要发出两个周期的命 令,要读的那一页是在两个命令周期之间写入的。最后再读数据。下面一段程序的操作为讲 page number页的 数据读到data2048]这个数组中。接下米打算再看看ECC校验,这个应该不会很难操作,因为2440的硬件产生 的ECC校验。用久了的 nandflash容易产生坏块,所以很有必要对ECC校验学习一下,无非也是对几个寄存器 的操作。然后对比下 unsigned char data 2048; void nandflash read(U32 page number) unsigned int i; NF CE LO NF CLEAR RB0 NF CMD(cmd read1);∥写入命令1 NF ADDR(0x0O);∥连续写入五个周期的地址 NF ADDR(OX00) NF ADDR(page number&Oxff) NF ADDR((page number>>8)&0xff); NF ADDR((page number>>16)&0xff); NF CMD(cmd read2);W写入命令2 dely (1); NE DETECT RB(;∥等待RNB变高 for(i=0;i<2048+) data= rNFDATA8;∥读出 NF CE HO 3、写操作 写操作跟读操作是差不多的。无非一个是读一个是写。在此我也没有对其进行ECC校验。按理说应该对其 进行校验,才能知道我们写入的是否成功。现在只是对其操作的熟悉,后面再对其进行深入了。 void nandflash write (U32 page_ number) U32 unsigned char stat NF CE LO NF CLEAR RB0; NF CMD(cmd_page_ write 1) NF ADDR(OX0O NF ADDR(Ox00) NF ADDR(page number&Oxff) NF ADDR((page number>>8)&0xff); NF ADDR((page number>>16)&0xff) fori=01<2048++) rNFDATA8=data 4、块擦除 擦察除是以块为单位进行的,因此在写地址周期是,只需写三个行周期,并且要从A18开始写起。其他的操 作都是差不多的 unsigned char nandflash erase(unsigned int block number) unsigned char stat NF CE LO NF CLEAR RBO; NF CMD(cmd block erase) NF ADDR((block number<<6)&0xff) NF ADDR((block number>>2)&0xff) NF ADDR((block number>>10)&0xff) NF CMD(cmd block erase2) dely(1) NF DETECT RBO; NF CMD(cmd readstatus) stat=rNFDATA8 NF CE_ HO if(sta&0×01)==0) return oxo else return 0x02 Nandflash的操作还有事可以读或者写页内的任意地址,随意读命令是在读命令2后写入随意读命令和地址 的。随意写操作是在写命令1后写入随意写命令和地址的。 知道裸机的 nandflash怎么操作后,可以开始进行 uboot中 nandflash的移植了,目前u-boot中还没有对 2440上 Nand flash的支持,也就是说要想凵-boot从 Nand flash上启动得自己去实现了 (1) i include/ configs/hzb2440.h添加2440用到的 nandflash相关寄存器 Nandflash register #define coNFIg s3C2440 NAND boot 1 define nand ctl base0xE66/0d01h配置寄存器基地址,查2110手册可得知 define STAcK base0x33F0⊙⊙6 /定义堆栈的地址 tdefine STAcK SIzE 0x8000 //栈的长度大小 #define onfconF 0x90 相对Nand配置宵存器基地址的移量,运是配置寄存器的基地址 define onfcont6x64//相对Nand配置寄存器基地址的偏移量可得到控制寄存器的基地址(×4E060 据 define onfaddr oxo/相对Nand配置寄存器基地址的偏移量,可得到地址寄存器的基地址(x400c6 # definc oNeAta ox10//相对Nand配置寄存器其地址的偏移量.可得到数据寄有器的基地址(0x4E618 define oNF CMD Ox(8/相对Nand配置寄存器基地址的偏移量,可得到指令寄存恭的基地址(0x4E606 define lestat6x20/相对Nand配置寄存器基地址的偏移量,可得到状态寄存器的基地址(x4Ee002 #define oNfECc 0x2c /相对Nand配置寄存器基地址的偏移量.可得到EcC寄午器的基地址(0x4E6000-c) 并注销掉我们在上面添加的# define CoNFig sKIp lowleⅤ EL INIT。在卜一篇中,我们为了把u-boot下载 到内存中运行而屏蔽掉这段有关CPU初始化的代码。而现在我们要把 u-boot下载到 Nand flash中,从 Nand flash 启动,所以现在要恢复这段代码。 //#define CONFIG SKIP LOWLEVEL INIT (2) gedit arch/arm/cpu/arm920t/start. S 屏蔽掉 uboot从 norflash启动部分 #讠f #ifndef CONFIG SKIP RELOCATE UBOOT relocate relocate u- boot to ram adr re,⊥ start ro < current position of code * ldr T1. TEXT BASE / test if we run from fhash or RAM * CMp r6,「1 / don't reloc during debug eg stack setup ldr r2. armboot start ldr 「3,bss_ start sub 2,「3,『2 / r2 <- size of armboot add 广 r2 / r2 < source end address copy loop: ldmia rol, [r3-r101 / copy from source address [ro stna「1!,{r3-「10} copy to target address [r1] CHp re,『2 until source end addreee [r21 * ble copy Le OOD #endif / CONFIG SKIP RELOCATE UBOOT fendi 下面添加 uboot从 nandflash启动的部分代码

...展开详情
试读 21P uboot移植详细教程
立即下载 低至0.43元/次 身份认证VIP会员低至7折
一个资源只可评论一次,评论内容不能少于5个字
liushiqian1984 看了一下可以作为参考,总的来说还行吧
2018-02-05
回复
JimTam 可以参考 还行吧
2017-12-08
回复
cruisef 感觉还行,只是感觉用着不是特别顺手
2015-10-06
回复
d19810829 不错的资源,可以作为参考
2015-10-04
回复
您会向同学/朋友/同事推荐我们的CSDN下载吗?
谢谢参与!您的真实评价是我们改进的动力~
关注 私信
上传资源赚钱or赚积分
最新推荐
uboot移植详细教程 50积分/C币 立即下载
1/21
uboot移植详细教程第1页
uboot移植详细教程第2页
uboot移植详细教程第3页
uboot移植详细教程第4页
uboot移植详细教程第5页

试读结束, 可继续读2页

50积分/C币 立即下载 >