您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > Uboot移植到S3C2410
本次移植是将uboot-1.1.6移植到s3c2410开发板上一、创建开发板目录,修改相应的makefile及相关文件创建开发板目录board/s3c2410,找到相似的开发板board/smdk2410,将此目录中文件全部copy到s3c2410目录中。由于我的开发板用的flash是intel的E28F128J3A,所以要寻找这个flash的驱动。将board/cmi中的flash.c文件copy到s3c2410目录下,并改名为flash_e28_cmi.c。修改board/s3c2410/Makefile中的COBJS:=smdk2410.oflash.o为COBJS:=smdk2410.oflash_e28_cmi.o将include/configs/目录下的smdk2410.h在本目录中复制并改名为s3c2410.h。这个是开发板的配置头文件。修改顶层Makefile,在smdk2410_config:unconfig@$(MKCONFIG)$(@:_config=)armarm920tsmdk2410NULLs3c24x0下添加s3c2410_config:unconfig@$(MKCONFIG)$(@:_config=)armarm920ts3c2410NULLs3c24x0修改board/s3c2410/config.mk,将TEXT_BASE=0x33F80000改为TEXT_BASE=0x33E80000。这个为什么这样改,我还没弄清楚,只是我看到有移植好的定的就是这个值。有知道的希望留个言,在此先谢过。在这里说说TEXT_BESE这个变量在编译和链接时怎么传递的。在顶层目录下的config.mk中,有这么一行代码sinclude$(TOPDIR)/board/$(BOARDDIR)/config.mk先将上述变量所在的文件包含,然后有两个定义CPPFLAGS:=$(DBGFLAGS)$(OPTFLAGS)$(RELFLAGS)\-D__KERNEL__-DTEXT_BASE=$(TEXT_BASE)\CFLAGS:=$(CPPFLAGS)-Wall-Wstrict-prototypes这是在编译时用到的选项。这样在编译时通过-DTEXT_BASE=$(TEXT_BASE)定义,就把TEXT_BASE的值传递到各使用到该变量的源文件,如cpu/arm920t.S中就用到这个变量。还有一个变量的定义LDFLAGS+=-Bstatic-T$(LDSCRIPT)-Ttext$(TEXT_BASE)$(PLATFORM_LDFLAGS)这个是在链接时用的到选项,根据-Ttext选项的指示,链接脚本链接时就可以使用TEXT_BASE的值了。到此,开发板的一系列目录、文件及编译链接相关的事项都已完成,下面就是要修改相就文件的代码以及开发板配置头文件的配置选项,以适合我的开发板上的芯片特性。二、修改相关源文件主要有三个方面的文件要修改:1.我们用的flash是两片在一起,组成了32位寻址。而原来的代码是按16位寻址写的。所以关于flash一系列操作的代码要修改。这部分修改要保证能正确操作flash2.关于i2c设备eeprom的相关配置,主是要是设备地址以及设备内存地址的宽度等。同样,这里修改后要保证能正确读写eeprom3.关于网卡的设置,网络用了以后我们就可以用过网络从主机上下载相关代码。修改完后要能使用tftp工具进行下载。1)、flash由于我的开发板是两块e28F128J3Aflash组成32位寻址,所以与地址操作相关的数据都由原来的16位改为32位。首先修改flash相关的命令,在flash_e28_cmi.c中#defineFLASH_ID_MASK0xFFFF#defineFLASH_BLOCK_SIZE0x00010000#defineFLASH_CMD_READ_ID0x0090#defineFLASH_CMD_RESET0x00ff#defineFLASH_CMD_BLOCK_ERASE0x0020#defineFLASH_CMD_ERASE_CONFIRM0x00D0#defineFLASH_CMD_CLEAR_STATUS0x0050#defineFLASH_CMD_SUSPEND_ERASE0x00B0#defineFLASH_CMD_WRITE0x0040#defineFLASH_CMD_PROTECT0x0060#defineFLASH_CMD_PROTECT_SET0x0001#defineFLASH_CMD_PROTECT_CLEAR0x00D0#defineFLASH_STATUS_DONE0x0080这些相关的命令状态值等都是16位的,只能操作一片flash。所以要将其全部改为32位#defineFLASH_ID_MASK0xFFFFFFFF#defineFLASH_BLOCK_SIZE0x00040000#defineFLASH_CMD_READ_ID0x00900090#defineFLASH_CMD_RESET0x00ff00ff#defineFLASH_CMD_BLOCK_ERASE0x00200020#defineFLASH_CMD_ERASE_CONFIRM0x00D000D0#defineFLASH_CMD_CLEAR_STATUS0x00500050#defineFLASH_CMD_SUSPEND_ERASE0x00B000B0#defineFLASH_CMD_WRITE0x00400040#defineFLASH_CMD_PROTECT0x00600060#defineFLASH_CMD_PROTECT_SET0x00010001#defineFLASH_CMD_PROTECT_CLEAR0x00D000D0#defineFLASH_STATUS_DONE0x00800080在flash_init()函数中size_b0=flash_get_size((vu_short*)FLASH_BASE0_PRELIM,&flash_info[0]);这里是读取flash的大小,其传递的地址是vu_short型,只能读取一片flash的信息。所以做如下修改size_b0=flash_get_size((vu_long*)CFG_FLASH_BASE,&flash_info[0]);CFG_FLASH_BASE在s3c2410.h中定义。是flash的基地址还有flash_get_offsets(FLASH_BASE0_PRELIM,&flash_info[0]);改为flash_get_offsets(CFG_FLASH_BASE,&flash_info[0]);下面还要到flash_get_size()函数中进行修改staticulongflash_get_size(vu_short*addr,flash_info_t*info)改为staticulongflash_get_size(vu_long*addr,flash_info_t*info)vu_shortvalue;改为vu_longvalue;flash_get_size函数修改结束。擦除flash函数flash_erase()擦除比较简单,直接往每个sector的起始地址写擦除命令即可vu_short*addr=(vu_short*)(info-start[sect]);改为vu_long*addr=(vu_long*)(info-start[sect]);这里还要注意一个问题,下面被注释掉的两行是用来判断擦除单个sector是否超时的,它提供了一个擦除起始时间。但它确在下面的擦除循环之前,这样就是擦除所有sector的起始时间,而不是擦除单个sector的起始时间/*thenexttwolineswillleadtotimeingoutinthislocation.modifiedbyBoySKung08/11/14*///start=get_timer(0);//last=start;/*Starteraseonunprotectedsectors*/for(sect=s_first;sect=s_last;sect++){//这里是擦除循环if(info-protect[sect]==0){/*notprotected*///vu_short*addr=(vu_short*)(info-start[sect]);vu_long*addr=(vu_long*)(info-start[sect]);/*modifiedbyBoySKung08/11/05*/unsignedlongstatus;应该把这个起始时间放到循环里面start=get_timer(0);/*modifiedbyBoySKung08/11/14*/last=start;/*Disableinterruptswhichmightcauseatimeouthere*/flag=disable_interrupts();#ifdefDEBUGprintf(Erasesector%datstartaddr0x%08X,sect,(unsignedint)info-start[sect]);#endif*addr=FLASH_CMD_CLEAR_STATUS;*addr=FLASH_CMD_BLOCK_ERASE;*addr=FLASH_CMD_ERASE_CONFIRM;/*re-enableinterruptsifnecessary*/if(flag)enable_interrupts();/*waitatleast80us-let'swait1ms*/udelay(1000);while(((status=*addr)&FLASH_STATUS_DONE)!=FLASH_STATUS_DONE){在这里通过上面的起始时间获得当前时间,判断是否超时if((now=get_timer(start))CFG_FLASH_ERASE_TOUT){printf(Flasherasetimeoutataddress%lx\n,info-start[sect]);*addr=FLASH_CMD_SUSPEND_ERASE;*addr=FLASH_CMD_RESET;return1;}/*showthatwe'rewaiting*/if((now-last)1000){/*everysecond*/putc('.');last=now;}}*addr=FLASH_CMD_RESET;}写数据到flash中这里涉及到两个函数:write_buff();//写数据前进行一些调整write_word();//真正的往flash中写数据这里要修改的地方比较多,主要是数据长度和地址长度方面的凡是我修改的地方都有/*modifiedbyBoySKung08/11/05*/或/*addedbyBoySKung08/11/05*/这样的注释intwrite_buff(flash_info_t*info,uchar*src,ulongaddr,ulongcnt){ulongcp,wp;//ushortdata;ulongdata;/*modifiedbyBoySKung08/11/05*/inti,rc;intl;/*addedbyBoySKung08/11/05*/if(info-flash_id==FLASH_UNKNOWN){return4;}//wp=(addr&~1);/*getlowerwordalignedaddress*/wp=(addr&~3);/*modifiedbyBoySKung08/11/05*///现我们是32位操作,所以地址应4字节对齐/**handleunalignedstartbyte*//*if(addr-wp){data=0;data=(data8)|*src++;--cnt;if((rc=wr
本文标题:Uboot移植到S3C2410
链接地址:https://www.777doc.com/doc-440688 .html