uboot源码学习(5)uart_asm_init

一、415行-421行

uart_asm_init:
	/* set GPIO to enable UART0-UART4 */
	mov	r0, r8
	ldr	r1, =0x22222222
	str	r1, [r0, #0x0]			@ S5PC100_GPIO_A0_OFFSET
	ldr	r1, =0x00002222
	str	r1, [r0, #0x20]			@ S5PC100_GPIO_A1_OFFSET

r8 = 0xE0200000,为GPA0CON寄存器。上面的代码将GPA0CON配置为UART功能。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
二、423行-425行

/* Check S5PC100 */
cmp	r7, r8
bne	110f

跳转到110f。

三、444行-463行

110:
/*
 * Note that the following address
 * 0xE020'0360 is reserved address at S5PC100
 */
/* UART_SEL MP0_5[7] at S5PC110 */
	add	r0, r8, #0x360			@ S5PC110_GPIO_MP0_5_OFFSET
	ldr	r1, [r0, #0x0]			@ S5PC1XX_GPIO_CON_OFFSET
	bic	r1, r1, #(0xf << 28)		@ 28 = 7 * 4-bit
	orr	r1, r1, #(0x1 << 28)		@ Output
	str	r1, [r0, #0x0]			@ S5PC1XX_GPIO_CON_OFFSET

	110:
	/*
	 * Note that the following address
	 * 0xE020'0360 is reserved address at S5PC100
	 */
	/* UART_SEL MP0_5[7] at S5PC110 */
	add	r0, r8, #0x360			@ S5PC110_GPIO_MP0_5_OFFSET
	ldr	r1, [r0, #0x0]			@ S5PC1XX_GPIO_CON_OFFSET
	bic	r1, r1, #(0xf << 28)		@ 28 = 7 * 4-bit
	orr	r1, r1, #(0x1 << 28)		@ Output
	str	r1, [r0, #0x0]			@ S5PC1XX_GPIO_CON_OFFSET

	ldr	r1, [r0, #0x8]			@ S5PC1XX_GPIO_PULL_OFFSET
	bic	r1, r1, #(0x3 << 14)		@ 14 = 7 * 2-bit
	orr	r1, r1, #(0x2 << 14)		@ Pull-up enabled
	str	r1, [r0, #0x8]			@ S5PC1XX_GPIO_PULL_OFFSET

	ldr	r1, [r0, #0x4]			@ S5PC1XX_GPIO_DAT_OFFSET
	orr	r1, r1, #(1 << 7)		@ 7 = 7 * 1-bit
	str	r1, [r0, #0x4]			@ S5PC1XX_GPIO_DAT_OFFSET

配置MP0_5寄存器。
在这里插入图片描述
在这里插入图片描述
查看原理图:
在这里插入图片描述
发现在原理图中MP0_5没有作为ADDR引脚使用。没有特殊的用途。
四、串口UART Line Control Register手册:
在这里插入图片描述
在这里插入图片描述
自己配置UART0,8个数据位,1个停止位,无校验。添加的代码:

ldr r0,=0xE2900000
ldr r1,=3
str r1,[r0]			@ULCON0=3

五、Uart Control Register
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

ldr r1,=0x305							//此处代码需查看手册,确定寄存器的功能
str r1,[r0,#0x4]	@UCON0=0x305	

ldr r1,=1
str r1,[r0,#0x8]	@UFCON0=0			//此处代码需查看手册,确定寄存器的功能

ldr r1,=0
str r1,[r0,#0xc]		@UMCON0=0			//此处代码需查看手册,确定寄存器的功能

六、UART 时钟频率配置,需要配置下面UBRDIVn和UDIVSLOT两个寄存器。
在这里插入图片描述

在这里插入图片描述
UBRDIVn和UDIVSLOT的取值计算方法如上图中框起来的公式:
DIV_VAL=UBRDIVn+(num of 1’s in UDIVSLOTn)/16 = (PCLK/(bps*16))-1。
其中,UDIVSLOTn的取值如下表所示:
在这里插入图片描述
比如,当UDIVSLOTn取0x0080时,则num of 1‘s = 1.

**公式计算举例:**取bps = 115200。PCLK = 66M。当UDIVSLOTn=0x0080,num of 1‘s = 1。
此时:UBRDIVn+1/16 = (66M/(11520016))-1,计算得到UBRDIVn = (66M/(11520016))-1-1/16 =34.8072917-0.0625 = 34.74479≈35。当一次发送的报文过长,则34.74479≈35这一过程的偏差累积,就会影响到数据传送的准确性。因此,尽量使这个误差减小。推荐使用值:UDIVSLOTn = 0xDFDD,此时num of 1‘s = 13,UBRDIVn = 33.99479≈34。这样误差会小很多。
写入到程序里:

ldr r1,=34
str r1,[r0,#0x28]		@UBRDIV0=34  

ldr r1,0xDFDD
str r1,[r0,#0x2C]		@UDIVSLOT0=0XDFDD,num of 1‘s = 13

七、使用串口发送数据,将数据写进发送数据寄存器
在这里插入图片描述
代码:

ldr r0,=0xE2900020
ldr r1,=0x55			@UART0='U',使用UART0发送'U'
str r1,[r0]

ldr r1,=0x61			@UART0='U',使用UART0发送'a'
str r1,[r0]

ldr r1,=0x72			@UART0='U',使用UART0发送'r'
str r1,[r0]

ldr r1,=0x74			@UART0='U',使用UART0发送't'
str r1,[r0]

ldr r1,=0xA				@UART0='U',使用UART0发送'\r'
str r1,[r0]

ldr r1,=0xD				@UART0='U',使用UART0发送'\n'
str r1,[r0]

WINDOWS中换行是:’\r\n’,’\r’=0xA,’\n’=0xD;
LINUX中换行是:’\n’。

八、前面这段UART配置代码,是为了测试在IRAM中运行BL1阶段16K程序的时候,通过UART发送数据,但是此时在链接阶段,lowlevel_init.S生成的.o文件被链接在uboot.bin的末尾,当生成uboot.16K文件的时候,此部分代码并不能被包含进去。
在这里插入图片描述
所以此时需要修改Makefile文件,此.o文件链接在start.o文件后面,修改内容如下:
在这里插入图片描述
重新编译即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
uboot是一种常用的开引导加载程序,用于嵌入式系统的引导启动。其中,board_init_r和board_init_f是uboot中的两个重要函数。 board_init_r函数是在uboot启动过程中执行的第一个函数。它负责执行一系列的初始化工作,例如初始化系统时钟、设置内存映射等。此函数被用于配置和初始化各个硬件模块,包括中断控制器、串口控制器、定时器等,以确保系统正常运行。该函数还读取并解析配置文件,加载设备树等操作,为后续的引导加载准备好必要的条件。 board_init_f函数是在board_init_r函数之后调用的。它用于进一步初始化系统,并执行一些与硬件相关的操作。例如,该函数可能会初始化网络接口、USB接口、存储设备等,并设置系统的默认环境变量。此外,board_init_f函数还负责将uboot的控制权交给操作系统的引导加载程序,从而完成uboot的使命。 通过调用board_init_r和board_init_f函数,uboot能够在系统启动时完成各种硬件的初始化和配置工作。这两个函数是uboot启动过程中的重要环节,确保系统能够顺利地加载操作系统并运行。同时,它们也为开发者提供了扩展uboot的接口,可以在这两个函数中添加自定义的初始化代码,以满足系统特定的需求。 总结来说,board_init_r和board_init_f是uboot中两个重要的函数,用于初始化和配置嵌入式系统的硬件,并为操作系统的加载做好准备。它们是uboot启动过程中不可或缺的一部分,保证系统的正常启动和运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值