今天我给大家分享一下如何移植一个纯净的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
二维码:

备注:交流学习哦
另外我这里有大量的学习资料,以及现成的项目的经验总结,欢迎叨扰!!!

移植u-boot-2012.04.01到jz2440开发板相关推荐

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

    上一篇文章我们已经修改了uboot源码使其能够正常打印输出了,但是输出停到了nand启动那里,所以这篇文章就来记录如何修改源码使uboot支持NAND启动. 原来的代码在链接时加了"-pie ...

  2. 移植Linux 3.4.2内核到JZ2440开发板(超精讲)

    Linux 3.4.2内核移植到JZ2440开发板 0.开发环境 虚拟机:VMware workstation 16 pro 宿主机操作系统:Ubuntu 16.04 开发板:JZ2440 移植内核版 ...

  3. 移植u-boot-2012.04.01到JZ2440(二:分析启动流程)

    目录 2. 分析启动流程 2.1 u-boot.lds链接脚本 2.2 start.S启动文件     2.2.1 设置异常向量表     2.2.2 设置SVC管理模式.关看门狗.关中断.设置时钟频 ...

  4. 移植u-boot.2012.04.01

    /*************************************************** *u-boot版本:u-boot2012.04.01 *gcc版本:arm-linux-gcc ...

  5. (2012.01.12-2012.04.01)八十二天的学习小记

    (2012.01.12-2012.04.01)八十二天的学习小记   哈哈,原来又是过了八十二个日子了,真快啊~这次发的学习小记日期记录时间有点长,回看1月份的东西,原来已经隔了八十多个日子了,对于这 ...

  6. jz2440开发板移植U-boot之修改代码支持DM9000网卡

    今天我们来移植U-boot到jz2440开发板,修改代码支持DM9000网卡.查看之前写的移植记录请点击链接:点击查看之前的移植记录 现在大多数开发板都支持DM9000网卡.我们的U-boot源码里面 ...

  7. 移植QT5.6到韦东山JZ2240嵌入式开发板(史上最最最最最详细的QT移植教程)

    首先感谢http://blog.csdn.net/lizuobin2/article/details/52673494的博主,应该是韦东山团队的老师,说实话,拿到JZ2440的板子很长时间了,每次都有 ...

  8. 关于修改jz2440开发板IP以及开发板与Windows互ping问题

    一.如何修改jz2440开发板IP 开头注意:在进行以下操作前必须已经跟着u-boot内核到开发板上,此外还要移植根文件系统到开发板上. 修改开发板IP有两种方式: 1.临时修改IP 2.永久修改IP ...

  9. jz2440开发板修改UBOOT支持NAND FLASH

    很多天没有看嵌入式的东西了,今天来看一下,继续之前移植uboot到jz2440开发板.今天我们来实现Uboot支持NAND FLASH. 在之前的文章里(点击连接查看之前的记录),我们为了编译通过把N ...

最新文章

  1. vue从入门到进阶:Vuex状态管理(十)
  2. STOMP协议规范--转载
  3. pp模块中关于物料反冲的探讨
  4. python将变量i的值增加1_Python中变量自增、i+=x与i=i+x、is与==
  5. Leetcode每日一题:171.excel-sheet-column-number(Excel表列序号)
  6. 全球AI人才只有2万多,仅3000人在求职 | 报告
  7. Vue官方文档代码大全
  8. QT跨平台使用libvlc播放视频
  9. 流量计算机常见故障,流量计40个常见故障、处理方法!多数人看完就收藏
  10. 让传感器数据在三维地图上显示,更直观,更震撼!
  11. 一文看懂李录价值投资体系
  12. intellIj idea修改英文字体解决大写的“I”和小写的“l”显示冲突问题
  13. Java腐烂的橘子leetcode
  14. 汽车不同的电源接通状态
  15. 英语论文常用词汇句式积累
  16. 单细胞论文记录(part9)--Spatial charting of single-cell transcriptomes in tissues
  17. 关于5G时延的深度解读,非常详尽
  18. 如何选择电脑--送给我的大一学弟学妹
  19. Microchip PIC系列8位单片机入门教程(一)开发环境建立
  20. TCO-PNB ester,1438415-89-4, 反式环辛烯-对硝基苯

热门文章

  1. 65 modol1用户登录
  2. java学习(106):字符串tocharArray,tolowercase,touppercase方法
  3. Centos7中Memcached安装使用说明
  4. java薪资年龄交叉表_巧用参数实现交叉表行列互换
  5. android 论坛_如何看待百度android吧萎靡现象与吧主的无所作为
  6. echarts轨迹图,各个城市线路图轨迹如何取值
  7. C++ 宏、范型和RTTI 浅析
  8. Microsoft SQL Server 全角转半角函数
  9. Python 第五天
  10. 深入理解css优先级