日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BootLoader引导程序制作及移植(一)

發布時間:2025/3/20 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BootLoader引导程序制作及移植(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

U-Boot 實驗指導書

一、獲得U-Boot 源碼

我們的光盤中提供了直接從U-Boot的官方網站下載的源代碼,版本是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

?

二、建立板級支持包

board立一個目錄,目名錄字下叫,做每一塊開發板都有一個對應的目錄,因此我們需要為我們的開發板建up2410,并創建相應的文件:

[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下,因為我們的開發板和目錄smdk2410每個開發板都有一個自己的開配發置板的文配件置,差如不多。smdk2410開發板的配置文件為include/configs/smdk2410.h,我們也需要為我們的開發板建立自己的配置文件。可以直接從smdk2410開發板的配置文件中修改而來。因此我們先把smdk2410的配置文件復制到我們開發板的配置文件當中:

[root@vm-dev u-boot-1.3.2]# cp include/configs/smdk2410.h include/configs/up2410.h

然后,修改Makefile,使得可以配置我們的開發板:

[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

注意第二行開始部分的空白是按TAB鍵獲得的!紅色的部分顯示了不同處!

這樣,我們自己的板級支持包就建好了。

?

?

三、添加代碼,支持從Nand Flash 啟動

由于我們的開發板上沒有Nor Flash,只能從Nand Flash啟動。而U-Boot默認不支持從Nand Flash啟動,所以需要我們自己添加代碼來實現從Nand Flash啟動。

1、修改start.S

文件位于cpu/arm920t/目錄下的start.S這個文件中添加內容,以支持從文件是開發板上電后運行的第一段代碼,需要在Nand Flash啟動。

[root@localhost u-boot-1.3.2]# vi +181 cpu/arm920t/start.S

首先,刪掉start.S中的第181行和201行的下面內容:

#ifdef CONFIG_AT91RM9200

...............................................................

#endif

如果有這兩句,這兩句之間的內容將不會被編譯。而我們的開發板需要執行這些內容。然后,找這到這一行:

#ifndef CONFIG_SKIP_RELOCATE_UBOOT

在緊接這行的下面添加下面幾行:

#ifdef CONFIG_S3C2410_NAND_BOOT

bl copy_myself

#else

再找到

ble copy_loop

在它的下面添加一行:

#endif

做這些工作就是要完成一個簡單的功能:如果我們定義了CONFIG_S3C2410_NAND_BOOT這個宏,那么就執行copy_myself行這個子程序,否則就執#else下面的程序。copy_myself這個子程序的功能就是把U-Boot自身的代碼從Nand Flash拷貝到SDRAM中,需要我們自己實現,U-Boot我們把自身并沒有為我們實現。

我們copy_myself也添加在start.S文件中。找到下面的一行:

_start_armboot: .word start_armboot

在這一行的下面添加如下的內容:

上面是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>

#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文件的全部內容。為了改相應的使編譯的時候能把這個文件編譯進去,需要修Makefile

[root@vm-dev u-boot-1.3.2]# vi board/up2410/Makefile

找到這一行:

COBJS := smdk2410.o flash.o

把這行的內容改為下面這行:

COBJS := smdk2410.o flash.o nand.o

即在行尾加上了

nand.o,這樣,編譯的時候就會把nand.c編譯進去,并進行鏈接。

3、修改up2410.h

前面提到,up2410.h是開發板的配置文件。關于nand.c定義的,我們都放在中用到的一些宏或者其他需要up2410.h中。注意,這里只介紹和從Nand啟動相關的配置,因為up2410.h

中還有很多其他配置,將在后面介紹!

[root@vm-dev u-boot-1.3.2]# vi + include/configs/up2410.h

光標移動到文件的末尾,在文件的最后一個#endif的前面添加如下內容:

#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)));}

?

?

這樣,關于從Nand啟動的修改就做完了。保存文件。

三、開發板的配置。

前面已經提到,up2410.h文件中進行配置。是我們的開發板的配置文件,許多重要的內容都需要在這個

1、網卡配置

Smdk2410開發板上用的是CS8900網卡,而我們的開發板上使用的是AX88796網卡, 因此網卡的配置需要修改。找到下面三行:

#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

這樣定義主要是因為U-Boot中提供的DM9000X網卡驅動與我們的經典2410用的平臺上使DM9000A網卡有一定的不同之處,不能直接驅動我們的DM9000A這里對網卡的信息進行配置以外,還需要修改網卡。因此,除了DM9000A網卡的驅動,將在后面介紹。

轉載于:https://blog.51cto.com/chenboqiang/484032

總結

以上是生活随笔為你收集整理的BootLoader引导程序制作及移植(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。