UBOOT-1.1.6一些文件功能分析_prodigal

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

141745169S3C2440裸奔讨论群
Prodigal UBOOT学习笔记之部分:
这是今天下午分析的文件,贴出来希望对大家帮助,分析了文件后对移植理解又更深了一步。

UBOOT移植体会:
看下笔记记录时间,UBOOT这环节是从3月10号开始的,其中包括了几个学习环节:UBOOT 启动分析,UBOOT移植,UBOOT常见文件分析。

在移植中感觉最大的收获:倒不是成功的移植几个程序(说实话,在移植过程中,思维一直都是别人的,我们大都做的只是代码搬运,这样学着你是不是觉得很迷茫?),而是对UBOOT文件系统更加熟悉,更加清晰,也学会了一些错误分析的方法。

在UBOOT移植过程中:我不断问自己:要是自己移植的并不是S3C2440,而是一个我不熟悉的开发板,那我又应该怎么修改?也许我不喜欢被动的感觉吧。

01.include/configs/smdk2410.h
FUNCTION:
一些预定义配置
①上层配置信息
②Fin=12MHz
③MMU IRQ/FIQ
④malloc池大小、全局变量池大小
⑤硬件设备:网卡我的网卡是DM9000
⑥选择串行控制台配置
⑦实时时钟RTC
⑧波特率设置以及串口overwrite允许
⑨预定义命令CONFIG_COMMANDS
⑩网络配置*/
⑪一些杂乱的配置信息:主要是UBOOT控制台显示设置
⑫用PWM定时器4计时10ms(15625),所以1s就应该设置为15625*100
⑬可设置的波特率:一般使用115200
⑭堆栈大小设置
⑮物理内存空间的设置:SDRAM,FLASH
⑯FLASH与环境组织
⑰擦除与写FLASH的最大时间:
02.board/smdk2410/lowlevel_init.S
FUNCTION:
初始化存储控制器
03.board/smdk2410/smdk2410.c
FUNCTION:
初板子的初始化配置
①配置Fout(MPLL)
②配置usb输出频率(UPLL)
③平台依赖的相关部件的初始化
3.1设置系统时钟
3.2设置I/O端口
3.3读取板子ID
3.4UBOOT参数存放位置
3.5使能icache与dcache
3.5检测内存映射
04.include/s3c2410.h
FUNCTION:
①UART与SPI选用的通道
②ECC参数设置
③UART的选择
④S3C2410芯片上功能部件寄存器的起始地址
⑤S3C2410芯片上功能部件寄存器的起始地址的获取函数
⑥ISR相关的地址定义
⑥这什么玩意??PENDING BIT
⑦这什么玩意??清除Pending,这下懂了,就是清除中断挂起寄存器
05.include/s3c24x0.h
FUNCTION:
部件相关的结构体定义
06.include/asm-arm/global_data.h
FUNCTION:
lobal data used for startup functions
①定义gd_t(struct global_data)类型的结构体
②全局数据标志
③宏定义DECLARE_GLOBAL_DATA_PTR
07.include/asm-arm/u-boot.h
FUNCTION:
boot information for Linux kernel 08.include/common.h
FUNCTION:
目前用到的是:对函数的声明
还有几个文件,但目前暂时不想分析
只贴这个文件:
board/smdk2410/smdk2410.c
(并不是说其他的怎么样,而是因为这个文件让我学会了很多东西)
/*
*(C)Copyright2002
*Sysgo Real-Time Solutions,GmbH<>
*Marius Groeger<mgroeger@sysgo.de>
*
*(C)Copyright2002
*David Mueller,ELSOFT AG,<d.mueller@elsoft.ch>
*
*See file CREDITS for list of people who contributed to this
*文件CREDITS列出了所有对此做出贡献的人
*project.
*
*This program is free software;you can redistribute it and/or一*modify it under the terms of the GNU General Public License as
*published by the Free Software Foundation;either version2of些*the License,or(at your option)any later version.
*
*This program is distributed in the hope that it will be useful,
*but WITHOUT ANY WARRANTY;without even the implied warranty of说*MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
*GNU General Public License for more details.
*
*You should have received a copy of the GNU General Public License明*along with this program;if not,write to the Free Software
*Foundation,Inc.,59Temple Place,Suite330,Boston,
*MA02111-1307USA
*/
FUNCTION:
初板子的初始化配置
①配置Fout(MPLL)
②配置usb输出频率(UPLL)
③平台依赖的相关部件的初始化
3.1设置系统时钟
3.2设置I/O端口
3.3读取板子ID
3.4UBOOT参数存放位置
3.5使能icache与dcache
3.5检测内存映射
/*下面头文件在include/目录下*/
#include<common.h>
#include<s3c2410.h>
DECLARE_GLOBAL_DATA_PTR;/*必须增加这一行才能使用gd变量*/
/*①配置Fout(MPLL)*/
#define FCLK_SPEED1
#if FCLK_SPEED==0/*Fout=203MHz,Fin=12MHz for Audio*/
#define M_MDIV0xC3
#define M_PDIV0x4
#define M_SDIV0x1
#elif FCLK_SPEED==1/*Fout=202.8MHz*/
#define M_MDIV0xA1
#define M_PDIV0x3
#define M_SDIV0x1
#endif
/*②配置usb输出频率(UPLL)*/
#define USB_CLOCK1
#if USB_CLOCK==0
#define U_M_MDIV0xA1
#define U_M_PDIV0x3
#define U_M_SDIV0x1
#elif USB_CLOCK==1
#define U_M_MDIV0x48
#define U_M_PDIV0x3
#define U_M_SDIV0x2
#endif
/*
*delay函数加上“static inline”是有原因的,
*这样可以使得编译*.c时,delay嵌入其他函数中,编译结果中只有其他函数一个函数。

*/
static inline void delay(unsigned long loops)
{
__asm__volatile("1:\n"
"subs%0,%1,#1\n"
"bne1b":"=r"(loops):"0"(loops));
}
/*
*Miscellaneous platform dependent initialisations
*③平台依赖的相关部件的初始化
*/
int board_init(void)
{
/*定义一个S3C24X0_CLOCK_POWER类型的结构体变量clk_power*/
S3C24X0_CLOCK_POWER*const clk_power=S3C24X0_GetBase_CLOCK_POWER();
/*------------------------------------------------------------------------------------------
①在include/s3c2410.h(#include<s3c2410.h>)中有如下定义:
#define S3C24X0_CLOCK_POWER_BASE0x4C000000
static inline S3C24X0_CLOCK_POWER*const S3C24X0_GetBase_CLOCK_POWER(void)
{
return(S3C24X0_CLOCK_POWER*const)S3C24X0_CLOCK_POWER_BASE;
}
②在s3c2410.h文件中包含了s3c24x0.h头文件(#include<s3c24x0.h>)=>s3c24x0.h同样在include 目录下:
看看S3C24X0_CLOCK_POWER的结构,其实就是一个struct机构体
typedef struct{
S3C24X0_REG32LOCKTIME;
S3C24X0_REG32MPLLCON;
S3C24X0_REG32UPLLCON;
S3C24X0_REG32CLKCON;
S3C24X0_REG32CLKSLOW;
S3C24X0_REG32CLKDIVN;
}/*__attribute__((__packed__))*/S3C24X0_CLOCK_POWER;
------------------------------------------------------------------------------------------*/ /*同上定义一个S3C24X0_GPIO类型的结构体变量gpio*/
S3C24X0_GPIO*const gpio=S3C24X0_GetBase_GPIO();
(3.1设置系统时钟)
/*to reduce PLL lock time,adjust the LOCKTIME register*/
clk_power->LOCKTIME=0xFFFFFF;
/*configure MPLL*/
clk_power->MPLLCON=((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV);
/*some delay between MPLL and UPLL*/
delay(4000);
/*configure UPLL*/
clk_power->UPLLCON=((U_M_MDIV<<12)+(U_M_PDIV<<4)+U_M_SDIV);
/*some delay between MPLL and UPLL*/
delay(8000);
(3.2设置I/O端口)
/*set up the I/O ports*/
gpio->GPACON=0x007FFFFF;
gpio->GPBCON=0x00044555;
gpio->GPBUP=0x000007FF;
gpio->GPCCON=0xAAAAAAAA;
gpio->GPCUP=0x0000FFFF;
gpio->GPDCON=0xAAAAAAAA;
gpio->GPDUP=0x0000FFFF;
gpio->GPECON=0xAAAAAAAA;
gpio->GPEUP=0x0000FFFF;
gpio->GPFCON=0x000055AA;
gpio->GPFUP=0x000000FF;
gpio->GPGCON=0xFF95FFBA;
gpio->GPGUP=0x0000FFFF;
gpio->GPHCON=0x002AFAAA;
gpio->GPHUP=0x000007FF;
(3.3读取板子ID)
/*arch number of SMDK2410-Board*/
gd->bd->bi_arch_number=MACH_TYPE_SMDK2410;
/*-----------------------------------------------------------------------------------------❶根据上面分析gd->bd->bi_arch_number这么个东西肯定在include/common.h(#include <common.h>)中有定义:去找,没有?
❷再分析:对了上面不是加了一个看不懂的声明吗?
DECLARE_GLOBAL_DATA_PTR;/*必须增加这一行才能使用gd变量*/
❸上网查得:
DECLARE_GLOBAL_DATA_PTR只是一个定义的宏,这个宏定义了一个gd_t(struct global_data)类型的全局数据结构的指针,这个指针存放在指定的寄存器中
(386体系结构没有放到指定寄存器中)。

例如ARM体系结构中,DECLARE_GLOBAL_DATA_PTR定义如下:
#define DECLARE_GLOBAL_DATA_PTR register volatile gd_t*gd asm("r9")❹有上面的提示就好办了(在include/asm-arm/global_data.h下有如下定义):
#define DECLARE_GLOBAL_DATA_PTR register volatile gd_t*gd asm("r8")
gd_t(include/asm-arm/global_data.h)的结构类型如下
typedef struct global_data{
bd_t*bd;
unsigned long flags;
unsigned long baudrate;
unsigned long have_console;/* serial_init()was called*/
unsigned long reloc_off;/* Relocation Offset*/
unsigned long env_addr;/*Address of Environment struct*/
unsigned long env_valid;/* Checksum of Environment valid?*/
unsigned long fb_base;/*base address of frame buffer*/
#ifdef CONFIG_VFD
unsigned char vfd_type;/*display type*/
#endif
#if0
unsigned long cpu_clk;/*CPU clock in Hz!*/
unsigned long bus_clk;
unsigned long ram_size;/*RAM size */
unsigned long reset_status;/* reset status register at boot*/
#endif
void**jt;/*jump table*/
}gd_t;
bd_t(include/asm-arm/u-boot.h)的结构类型如下
typedef struct bd_info{
int bi_baudrate;
/*serial console baudrate*/
unsigned long bi_ip_addr;/*IP Address*/
unsigned char bi_enetaddr[6];/* Ethernet adress*/
struct environment_s*bi_env;
ulong bi_arch_number;
/*unique id for this board*/
ulong bi_boot_params;
/*where this board expects params*/
struct/*RAM configuration*/
{
ulong start;
ulong size;
}
bi_dram[CONFIG_NR_DRAM_BANKS];
#ifdef CONFIG_HAS_ETH1
/*second onboard ethernet port*/
unsigned char bi_enet1addr[6];
#endif
}bd_t;
❺现在在分析(本以为很简单的东西,一分析还真的一大堆额):
gd->bd->bi_arch_number=MACH_TYPE_SMDK2410;
#define DECLARE_GLOBAL_DATA_PTR register volatile gd_t*gd asm("r8")
其实就是:将该ID号存放到寄存器r8中去
提示:前面UBOOT第一阶段->4.设置堆栈:不就是开辟了一段存放全局变量的空间吗
-----------------------------------------------------------------------------------------*/
(3.4UBOOT参数存放位置)
/*adress of boot parameters*/
gd->bd->bi_boot_params=0x30000100;
(3.5使能icache与dcache)
icache_enable();
dcache_enable();
/*-----------------------------------------------------------------------------------------❶这次总在include/common.h(#include<common.h>)中吧?去看看
void dcache_enable(void);
void icache_enable(void);
❷在文件cpu/$(CPU)/cpu.c
#ifdef USE_920T_MMU
/*在1.include/configs/smdk2410.h中有:
#define USE_920T_MMU1/*使能MMU*/
/*It makes no sense to use the dcache if the MMU is not enabled*/
void dcache_enable(void)
{
ulong reg;
reg=read_p15_c1();
/*------------------------------------------------------------(暂时不懂)
/*read co-processor15,register#1(control register):也是在文件cpu/$(CPU)/cpu.c*/
static unsigned long read_p15_c1(void)
{
unsigned long value;
__asm____volatile__(
"mrc p15,0,%0,c1,c0,0@read control reg\n"
:"=r"(value)
:
:"memory");
#ifdef MMU_DEBUG
printf("p15/c1is=%08lx\n",value);
#endif
return value;
}
--------------------------------------------------------------*/
cp_delay();
/*--------------------------------------------------------------
static void cp_delay(void)
{
volatile int i;
/*copro seems to need some delay between reading and writing*/
for(i=0;i<100;i++);
}
--------------------------------------------------------------*/
write_p15_c1(reg|C1_DC);
/*--------------------------------------------------------------
static void write_p15_c1(unsigned long value)
{
#ifdef MMU_DEBUG
printf("write%08lx to p15/c1\n",value);
#endif
__asm____volatile__(
"mcr p15,0,%0,c1,c0,0@write it back\n"
:
:"r"(value)
:"memory");
read_p15_c1();
}
--------------------------------------------------------------*/
}
#endif
void icache_enable(void)
{
ulong reg;
reg=read_p15_c1();/*get control reg.*/
cp_delay();
write_p15_c1(reg|C1_IC);
}
-----------------------------------------------------------------------------------------*/
return0;
}
(3.5检测内存映射)
int dram_init(void)
{
gd->bd->bi_dram[0].start=PHYS_SDRAM_1;
gd->bd->bi_dram[0].size=PHYS_SDRAM_1_SIZE;
/*--------------------------------------------------------------------------------------
---
PHYS_SDRAM_1、PHYS_SDRAM_1_SIZE立马想到:在1.include/configs/smdk2410.h中有定义
#define PHYS_SDRAM_10x30000000/*SDRAM Bank#1BANK6接外设SDRAM */
#define PHYS_SDRAM_1_SIZE0x04000000/*64MB SDRAM大小
64MB(=0x04000000):BANK[7:6]地址空间大小可编程控制*/
-----------------------------------------------------------------------------------------*/
return0;
}
剩下的文件,也会挨着分析。

待更新
PS:也许由于本人水平有限,所以难免有一些不正确的地方,望大家理解。

如果我的笔记或者心得能侥幸的提醒到你,那才是我最大的荣欣。

相关文档
最新文档