BootLoader引导程序制作及移植(一)
U-Boot 實(shí)驗(yàn)指導(dǎo)書(shū)
一、獲得U-Boot 源碼
我們的光盤(pán)中提供了直接從U-Boot的官方網(wǎng)站下載的源代碼,版本是1.3.2,放在src目錄下。將u-boot-1.3.2.tar.bz2拷貝了工作目錄下,解壓源碼包:
[root@localhost root]# mkdir 2410-s
[root@localhost root]# cd 2410-s/
[root@localhost 2410-s]# cp /mnt/hgfs/linux/u-boot-1.3.2.tar.bz2 ./
[root@localhost 2410-s]# tar xjvf u-boot-1.3.2.tar.bz2
?
二、建立板級(jí)支持包
在board立一個(gè)目錄,目名錄字下叫,做每一塊開(kāi)發(fā)板都有一個(gè)對(duì)應(yīng)的目錄,因此我們需要為我們的開(kāi)發(fā)板建up2410,并創(chuàng)建相應(yīng)的文件:
[root@vm-dev u-boot-1.3.2]# cd board/
[root@vm-dev board]# mkdir up2410
[root@vm-dev board]# cp smdk2410/* up2410
[root@vm-dev board]# cd ../
?
上面的步驟中,我們把smdk2410目錄下的所有文件都拷貝到了我們的up2410下,因?yàn)槲覀兊拈_(kāi)發(fā)板和目錄smdk2410每個(gè)開(kāi)發(fā)板都有一個(gè)自己的開(kāi)配發(fā)置板的文配件置,差如不多。smdk2410開(kāi)發(fā)板的配置文件為include/configs/smdk2410.h,我們也需要為我們的開(kāi)發(fā)板建立自己的配置文件。可以直接從smdk2410開(kāi)發(fā)板的配置文件中修改而來(lái)。因此我們先把smdk2410的配置文件復(fù)制到我們開(kāi)發(fā)板的配置文件當(dāng)中:
[root@vm-dev u-boot-1.3.2]# cp include/configs/smdk2410.h include/configs/up2410.h
然后,修改Makefile,使得可以配置我們的開(kāi)發(fā)板:
[root@vm-dev u-boot-1.3.2]# vi Makefile
在Makefile中找到下面兩行:
smdk2400_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t smdk2400 NULL s3c24x0
緊接這兩行添加如下兩行:
up2410_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t up2410 NULL s3c24x0
注意第二行開(kāi)始部分的空白是按TAB鍵獲得的!紅色的部分顯示了不同處!
這樣,我們自己的板級(jí)支持包就建好了。
?
?
三、添加代碼,支持從Nand Flash 啟動(dòng)
由于我們的開(kāi)發(fā)板上沒(méi)有Nor Flash,只能從Nand Flash啟動(dòng)。而U-Boot默認(rèn)不支持從Nand Flash啟動(dòng),所以需要我們自己添加代碼來(lái)實(shí)現(xiàn)從Nand Flash啟動(dòng)。
1、修改start.S
文件位于cpu/arm920t/目錄下的start.S這個(gè)文件中添加內(nèi)容,以支持從文件是開(kāi)發(fā)板上電后運(yùn)行的第一段代碼,需要在Nand Flash啟動(dòng)。
[root@localhost u-boot-1.3.2]# vi +181 cpu/arm920t/start.S
首先,刪掉start.S中的第181行和201行的下面內(nèi)容:
#ifdef CONFIG_AT91RM9200
...............................................................
#endif
如果有這兩句,這兩句之間的內(nèi)容將不會(huì)被編譯。而我們的開(kāi)發(fā)板需要執(zhí)行這些內(nèi)容。然后,找這到這一行:
#ifndef CONFIG_SKIP_RELOCATE_UBOOT
在緊接這行的下面添加下面幾行:
#ifdef CONFIG_S3C2410_NAND_BOOT
bl copy_myself
#else
再找到
ble copy_loop
在它的下面添加一行:
#endif
做這些工作就是要完成一個(gè)簡(jiǎn)單的功能:如果我們定義了CONFIG_S3C2410_NAND_BOOT這個(gè)宏,那么就執(zhí)行copy_myself行這個(gè)子程序,否則就執(zhí)#else下面的程序。copy_myself這個(gè)子程序的功能就是把U-Boot自身的代碼從Nand Flash拷貝到SDRAM中,需要我們自己實(shí)現(xiàn),U-Boot我們把自身并沒(méi)有為我們實(shí)現(xiàn)。
我們copy_myself也添加在start.S文件中。找到下面的一行:
_start_armboot: .word start_armboot
在這一行的下面添加如下的內(nèi)容:
上面是copy_myself的實(shí)現(xiàn)代碼,添加完成以后,U-Boot段代碼,將啟動(dòng)時(shí)就會(huì)執(zhí)行我們的這U-Boot的內(nèi)容從Flash中拷貝到SDRAM中。
這樣,start.S這個(gè)文件就修改完成了,保存剛才的修改。
?
2、添加nand.c 文件
?
在copy_mysel這段程序中,我們調(diào)用了nand_read_whole子程序。這個(gè)程序是用C程序?qū)崿F(xiàn)的,我們新建一個(gè)文件,board/up2410/nand.c,在這個(gè)文件中實(shí)現(xiàn)它:
#include <common.h>
#include <s3c2410.h>
#include <config.h>
#define TACLS 0
#define TWRPH0 3
#define TWRPH1 0
#define U32 unsigned int
extern unsigned long nand_probe(unsigned long physadr);
static void NF_Reset(void)
{
?????? int i;
?????? NF_nFCE_L();
?????? NF_CMD(0xFF);
?????? for(i=0;i<10;i++);
?????? NF_WAITRB();
?????? NF_nFCE_H();
}
void NF_Init(void)
{
?????? rNFCONF=(1<<15)|(1<<14)|(1<<13)|(1<<12)|(1<<11)|(TACLS<<8)|(TWRPH0<<4)|(TWRPH1<<0);
?????? NF_Reset();
}
int nand_read_whole(unsigned char *buf, unsigned long start_addr, int size)
{
?????? int i, j;
?????? if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK))
?????? return 1;
?????? NF_nFCE_L();
?????? for(i=0; i<10; i++);
?????? i = start_addr;
?????? while(i < start_addr + size) {
?????? rNFCMD = 0;
?????? rNFADDR = i & 0xff;
?????? rNFADDR = (i >> 9) & 0xff;
?????? rNFADDR = (i >> 17) & 0xff;
?????? rNFADDR = (i >> 25) & 0xff;
?????? NF_WAITRB();
?????? for(j=0; j < NAND_SECTOR_SIZE; j++, i++) {
?????? *buf = (rNFDATA & 0xff);
?????? buf++;
?????? }
}
?????? NF_nFCE_H();
?????? return 0;
}
?
[root@localhost u-boot-1.3.2]# vi board/up2410/nand.c
?
上面就是nand.c文件的全部?jī)?nèi)容。為了改相應(yīng)的使編譯的時(shí)候能把這個(gè)文件編譯進(jìn)去,需要修Makefile:
[root@vm-dev u-boot-1.3.2]# vi board/up2410/Makefile
找到這一行:
COBJS := smdk2410.o flash.o
把這行的內(nèi)容改為下面這行:
COBJS := smdk2410.o flash.o nand.o
即在行尾加上了
nand.o,這樣,編譯的時(shí)候就會(huì)把nand.c編譯進(jìn)去,并進(jìn)行鏈接。
3、修改up2410.h
前面提到,up2410.h是開(kāi)發(fā)板的配置文件。關(guān)于nand.c定義的,我們都放在中用到的一些宏或者其他需要up2410.h中。注意,這里只介紹和從Nand啟動(dòng)相關(guān)的配置,因?yàn)?span lang="en-us">up2410.h
中還有很多其他配置,將在后面介紹!
[root@vm-dev u-boot-1.3.2]# vi + include/configs/up2410.h
光標(biāo)移動(dòng)到文件的末尾,在文件的最后一個(gè)#endif的前面添加如下內(nèi)容:
#define CONFIG_S3C2410_NAND_BOOT 1
#define STACK_BASE 0x33f00000
#define STACK_SIZE 0x8000
#define UBOOT_RAM_BASE 0x33f80000
#define CFG_NAND_BASE 0x4E000000
#define CFG_MAX_NAND_DEVICE 1
#define SECTORSIZE 512
#define NAND_SECTOR_SIZE SECTORSIZE
#define NAND_BLOCK_MASK (NAND_SECTOR_SIZE - 1)
#define ADDR_COLUMN 1
#define ADDR_PAGE 2
#define ADDR_COLUMN_PAGE 3
#define NAND_ChipID_UNKNOWN 0x00
#define NAND_MAX_FLOORS 1
#define NAND_MAX_CHIPS 1
#define WRITE_NAND_COMMAND(d, adr) do {rNFCMD = d;} while(0)
#define WRITE_NAND_ADDRESS(d, adr) do {rNFADDR = d;} while(0)
#define WRITE_NAND(d, adr) do {rNFDATA = d;} while(0)
#define READ_NAND(adr) (rNFDATA)
#define NAND_WAIT_READY(nand) {while(!(rNFSTAT&(1<<0)));}
#define NAND_DISABLE_CE(nand) {rNFCONF |= (1<<11);}
#define NAND_ENABLE_CE(nand) {rNFCONF &= ~(1<<11);}
#define NAND_CTL_CLRALE(nandptr)
#define NAND_CTL_SETALE(nandptr)
#define NAND_CTL_CLRCLE(nandptr)
#define NAND_CTL_SETCLE(nandptr)
#define CONFIG_MTD_NAND_VERIFY_WRITE 1
#define rNFCONF (*(volatile unsigned int *)0x4e000000)
#define rNFCMD (*(volatile unsigned char *)0x4e000004)
#define rNFADDR (*(volatile unsigned char *)0x4e000008)
#define rNFDATA (*(volatile unsigned char *)0x4e00000c)
#define rNFSTAT (*(volatile unsigned int *)0x4e000010)
#define rNFECC (*(volatile unsigned int *)0x4e000014)
#define rNFECC0 (*(volatile unsigned char *)0x4e000014)
#define rNFECC1 (*(volatile unsigned char *)0x4e000015)
#define rNFECC2 (*(volatile unsigned char *)0x4e000016)
#define NF_CMD(cmd) {rNFCMD=cmd;}
#define NF_ADDR(addr) {rNFADDR=addr;}
#define NF_nFCE_L() {rNFCONF&=~(1<<11);}
#define NF_nFCE_H() {rNFCONF|=(1<<11);}
#define NF_RSTECC() {rNFCONF|=(1<<12);}
#define NF_RDDATA() (rNFDATA)
#define NF_WRDATA(data) {rNFDATA=data;}
#define NF_WAITRB() {while(!(rNFSTAT&(1<<0)));}
?
?
這樣,關(guān)于從Nand啟動(dòng)的修改就做完了。保存文件。
三、開(kāi)發(fā)板的配置。
前面已經(jīng)提到,up2410.h文件中進(jìn)行配置。是我們的開(kāi)發(fā)板的配置文件,許多重要的內(nèi)容都需要在這個(gè)
1、網(wǎng)卡配置
Smdk2410開(kāi)發(fā)板上用的是CS8900網(wǎng)卡,而我們的開(kāi)發(fā)板上使用的是AX88796網(wǎng)卡, 因此網(wǎng)卡的配置需要修改。找到下面三行:
#define CONFIG_DRIVER_CS8900 1 /* we have a CS8900 on-board */
#define CS8900_BASE 0x19000300
#define CS8900_BUS16 1 /* the Linux driver does accesses as shorts */
注釋掉這三行,在這三行下面添加下面的兩行:
#define CONFIG_DRIVER_DM9000 1
#define CONFIG_DRIVER_DM9000_BASE 0x10000000
#define DM9000_IO CONFIG_DM9000_BASE
#define DM9000_DATA (DM9000_IO + 2)
#define CONFIG_DM9000_USE_16BIT
這樣定義主要是因?yàn)?span lang="en-us">U-Boot中提供的DM9000X網(wǎng)卡驅(qū)動(dòng)與我們的經(jīng)典2410用的平臺(tái)上使DM9000A網(wǎng)卡有一定的不同之處,不能直接驅(qū)動(dòng)我們的DM9000A這里對(duì)網(wǎng)卡的信息進(jìn)行配置以外,還需要修改網(wǎng)卡。因此,除了DM9000A網(wǎng)卡的驅(qū)動(dòng),將在后面介紹。
轉(zhuǎn)載于:https://blog.51cto.com/chenboqiang/484032
總結(jié)
以上是生活随笔為你收集整理的BootLoader引导程序制作及移植(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Drupal6中的表单如果不让修改
- 下一篇: C#遍历文件读取Word内容以及使用Ba