文章目录

  • 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下的MakefileCOBJS := 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.hboard/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.hCONFIG_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-串口相关推荐

  1. S3C2440移植uboot之新建单板_时钟_SDRAM_串口

    上一节S3C2440移植uboot之启动过程概述我们我们分析了uboot启动流程,这节将开始新建一块单板支持S3C2440. 文章目录 1.新建单板 1.1 将2410的单板文件夹拷贝成2440: 1 ...

  2. S3C2440移植uboot之编译烧写uboot

    文章目录 移植环境 获取uboot 更新交叉编译工具 配置环境变量 移植Uboot其他文章链接: S3C2440移植uboot之新建单板_时钟_SDRAM_串口 S3C2440移植uboot之启动过程 ...

  3. 2.移植uboot-添加2440单板,并实现NOR、NAND启动

    上章分析了uboot启动流程后,接下来便来配置新的单板,实现nor.nand启动 1.首先在uboot里新建单板2440 1.1将2410的单板文件夹拷贝成2440: cd board/samsung ...

  4. 移植u-boot v2018

    本篇文章阐述移植 u-boot v2018.01 至 S5PV210 开发板上的主要流程和细节.市场上的S5PV210开发板,均是基于三星smdkv210公版平台山寨出来的.我使用的GEC210开发板 ...

  5. uboot和linux内核移植,Uboot与kernel移植总结

    设置uimage入口:由于一个可执行的Image必须有一个入口点,并且只能有一个全局入口,通常这个入口放在ROM(Flash)的0x0地址,因此,必须通知编译器以使其知道这个入口,该工作可通过修改连接 ...

  6. 移植u-boot到stm32f407

    上年刚从硬件跳槽为嵌软,没有任何一丝丝的防备,一入职.领导就交代了一特难任务-在stm32上移植linux,瞬间我就懵逼了~没办法硬着头发上,先搜集资料,一看还真是个艰难的任务,我之前跑的是ok641 ...

  7. 秉火stm32f429移植u-boot

    秉火stm32f429移植u-boot 参考: <STM32F429i-Discovery 移植并成功跑起来u-boot 2016.05>作者:tcjy1000,链接: https://b ...

  8. JZ2440移植uboot

    开发板:JZ2440V3 U-Boot版本:u-boot-2012.04.01 1.首先下载源码,上传到服务器,解压缩. tar -jxvf u-boot-2012.04.01.tar.bz2 2.新 ...

  9. uboot研读笔记 | 05 - 移植uboot 2012.04到JZ2440(支持Nand Flash读写)

    项目开源地址:https://github.com/Mculover666/uboot-jz2440 0. 教程完整目录 00 - 嵌入式Linux系统中Bootloader的作用和基本运行原理 01 ...

最新文章

  1. 探索“老药新用”最短路径:亚马逊AI Lab开源大规模药物重定位知识图谱DRKG
  2. getRunningTask API
  3. 实战SSM_O2O商铺_11【商铺注册】Controller层的实现
  4. 【成都站参会指南】神策 2020 数据驱动用户大会,邀您面基!
  5. P1433 吃奶酪(状压dp)
  6. 复杂的c语言,c语言复杂数据类型
  7. 【转】mip-semi-fixed 走走又停停
  8. mongodb mysql 写_MySQL和MongoDB语句的写法对照
  9. java 平均分割list_Java 实现将List平均分成若干个集合
  10. MVC Code First中的惯例(约定)
  11. java案例代码4-数组的复制
  12. 怎样在计算机上注册dll文件,注册dll文件【搞定步骤】
  13. PHP:A mono-alphabetic cipher 单字母密码加解密算法(附完整源码)
  14. 解决MAC上网速度慢的原因
  15. python-web开发(一)知识储备准备
  16. 毕业设计说明书(论文)结构-系统设计方面
  17. wps表格宏被禁用如何解禁_(wps表格怎么设置宏)为什么每次打开excel文件都要提示启用或者禁用宏?...
  18. C# 发送邮件之QQ邮箱
  19. 智能路由器VS传统路由器:未来由谁主宰?
  20. 鼠标API函数(windows)

热门文章

  1. 金蝶云星空与飞书系统对接方案(飞书审批)
  2. uniapp h5地图导航
  3. leetcode21 合并两个有序链表
  4. ShapeAlias
  5. 词霸天下---词根227【-gress- = -grad- = -gred- = -gre(e)- 步,走】
  6. 洗牌一副n张牌,每一张牌都用字母顺序标记。
  7. 【有感】失去人性,失去很多;失去兽性,失去一切
  8. Quality-Estimation1 (翻译质量评价-复现 WMT2018 阿里论文结果)
  9. 计算机excel中行高在哪里,电脑Excel表格怎么对行高和列宽进行调整
  10. 机器学习(一)机器学习概述