没有合适的资源?快使用搜索试试~ 我知道了~
U-Boot详细移植过程 配合文档https://ce123.blog.csdn.net/article/details/104141326看
资源推荐
资源详情
资源评论























硬件配置.............................................................................................................................1
下载源码.............................................................................................................................1
编译测试.............................................................................................................................1
增加对 S3C2440 的支持....................................................................................................2
配置 Nor Flash..................................................................................................................10
增加 Nand Flash 读写驱动...............................................................................................11
支持网卡 CS8900.............................................................................................................17
支持 NAND Flash 启动....................................................................................................17
引导 Linux 内核...............................................................................................................25
支持 Yaff2 文件系统........................................................................................................27
硬件配置
下载源码
http://ftp.denx.de/pub/u-boot/
编译测试
建立自己的目标板系统,并测试编译
1、解压源码包
root@czu:~# tar jxvf /root/桌面/u-boot-1.1.6.tar.bz2
解压后在/root 目录下生成 u-boot-1.1.6 目录
硬件 描述
CPU S3C2440A
Nor Flash 2M SST39VF1601
存储器 SDRAM 64M HY57V561620×2
Nand Flash 256M K9F2G08R0A
网卡 CS8900A
串口/JTAG 口 3 个 RS-485 口/1 个
晶振 12MHz 内部锁相环倍频 CPU 主频 120MHz

2、建立自己的目标板
进入 u-boot-1.1.6 目录。
? 将 board/smdk2410 目录复制为 czu2440 目录
cp -rf board/smdk2410/ board/czu2440
修改 smdk2410.c 为czu2440.c
mv board/czu2440/smdk2410.c board/czu2440/czu2440.c
? 修改 Makefile 文件中 28 行的 COBJS 改为:
COBJS := czu2440.o flash.o
建立目标板配置文件:进入 include/configs 目录下, 将 smdk2410.h 复制为
czu2440.h
cp include/configs/smdk2410.h include/configs/czu2440.h
修改顶层(u-boot-1.1.6 目录)Makefile 文件 1881 行,增加:
czu2440_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t czu2440 NULL s3c24x0
各项的意思如下:
arm: CPU 的架构(ARCH)
arm920t: CPU 的类型(CPU),其对应于 cpu/arm920t 子目录。
czu2440: 开发板的型号(BOARD),对应于 board/czu2440 目录。
NULL: 开发者/或经销商(vender)。(此处没加 vender,为 NULL。)
s3c24x0: 片上系统(SOC)。
配置交叉编译器:修改顶层(u-boot-1.1.6 目录)Makefile 文件 128 行,修改:
CROSS_COMPILE = arm-linux-
使用 arm-linux-gcc –v 命令查看交叉编译器的版本是否是 3.4.1。
3、编译测试
进入 u-boot-1.1.6 目录
#make mrproper //(或#make distclean 修改顶层Makefile 等相关文件必须执行此步
骤)
#make czu2440_config
#make all
如果没有错误,则会生成u-boot.bin 文件。
至此,自己的目标板已经建立,下面要做的是修改一些配置,增加一些驱动。
增加对 S3C2440 的支持
加入 S3C2440 相关代码,使得 u-boot 可以在 s3c2440 上正常工作
1、修改SDRAM 配置
进入 board/czu2440目录修改lowlevel_init.S 文件54 行如下:
#define B1_BWSCON (DW16)
#define B2_BWSCON (DW16)
#define B3_BWSCON (DW16 + WAIT + UBLB)
#define B4_BWSCON (DW16)
#define B5_BWSCON (DW8)

#define B6_BWSCON (DW32)
#define B7_BWSCON (DW32)
修改 lowlevel_init.S 文件126 行如下:
#define REFCNT 0x4f4
/*period=7.8125us,HCLK=100Mhz,(2048+1-7.8125*100)=0x4F4 */
//1113 /* period=15.6us, HCLK=60Mhz, (2048+1-15.6*60) */
2、时钟设置
S3c2440 的时钟计算公式和s3c2410 不一样,对于s3c2440 开发板,将PCLK 设
为400Mhz,分频比为FCLK:HCLK:PCLK=1:4:8。
首先屏蔽原来 s3c2410 的时钟设置,修改cpu/arm920t/目录下start.S 文件148
行如
下:
#if 0
/* FCLK:HCLK:PCLK = 1:2:4 */
/* default FCLK is 120 MHz ! */
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
#endif
修改 cpu/arm920t/start.S 文件时
在屏蔽原来的时钟后将stack_setup 子程序搬到relocate 子程序之前(这步别忘了),
并
在stack_setup 子程序后加一条跳转指令调用到clock_init 子函数,进行时钟初始
化:
增加跳转指令:
/* Set up the stack */
stack_setup:
ldr r0, _TEXT_BASE /* upper 128 KiB: relocated uboot */
sub r0, r0, #CFG_MALLOC_LEN /* malloc area */
sub r0, r0, #CFG_GBL_DATA_SIZE /* bdinfo */
#ifdef CONFIG_USE_IRQ
sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
#endif
sub sp, r0, #12 /* leave 3 words for abort-stack */
bl clock_init
#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 clear_bss

ldr r2, _armboot_start
ldr r3, _bss_start
sub r2, r3, r2 /* r2 <- size of armboot */
为什么这么换呢?可能是因为所调用的clock_init 函数需要用到堆栈。
编写 clock_init 函数
在 board/czu2440 目录下建议一个名为boot_init.c 的文件,编写colck_init 函数,
同时
加上一些声明和延时子函数,如下:
#include <common.h>
#include <s3c2410.h>
static inline void delay (unsigned long loops)
{
__asm__ volatile ("1:\n"
"subs %0, %1, #1\n"
"bne 1b":"=r" (loops):"0" (loops));
}
/* S3C2440: Mpll = (2*m * Fin) / (p * 2^s), UPLL = (m * Fin) / (p * 2^s)
* m = M (the value for divider M)+ 8, p = P (the value for divider P) + 2
*/
#define S3C2440_MPLL_400MHZ ((0x5c<<12)|(0x01<<4)|(0x01))
#define S3C2440_MPLL_200MHZ ((0x5c<<12)|(0x01<<4)|(0x02))
#define S3C2440_MPLL_100MHZ ((0x5c<<12)|(0x01<<4)|(0x03))
#define S3C2440_UPLL_96MHZ ((0x38<<12)|(0x02<<4)|(0x01))
#define S3C2440_UPLL_48MHZ ((0x38<<12)|(0x02<<4)|(0x02))
#define S3C2440_CLKDIV (0x05) // | (1<<3)) /* FCLK:HCLK:PCLK =
1:4:8, UCLK = UPLL/2 */
#define S3C2440_CLKDIV188 0x04 /* FCLK:HCLK:PCLK = 1:8:8 */
#define S3C2440_CAMDIVN188 ((0<<8)|(1<<9)) /* FCLK:HCLK:PCLK = 1:8:8
*/
/* Fin = 16.9344MHz */
#define S3C2440_MPLL_399MHz ((0x6e<<12)|(0x03<<4)|(0x01))
#define S3C2440_UPLL_48MHZ_Fin16MHz ((60<<12)|(4<<4)|(2))
void clock_init(void)
{
S3C24X0_CLOCK_POWER *clk_power = (S3C24X0_CLOCK_POWER
*)0x4C000000;

/* FCLK:HCLK:PCLK = 1:4:8 */
clk_power->CLKDIVN = S3C2440_CLKDIV;
/* change to asynchronous bus mod */
__asm__( "mrc p15, 0, r1, c1, c0, 0\n" /* read ctrl register */
"orr r1, r1, #0xc0000000\n" /* Asynchronous */
"mcr p15, 0, r1, c1, c0, 0\n" /* write ctrl register */
:::"r1"
);
/* to reduce PLL lock time, adjust the LOCKTIME register */
clk_power->LOCKTIME = 0xFFFFFFFF;
/* configure UPLL */
clk_power->UPLLCON = S3C2440_UPLL_48MHZ;
/* some delay between MPLL and UPLL */
delay (4000);
/* configure MPLL */
clk_power->MPLLCON = S3C2440_MPLL_400MHZ;
/* some delay between MPLL and UPLL */
delay (8000);
}
然后修改 board/czu2440/czu2440.c 文件中的board_init 函数,修改如下:
int board_init (void)
{
S3C24X0_CLOCK_POWER * const clk_power =
S3C24X0_GetBase_CLOCK_POWER();
S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO();
/* to reduce PLL lock time, adjust the LOCKTIME register */
clk_power->LOCKTIME = 0xFFFFFF;
/* configure MPLL */
clk_power->MPLLCON = ((M_MDIV << 12) + (M_PDIV << 4) + M_SDIV);
/* some delay between MPLL and UPLL */
delay (4000);
/* configure UPLL */
剩余32页未读,继续阅读
资源评论


求佛_ce123
- 粉丝: 4176
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 无线网络解决方案投标.doc
- (完整版)北京交通大学软件工程(完整ppt教程).ppt
- 项目管理过程之计划和预算模式.doc
- 电子商务网站实训报告.doc
- 项目管理及实施方案.doc
- 基于方程的COMSOL气泡空化模型及其在多领域中的应用研究
- 金算盘软件操作手册分公司金算盘操作手册.doc
- 网络协议分析实验报告.doc
- PLC课设水塔水位PLC自动控制系统.doc
- 软件需求评审报告.doc
- 电气控制与PLC应用教案及讲稿10.docx
- 电气工程及其自动化专业外文文献英文文献外文翻译方面.doc
- 智能家居控制系统课程设计样本.doc
- 数据库课程设计高校工资管理系统.doc
- 基于51单片机的时钟电路设计.doc
- 漫画中国式项目管理-项目团队沟通篇一.pdf
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制
