uboot研读笔记|03-初步移植uboot2012.04到jz2440(修改时钟,配置串口)(代码片段)

Neutionwei Neutionwei     2022-12-16     546

关键词:

项目开源地址:https://github.com/Mculover666/uboot-jz2440

0. 教程完整目录

在移植之前, 请首先确保对uboot的启动过程有所了解,参考:

1.新建单板

  • ① 新建单板目录,复制已有相似的目录即可(在board/厂家型号之下)

  • ② 新建单板配置文件,复制相似即可(在include/configs/目录下

  • ③添加单板配置文件

修改根目录下boards.cfg文件,在其中按照规定的格式添加单板配置文件,格式如下:

Target ARCH CPU Board name  Vendor SoC Options
//目标	CPU架构 CPU架构 单板名称 厂商名称 SOC信息 设置

搜索smdk2410,仿照24120的添加一行2440的:

至此,新单板的所有文件创建完成,编译测试:

make smdk2440_config
make

如果配置和编译通过,则证明新的单板文件没有问题,接下来按照uboot启动流程来修改代码。

2. 单板配置文件

上一小节中添加的单板配置文件include/configs/smdk2440.h中包含了最顶层的一些宏定义配置,需要在修改过程中不断的进行修改。

  • 一定不要先直接修改最顶层的宏定义!
  • 一定不要先直接修改最顶层的宏定义!
  • 一定不要先直接修改最顶层的宏定义!

3. 初步修改配置

在start_code中,依次检查需要修改的地方。

参考S3C2440-裸机篇-05 | S3C2440时钟体系详解(FCLK、PCLK、HCLK)

3.1. 修改时钟分频系数

#if defined(CONFIG_S3C2410)
	/* 自己添加的S3C2440时钟分频系数配置 */
	/* FCLK:HCLK:PCLK = =8:4:1 */
	/* default FCLK is 400 MHz ! */
	ldr	r0, =CLKDIVN
	mov	r1, #5
	str	r1, [r0]
	/* HDIVN不为0,设置CPU为异步模式(来源芯片手册)*/
	mrc p15,0,r0,c1,c0,0
	orr r0,r0,#0xc0000000  @#R1_nF:OR:R1_iA
	mcr p15,0,r0,c1,c0,0
#endif 

3.2. 调用lowlevel_init函数设置内存控制器

内存控制器中关于SDRAM的配置修改如下:

在地址配置中去掉了tchr的选项,s3c2440中没有:

3.3. 修改board_init_f函数

在单板配置文件中设置了栈顶指针sp:

所以无需修改,直接跳入到board_init_f函数执行即可。

在board_init_f函数中,board_early_init_f函数需要修改,修改时钟配置代码:

可以看到,通过修改M_MDIV、M_PDIV、M_SDIV的值来改变时钟配置,在该文件上面修改:

USB暂未用到,先不修改。

3.4. 编译测试

make distclean
make smdk2440_config
make

编译成功后,使用open-JTAG直接下载,将编译出的u-boot.bin文件下载到nor flash中,:

这种烧写方式太慢了,烧录一次需要3-5min,可以先将正常的uboot烧录到nor flash中,然后通过uboot的usb下载方式,将自己移植的uboot程序通过DNW工具发送给uboot,存放到内存中,这种方式下载速度非常快:

然后将内存中的程序烧录到nor flash中:

protect off all
erase 0 7ffff
cp.b 30000000 0 80000
//重启开发板

可以看到自己移植的uboot运行起来了,但是串口仍然有乱码,说明波特率设置有问题,后续进行修改:

烧写自己移植的程序之后,Nor Flash上原有的正常uboot已经被破坏,需要重新烧写!

4. 修改串口设置

在文件drivers/serial/serial_s3c24x0.c中找到串口配置函数serial_init,进一步查找,同样在该文件中有serial_init_dev,该函数用来初始化串口设备,该函数末尾跳转到_serial_setbrg。

_serial_setbrg函数同样在该文件中调用get_PCLK函数来计算值,如下:

	/* value is calculated so : (int)(PCLK/16./baudrate) -1 */
	reg = get_PCLK() / (16 * gd->baudrate) - 1;

查看get_PCLK函数,跳转到文件arch/arm/cpu/arm920t/s3c24x0/speed.c中,可以看到,该函数调用了get_HCLK:

/* return PCLK frequency */
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函数同样在该文件中,但是从源码可以看到,只有定义了宏CONFIG_S3C2440,该段代码才有效(整个文件还需要开启宏CONFIG_S3C24X0):

/* return HCLK frequency */
ulong get_HCLK(void)

	struct s3c24x0_clock_power *clk_power = s3c24x0_get_base_clock_power();
#ifdef CONFIG_S3C2440
	switch (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;
	
#else
	return (readl(&clk_power->clkdivn) & 2) ? get_FCLK() / 2 : get_FCLK();
#endif

5. 开启CONFIG_S3C2440宏定义

在配置文件中开启这个宏定义:

然后修改在start.S中配置时钟分频系数的代码:

编译之后发现nand文件有问题,这里暂且先不使用nand flash,在单板配置文件中屏蔽掉相关宏定义::

再次编译之后发现yaffs2文件系统有问题,这里暂且先不使用文件系统,在单板配置文件屏蔽掉相关宏定义:

再次编译,没有问题,下载到开发板的Nor Flash中,查看串口输出,可以正常打印,uboot初步移植成功:

接收更多精彩文章及资源推送,欢迎订阅我的微信公众号:『mculover666』

uboot|移植nxp官方uboot到imx6ull开发板(2016.03)(代码片段)

一、NXP官方uboot1.下载NXP官方uboot仓库地址为:https://github.com/Freescale/u-boot-fslc。这里为了保持版本统一,使用正点原子资料包中提供的原厂linux:uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2(版本是2016.03)。2.编译设置 查看详情

u-boot移植

...节我们详细的分析了uboot的启动流程,对uboot有了一个初步的了解。前两章我们都是使用的正点原子提供的uboot,本章我们就来学习如何将NXP官方的uboot移植到正点原子的I.MX6ULL开发板上,学习如何在uboot中添加我们自己... 查看详情

uboot移植:移植前的准备工作

一:uboot的来源    uboot的获取途径一般有三种,一种是uboot官方提供的这uboot,这里面是针对多种开发板和芯片的uboot代码,是全球各地上传,然后由uboot官方提供的,因为它里面包含了很多种开发板的uboot,所以文... 查看详情

uboot|移植nxp官方uboot到imx6ull开发板(2016.03)(代码片段)

一、NXP官方uboot1.下载NXP官方uboot仓库地址为:https://github.com/Freescale/u-boot-fslc。这里为了保持版本统一,使用正点原子资料包中提供的原厂linux:uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2(版本是2016.03)。2.编译设置临时... 查看详情

uboot移植之uboot命令体系解析

1:回归到main_loop   uboot启动第二阶段的最后,进入死循环main_loop()函数,命令行中没输出一次命令,就会执行一次main_loop函数,完成一次命令的获取、解析和执行。2:uboot命令体系的实现原理    uboot中... 查看详情

uboot移植一uboot架构分析

开发环境:  1.开发板mini2440  2. u-boot-2010.12参考i资料:https://blog.csdn.net/androidbbc/article/details/50961163     http://www.cnblogs.com/kele-dad/p/8969174.html一、下载u-boot-2010.12,并且解压二、分析u-boor-2010.12a 查看详情

一,移植uboot,分析uboot启动流程(代码片段)

文档时间:2018-08-08交叉编译器:arm-linux-gcc-4.3.2Ubuntu版本:16.04uboot版本:2013.10uboot启动流程简要如下:    a,设置CPU为管理模式    b,关闭看门狗    c,关闭中断    d,设置时钟频率    e,进入lowlevel_init.S,... 查看详情

从0移植uboot_编译最小可用uboot(代码片段)

来源:Linux社区 作者:xiaojiang1025 :http://www.linuxidc.com/Linux/2017-02/141020.htm 前两篇介绍了uboot-2013.01的配置原理以及大体的运行流程,本文将讨论如何对uboot源码进行配置,将一个可用的uboot烧录到SD卡中。定制自己的coreb... 查看详情

uboot配置编译源码分析

一、X210官方uboot配置编译实践1、找到官方移植好的uboot(BSP概念)(1)源头的源代码是uboot官网下载的。这个下载的源代码可能没有你当前使用的开发板的移植,甚至找不到当前开发板使用的SoC对应的移植版本。(2)SoC厂商在推出一... 查看详情

uboot移植之九鼎提供的uboot的文件分析

文件分析(1).gitignore:git管理工具相关的文件。(2)arm_config.mk:一个Makefile文件,将来会被Makefile里面的某句代码调用。(3)CHANGELOG、Changelog_Samsung、CHANGELOG-before-U-Boot-1.1.5:三个CHANELOG文件,其实就是该版本的uboot的变迁记录... 查看详情

三,移植uboot-支持nand启动

文档时间:2018-08-10交叉编译器:arm-linux-gcc-4.3.2Ubuntu版本:16.04uboot版本:2013.10  查看详情

uboot移植之uboot中的sd卡驱动解析

1:地址对硬件操作的影响    (1)操作系统(指的是linux)下MMU肯定是开启的,也就是说linux驱动中肯定都使用的是虚拟地址。而纯裸机程序中根本不会开MMU,全部使用的是物理地址。这是裸机下和驱动中操控硬件的... 查看详情

uboot移植之start_armboot()函数分析

/********************************uboot的第二阶段就是初始化剩下的还没在第一阶段初始化的硬件。主要是SoC外部硬件(譬如iNand网卡芯片.......)uboot本身的一些东西(uboot的命令环境变量等.....)。然后最终初始化完必要的东西后进入到u... 查看详情

uboot移植——修改默认ip地址(代码片段)

...,这些IP地址都是在uboot的环境变量里保存的。在uboot移植时可能会对默认的IP地址有要求,只需要修改默认环境变量里IP地址部分。对uboot的环境变量熟悉的参考博客:《uboot中环境变量的实现》。2、修改配置文件//配... 查看详情

uboot移植之九鼎提供的uboot的文件夹分析

...到的一些函数,这些函数都是硬件无关的,所以和我们的移植没多大关系(2)api_examples:api的示例代码(3)board:开发板相关的文件夹,这个文件夹里面存放的一个文件夹对应一款开发板或者是一个芯片厂商。我们在config配置... 查看详情

uboot之初体验

...xff0c;这种方式下载的源代码可能没有针对于当前开发板的移植,也可以从soc厂商提供的地址下载,这种方式一般是针对这个Soc已经移植过的uboot,还可以从开发板供应商处获得uboot,这种方式的uboot移植的更加彻底... 查看详情

x210官方uboot配置编译时实践

2.3.1、X210官方uboot配置编译实践2.3.1.1、找到官方移植好的uboot(BSP概念)(1)源头的源代码是uboot官网下载的。这个下载的源代码可能没有你当前使用的开发板的移植,甚至找不到当前开发板使用SoC对应的移植版本。(2)SoC厂商在... 查看详情

嵌入式linux核心课程2.uboot和系统移植-第4部分-2.4.uboot配置和编译过程详解

《2.uboot和系统移植-第4部分-2.4.uboot配置和编译过程详解》第一部分、章节目录2.4.1.uboot主Makefile分析12.4.2.uboot主Makefile分析22.4.3.uboot主Makefile分析32.4.4.uboot主Makefile分析42.4.5.uboot主Makefile分析52.4.6.uboot主Makefile分析62.4.7.uboot配置过程... 查看详情