移植u-boot-2012.04.01到jz2440开发板

今天我给大家分享一下如何移植一个纯净的uboot到jz2440开发大版,通过记录学习分享,与大家一起进步!!!

1.首先我们在uboot官网下载u-boot-2012.04.01.tar.bz2,建立source insight工程。将下载好的uboot通过FTP服务器传送到虚拟机中的linux系统下。
解压uboot:

tar xjf u-boot-2012.04.01.tar.bz2
cd u-boot-2012.04.01
make smdk2410_config
make

将得到的u-boot.bin文件下载到开发板(下载方式不唯一),连接至串口,发现没有输出。所以我们下载的uboot不支持我们的jz2440开发板,我们接下来应该通过修改uboot源码使它支持我们的开发板。

2.分析u-boot: 得知大概的启动过程如下:

-初始化硬件:关看门狗、设置时钟、设置SDRAM、初始化NAND FLASH
-如果bootloader较大,要把它重定位到SDRAM
-把内核从NAND FLASH 读到 SDRAM
-设置“设置要传给内核的参数”
-跳转要执行的内核

3.修改U-BOOT代码
3.1 建一个单板
cd board/samsung/
cp smdk2410 smdk2440 -rf
cd ../../include/configs/
cp smdk2410.h smdk2440.h

修改boards.cfg:
仿照:
smdk2410 arm arm920t - samsung s3c24x0
添加:
smdk2440 arm arm920t - samsung s3c24x0
重新编译烧写看结果:串口还是没有输出.
阅读代码发现不足:UBOOT里先以60MHZ的时钟计算参数来设置内存控制器,但是MPLL还未设置
处理措施:把MPLL的设置放到start.S里,取消board_early_init_f里对MPLL的设置
操作如下:
在uboot中的start.s中170行有代码如下:

    /* FCLK:HCLK:PCLK = 1:2:4 *//* default FCLK is 120 MHz ! */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

在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

将其删掉改为:

    .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

重新编译烧写看看什么情况:编译烧写成功,启动串口,输出打印乱码如下(至少有打印了,说明我们已经成功了第一步,哈哈哈):

这里写图片描述

3.1下面解决串口打印乱码问题:
查看串口波特率的设置,在arch\arm\lib中有函数board_init_f,其中有一个结构体init_sequence:

for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {if ((*init_fnc_ptr)() != 0) {hang ();

跳转到这个结构体:


init_fnc_t *init_sequence[] = {
#if defined(CONFIG_ARCH_CPU_INIT)arch_cpu_init,      /* basic arch cpu dependent setup */
#endif
#if defined(CONFIG_BOARD_EARLY_INIT_F)board_early_init_f,
#endif
#ifdef CONFIG_OF_CONTROLfdtdec_check_fdt,
#endiftimer_init,     /* initialize timer */
#ifdef CONFIG_FSL_ESDHCget_clocks,
#endifenv_init,       /* initialize environment */init_baudrate,      /* initialze baudrate settings */serial_init,        /* serial communications setup */console_init_f,     /* stage 1 init of console */display_banner,     /* say that we are here */
#if defined(CONFIG_DISPLAY_CPUINFO)print_cpuinfo,      /* display cpu info (and speed) */
#endif
#if defined(CONFIG_DISPLAY_BOARDINFO)checkboard,     /* display board info */
#endif
#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)init_func_i2c,
#endifdram_init,      /* configure available RAM banks */NULL,
};

里面是各种初始化,找到串口初始化:serial_init,跳转到这里:

int serial_init(void)
{return serial_init_dev(UART_NR);
}
#endif

然后跳转到这里:serial_init_dev

/* Initialise the serial port. The settings are always 8 data bits, no parity,* 1 stop bit, no start bits.*/
static int serial_init_dev(const int dev_index)
{struct s3c24x0_uart *uart = s3c24x0_get_base_uart(dev_index);#ifdef CONFIG_HWFLOWhwflow = 0; /* turned off by default */
#endif/* FIFO enable, Tx/Rx FIFO clear */writel(0x07, &uart->ufcon);writel(0x0, &uart->umcon);/* Normal,No parity,1 stop,8 bit */writel(0x3, &uart->ulcon);/** tx=level,rx=edge,disable timeout int.,enable rx error int.,* normal,interrupt or polling*/writel(0x245, &uart->ucon);#ifdef CONFIG_HWFLOWwritel(0x1, &uart->umcon);  /* rts up */
#endif/* FIXME: This is sooooooooooooooooooo ugly */
#if defined(CONFIG_ARCH_GTA02_v1) || defined(CONFIG_ARCH_GTA02_v2)/* we need auto hw flow control on the gsm and gps port */if (dev_index == 0 || dev_index == 1)writel(0x10, &uart->umcon);
#endif_serial_setbrg(dev_index);return (0);
}

然后跳转到这里:_serial_setbrg
void _serial_setbrg(const int dev_index)
{
struct s3c24x0_uart *uart = s3c24x0_get_base_uart(dev_index);
unsigned int reg = 0;
int i;

/* value is calculated so : (int)(PCLK/16./baudrate) -1 */
reg = get_PCLK() / (16 * gd->baudrate) - 1;writel(reg, &uart->ubrdiv);
for (i = 0; i < 100; i++)/* Delay */ ;

}
跳转到:get_PCLK

ulong get_PCLK(void)
{struct s3c24x0_clock_power *clk_power = s3c24x0_get_base_clock_power();return (readl(&clk_power->clkdivn) & 1) ? get_HCLK() / 2 : get_HCLK();
}

跳转到这里:get_HCLK

ulong get_HCLK(void)
{struct s3c24x0_clock_power *clk_power = s3c24x0_get_base_clock_power();
#ifdef CONFIG_S3C2440switch (readl(&clk_power->clkdivn) & 0x6) {default:case 0:return get_FCLK();case 2:return get_FCLK() / 2;case 4:return (readl(&clk_power->camdivn) & (1 << 9)) ?get_FCLK() / 8 : get_FCLK() / 4;case 6:return (readl(&clk_power->camdivn) & (1 << 8)) ?get_FCLK() / 6 : get_FCLK() / 3;}

我们会发现#ifdef CONFIG_S3C2440 这一句是黑色的,说明没有定义这个CONFIG_S3C2440,
处理措施:
在include/configs/smdk2440.h: 去掉CONFIG_S3C2410 ,换成CONFIG_S3C2440
#define CONFIG_S3C2440
定义好这个之后,重新编译,发现编译有错误如下:
这里写图片描述

错误显示有大量关于nand的错误,猜想原因应该是此uboot暂时不支持该单板,我决定先把nand去掉,先看看串口是否可以正常打印出不是乱码的消息,之后再加入nand的支持,要一步一步来嘛!我们把关于nand的编译选项去掉,查看/drivers/mtd/nand/Makefile,找到只一句:
COBJS-$(CONFIG_NAND_S3C2410) += s3c2410_nand.o
说明编译s3c2410_nand.c以来的定义是:CONFIG_NAND_S3C2410,在源码中搜索CONFIG_NAND_S3C2410,在smdk2440.h中找到:

#ifdef CONFIG_CMD_NAND
#define CONFIG_NAND_S3C2410
#define CONFIG_SYS_S3C2410_NAND_HWECC
#define CONFIG_SYS_MAX_NAND_DEVICE  1
#define CONFIG_SYS_NAND_BASE        0x4E000000
#endif

说明定义了CONFIG_CMD_NAND则CONFIG_NAND_S3C2410就被定义,我们只需要让CONFIG_CMD_NAND不被定义即可,搜索到如下:
#define CONFIG_CMD_NAND
将其改为:
//#define CONFIG_CMD_NAND
重新编译,没有出现错误,烧写测试串口输出为:
这里写图片描述

哈哈哈!!!!,串口终于输出而且不是乱码了,我们已经走出了第一步,接下来就是让它支持nand flash了,也不是容易的事情啊,已经写了这么多了,就放到下一篇 博客中吧!!!

想跟我一起交流学的加我
qq:1126137994
二维码:
这里写图片描述
微信:liu1126137994
二维码:
这里写图片描述
备注:交流学习哦
另外我这里有大量的学习资料,以及现成的项目的经验总结,欢迎叨扰!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/423363.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

温习了一下java线程状态方面的知识总结一

好长时间没有复习线程状态这块&#xff0c;读并发编程实战正好看着这块&#xff0c;顺便复习一下&#xff1a; 1.线程的五种状态&#xff1a; 2.线程五种状态的转换图&#xff1a; wait()会立刻释放synchronized(obj)中的锁以便其它线程可以执行obj.notify 但是notify() 不会立…

WinForm:进度条的实现(异步)

在WinForm中经常遇到一些费时的操作界面&#xff0c;比如统计某个磁盘分区的文件夹或者文件数目&#xff0c;如果分区很大或者文件过多的话&#xff0c;处理不好就会造成“假死”的情况&#xff0c;或者报“线程间操作无效”的异常&#xff0c;为了解决这个问题&#xff0c;可以…

移植u-boot-2012.04.01到jz2440开发板之修改代码支持NAND启动

上一篇文章我们已经修改了uboot源码使其能够正常打印输出了&#xff0c;但是输出停到了nand启动那里&#xff0c;所以这篇文章就来记录如何修改源码使uboot支持NAND启动。 原来的代码在链接时加了”-pie”选项, 使得u-boot.bin里多了”(.rel)”, “*(.dynsym)”使得程序非常大…

XMLHttpRequest() 请求 返回结果JSON 对象与JSON 字符串处理

好久没有看JavaWEB项目了突然拿起来&#xff0c;而且是原生的项目&#xff0c;中JSON 字符串的处理 json.stingfy() 将对象&#xff0c;数组转换为字符串&#xff0c;json.parse() 将字符串转成json 对象JSON.stringify&#xff08;数组或者对象&#xff09; JSON.parse(字符串…

【C++深度剖析教程4】C++的二阶构造模式

今天学习的是C中的二阶构造模式&#xff0c;二阶构造模式只是设计模式中的简单的模式&#xff0c;是一种软件设计的方法&#xff0c;并没有我们想象的那么高深&#xff0c;设计模式也是一样&#xff0c;只不过是一系列的设计方法&#xff0c;只要我们懂得了原理&#xff0c;那么…

获取应用程序根路径

public string GetRootURI(){string UrlAuthority Request.Url.GetLeftPart(UriPartial.Authority);if (Request.ApplicationPath null || Request.ApplicationPath "/"){//直接安装在Web站点return UrlAuthority;}else{//安装在虚拟子目录下return UrlAuthority …

JQuery 中选择多选择框,和单选框,实现获取相应选择的值

好久没有弄前端了&#xff0c;还是记一下&#xff1a;建议大家学习时&#xff0c;深入学习一样知识&#xff0c;可以涉猎很多 获取单选按钮的值&#xff1a; $(document).ready(function() { $.ajax({//url:base_url"/login/login.do",url:"url地址",type…

【C++深度剖析教程5】C++中类的静态成员函数

学习交流加&#xff08;可免费帮忙下载CSDN资源&#xff09;&#xff1a;个人微信&#xff1a; liu1126137994学习交流资源分享qq群1&#xff08;已满&#xff09;&#xff1a; 962535112学习交流资源分享qq群2&#xff08;已满&#xff09;&#xff1a; 780902027学习交流资源…

Lucene:基于Java的全文检索引擎简介

(转自http://hi.baidu.com/sz_xiaofeng/blog/item/7f3c33ed033444d1b31cb1b2.html)Lucene是一个基于Java的全文索引工具包。 基于Java的全文索引引擎Lucene简介&#xff1a;关于作者和Lucene的历史全文检索的实现&#xff1a;Luene全文索引和数据库索引的比较中文切分词机制简介…

eclipse 工程中使用引入maven项目遇到maven-resources-plugin:2.6 找不到

1.开始eclipse 配置本地库 首先是从maven 官网下载maven 组件 其次是配置 maven 环境和java 配置jdk 类似这里就不做介绍了 配置完环境后修改\apache-maven-3.3.9\conf\settings.xml 中的<localRepository> 设置本地仓库 然后配置eclipse 下面图中执行较为重要&#xff…

移植uboot之修改代码支持NorFlash记录

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 今天我们的任务是修改uboot源码支持NorFlash。 上两篇关于uboot移植的文章&#xff0c;我们修改了uboot源代码&#xff0c;支持了串口的输出&#xff…

保持一颗好学之心

保持一颗好学之心 初见这个题目&#xff0c;许多人可能会对自己相当满意&#xff1a;“我还是很好学的”。真的是这样吗&#xff1f;个人之见&#xff0c;有不少人其实并不像他们想象的那么好学&#xff0c;尤其是那些有了一定经验&#xff0c;在某些方面有些过人之处的“聪明”…

Vue.js 学习

后端和数据库角色&#xff0c;确参加了前端培训&#xff0c;哪就总结一下&#xff1a;后续继续更新 1.首先是vue.js 与jquery 的比较 vue.js 是采用数据和dom元素分类&#xff0c;采用的VMMV 模式 V view 视图 M Model 存放数据&#xff0c;VM 在M和V 主要是处理一些业务逻辑…

移植uboot之修改代码支持NorFlash记录续集

接着上一篇文章写的内容&#xff08;上一篇文章链接&#xff1a;移植uboot之修改代码支持NORFLASH&#xff09;&#xff0c;上一篇结尾测试flash的擦除读写功能&#xff0c;结果无法写flash&#xff0c;卡在了这里&#xff1a; 前面已经擦除成功&#xff0c;这里写内容写不进…

C#开发终端式短信的原理和方法

本文示例源代码或素材下载 简介 没发过短信的年轻人肯定是属于那种受保护的稀有动物&#xff0c;通讯发达的今天短信已经成为人们交流的重要手段&#xff0c;其中也蕴含着巨大的市场和经济利益&#xff0c;掌握短信技术的人才也受到各大公司的追捧是目前职场上耀眼的明星。本文…

移植uboot之修改代码支持NorFlash记录续集二

先说一个事&#xff1a;我会在最后把移植好的uboot&#xff0c;内核&#xff0c;分别做一个补丁文件&#xff0c;以后如果用到相同的uboot以及内核都可以直接下载我这个补丁进行打补丁操作就可以直接用~ 上一个移植uboot续集&#xff0c;我们解决了无法写flash的问题&#xff…

Mysql function(函数)

1.mysql 拼接函数 1. 1CONCAT(string1,string2,…) 说明 : string1,string2代表字符串,concat函数在连接字符串的时候&#xff0c;只要其中一个是NULL,那么将返回NULL 1.2 CONCAT_WS(separator,str1,str2,...)说明 : string1,string2代表字符串,concat_ws 代表 conca…

【C++深度剖析教程6】C++之友元

这几天在复习数学考试&#xff0c;都没有学C&#xff0c;今天抽空来学一点。 什么是友元&#xff1f; 友元是C中的一种关系友元发生在函数与类之间或者类与类之间友元关系是单向的&#xff0c;不能传递 在具体讲解友元的性质之前&#xff0c;我们先来看看一个程序&#xff…

SpringAOP xml 方式和注解简单实现日志处理

1.首先是用注解方式捕捉Controller 层异常&#xff1a; 首先是引入aop 依赖的jar <!-- Spring AOP 日志管理需要导入的包 --><dependency><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId><version>1.8.13</…

call stack and stack buffer overflow

http://en.wikipedia.org/wiki/Call_stack http://en.wikipedia.org/wiki/Stack_buffer_overflow Stack_buffer_overflow里提到的frame pointer 的位置不一样&#xff0c;不同的系统实现应该是不一样的。 运行时的栈是从高地址向低地址分配的&#xff0c;堆是从低地址向高地址…