3、移植UBOOT之新建单板-时钟-SDRAM-串口
文章目录
- 1、新建一个单板
- 将2410的单板文件夹拷贝成2440
- 将2410的头文件拷贝成2440
- 2、修改boards.cfg使uboot支持2440单板
- 3、修改uboot系统时钟
- 4、烧写SDRAM寄存器
- 5、设置UART解决乱码
- arch\arm\cpu\arm920t\s3c24x0\speed.c下的get_HCLK ()函数
- 编译测试
- 去掉s3c2410_nand.c文件,不让编译器编译
- 1、直接进入`s3c2410_nand.c`的目录,打开drivers/mtd/nand/Makefile:
- 2、搜索`CONFIG_NAND_S3C2410`宏,位于`include/configs/smdk2440.h`:
- 3、屏蔽`include/configs/smdk2440.h`下的`CONFIG_CMD_NAND`宏定义
- 4、重新编译测试
上一节:2、移植UBOOT之启动过程分析
下一节:4、移植UBOOT之支持nand启动
1、新建一个单板
将2410的单板文件夹拷贝成2440
cd board/samsung/
cp smdk2410 smdk2440 -rf
然后将smdk2440下的smdk2410.c
改为smdk2440.c
。
然后将smdk2440
下的Makefile
中COBJS := smdk2410.o
改为COBJS := smdk2440.o
将2410的头文件拷贝成2440
cd ../../include/configs/
cp smdk2410.h smdk2440.h
2、修改boards.cfg使uboot支持2440单板
cd ../..
sudo vim boards.cfg
仿照:smdk2410 arm arm920t - samsung s3c24x0
添加:smdk2440 arm arm920t - samsung s3c24x0
添加后,就能够使用make smdk2440_config
命令。
(该命令便会调用include/configs/smdk2440.h
和board/samsung/smdk2440
里的文件来配置uboot)
配置命令如下:
make smdk2440_config
make
同样的,在windows下把u-boot-2012.04.01.tar_2\u-boot-2012.04.01\board\samsung
下的smdk2410
拷贝成smdk2440
,把u-boot-2012.04.01.tar_2\u-boot-2012.04.01\include\configs smdk2410.h
复制为smdk2440.h
。在source insight中添加2440相关的文件,去掉2410部分。
3、修改uboot系统时钟
在start.S里,uboot只设置了CLKDIVN
寄存器,而2440的系统时钟需要设置两个寄存器:MPLLDIVN
(设置FCLK频率)、CLKDIVN
(设置分频比例),且还要设为异步模式。
本来是在下面设置时钟:
cpu_init_critboard_init_finit_sequence//在lowlevel_init.S 里,本来在这里设置时钟,现在改为在start.S里设置时钟int board_early_init_f(void)
修改在start.S里设置时钟
/* FCLK:HCLK:PCLK = 1:2:4 *//* default FCLK is 120 MHz ! *//* zdy。。。。。。。。。。。。。ldr r0, =CLKDIVNmov r1, #3str r1, [r0]*//* 2. 设置时钟 */ldr r0, =0x4c000014//mov r1, #0x03; // FCLK:HCLK:PCLK=1:2:4, HDIVN=1,PDIVN=1mov r1, #0x05; // FCLK:HCLK:PCLK=1:4:8str r1, [r0]/* 如果HDIVN非0,CPU的总线模式应该从“fast bus mode”变为“asynchronous bus mode” */mrc p15, 0, r1, c1, c0, 0 /* 读出控制寄存器 */ orr r1, r1, #0xc0000000 /* 设置为“asynchronous bus mode” */mcr p15, 0, r1, c1, c0, 0 /* 写入控制寄存器 */#define S3C2440_MPLL_400MHZ ((0x5c<<12)|(0x01<<4)|(0x01))/* MPLLCON = S3C2440_MPLL_200MHZ */ldr r0, =0x4c000004ldr r1, =S3C2440_MPLL_400MHZstr r1, [r0]/* 启动ICACHE */mrc p15, 0, r0, c1, c0, 0 @ read control regorr r0, r0, #(1<<12)mcr p15, 0, r0, c1, c0, 0 @ write it back
。。。
。。。
并修改board\samsung\smdk2440\Smdk2440.c
里的board_early_init_f()
函数,屏蔽对MPLLDIVN
, LOCKTIME
寄存器的设置(该函数被start.S->board_init_f()
调用,这些寄存器在前面已被设置)
4、烧写SDRAM寄存器
编译出来的uboot非常大,可以先烧写主光盘里的u-boot.bin到nor,然后用这个uboot来烧写新的uboot
oflash 0 1 1 0 0 .\u-boot.bin
把服务器上的u-boot.bin传回pc上;
usb 1 30000000,再使用dnw下载u-boot.bin
protect off all :去除nor flash 的写保护
erase 0 7FFFF :0(开始地址)7FFFF(结束地址)共512k
cp.b 30000000 0 80000 :把程序烧写到0地址,烧写大小为0x80000
打开OpenJTAG,连接:
在Open On-Chip Debugger界面:
reset halt
halt
mdw 0 读出:ea000013
mdw 4 读出:e59ff014
这两个位置就是u-boot.bin的二进制文件内容
开始一步一步运行:
step 0
step
发现这样看太慢了,生成dis发汇编文件:
arm-linux-objdump -D u-boot > u-boot.dis
查看u-boot.dis文件
在start.S
中调用完cpu_init_crit
之后就初始化完SDRAM
,在call_board_init_f
设置断点:
在反汇编文件中搜索:call_board_init_f
在98出打一个硬件断点:
bp 0x98 4 hw
resume
mdw 0x30000000 :读地址
读出:ea80ffff
mww 0x30000000 0x12345678 :写地址
mdw 0x30000000 :读地址
读出:1234ffff :只有一半正确
这就可以看出SDRAM的设置有问题,需要修改代码,接下来便修改bank寄存器,修改SDRAM内存:在lowlevel_init.S 里。
修改前:
。。。
。。。
SMRDATA:.word (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28)).word ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC)).word ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC)).word ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC)).word ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC)).word ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC)).word ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC)).word ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN)).word ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN)).word ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT).word 0x32.word 0x30.word 0x30
修改后:
。。。
。。。
SMRDATA:.long 0x22011110 //BWSCON.long 0x00000700 //BANKCON0.long 0x00000700 //BANKCON1.long 0x00000700 //BANKCON2.long 0x00000700 //BANKCON3 .long 0x00000700 //BANKCON4.long 0x00000700 //BANKCON5.long 0x00018005 //BANKCON6.long 0x00018005 //BANKCON7.long 0x008C04F4 // REFRESH.long 0x000000B1 //BANKSIZE.long 0x00000030 //MRSRB6.long 0x00000030 //MRSRB7
上传修改的
u-boot-2012.04.01\arch\arm\cpu\arm920t\ start.s
和
u-boot-2012.04.01\board\samsung\smdk2440\s3c2440.c
和
u-boot-2012.04.01\board\samsung\smdk2440\lowevel_init.S
到ubuntu重新编译。
再次编译:make
把u-boot.bin传会pc机,再次烧写:
编译出来的uboot非常大,可以先烧写主光盘里的u-boot.bin到nor,然后用这个uboot来烧写新的uboot
oflash 0 1 1 0 0 .\u-boot.bin
把服务器上的u-boot.bin传回pc上;
usb 1 30000000,再使用dnw下载u-boot.bin
protect off all :去除nor flash 的写保护
erase 0 7FFFF :0(开始地址)7FFFF(结束地址)共512k
cp.b 30000000 0 80000 :把程序烧写到0地址,烧写大小为0x80000
打开OpenJTAG,连接;
在Open On-Chip Debugger界面:
reset
halt
读写地址:成功
5、设置UART解决乱码
重新编译烧写uboot,发现串口已有数据,但是乱码:
arch\arm\cpu\arm920t\s3c24x0\speed.c下的get_HCLK ()函数
在start.S的
board_init_f //board.c (D:\linux Doc\u-boot-2012.04.01\arch\arm\lib)init_sequence //board.c (D:\linux Doc\u-boot-2012.04.01\arch\arm\lib)serial_init //serial_s3c24x0.c (D:\linux Doc\u-boot-2012.04.01\drivers\serial)serial_init_dev //serial_s3c24x0.c (D:\linux Doc\u-boot-2012.04.01\drivers\serial)_serial_setbrg //serial_s3c24x0.c (D:\linux Doc\u-boot-2012.04.01\drivers\serial)get_PCLK //speed.c (D:\linux Doc\u-boot-2012.04.01\arch\arm\cpu\arm920t\s3c24x0)get_HCLK //speed.c (D:\linux Doc\u-boot-2012.04.01\arch\arm\cpu\arm920t\s3c24x0)
由于我们没有配置CONFIG_S3C2440
宏,所以uboot获取HCLK时钟设置波特率时,用的是CONFIG_S3C2410
宏的方法,搜索CONFIG_S3C2410
宏,找到位于smdk2440.h
,然后将smdk2440.h
的CONFIG_S3C2410
宏 改为: CONFIG_S3C2440
宏
编译测试
make时,发现以下几个error:
进入drivers/mtd/nand/s3c2410_nand.c
的72行:
其中nand
是一个s3c2410_nand
结构体:
该结构体如下所示:
从上图可以看出,只有定义了CONFIG_S3C2410
宏,才能得到该结构体,而我们使用的是CONFIG_S3C2440
宏。且上面的s3c2410_nand
结构体和s3c2440_nand
结构体的差别也很大,修改s3c2410_nand.c
会很麻烦
去掉s3c2410_nand.c文件,不让编译器编译
1、直接进入s3c2410_nand.c
的目录,打开drivers/mtd/nand/Makefile:
如上图所示,需要去掉CONFIG_NAND_S3C2410
宏定义才行
2、搜索CONFIG_NAND_S3C2410
宏,位于include/configs/smdk2440.h
:
如上图所示,我们直接来屏蔽CONFIG_CMD_NAND
宏即可,因为该宏下的#ifdef,都是与2410相关的
3、屏蔽include/configs/smdk2440.h
下的CONFIG_CMD_NAND
宏定义
4、重新编译测试
上传到服务器,重新编译:make
把u-boot.bin传会pc机,再次烧写:
编译出来的uboot非常大,可以先烧写主光盘里的u-boot.bin到nor,然后用这个uboot来烧写新的uboot
oflash 0 1 1 0 0 .\u-boot.bin
把服务器上的u-boot.bin传回pc上;
usb 1 30000000,再使用dnw下载u-boot.bin
protect off all :去除nor flash 的写保护
erase 0 7FFFF :0(开始地址)7FFFF(结束地址)共512k
cp.b 30000000 0 80000 :把程序烧写到0地址,烧写大小为0x80000
发现无乱码了,表示nor
启动成功,其中Flash: *** failed ***
表示不支持nor flash
,因为我们只实现了重定位,并没有对nor
实现写擦除等命令。
上一节:2、移植UBOOT之启动过程分析
下一节:4、移植UBOOT之支持nand启动
3、移植UBOOT之新建单板-时钟-SDRAM-串口相关推荐
- S3C2440移植uboot之新建单板_时钟_SDRAM_串口
上一节S3C2440移植uboot之启动过程概述我们我们分析了uboot启动流程,这节将开始新建一块单板支持S3C2440. 文章目录 1.新建单板 1.1 将2410的单板文件夹拷贝成2440: 1 ...
- S3C2440移植uboot之编译烧写uboot
文章目录 移植环境 获取uboot 更新交叉编译工具 配置环境变量 移植Uboot其他文章链接: S3C2440移植uboot之新建单板_时钟_SDRAM_串口 S3C2440移植uboot之启动过程 ...
- 2.移植uboot-添加2440单板,并实现NOR、NAND启动
上章分析了uboot启动流程后,接下来便来配置新的单板,实现nor.nand启动 1.首先在uboot里新建单板2440 1.1将2410的单板文件夹拷贝成2440: cd board/samsung ...
- 移植u-boot v2018
本篇文章阐述移植 u-boot v2018.01 至 S5PV210 开发板上的主要流程和细节.市场上的S5PV210开发板,均是基于三星smdkv210公版平台山寨出来的.我使用的GEC210开发板 ...
- uboot和linux内核移植,Uboot与kernel移植总结
设置uimage入口:由于一个可执行的Image必须有一个入口点,并且只能有一个全局入口,通常这个入口放在ROM(Flash)的0x0地址,因此,必须通知编译器以使其知道这个入口,该工作可通过修改连接 ...
- 移植u-boot到stm32f407
上年刚从硬件跳槽为嵌软,没有任何一丝丝的防备,一入职.领导就交代了一特难任务-在stm32上移植linux,瞬间我就懵逼了~没办法硬着头发上,先搜集资料,一看还真是个艰难的任务,我之前跑的是ok641 ...
- 秉火stm32f429移植u-boot
秉火stm32f429移植u-boot 参考: <STM32F429i-Discovery 移植并成功跑起来u-boot 2016.05>作者:tcjy1000,链接: https://b ...
- JZ2440移植uboot
开发板:JZ2440V3 U-Boot版本:u-boot-2012.04.01 1.首先下载源码,上传到服务器,解压缩. tar -jxvf u-boot-2012.04.01.tar.bz2 2.新 ...
- uboot研读笔记 | 05 - 移植uboot 2012.04到JZ2440(支持Nand Flash读写)
项目开源地址:https://github.com/Mculover666/uboot-jz2440 0. 教程完整目录 00 - 嵌入式Linux系统中Bootloader的作用和基本运行原理 01 ...
最新文章
- 探索“老药新用”最短路径:亚马逊AI Lab开源大规模药物重定位知识图谱DRKG
- getRunningTask API
- 实战SSM_O2O商铺_11【商铺注册】Controller层的实现
- 【成都站参会指南】神策 2020 数据驱动用户大会,邀您面基!
- P1433 吃奶酪(状压dp)
- 复杂的c语言,c语言复杂数据类型
- 【转】mip-semi-fixed 走走又停停
- mongodb mysql 写_MySQL和MongoDB语句的写法对照
- java 平均分割list_Java 实现将List平均分成若干个集合
- MVC Code First中的惯例(约定)
- java案例代码4-数组的复制
- 怎样在计算机上注册dll文件,注册dll文件【搞定步骤】
- PHP:A mono-alphabetic cipher 单字母密码加解密算法(附完整源码)
- 解决MAC上网速度慢的原因
- python-web开发(一)知识储备准备
- 毕业设计说明书(论文)结构-系统设计方面
- wps表格宏被禁用如何解禁_(wps表格怎么设置宏)为什么每次打开excel文件都要提示启用或者禁用宏?...
- C# 发送邮件之QQ邮箱
- 智能路由器VS传统路由器:未来由谁主宰?
- 鼠标API函数(windows)
热门文章
- 金蝶云星空与飞书系统对接方案(飞书审批)
- uniapp h5地图导航
- leetcode21 合并两个有序链表
- ShapeAlias
- 词霸天下---词根227【-gress- = -grad- = -gred- = -gre(e)- 步,走】
- 洗牌一副n张牌,每一张牌都用字母顺序标记。
- 【有感】失去人性,失去很多;失去兽性,失去一切
- Quality-Estimation1 (翻译质量评价-复现 WMT2018 阿里论文结果)
- 计算机excel中行高在哪里,电脑Excel表格怎么对行高和列宽进行调整
- 机器学习(一)机器学习概述