加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

u-boot 2010.03 移植

发布时间:2020-12-15 06:45:13 所属栏目:百科 来源:网络整理
导读:【环境】 1:Ubuntu 10.10 2:u-boot-2010.03 3:优龙FS2410 4:交叉编译器:arm-none-linux-gnueabi-gcc version 4.3.2 ? ? Step1: 创建板级源码 1)????????解压 tar jxvf u-boot-2010.03.tar.bz2 ? 2)?????????进入板极源码目录 tony@Ubuntu:~/win/u-boot-2

【环境】

1:Ubuntu 10.10

2:u-boot-2010.03

3:优龙FS2410

4:交叉编译器:arm-none-linux-gnueabi-gcc version 4.3.2

?

?

Step1: 创建板级源码

1)????????解压

tar jxvf u-boot-2010.03.tar.bz2

?

2)?????????进入板极源码目录

tony@Ubuntu:~/win/u-boot-2010.03/board/samsung$ls

smdk2400? smdk2410?smdk6400? smdkc100

?

3)??? 拷贝一份最相似的平台代码并改名(smdk2410是s3c2410的标准板,我们在smdk2410的基础上做FS2410的移植)

tony@Ubuntu:~/win/u-boot-2010.03/board/samsung$cp smdk2410 fs2410 -a

?

修改文件名

tony@Ubuntu:~/win/u-boot-2010.03/board/samsung/fs2410$mv smdk2410.cfs2410.c

?

修改 Makefile

tony@Ubuntu:~/win/u-boot-2010.03/board/samsung/fs2410$vim Makefile

将28行的COBJS?? := smdk2410.o flash.o

修改为COBJS?? := fs2410.o flash.o

?

拷贝头文件并改名

tony@Ubuntu:~/win/u-boot-2010.03/include/configs$cp smdk2410.h fs2410.h

?

4)???修改顶级 Makefile

tony@Ubuntu:~/win/u-boot-2010.03$vim Makefile

在 3045 和 3046 行下加入以下两句

fs2410_config :?????unconfig

(Tab键)@$(MKCONFIG) $(@:_config=)arm arm920t fs2410 samsung s3c24x0

?

修改编译器

在162、163和164行下添加(可以先找到编译器的绝对路径)

ifeq (arm,$(ARCH))

CROSS_COMPILE?=/home/tony/toolchain/bin/arm-none-linux-gnueabi-

Endif

?

5)???编译

tony@Ubuntu:~/win/u-boot-2010.03$make distclean

tony@Ubuntu:~/win/u-boot-2010.03$makefs2410_config

tony@Ubuntu:~/win/u-boot-2010.03$make

?

?这个时候我们就可以得到一个u-boot.bin也就是我们的目标文件,但是这个文件通常情况下是不能够正常工作的,我们还需要对u-boot源代码进行进一步的修改。


Step2: 修改平台相关信息

?

1)???修改中断屏蔽位

tony@Ubuntu:~/win/u-boot-2010.03$vim cpu/arm920t/start.S

将159行的??? ldr r1,=0x3ff 修改为ldr r1,=0x7ff


2)???修改 SDRAM 刷新周期

tony@Ubuntu:~/win/u-boot-2010.03$ vimboard/samsung/fs2410/lowlevel_init.S

将126行 #defineREFCNT???? 1113??? /* period=15.6us,HCLK=60Mhz,(2048+1-15.6*60) */

修改为#define REFCNT ??1268?? /*period=7.8125us,HCLK=100Mhz,(2048+1-7.8152*100) */

?

?

Step3:修改配置文件include/configs/fs2410.h

1)????????命令行提示符的修改:

修改:#define??? CONFIG_SYS_PROMPT??????? "SMDK2410 # "

改成:#define??? CONFIG_SYS_PROMPT??????? "fs2410 # "


2)???????添加uImage内核启动时候的TAG参数数支持

#define CONFIG_CMDLINE_TAG? 1? /*enable passing of ATAGs */

#define CONFIG_SETUP_MEMORY_TAGS1

#define CONFIG_INITRD_TAG?????? 1

#define CONFIG_ETH_TAG??????????? 1


3)????????网络参数设置

#defineCONFIG_ETHADDR???????????? 08:00:3e:26:0a:5b

#define CONFIG_NETMASK? ? ? ? ? ???255.255.255.0

#defineCONFIG_IPADDR? ? ? ? ? ???开发板IP

#defineCONFIG_SERVERIP? ? ? ? ? ??? Ubuntu IP


4)????????内核加载地址的修改

修改:#define ???? CONFIG_SYS_LOAD_ADDR??????????? 0x33000000

改成:#define ???? CONFIG_SYS_LOAD_ADDR? ? ? ? ? ???0x30008000


5)????????Nand功能添加

#defineCONFIG_CMD_NAND????????????????/*NAND support*/

?

#if defined(CONFIG_CMD_NAND)

#define CONFIG_SYS_MAX_NAND_DEVICE ???? 1

#define CONFIG_SYS_NAND_BASE ???? 0x4E000000

#define CONFIG_NAND_S3C2410

?

#define STACK_BASE ????? 0x33f00000

#define STACK_SIZE ?????? 0x8000

?

/* Nand Flash */

#define CONFIG_MTD_NAND_VERIFY_WRITE 1

#endif


6)????????同时支持nand启动和nor启动

#if defined(CONFIG_S3C2410)

#define CONFIG_S3C2410_NAND_BOOT??? 1???? //nand启动

#define CONFIG_S3C2410_NOR_BOOT????? 1???? //nor启动

#endif


7)????????环境变量保存位置

#ifdef ??? CONFIG_S3C2410_NOR_BOOT

#define???CONFIG_ENV_IS_IN_FLASH? 1/*common/env_flash.c */

#define CONFIG_ENV_ADDR?(CONFIG_SYS_FLASH_BASE + 0x30000)

#endif

#ifdef ??? CONFIG_S3C2410_NAND_BOOT

#define???CONFIG_ENV_IS_IN_NAND??? 1 /*common/env_nand.c */

#define CONFIG_ENV_SIZE????????? 0x10000

#define?? CONFIG_ENV_OFFSET?? 0x30000

#define NAND_CTL_BASE 0x4E000000

/* Offset */

#define oNFCONF ????? 0x00

#define oNFCMD ?????? 0x04

#define oNFADDR ???? 0x08

#define oNFDATA ????? 0x0c

#define oNFSTAT ?????? 0x10

#define oNFECC 0x14

#endif


8)????????USB功能的添加

#defineCONFIG_CMD_FAT????????????????/*FAT support*/

#defineCONFIG_CMD_USB????????????????/*USB support*/

#if defined(CONFIG_CMD_USB)

#define CONFIG_DOS_PARTITION

#define CONFIG_USB_OHCI

#define CONFIG_USB_STORAGE

#define CONFIG_SUPPORT_VFAT

#define LITTLEENDIAN

#endif


9)???????Ping命令的添加

#defineCONFIG_CMD_PING????????????????/*ping support*/


10)???? Nor flash(sst39vf1601)及Norflash相关内容的

注释掉

#defineCONFIG_AMD_LV400????????1????????/*uncomment this if you have a LV400 flash */

#define CONFIG_AMD_LV800????????1????????/*uncomment this if you have a LV800 flash */

?添加

#define CONFIG_SST_39VF1601 1

#ifdef CONFIG_SST_39VF1601

#definePHYS_FLASH_SIZE????????????????0x00200000/* 2M*/

#defineCONFIG_SYS_MAX_FLASH_SECT????????(512)????????/*max number of sectors on one chip */

#endif



Step4:添加Nand启动功能(修改cpu/arm920t/start.S)

u-boot默认情况下是nar启动,这里我们添加nand启动的内容:

1)????????添加头文件

#include <version.h>

#include <status_led.h>


2)????????添加nand启动标志位

/*add for env_nand.c*/

.extern? pbootflag

@pbootflag:????????????????//1:NORflash,0:NAND flash


3)????????添加BWSCON寄存器的定义

#?if?defined(CONFIG_S3C2400)

#??define?pWTCON????????????????0x15300000

#??define?INTMSK????????????????0x14400008????????/*?Interupt-Controller?base?addresses?*/

#??define?CLKDIVN????????0x14800014????????/*?clock?divisor?register?*/

#else

#??define?pWTCON????????????????0x53000000

#??define?INTMSK????????????????0x4A000008????????/*?Interupt-Controller?base?addresses?*/

#??define?INTSUBMSK????????0x4A00001C

#??define?CLKDIVN????????0x4C000014????????/*?clock?divisor?register?*/

#??define?BWSCON????????0x48000000????????

#?endif


4)????????添加启动模式判断Nor启动还是nand启动

ldrr0,=BWSCON

ldrr0,[r0]

andsr0,r0,#6

beqnand_boot

?

#ifndef?CONFIG_SKIP_RELOCATE_UBOOT

relocate:????????????????????????????????/*?relocate?U-Boot?to?RAM????????????*/

adr????????r0,?_start????????????????/*?r0?<-?current?position?of?code???*/

ldr????????r1,?_TEXT_BASE????????????????/*?test?if?we?run?from?flash?or?RAM?*/

cmp?????r0,?r1??????????????????/*?don't?reloc?during?debug?????????*/

beq?????stack_setup

?

copy_loop:

ldmia????????r0!,?{r3-r10}????????????????/*?copy?from?source?address?[r0]????*/

stmia????????r1!,?{r3-r10}????????????????/*?copy?to???target?address?[r1]????*/

cmp????????r0,?r2????????????????????????/*?until?source?end?addreee?[r2]????*/

ble????????copy_loop

#endif????????/*CONFIG_SKIP_RELOCATE_UBOOT */

bl stack_setup


5)????????添加NAND启动自搬移代码(在上一步代码下添加)

nand_boot:

#ifdef CONFIG_S3C2410_NAND_BOOT

@ reset NAND

? mov r1,#NAND_CTL_BASE

? ldr r2,=0xf830 @ initial value

?str r2,[r1,#oNFCONF]

?ldr r2,#oNFCONF]

?bic r2,r2,#0x800 @ enable chip

?str r2,#oNFCONF]

?mov r2,#0xff @ RESET command

?strb r2,#oNFCMD]

??

?mov r3,#0 @ wait

nand1:

?add r3,r3,#0x1

?cmp r3,#0xa

?blt nand1

?

nand2:

?ldr r2,#oNFSTAT] @ wait ready

?tst r2,#0x1

?beq nand2

?

?ldr r2,#oNFCONF]

?orr r2,#0x800 @ disable chip

?str r2,#oNFCONF]

?

@ get read to call C functions (for nand_read())

? ldr sp,DW_STACK_START @ setup stack pointer

? mov fp,#0 @ noprevious frame,so fp=0

?

@ copy U-Boot to RAM

? ldr r0,=TEXT_BASE

? mov r1,#0x0

?mov r2,#0x30000

?bl nand_read_ll

? tst r0,#0x0

? beq ok_nand_read

?

bad_nand_read:

loop2: b loop2 @ infinite loop

??

ok_nand_read:

?????? ldr?r0,=pbootflag

?????? movr1,#0x0

?????? str? r1,[r0]

@ verify

?mov r0,#0

?ldr r1,=TEXT_BASE

?mov r2,#0x400 @ 4 bytes * 1024 = 4K-bytes

go_next:

?ldr r3,[r0],#4

??ldr r4,[r1],#4

?teq r3,r4

?bne notmatch

?subs r2,#4

?beq stack_setup

? bne go_next

?

notmatch:

loop3: b loop3 @ infinite loop

#endif @ CONFIG_S3C2410_NAND_BOOT

?

6)???????在_start_armboot: .word start_armboot下添加如下代码:

.align 2

DW_STACK_START: .word STACK_BASE +STACK_SIZE – 4

?

?

Step5:添加nand_read.c为nand启动做支持

在board/samsung/fs2410下添加文件nand_read.c并在这个文件中添加如下内容:

#include <config.h>

?

#define __REGb(x) (*(volatile unsigned char *)(x))

#define __REGi(x) (*(volatile unsigned int *)(x))

#define NF_BASE 0x4e000000

?

# if defined(CONFIG_S3C2410)?

#define NFCONF __REGi(NF_BASE + 0x0)

#define NFCMD __REGb(NF_BASE + 0x4)

#define NFADDR __REGb(NF_BASE + 0x8)

#define NFDATA __REGb(NF_BASE + 0xc)

#define NFSTAT __REGb(NF_BASE + 0x10)

#define BUSY 1

?

#define NAND_SECTOR_SIZE 512

?

#define NAND_BLOCK_MASK (NAND_SECTOR_SIZE – 1)

?

inline void wait_idle(void) {

??? int i;

??? while(!(NFSTAT& BUSY))

????? for(i=0;i<10; i++);

}

/* low level nand read function */

int

nand_read_ll(unsigned char *buf,unsigned long start_addr,int size)

{

??? int i,j;

??? if ((start_addr& NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK)) {

??????? return -1; /*invalid alignment */

??? }

??? /* chip Enable */

??? NFCONF &=~0x800;

??? for(i=0; i<10;i++);

??? for(i=start_addr;i < (start_addr + size);) {

????? /* READ0 */

????? NFCMD = 0;

????? /* Write Address*/

????? NFADDR = i &0xff;

????? NFADDR = (i >> 9) & 0xff;

?????NFADDR = (i >> 17) & 0xff;

?????NFADDR = (i >> 25) & 0xff;

????? wait_idle();

????? for(j=0; j <NAND_SECTOR_SIZE; j++,i++) {

?*buf = (NFDATA &0xff);

?buf++;

????? }

??? }

??? /* chip Disable */

??? NFCONF |= 0x800;/* chip disable */

??? return 0;

}

# endif


并修改board/Samsung/fs2410/ 下Makefile

修改:COBJS????????:=fs2410.o flash.o

改成:COBJS????????:=fs2410.o flash.o nand_read.o



Step6:修改board/samsung/fs2410/flash.c支持sst19lv1601 NOR flash芯片

?

修改:#define MAIN_SECT_SIZE0x10000?? /*64KB*/

改成:#define MAIN_SECT_SIZE 0x1000?? /*4KB forsst39lv1601*/

?

修改:#defineCMD_UNLOCK_BYPASS????????0x00000020

改成:#defineCMD_UNLOCK_BYPASS????????0x000000A0

?

修改:#defineMEM_FLASH_ADDR1????????????????(*(volatileu16 *)(CONFIG_SYS_FLASH_BASE + (0x00000555 << 1)))

#defineMEM_FLASH_ADDR2????????????????(*(volatileu16 *)(CONFIG_SYS_FLASH_BASE + (0x000002AA << 1)))

改成:#defineMEM_FLASH_ADDR1????????????????(*(volatileu16 *)(CONFIG_SYS_FLASH_BASE + (0x00005555<< 1)))

#defineMEM_FLASH_ADDR2????????????????(*(volatileu16 *)(CONFIG_SYS_FLASH_BASE + (0x00002AAA << 1)))

?

#elif defined(CONFIG_AMD_LV800)

?????????????????????????(AMD_MANUFACT& FLASH_VENDMASK) |

?????????????????????????(AMD_ID_LV800B& FLASH_TYPEMASK);

下添加

#elif defined(CONFIG_SST_39VF1601)

????????????????????????(SST_MANUFACT& FLASH_VENDMASK) |

????????????????????????(SST_ID_xF1601& FLASH_TYPEMASK);

??

修改

for (j = 0; j <flash_info[i].sector_count; j++) {

????????if(j <= 3) {

????????????????/*1st one is 16 KB */

????????????????if(j == 0) {

????????????????????????flash_info[i].start[j]= flashbase + 0;

????????????????????????}

????????????????????????????????/*2nd and 3rd are both 8 KB */

????????????????????????if((j == 1) || (j == 2)) {

????????????????????????????????flash_info[i].start[j]=

???????????????????????????????flashbase+ 0x4000 + (j -1) *?0x2000;

????????????????????????}

????????????????????????????????/*4th 32 KB */

????????????????????????if(j == 3) {

????????????????????????????????flash_info[i].start[j]=

????????????????????????????????????????flashbase+ 0x8000;

????????????????????????}

????????????????}else {

????????????????????????flash_info[i].start[j]=

????????????????????????????????flashbase+ (j - 3)*MAIN_SECT_SIZE;

????????????????????????}

????????}

?

替换为

for (j = 0; j < flash_info[i].sector_count; j++) {

????????flash_info[i].start[j]=

????????????????flashbase+ j*MAIN_SECT_SIZE;

}

??

case (AMD_MANUFACT &FLASH_VENDMASK):

?????????????????printf("AMD: ");

?????????????????break;

下添加

case (SST_MANUFACT & FLASH_VENDMASK):

????????????????printf("SST: ");

????????????????break;

?

case (AMD_ID_LV800B &FLASH_TYPEMASK):

????????????????printf("1x Amd29LV800BB (8Mbit)n");

?????????????????break;

下添加

case ( SST_ID_xF1601 & FLASH_TYPEMASK):

????????????????printf("1x 39VF1601n");

????????????????break;

?

修改

if ((info->flash_id &FLASH_VENDMASK) !=

??? (AMD_MANUFACT & FLASH_VENDMASK)) {

returnERR_UNKNOWN_FLASH_VENDOR;

}

if ((info->flash_id & FLASH_VENDMASK) !=

??? (SST_MANUFACT& FLASH_VENDMASK)) {

return ERR_UNKNOWN_FLASH_VENDOR;

}

?

注释掉下面语句

if (!chip

? && (result & 0xFFFF) &BIT_PROGRAM_ERROR)

????????chip= ERR;

?

注释掉

*addr = CMD_PROGRAM;

?

?

Step7:修改common/env_flash.c,为nor flash保存环境变量做准备

修改:char * env_name_spec ="Flash";

改成:char* nor_env_name_spec = "Flash";

?

修改:env_t *env_ptr = (env_t*)(&environment[0]);

改成:extern env_t *env_ptr = (env_t*)(&environment[0]);

?

修改:env_t*env_ptr = (env_t *)CONFIG_ENV_ADDR;

改成:externenv_t *env_ptr ;

?

添加:extern ucharenv_get_char_spec (int index);

?

并注释掉下面语句

ucharenv_get_char_spec (int index)

{

return ( *((uchar*)(gd->env_addr + index)) );

}

?

修改:int env_init(void)

改成:int nor_env_init(void) ? ? (2处) ?

?

修改:int saveenv(void)

改成:int?nor_saveenv(void)?? ? (2处

?

修改:void env_relocate_spec (void)

改成:void nor_env_relocate_spec (void)

?

Step8:修改common/env_nand.c添加norflash环境变量烧写功能

添加

volatile int?pbootflag=1; //add by lht??1->nor? 0->nand

extern int?nor_env_init(void);

?

修改int env_init(void)函数在函数开始添加如下内容:

?if(pbootflag==1)

{

????????????????env_name_spec= "NOR";

????????????????env_ptr=(env_t *)CONFIG_ENV_ADDR;

????????????????returnnor_env_init();

????????}

???????

修改int? saveenv(void)函数,在函数开始添加如下内容?? ? (2处

????????if(pbootflag==1)

????????{

????????????????env_name_spec= "NOR";

????????????????returnnor_saveenv();

??}

修改voidenv_relocate_spec (void)函数,在函数开始添加如下内容?? ? (2处

?if(pbootflag==1)

?{

?????????returnnor_env_relocate_spec();

?}

???

Step9:链接文件的修改(cpu/arm920t/u-boot.lds

在cpu/arm920t/start.o?? (.text)

下添加

board/samsung/fs2410/lowlevel_init.o?????? (.text)

board/samsung/fs2410/nand_read.o?? (.text)


Step10:go命令的优化(修改common/cmd_boot.c

int do_go (cmd_tbl_t *cmdtp,int flag,int argc,char *argv[])

{

ulong????????addr,rc;

int???? rcode = 0;

?

/****add 2011-10-08**************************************/

char *commandline = getenv("bootargs");

struct param_struct *tag_params=(struct param_struct *)0x30000100;

?

printf("setup linux parameters at 0x30000100n");

memset(tag_params s,sizeof(struct param_struct));

tag_params ->u1.s.page_size=4096;

tag_params ->u1.s.nr_pages=0x4000000>>12;

memcpy(tag_params->commandline,commandline,strlen(commandline)+1);

printf("linux command line is:"%s"n",commandline);

?

/***************************************************************/????????

if (argc < 2) {

cmd_usage(cmdtp);

return 1;

}

?

addr = simple_strtoul(argv[1],NULL,16);

?

printf ("## Startingapplication at 0x%08lX ...n",addr);

?

/*

?* pass address parameter as argv[0] (akacommand name),

?* and all remaining args

?*/

/********************* add 2011-10-08 by wgx *********************/

__asm__(

"mov r1,#193n"

"mov????????ip,#0n"

"mcr????????p15,ip,c13,c0,0n"????????/*zero PID */

"mcr????????p15,c7,0n"????????/*invalidate I,D caches */

"mcr????????p15,c10,4n"????????/*drain write buffer */

"mcr????????p15,c8,D TLBs */

"mrc????????p15,c1,0n"????????/* getcontrol register */

"bic????????ip,#0x0001n"????????????????/*disable MMU */

"mov pc,%0n"

"nopn"

:

:"r"(addr)

);

/***************************************************************/

?

rc = do_go_exec ((void *)addr,argc - 1,argv + 1);

if (rc != 0) rcode = 1;

?

printf ("## Applicationterminated,rc = 0x%lXn",rc);

return rcode;

}


重新编译

$ make distclean

$ make fs2410_config

$ make

大功告成,现在就可以获得一个我们能够使用的u-boot了

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读