基于mini2440的uboot移植(一)

发布者:龙腾少年最新更新时间:2022-05-25 来源: eefocus关键字:mini2440  uboot  移植 手机看文章 扫描二维码
随时随地手机看文章

一.移植环境


虚拟机:ubuntu12.04


uboot源码:u-boot-2008.10.tar.bz2


交叉编译:arm-linux-gcc-4.4.3


简单的记录下编译uboot的过程,要想具体了解uboot的工作原理,可以查看韦东山对uboot这部分的讲解,红色部分为修改部分


二.移植步骤


1.将uboot源码复制到ubuntu下的自己定义的文件夹,并解压tar jxvf u-boot-2008.10.tar.bz2


2.选择要移植的开发板,我们要准备将uboot移植到mini2440上,s3c2440开发板的cpu为arm920t,smdk2410开发板的cpu也为arm920t,所以我们选择smdk2410作为模板进行移植


3.首先将u-boot-2008.10/board下面的smdk2410 这个文件夹复制成一个自己定义的文件,放在board目录下:


cp -rf smdk2410 mini2440


进入mini2440目录,将smdk.c重命名为mini2440.c,与建立的文件夹名字相符


进入u-boot-2008.10/include/configs目录下,为你的开发板建立一个头文件,以smdk2410.h为模板


cp  smdk2410.h   mini2440.h


4. 在顶层Makefile中为开发板添加新的配置选项


smdk2410_config : unconfig

@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0

mini2440_config :   unconfig

@$(MKCONFIG) $(@:_config=) arm arm920t mini2440 NULL s3c24x0


CROSS_COMPILE = arm-linux-     //指定交叉编译环境

 

这部分代码时为mini2440添加配置选项,当我们运行make mini2440_config时,执行的就是这句语句


在mini2440文件夹中修改目标文件


COBJS:= mini2440.o flash.o


到这里我们可以编译我们新建的mini2440开发板了


make mini2440_config   配置mini2440


执行这个步骤,打印出


Configuring for mini2440 board...


执行make


在执行的过程中,会报错,具体的错误忘了,当时忘记截图了,如果报错的话,你找到报错的源文件,并将报错的语句全都注释掉,报错的话主要是因为硬件初始化的led与mini2440 然后进行make,编译成功的话会在目录下生成uboot.bin文件。  


 5. 修改u-boot-2008.10/cpu/arm920t/start.s,添加中断设置部分和时钟初始化部分


(1)修改编译条件,使其支持mini2440


136 #if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)

137     /* turn off the watchdog */

(2)添加硬件初始化的相关寄存器


150 /*add by mini2440*/

151 #define CLK_CTL_BASE 0X4C000000    //基地址

152 #define MDIV_405 0X7F << 12       //主频为405mhz

153 #define PSDIV_405 0X21

154 #define UPLL_MDIV_48 0x38 << 12    //usb频率为48mhz

155 #define UPLL_PSDIV_48 0x22


上述寄存器的定义根据s3c2440的datasheet来确定的,时钟的基地址:0X4C000000

S3C2440共有两个PLL,一个是MPLL,一个是UPLL。MPLL用于CPU及其他外围器件,UPLL用于USB。用于产生FCLK, HCLK, PCLK三种频率,这三种频率分别有不同的用途: 

FCLK是CPU提供的时钟信号。 

HCLK是为AHB总线提供的时钟信号, Advanced High-performance Bus,主要用于高速外设,比如内存控制器中断控制器,LCD控制器, DMA 等。 


PCLK是为APB总线提供的时钟信号,Advanced Peripherals Bus,主要用于低速外设,比如看门狗,UART控制器, IIS, I2C, SDI/MMC, GPIO,RTC and SPI等。


由datasheet可知,MDIV位于寄存器的12-19位,PDIV位于寄存器的4-9位和SDIV位于0-1位。


系统时钟的主频为405mhz,usb的频率为48mhz,查表可知MDIV,SDIV,PDIV的值

 

(3)修改s3c2440中断禁止部分


169 # if defined(CONFIG_S3C2410)

170     ldr r1, =0x3ff

171     ldr r0, =INTSUBMSK

172     str r1, [r0]

173 # endif

174 

175 

176 /*add for mini2440 ,15bit INTSUBMSK*/

177 # if defined(CONFIG_S3C2440)

178     ldr r1, =0x7fff

179     ldr r0, =INTSUBMSK

180     str r1, [r0]

181 # endif

(4)修改时钟分频,FLCK:HCLK:PCLK = 1:4:8


# if defined(CONFIG_S3C2440)

185     /* FCLK:HCLK:PLCK = 1:4:8 */

186     ldr r0, =CLKDIVN

187     mov r1, #5       //根据下面的datasheet,CLKDIVN的值应为5

188     str r1, [r0]

189 

190     mrc p15,0,r1,c1,c0,0 /*read ctrl regester*/   //读取协处理器中寄存器的数据到arm处理器中

191     orr r1,r1,#0xc0000000                     //设置为异步总线模式

192     mcr p15,0,r1,c1,c0,0 /*write ctrl regester*/

193 

194     mov r1, #CLK_CTL_BASE    //0x4c000000

195 

196     mov r2, #UPLL_MDIV_48   //配置upll

197     add r2, r2, #UPLL_PSDIV_48

198     str r2, [r1,#0x08]    //UPLLCON的地址为:0x4c000008

199 

200     mov r2, #MDIV_405   //配置mpll

201     add r2, r2, #PSDIV_405 

202     str r2, [r1, #0x04]    //MPLLCON的地址为:0x4c000004


204 # else

205     /* FCLK:HCLK:PCLK = 1:2:4 */

206     /* default FCLK is 120 MHz ! */

207     ldr r0, =CLKDIVN

208     mov r1, #3

209     str r1, [r0]

210 #endif

(6)修改u-boot-2008.10/cpu/arm920t/s3c24x0/interrupts.c支持mini2440


 32 #include

 33 #if defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) || defined(CONFIG_S3C2440) || defined (CONFIG_TRAB)

 34 

 35 #include

 36 #if defined(CONFIG_S3C2400)

 37 #include

 38 #elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)

 39 #include

 40 #endif


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

(7)修改u-boot-2008.10/cpu/arm920t/s3c24x0/speed.c的内容


 32 #include

 33 #if defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) ||defined (CONFIG_S3C2440) || defined (CONFIG_TRAB)

 34 

 35 #if defined(CONFIG_S3C2400)

 36 #include

 37 #elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)

 38 #include

 39 #endif

修改get_pllclk函数


 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        else if(pllreg == UPLL)

 74  #endif

 75     return((CONFIG_SYS_CLK_FREQ * m) / (p << s));

 76 77 

这段代码根据datasheet上的计算公式来修改

修改get_hclk函数,使其支持mini2440


 85 ulong get_HCLK(void)

 86 {

 87     S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();

 88 #if defined(CONFIG_S3C2440)

 89     if(clk_power->CLKDIVN & 0X6)    // 与0x6与CKDIVN与得到HDIVN的值 

 90        {

 91          if((clk_power->CLKDIVN & 0X6) == 2)    //HDIVN 为01b时

 92               return(get_FCLK()/2);  

 93          if((clk_power->CLKDIVN & 0X6) == 6)    //HDIVN 为11b时

 94               return((clk_power->CAMDIVN & 0x100) ? get_FCLK()/6 : get_FCLK()/3);  //与0x100与得到CAMDIVA[9]的值,并返回get_fclk()

 95          if((clk_power->CLKDIVN & 0X6) == 4)                                       //HDIVN 为10b时

 96               return((clk_power->CAMDIVN & 0x200) ? get_FCLK()/8 : get_FCLK()/4);   //与0x200与得到CAMDIVN[8]的值,并返回get_flck()

 97           return(get_FCLK());

 98        }

 99     else

100           return(get_FCLK());

101 #else

102     return((clk_power->CLKDIVN & 0x2) ? get_FCLK()/2 : get_FCLK());

103 #endif

104 }

(8)修改/u-boot-2008.10/board/mini2440/mini2440.c


修改mpll和upll的配置


 33 #define FCLK_SPEED 1

 34 

 35 #if FCLK_SPEED==0       /* Fout = 203MHz, Fin = 12MHz for Audio */

 36 #define M_MDIV  0xC3

 37 #define M_PDIV  0x4

 38 #define M_SDIV  0x1

 39 #elif FCLK_SPEED==1     /* Fout = 202.8MHz */

 40 #define M_MDIV  0xA1

 41 #define M_PDIV  0x3

 42 #define M_SDIV  0x1

 43 

 44 #if defined(CONFIG_S3C2440)

 45 /*fout = 405MHZ*/

 46 #define M_MDIV 0x7f

 47 #define M_PDIV 0x2

 48 #define M_SDIV 0x1

 49 #endif

 50 

 51 #endif

 54 #define USB_CLOCK 1

 55 

 56 #if USB_CLOCK==0

 57 #define U_M_MDIV    0xA1

 58 #define U_M_PDIV    0x3

 59 #define U_M_SDIV    0x1

 60 #elif USB_CLOCK==1

 61 #define U_M_MDIV    0x48

 62 #define U_M_PDIV    0x3

 63 

 64 #if defined(CONFIG_S3C2440)

 65 #define U_M_MDIV 0x38

 66 #define U_M_PDIV 0x2

 67 #endif

 68 

 69 #define U_M_SDIV    0x2

 70 #endif

(9)修改u-boot-2008.10/cpu/arm920t/s3c24x0/serial.c


 21 #include

 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

 26 #elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)

 27 #include

 28 #endif

(10)修改u-boot-2008.10/includes/s3c24x0.h


添加CAMDIVN寄存器的定义,注意一定要加对位置,是在S3C24X0_CLOCK_POWER这个结构体中不然编译时会报错,


 122 typedef struct {

 123     S3C24X0_REG32   LOCKTIME;

 124     S3C24X0_REG32   MPLLCON;

 125     S3C24X0_REG32   UPLLCON;

 126     S3C24X0_REG32   CLKCON;

 127     S3C24X0_REG32   CLKSLOW;

 128     S3C24X0_REG32   CLKDIVN;

 129 #if defined(CONFIG_S3C2440)

 130     S3C24X0_REG32   CAMDIVN;

 131 #endif

 132 

 133 } /*__attribute__((__packed__))*/ S3C24X0_CLOCK_POWER;

(11)修改u-boot-2008.10/drivers/rtc/s3c24x0_rtc.c


 31 #if (defined(CONFIG_CMD_DATE))

 32 

 33 #if defined(CONFIG_S3C2400)

 34 #include

 35 #elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)

 36 #include

 37 #endif

6.修改mini2440的机器id  /includes/asm-arm/mach-types.h


1860 #define MACH_TYPE_MINI2440             1999

[1] [2]
关键字:mini2440  uboot  移植 引用地址:基于mini2440的uboot移植(一)

上一篇:s3c2440之ADC 触摸屏操作
下一篇:基于mini2440的boa服务器移植

推荐阅读最新更新时间:2024-11-11 10:32

Windows下u-boot-2011.03在Mini2440移植详解(4)
增加Nand Flash的支持 参考网址: http://blog.csdn.net/zhaocj/article/details/6678866 http://blog.csdn.net/zhaocj/article/details/6709948 Nand flash的移植,网上说的很多。作者参考的是上面的两个网址,关于ECC的内容还没有校验。 网址http://my.oschina.net/fzliu/blog/33642,http://blog.chinaunix.net/uid-14833587-id-76512.html和http://blog.sina.com.cn/s/blog_640029b3
[单片机]
Windows下u-boot-2011.03在<font color='red'>Mini2440</font><font color='red'>移植</font>详解(4)
uboot启动后在内存中运行裸机程序hello
如题,实现过程中发现3额问题,先写下来,待解答: 1、uboot启动后再dnw上打印许多信息,我想改变其中的打印信息或加上自己的打印信息以证明程序运行到何处。修改完后重新编译uboot.bin。 在DNW下执行dnw 50008000 USB下载uboot.bin到内存50008000处, go 50008000,从内存50008000处运行我刚下载的程序,发现我修改的内容并未显示。 重新执行dnw 50008000,nand erase 0 100000,nand write.uboot 50008000 0 100000,后从nand直接启动,发现我修改的内容被打印出来了。 总结:可能的原因:1、程序下载到50008000
[单片机]
TQ2440上移植RT3070AP过程
  硬件: TQ2440 ,USB RT3070   编译环境:ubuntu、TQ提供的EABI-4.3.3、网上下载的2010_0203_RT3070_SoftAP_v2.4.0.1_DPA包   配置好编译环境,解压2010_0203_RT3070_SoftAP_v2.4.0.1_DPA   移植过程:   1、修改配置相关文件   进入2010_0203_RT3070_SoftAP_v2.4.0.1_DPA   下面有3个文件夹MODULE、NETIF、UTIL   分别修改3个Makefile文件   将PLATFORM = SMDK打开,其他注释掉   然后配置平台,LINUX_SRC
[单片机]
移植Python3到TQ2440(二)
在上一篇博文中我们用NFS挂载根文件系统的方式启动了系统,接下来我们把移植了Python3的根文件系统固化到NandFlash中,但是由于linux-4.9目前不支持Yaffs2文件系统,所以我们用Jiffs2文件系统。 下面我们分为几部分: 1、移植mtd-utils工具 2、固化根文件系统到NandFlash中 3、支持Telnet 平台 硬件:TQ2440 64MB内存 256MB NandFlash bootloader:U-Boot 2015.04 kernel:linux-4.9 Python: Python-3.6.0 工具链:arm-none-linux-gnueabi-gcc 4.8.3 一、移植mt
[单片机]
STM32f103 USB移植之USB标准描述符
在对USB协议进行学习和移植的过程有个东西不可避免,肯定会遇到,那就是USB的设备描述符。这个东西始终在usb协议中发挥作用,从设备的枚举到设备的配置,都是由usb描述符进行修改的。今天在移植的时候这个整理了一下usb描述符有关的知识。 /********************************************不啰嗦的分割线***********************************************/ 参考资料:深入浅出USB系统开发——基于ARM Cortex-M3 王川北 刘强 圈圈教你玩usb http://www.openedv.com/thread-10971-1-1.html
[单片机]
STM32f103 USB<font color='red'>移植</font>之USB标准描述符
LCD驱动程序移植
2.6.14的内核,按照网上的帖子,要做的工作量不是很大,现在先整理一下思路,我们从硬件开始,我用的LCD型号是LTV350QV-F04。320×240,这里的320×240是像素点数,其中320是水平方向,240是垂直方向。控制信号我们先不去管它,我们先来看一下数据线,也就是RGB(red green and blue)线,此处的硬件连接决定了LCD的BPP,16BPP或24BPP,我的开发板上采用的是5:6:5的16BPP的连接。关于BPP和连线的关系可以参考2410手册的387~390页。 接下来要配置和LCD相关的寄存器,这部分配置要参考2410的p397开始的关于LCD控制寄存器的说明。以下代码是网上一位大侠做的
[单片机]
μC/OS-Ⅱ在MSP430F149上的移植
μC/OS-Ⅱ是一个源代码公开的嵌入式实时操作系统(RTOS),该操作系统理论上最多可以管理64个任务,一般应用时需要留出8个任务给系统本事使用,因此用户的应用程序最多可以有56个任务,μC/OS-Ⅱ的内核为完全可剥夺型实时内核,即系统总是运行就绪条件下优先级最高的任务,并支持信号量、邮箱、消息队列等多种进程间通讯机制,同时用户可以根据需求通过条件编译实现对内核中的功能模块的裁剪,此外μC/OS-Ⅱ还具有可固化、中断管理、高稳定性和可靠性等特点,因此将μC/OS-Ⅱ移植到微处理器(MCU)上, 对于缩减产品开发和升级周期,提高可靠性和稳定性,降低成本方面有着重要的意义。以下主要讨论嵌入式实时操作系统μC/OS-Ⅱ在MSP430F1
[单片机]
μC/OS-Ⅱ在MSP430F149上的<font color='red'>移植</font>
Linux 蓝牙系列 -- ARM-Linux蓝牙工具的移植
一 内核修改 ------------------------------------------------------------ 将内核的蓝牙做成模块形式。 并配置如下, Bluetooth subsystem support --- L2CAP protocol support SCO links support RFCOMM protocol support RFCOMM TTY support BNEP protocol support HIDP protocol support (NEW) Bluetooth d
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved