mini2440移植uboot-2008.10 (一)
今天是我申请此博客的第一天,从现在开始养成每次学完新东西,都要写博客进行总结的习惯!!!Come on!
首先就从这两天学的uboot开始吧,这两天学这个东西郁闷死了,不知道该怎么去学,尤其是到nand那部分,根据mini2440之uboot移植详细手册进行改写uboot,越到后面越头疼,怎么办??今天下载了aiku的驱动视频感觉不错,等这两天把之前学的uboot总结一下,还是回归学习驱动吧。总之学这个东西,我现在觉得就是颠来倒去一点点深入地学习。不说废话了,开始吧:
一、简介
根据国嵌实验手册4.2.4,基于uboot-2008.10,移植出可以在mini2440 norflash上运行的uboot
二、uboot启动简述
uboot与其他bootloader类似,有两个阶段
stage1:
1、初始化硬件
2、为stage2运行代码准备RAM空间
3、将stage2代码复制到RAM空间
4、设置堆栈
5、跳转到stage2的C入口点
stage2:
1、初始化本阶段要使用的硬件
2、检测系统内存映射
3、将内核映像和根文件系统,从Flash读到RAM空间
4、为内核设置启动参数
5、调用内核
1、系统上电 2、_start标号(cpu/arm920t/start.s)3、reset标号(start.s)4、cpu_init_crit标号(start.s)5、low_level_init.s(board/smdk2410/low_level_init.s)5、relocate标号(start.s)6、_start_arm_boot标号(start.s)7、start_armboot()函数(lib_arm/board.c)8、main_loop()函数(common/main.c)9、进入uboot命令行
三、开始移植
1、修改顶层Makefile
根据
smdk2410_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
添加
mini2440_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t mini2440 NULL s3c24x0
2、修改cpu/arm920t/start.S (加黑的为添加部分)
2.1、添加对S3C2440的支持 代码136行
#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
2.2、添加寄存器的定义与修改时钟频率的参数
# define CLK_CTL_BASE 0x4c000000
# define MDIV_405 0x7f<<12
# define PSDIV_405 0x21
# define UPLL_MDIV_48 0x38<<12
# define UPLL_PSDIV_48 0x22
# define MDIV_200 0xa1<<12
# define PS_DIV_200 0x31
2.3、修改中断禁止部分,添加s3口440中断禁止代码 代码164行 后面添加
# if defined(CONFIG_S3C2440)
ldr r1, =0x7fff
ldr r0, =INTSUBMSK
str r1, [r0]
# endif
2.4、修改时钟设置(将s3c2440主频设置为405MHz)
/*FCLK:HCLK:PCLK=1:2:4*/ 166行左右
/*defauk FCLK is 120Mhz!*/
ldr r0,=CLKDlVN
mov r1,#3
str r1,[r0]
改为
179 # if defined(CONFIG_S3C2440)
180 /* FCLK:HCLK:PCLK = 1:4:8 */
181 ldr r0, =CLKDIVN
182 mov r1, #5
183 str r1, [r0]
184
185 mrc p15, 0, r1, c1, c0, 0
186 orr r1, r1, #0xc0000000
187 mcr p15, 0, r1, c1, c0, 0
188
189 mov r1, #CLK_CTL_BASE
190
191 mov r2, #UPLL_MDIV_48
192 add r2, r2, #UPLL_PSDIV_48
193 str r2, [r1, #0x08]
194
195 mov r2, #MDIV_405
196 add r2, r2, #PSDIV_405
197 str r2, [r1, #0x04]
199 # else
200 /* FCLK:HCLK:PCLK = 1:2:4 */
201 ldr r0, =CLKDIVN
202 mov r1, #3
203 str r1, [r0]
204
205 mrc p15, 0, r1, c1, c0, 0
206 orr r1, r1, #0xc0000000
207 mcr p15, 0, r1, c1, c0, 0
208
209 mov r1, #CLK_CTL_BASE
210 mov r2, #MDIV_200
211 add r2, r2, #PSDIV_200
212 str r2, [r1, #0x04]
213
214 # endif
3、修改cpu/arm920t/s3c24x0/interrupt.c
3.1、 修改宏定义,增加对S3C2440的支持 (加黑的为添加部分)
32 #include <common.h>
33 #if defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) || defined(CONFIG_S3C2440) || defined (CONFIG_TRAB)
34
35 #include <arm920t.h>
36 #if defined(CONFIG_S3C2400)
37 #include <s3c2400.h>
38 #elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
39 #include <s3c2410.h>
40 #endif
3.2、 在函数get_tbclk()中添加对mini2440的支持 (加黑的为添加部分)
173 ulong get_tbclk (void)
174 {
175 ulong tbclk;
176
177 #if defined(CONFIG_SMDK2400) || defined(CONFIG_TRAB)
178 tbclk = timer_load_val * 100;
179 #elif defined(CONFIG_SBC2410X) || \
180 defined(CONFIG_SMDK2410) || \
181 defined(CONFIG_MINI2440) || \
182 defined(CONFIG_VCMA9)
183 tbclk = CFG_HZ;
184 #else
185 # error "tbclk not configured"
186 #endif
187
188 return tbclk;
189 }
4、修改cpu/arm920t/s3c24x0/speed.c
4.1、 修改宏定义,增加对S3C2440的支持 (加黑的为添加部分)
32 #include <common.h>
33 #if defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) || defined(CONFIG_S3C2440) || defined (CONFIG_TRAB)
34
35 #if defined(CONFIG_S3C2400)
36 #include <s3c2400.h>
37 #elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
38 #include <s3c2410.h>
39 #endif
4.2、修改函数get_PLLCLK() (加黑的为添加部分)
由于S3C2440的MPLL计算公式与S3C2410不一样,而UPLL的计算公式一样,所以修改如下
54 static ulong get_PLLCLK(int pllreg)
55 {
56 S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
57 ulong r, m, p, s;
58
59 if (pllreg == MPLL)
60 r = clk_power->MPLLCON;
61 else if (pllreg == UPLL)
62 r = clk_power->UPLLCON;
63 else
64 hang();
65
66 m = ((r & 0xFF000) >> 12) + 8;
67 p = ((r & 0x003F0) >> 4) + 2;
68 s = r & 0x3;
69
70 #if defined(CONFIG_S3C2440)
71 if (pllreg == MPLL)
72 return((CONFIG_SYS_CLK_FREQ * m * 2) / (p << s));
73 #endif
74
75 return((CONFIG_SYS_CLK_FREQ * m) / (p << s));
76 }
4.3、修改函数get_HCLK() (加黑的为添加部分)
具体修改参考S3C2440数据手册
85 ulong get_HCLK(void)
86 {
87 S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
88
89 #if defined(CONFIG_S3C2440)
90 if(clk_power->CLKDIVN & 0x6)
91 {
92 if (2 == (clk_power->CLKDIVN & 0x6))
93 return (get_FCLK()/2);
94 if (6 == (clk_power->CLKDIVN & 0x6))
95 return((clk_power->CAMDIVN & 0x100) ? get_FCLK()/6 : get_FCLK()/3) ;
96 if (4 == (clk_power->CLKDIVN & 0x6))
97 return((clk_power->CAMDIVN & 0x200) ? get_FCLK()/8 : get_FCLK()/4) ;
98 else
99 return (get_FCLK());
100 }
101 else
102 return (get_FCLK());
103
104 #else
105 return((clk_power->CLKDIVN & 0x2) ? get_FCLK()/2 : get_FCLK());
106 #endif
107 }
5、修改cpu/arm920t/s3c24x0/serial.c (加黑的为添加部分)
21 #include <common.h>
22 #if defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) || defined(CONFIG_S3C2440) || defined (CONFIG_TRAB)
23
24 #if defined(CONFIG_S3C2400) || defined(CONFIG_TRAB)
25 #include <s3c2400.h>
26 #elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
27 #include <s3c2410.h>
28 #endif
6、修改drivers/rtc/s3c24x0_rtc.c (加黑的为添加部分)
28 #include <common.h>
29 #include <command.h>
30
31 #if (defined(CONFIG_CMD_DATE))
32
33 #if defined(CONFIG_S3C2400)
34 #include <s3c2400.h>
35 #elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
36 #include <s3c2410.h>
37 #endif
7、修改include/asm-arm/mach-type.h
第1859行左右添加
#define MACH_TYPE_MINI2440 1999
8、修改include/s3c24x0.h(加黑的为添加部分)
添加寄存器定义
77 /* INTERRUPT (see manual chapter 14) */
78 typedef struct {
………………
83 S3C24X0_REG32 INTPND;
84 S3C24X0_REG32 INTOFFSET;
85 #if defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
86 S3C24X0_REG32 SUBSRCPND;
87 S3C24X0_REG32 INTSUBMSK;
88 #endif
89 } /*__attribute__((__packed__))*/ S3C24X0_INTERRUPT;
92 /* DMAS (see manual chapter 8) */
93 typedef struct {
94 S3C24X0_REG32 DISRC;
95 #if defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
96 S3C24X0_REG32 DISRCC;
97 #endif
98 S3C24X0_REG32 DIDST;
99 #if defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
100 S3C24X0_REG32 DIDSTC;
101 #endif
…………
110 #if defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
111 S3C24X0_REG32 res[7];
112 #endif
113 } /*__attribute__((__packed__))*/ S3C24X0_DMA;
120 /* CLOCK & POWER MANAGEMENT (see S3C2400 manual chapter 6) */
121 /* (see S3C2410 manual chapter 7) */
122 typedef struct {
………
128 S3C24X0_REG32 CLKDIVN;
129 #if defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
130 S3C24X0_REG32 CAMDIVN;
131 #endif
132 } /*__attribute__((__packed__))*/ S3C24X0_CLOCK_POWER;
135 /* LCD CONTROLLER (see manual chapter 15) */
136 typedef struct {
……
149 S3C24X0_REG32 DITHMODE;
150 S3C24X0_REG32 TPAL;
151 #if defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
152 S3C24X0_REG32 LCDINTPND;
153 S3C24X0_REG32 LCDSRCPND;
154 S3C24X0_REG32 LCDINTMSK;
155 S3C24X0_REG32 LPCSEL;
156 #endif
157 } /*__attribute__((__packed__))*/ S3C24X0_LCD;
372 /* I/O PORT (see manual chapter 9) */
373 typedef struct {
374 #ifdef CONFIG_S3C2400
………
407 #if defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
408 S3C24X0_REG32 GPACON;
409 S3C24X0_REG32 GPADAT;
……………
457 } /*__attribute__((__packed__))*/ S3C24X0_GPIO;
9、在board目录中添加属于新开发板的目录
(1)在board目录下创建mini2440文件夹,将board/smdk2410下的所有文件拷贝到mini2440文件夹下
(2)将mini2440文件夹下的smdk2410.c改为mini2440.c
(3)修改mini2440文件夹下的Makefile, COBJS := mini2440.o flash.o
10、修改board/mini2440/mini2440.c (修改如下)
39 #elif FCLK_SPEED==1 /* Fout = 202.8MHz */
40
41 #if defined(CONFIG_S3C2440)
42 #define M_MDIV 0x7f
43 #define M_PDIV 0x2
44 #define M_SDIV 0x1
45 #endif
46
47 #if defined(CONFIG_S3C2410)
48 #define M_MDIV 0xA1
49 #define M_PDIV 0x3
50 #define M_SDIV 0x1
51 #endif
52
53 #endif
61 #elif USB_CLOCK==1
62
63 #if defined(CONFIG_S3C2440)
64 #define U_M_MDIV 0x38
65 #define U_M_PDIV 0x2
66 #define U_M_SDIV 0x2
67 #endif
68
69 #if defined(CONFIG_S3C2410)
70 #define U_M_MDIV 0x48
71 #define U_M_PDIV 0x3
72 #define U_M_SDIV 0x2
73 #endif
74
75 #endif
88 int board_init (void)
89 {
…………
125 /* arch number of SMDK2410-Board */
126 gd->bd->bi_arch_number = MACH_TYPE_MINI2440;
128 /* adress of boot parameters */
129 gd->bd->bi_boot_params = 0x30000100;
130
131 icache_enable();
132 dcache_enable();
133
134 return 0;
135 }
11、修改board/mini2440/lowlevel_init.S (修改如下)
#define REFCNT 1012 改为 #define REFCNT 0x4f4
原因:根据SDRAM芯片手册上说的 8192(8K) refresh cycles / 64ms 得到 SDRAM刷新周期 period=64ms/8192 =7.8125us
REFCNT 是刷新控制寄存器REFRESH的Refresh Counter([10:0])
SDRAM时钟频率就是HCLK的频率
REFCNT = 2^11 + 1 - SDRAM时钟频率(MHz) * SDRAM刷新周期(us) = 2^11 + 1 – 100 * 7.8125 = 1267.75 = 0x4F4
12、修改配置文件 include/configs/mini2440.h
将include/configs下的smdk2410.h 拷贝一份到mini2440.h
36 #define CONFIG_ARM920T 1 /* This is an ARM920T Core */
37 #define CONFIG_S3C2410 1 /* in a SAMSUNG S3C2410 SoC */
38 #define CONFIG_SMDK2410 1 /* on a SAMSUNG SMDK2410 Board */
改为
36 #define CONFIG_ARM920T 1 /* This is an ARM920T Core */
37 #define CONFIG_S3C2440 1 /* in a SAMSUNG S3C2440 SoC */
38 #define CONFIG_MINI2440 1 /* on a SAMSUNG Mini440 Board */
13、编译
#make clean
#make mini2440_config
#make CROSS_COMPILE=arm-linux-
mini2440移植uboot-2008.10 (一)的更多相关文章
- mini2440移植uboot 2014.04(五)
代码上传到github上:https://github.com/qiaoyuguo/u-boot-2014.04-mini2440 前几篇博文: <mini2440移植uboot 2014.04 ...
- mini2440移植uboot 2014.04(四)
我修改的代码已经上传到github上,地址:https://github.com/qiaoyuguo/u-boot-2014.04-mini2440.git 参考文章: <mini2440移植u ...
- mini2440移植uboot 2014.04(一)
最新版的uboot添加了很多新功能,我决定在最新版代码基础上重新移植一遍加深理解. 我修改的代码已经上传到github上,地址:https://github.com/qiaoyuguo/u-boot- ...
- mini2440移植uboot 2014.04(二)
我修改的代码已经上传到github上,地址:https://github.com/qiaoyuguo/u-boot-2014.04-mini2440.git 参考文章: <u-boot-2011 ...
- mini2440移植uboot 2014.04(三)
我修改的代码已经上传到github上,地址:https://github.com/qiaoyuguo/u-boot-2014.04-mini2440.git 参考文档: s3c2440手册(下载地址) ...
- mini2440移植uboot 2014.04(七)
上一篇博文:<mini2440移植uboot 2014.04(六)> 代码已经上传到github上: https://github.com/qiaoyuguo/u-boot-2014.04 ...
- mini2440移植uboot 2014.04(六)
上一篇博文:<mini2440移植uboot 2014.04(五)> 代码已经上传到github上:https://github.com/qiaoyuguo/u-boot-2014.04- ...
- mini2440移植uboot 2011.03(下)
参考博文: <u-boot-2011.03在mini2440/micro2440上的移植> 移植(五)添加nand支持: host@debian:~/soft/mini2440/u-boo ...
- mini2440移植uboot 2011.03(上)
参考博文: <u-boot-2011.03在mini2440/micro2440上的移植> 本来我想移植最新版的uboot,但是移植却不太成功,所以先模仿他人的例子重新执行一遍,对uboo ...
- mini2440移植uboot-2008.10 (二) DM9000网卡驱动移植
还是利用 mini2440移植uboot-2008.10 (一) 修改好的代码 通过观察可以发现,mini2400使用的网卡芯片是DM9000,在uboot-2008.10源码中已经支持该芯片的驱动 ...
随机推荐
- 四舍六入五成双银行家算法的 PHP和Javascript实现
四舍六入五成双 http://baike.baidu.com/view/1245064.htm?fr=aladdin 四舍六入五成双是一种比较精确比较科学的计数保留法,是一种数字修约规则. 对于位数很 ...
- Duff and Weight Lifting - 587A
题目大意:某个人训练举重,他每次可以举起来2^wi的重量,不过这个人比较懒所以他想尽量减少训练的次数,如果所有的训练重量2^a1 +2^a2+....2^ak = 2^x,那么这些重量可以一次性训练( ...
- windows蓝屏代码大全及常见蓝屏解决方案
对于以下的代码查询建议使用ctrl+F查询,而且很多蓝屏与黑屏的问题多是最近操作引起的,例如更新驱动,安装新的硬件.软件--把相关的配置调到最近的正常状况大多可以解决,确实不行时方可考虑重装系统,解决 ...
- HTML几类标签的应用总结
打开DREAMWEAVER,新建HTML,如下图: body的属性: bgcolor 页面背景色 background 背景壁纸.图片 text 文字颜色 topmargin 上边距 leftm ...
- 修改Tomcat Connector运行模式,优化Tomcat运行性能
Tomcat是一个小型的轻量级应用服务器,也是JavaEE开发人员最常用的服务器之一.不过,许多开发人员不知道的是,Tomcat Connector(Tomcat连接器)有bio.nio.apr三种运 ...
- eclipse 插件之Code Folding
功能: eclipse自带折叠包括方法, import, 注释等得折叠功能, code folding 插件对其增强. 1. 下载插件:( 也可以用link方式, 我的是link安装, jar包网上很 ...
- <Android>从窗口泄漏谈android:configChanges属性
今天有幸去哥们的大公司做了半天的暂时工,一个偶现的Bug折腾了他好久,好不easy今天抓到了异常Log日志.大致的意思就是android.view.windowleaked--窗口泄漏.我在网上查了资 ...
- AndroidPN中的心跳检测
在AndroidPN客户端里存在着心跳检测功能.就是每隔一段时间客户端向服务器端发送一个消息,以检测连接是否正常,发送的消息内容为: <presence id="h09Ke-13&qu ...
- mongodb的地理位置索引
mongoDB支持二维空间索引,使用空间索引,mongoDB支持一种特殊查询,如某地图网站上可以查找离你最近的咖啡厅,银行等信息.这个使用mongoDB的空间索引结合特殊的查询方法很容易实现.前提条件 ...
- 标准I/O库之标准输入、标准输出和标准出错
对一个进程预定义了三个流,并且这三个流可以自动地被进程使用,它们是:标准输入.标准输出和标注出错.这些流引用的文件与文件描述符STDIN_FILENO.STDOUT_FILENO和STDERR_FIL ...