bootloader功能介绍/时钟初始化设置/串口工作原理/内存工作原理/NandFlash工作原理

bootloader功能介绍

初始化开发板上主要硬件(时钟,内存,硬盘),

把操作系统从硬盘拷贝到内存,然后让cpu跳转到内存中执行操作系统。

boot阶段

1.关闭影响CPU正常执行的外设

-关闭看门狗(watch dog)   WTCON 0xE2700000

-关闭中断 CPSR I和F位设置为1,关闭,不响应任何中断。

2.初始化时钟

-倍频到1Ghz,为外设分频

*串口驱动

3.初始化内存控制器,DDRAM

-验证内存,往里面写一个值,然后再读出来

4.初始化硬盘,nand Flash

-nand flash 读驱动(从nand往外读数据)

loader阶段

1.从硬盘指定的地址加载kernel到内存指定的地址。

2.跳转到内存kernel所在的地址,执行

附加功能:

实现bootloader中shell(命令解释器)

附加功能:

实现bootloader中shell(命令解释器)

uboot中支持的命令,

help

loadb 下载程序, kermit 协议

go 0X21000000;

例如:在uboot中直接控制蜂鸣器

mm 0xe02000a0 0x1(控制寄存器)

mm 0xe02000a4 0x1(数据寄存器)

常用调试手段:

1.led点灯大法

2.串口调试,uart_getchar,uart_putchar,进一步实现stdio.h

时钟初始化设置

pll 锁相环,
倍频

串口工作原理

串口工作核心图

#define ULCON0 *((volatile unsigned int *)0XE2900000)

volatile 关键字,防止编译器做优化,每次读取寄存器的值,都是重新读取寄存器。

//start.s
	AREA start_main,CODE, READONLY
	ENTRY
	IMPORT uart_test
START
	B uart_test

	END
//uart.c
#define ULCON0 *((volatile unsigned int *)0XE2900000)
#define UCON0 *((volatile unsigned int *)0XE2900004)
#define UTRSTAT0 *((volatile unsigned int *)0XE2900010)
#define UTXH0 *((volatile unsigned int *)0XE2900020)
#define URXH0 *((volatile unsigned int *)0XE2900024)
#define UBRDIV0 *((volatile unsigned int *)0XE2900028)
#define UDIVSLOT0 *((volatile unsigned int *)0XE290002C)
#define GPACON0 *((volatile unsigned int *)0XE0200000)
void uart_init(void)
{
	//串口管脚设置成功能态
	GPACON0 = 0x22;
	//设置8  N  1
	ULCON0 = 0X3;
	//设置轮询工作模式
	UCON0 = 0X5;
	//设置波特率
	UBRDIV0 = 34;
	UDIVSLOT0 = 0XDDDD;

}
char uart_getchar(void)
{
	char ch;
	//如果有数据到达,状态寄存器第0位置1
	//判断状态位是否为1,决定读接收缓冲寄存器,读到的值作为函数的返回值
	while (!(UTRSTAT0 & 0x1))
		;
	ch = URXH0;
	return ch;
}
void uart_putchar(char ch)
{
	//如果状态寄存器第1为置1,表示发送单元为空,可以发送数据
	//把ch赋值到发送缓冲寄存器里,状态寄存器第1为置0, 自动发送,当发送完毕
	while (!(UTRSTAT0 & 0X2))
		;
	UTXH0 = ch;
}
void uart_test(void)
{
	char ch;

	uart_init();
	uart_putchar('a');
	uart_putchar('b');
	uart_putchar('c');
	//串口回显功能
	while (1)
	{
		ch = uart_getchar();
		uart_putchar(ch);
	}
}

内存工作原理

--------------------------------------------------

NandFlash工作原理

内存是总线设备,nandflash属于非总线设备。

没有地址线, 只有数据线。

内存:总线数据, nandflash:非总线设备。

命令、地址、数据复用端口。

忙闲位。

#define NFCONF (*(volatile unsigned int *)0xB0E00000)
#define NFCONT (*(volatile unsigned int *)0xB0E00004)
#define NFCMMD (*(volatile unsigned int *)0xB0E00008)
#define NFADDR (*(volatile unsigned int *)0xB0E0000C)
#define NFDATA (*(volatile unsigned int *)0xB0E00010)
#define NFSTAT (*(volatile unsigned int *)0xB0E00028)

#define MP0_3CON (*(volatile unsigned int *)0xE0200320)

#define PAGE_SIZE	2048

void nand_init(void)
{
	//[15:12]TACLS = 1->(1) 1/133Mhz = 7.5ns
	//[11:8] TWRPH0 = 1->(1+7) 7.5ns*2 = 15ns
	//[7:4] TWRPH1 = 1->(1+1) 7.5ms *2 = 15ns
	NFCONF |= 1<<2 | 1<< 8 | 1<< 4;
	//AdrCycle [1]1=5 address cycle
	NFCONF |= 1<<1;
	//MODE [0] NAND Flash controller operating node
	// 0=disable nand flash controller
	// *1 = enable nand flash controller
	NFCONT |= 1<<0;
	//Reg_nCE0 [1] nandflash memort nRCS[0] signal control
	// *0 = force nRCS[0] to low (enable chip select)
	// 1 = force nRCS[0] to high(disable chip select)
	NFCONT &= ~(1<<1);
	//GPIO functional mux setting
	// 0010 = NF_xxx
	MP0_3CON = 0X22222222;
	return ;
}

void nand_read_id(char id[])
{
	int i;
	//write read_id cmd 90th
	NFCMMD = 0X90;
	//write address 00h
	NFADDR = 0x00;
	for(i=0; i<5; i++)
	{
		id[i] = NFDATA;
	}
	return ;
}

void nand_read_page(int addr, char buf[])
{
	int i;
	char tmp;
	//write read_page cmd 00h
	NFCMMD = 0X00;
	//write 5 address
	NFADDR = (addr >> 0) & 0xFF;
	NFADDR = (addr >> 8) & 0x7;
	NFADDR = (addr >> 11) & 0xFF;
	NFADDR = (addr >> 19) & 0xFF;
	NFADDR = (addr >> 27) & 0x1;
	//write read_page cmd 30h
	NFCMMD = 0X30;
	//wait for R/nB -->ready
	while( (NFSTAT &(1<<0))==0 )
		;
	//read data 2048 bytes
	for(i=0; i<PAGE_SIZE; i++)
	{
		buf[i] = NFDATA;
	}
	for (i=0; i<64; i++)
	{
		tmp = NFDATA;
	}
	return ;

}

void nand_read(int nand_addr, char *sdram_addr, int size)
{
	int pages = (size -1)/PAGE_SIZE + 1;
	int i;

	for (i=0; i<pages; i++)
	{
		nand_read_page(nand_addr + i*PAGE_SIZE, sdram_addr + i*PAGE_SIZE);
	}

}
时间: 2024-08-10 17:08:44

bootloader功能介绍/时钟初始化设置/串口工作原理/内存工作原理/NandFlash工作原理的相关文章

7th.关于系统时钟的设置

言简意赅版本: 开启MPLL 设置LOCKTIME寄存器 (设置锁定时间) 设置MPLLCON寄存器(设置主频与FCLK的关系) 设置CLKDIVN寄存器(设置FCLK,HCLK,UCLK的倍数关系) MPLLCON参照官方提供参数配置即可. 详细情况 开发板在没有开启时钟前,整个开发板全靠一个12MHz的晶振提供频率来运行,当MPLLCON存入初值,并开始生效后,S3C2440A可以正常工作在400MHz下.开发板的主板上的外设和CPU也有一个频率限度,ARM920T内核的S3C2440的最高

s3c6410时钟初始化

今天自己写bootloader做时钟初始化时遇到的问题,特记录下来.为了方便理解,我大部分都有截图, 在此我先说明下,图均来自数据手册.也希望看了本篇文章的同志多多参看数据手册才能理解的更加透彻,才能真正的锻炼自己的能力.下面程序部分我也拆分成了5个部分分别解释,最后也给出了整个程序.本文如果有什么错误的地方,欢迎各位批评指正,不甚感激. 6410有3个内部PLL(Phase Locked Loop:为锁相回路或锁相环,用来统一整合时脉讯号,使内存能正确的存取资料.PLL用于振荡器中的反馈技术.

带你走近AngularJS - 基本功能介绍

AngularJS是Google推出的一款Web应用开发框架.它提供了一系列兼容性良好并且可扩展的服务,包括数据绑定.DOM操作.MVC设计模式和模块加载等.本文专注于AngularJS 指令的使用,在我们进入主题之前,我们将快速浏览AngularJS的基本用法. AngularJS 不仅仅是一个类库,而是提供了一个完整的框架.它避免了您和多个类库交互,需要熟悉多套接口的繁琐工作.它由Google Chrome的开发人员设计,引领着下一代Web应用开发.也许我们5年或10年后不会使用Angula

Linux电源管理(5)_Hibernate和Sleep功能介绍【转】

本文转载自:http://www.wowotech.net/pm_subsystem/std_str_func.html 1. 前言 Hibernate和Sleep两个功能是Linux Generic PM的核心功能,它们的目的是类似的:暂停使用——>保存上下文——>关闭系统以节电········>恢复系统——>恢复上下文——>继续使用. 本文以内核向用户空间提供的接口为突破口,从整体上对这两个功能进行介绍,并会在后续的文章中,分析它们的实现逻辑和执行动作. 顺便感概一下,虽

Exchange2016正式版功能介绍及全新安装配置

Exchange2016功能介绍及全新安装配置 说到Exchange服务相信很多人都在关注,微软在2015年更新了很多服务,从功能上来说确实做了很多优化及提升,具体就不多说了,微软在2015年10月1日发布了Exchange2016正式版,版本还是分为标准版和企业版,此次发布为多语言版本 同样微软在2015年发布了那些新产品呢 : 我们还是说说Exchange2016,从安装及官网文档上看微软从Exchange2010到Exchange2016角色上缩减了很多,从Exchange2010的Mai

GPS接收器控件TGPS下载及功能介绍

TGPS是一个Delphi控件,包装了GPS接收器的相关接口.TGPS是一个GPS接收器接口,它可以用于所有发送NMEA 0183数据的GPS接收器,同时也可以连接计算机的串行通信端口. TGPS的功能特性包括: 可以获取位置.时间.速度.标题.方位.路标.线路等等(主要取决于GPS接收器提供的数据,不同的GPS接收器接收的数据也可能有一些差异) 包含两个组件:提供卫星位置的图片以及信号强度 自动识别COM端口,波特率等等 TGPS 组件在Delphi 3.0, 4.0, 6.0 和 7.0开发

Windows Azure初体验--功能介绍

Windows azure功能介绍 随之云计算时代的到来,让很多人都感觉在云里雾里.云到底是什么概念呢?我相信没有人能给一个合理的解释,反正我到目前理解是,公有云是托管在数据中心的服务器,前提是数据中心提供所有的软硬件服务,但是这样的解释也不完全对,也不完全错. Windows Azure分为中国版本和国际版本,两个在功能上有很大的区别.国际版的Azure功能相对比较丰富.在中国部署的windows azure 服务机房主要分布在北京.上海.在windows azure上通过地缘组来区分.那什么

AndroidStudio3.0 下载使用新功能介绍

"-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> AndroidStudio3.0 下载使用新功能介绍 - 天平 - 博客频道 - CSDN.NET 天平 向着目标一步一步走. 目录视图 摘要视图 订阅 [活动]2017 CSDN博客专栏评选 &nbsp [5月书讯]流畅的Python,终于等到你!    &

ARUBA无线控制器内置网管功能介绍

ARUBA无线控制器内置网管功能介绍 ARUBA无线控制器内置了业界最为丰富的无线网络管理功能,用户不需要增加任何额外费用就可以实现以下功能: l 图形化的无线网络集中配置 l 图形化的网络实时性能监控 l 图形化的无线覆盖热区图 l 图形化的无线终端定位 l 图形化的访客管理系统 以上各项管理功能的具体介绍如下: 1. 图形化的无线网络集中配置 通过图形化的无线网络集中配置功能,网络管理人员可以在控制器的图形化管理界面上对VLAN.IP.Route等网络参数,访问控制策略.带宽控制策略等无线防