嵌入式Linux之我行——u-boot-2009.08在2440上的移植详解(一)

发布者:tnzph488最新更新时间:2016-04-27 来源: eefocus关键字:Linux  u-boot 手机看文章 扫描二维码
随时随地手机看文章
一、移植环境

二、移植步骤

本次移植的功能特点包括:

  • 支持Nand Flash读写
  • 支持从Nor/Nand Flash启动
  • 支持CS8900或者DM9000网卡 
  • 支持Yaffs文件系统 
  • 支持USB下载(还未实现)

1. 了解u-boot主要的目录结构和启动流程,如下图。

 
 
嵌入式Linux之我行——u-boot-2009.08在2440上的移植详解(一) <wbr>转
 
    u-boot的stage1代码通常放在cpu/xxxx/start.S文件中,他用汇编语言写成;
    u-boot的stage2代码通常放在lib_xxxx/board.c文件中,他用C语言写成。
    各个部分的流程图如下:
 
嵌入式Linux之我行——u-boot-2009.08在2440上的移植详解(一) <wbr>转
 
 
2. 建立自己的开发板项目并测试编译。
   目前u-boot对很多CPU直接支持,可以查看board目录的一些子目录,如:board/samsung/目录下就是对三星一些ARM处理器的支持,有smdk2400、smdk2410和smdk6400,但没有2440,所以我们就在这里建立自己的开发板项目。
 
1)因2440和2410的资源差不多,主频和外设有点差别,所以我们就在board/samsung/下建立自己开发板的项目,取名叫my2440

#tar -jxvf u-boot-2009.08.tar.bz2    //解压源码
#cd u-boot-2009.08/board/samsung/    //进入目录
#mkdir my2440                        //创建my2440文件夹

 
2)因2440和2410的资源差不多,所以就以2410项目的代码作为模板,以后再修改

#cp -rf smdk2410

start_code:
    
    mrs    r0,cpsr
    bic    r0,r0,#0x1f
    orr    r0,r0,#0xd3
    msr    cpsr,r0

    bl coloured_LED_init  //此处两行是对AT91RM9200DK开发板上的LED进行初始化的
    bl red_LED_on

 

 

由此可以看到,start_code处才是u-boot启动代码的真正开始处。以上就是u-boot的stage1入口的过程。

2)my2440开发板u-boot的stage1阶段的硬件设备初始化。
由于在u-boot启动代码处有两行是AT91RM9200DK的LED初始代码,但我们my2440上的LED资源与该开发板的不一致,所以我们要删除或屏蔽该处代码,再加上my2440的LED驱动代码(注:添加my2440 LED功能只是用于表示u-boot运行的状态,给调试带来方便,可将该段代码放到任何你想调试的地方),代码如下:

    

 

#if defined(CONFIG_S3C2440)  //区别与其他开发板

//根据mini2440原理图可知LED分别由S3C2440的PB5、6、7、8口来控制,以下是PB端口寄存器基地址(查2440的DataSheet得知)
#define GPBCON 0x56000010
#define GPBDAT 0x56000014
#define GPBUP  0x56000018    

    //以下对寄存器的操作参照S3C2440的DataSheet进行操作
    ldr r0, =GPBUP
    ldr r1, =0x7FF    //即:二进制11111111111,关闭PB口上拉
    str r1, [r0]

    ldr r0, =GPBCON   //配置PB5、6、7、8为输出口,对应PBCON寄存器的第10-17位
    ldr r1, =0x154FD  //即:二进制010101010011111101
    str r1, [r0]

    ldr r0, =GPBDAT
    ldr r1, =0x1C0    //即:二进制111000000,PB5设为低电平,6、7、8为高电平
    str r1, [r0] 

#endif

//此段代码使u-boot启动后,点亮开发板上的LED1,LED2、LED3、LED4不亮

 

在include/configs/my2440.h头文件中添加CONFIG_S3C2440宏

#gedit include/configs/my2440.h

#define CONFIG_ARM920T           
#define CONFIG_S3C2410           
#define CONFIG_SMDK2410          
#define CONFIG_S3C2440           

 

现在编译u-boot,在根目录下会生成一个u-boot.bin文件。然后我们利用mini2440原有的supervivi把u-boot.bin下载到RAM中运行测试(注意:我们使用supervivi进行下载时已经对CPU、RAM进行了初始化,所以我们在u-boot中要屏蔽掉对CPU、RAM的初始化),如下:

/*#ifndef CONFIG_SKIP_LOWLEVEL_INIT //在start.S文件中屏蔽u-boot对CPU、RAM的初始化
   bl cpu_init_crit
#endif*/

#make my2440_config

#make

 

下载运行后可以看到开发板上的LED灯第一了亮了,其他三个熄灭,测试结果符合上面的要求。终端运行结果如下:
嵌入式Linux之我行——u-boot-2009.08在2440上的移植详解(一) <wbr>转

3)在u-boot中添加对S3C2440一些寄存器的支持、添加中断禁止部分和时钟设置部分。
由于2410和2440的寄存器及地址大部分是一致的,所以这里就直接在2410的基础上再加上对2440的支持即可,代码如下:

#gedit cpu/arm920t/start.S

#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
    /* turn off the watchdog */

if defined(CONFIG_S3C2400)
# define pWTCON     0x15300000
# define INTMSK     0x14400008    /* Interupt-Controller base addresses */
# define CLKDIVN    0x14800014    /* clock divisor register */
#else  //下面2410和2440的寄存器地址是一致的
# define pWTCON     0x53000000
# define INTMSK     0x4A000008    /* Interupt-Controller base addresses */
# define INTSUBMSK  0x4A00001C
# define CLKDIVN    0x4C000014    /* clock divisor register */
endif

    ldr  r0, =pWTCON
    mov  r1, #0x0
    str  r1, [r0]

    /*
     mask all IRQs by setting all bits in the INTMR default
     */
    mov  r1, #0xffffffff
    ldr  r0, =INTMSK
    str  r1, [r0]
if defined(CONFIG_S3C2410)
    ldr  r1, =0x3ff
    ldr  r0, =INTSUBMSK
    str  r1, [r0]
endif
if defined(CONFIG_S3C2440)//添加s3c2440的中断禁止部分
    ldr  r1, =0x7fff        //根据2440芯片手册,INTSUBMSK寄存器有15位可用   

    ldr  r0, =INTSUBMSK
    str  r1, [r0]
endif

if defined(CONFIG_S3C2440)   //添加s3c2440的时钟部分

#define MPLLCON   0x4C000004   //系统主频配置寄存器基地址

#define UPLLCON   0x4C000008   //USB时钟频率配置寄存器基地址 
    ldr  r0, =CLKDIVN          //设置分频系数FCLK:HCLK:PCLK = 1:4:8
    mov  r1, #5
    str  r1, [r0]

 

    ldr  r0, =MPLLCON  //设置系统主频为405MHz 

    ldr  r1, =0x7F021  //这个值参考芯片手册“PLL VALUE SELECTION TABLE”部分

    str  r1, [r0]

 

    ldr  r0, =UPLLCON  //设置USB时钟频率为48MHz 

    ldr  r1, =0x38022  //这个值参考芯片手册“PLL VALUE SELECTION TABLE”部分

    str  r1, [r0]

else //其他开发板的时钟部分,这里就不用管了,我们现在是做2440的

    /* FCLK:HCLK:PCLK 1:2:4 */
    /* default FCLK is 120 MHz */  

    ldr  r0, =CLKDIVN
    mov  r1, #3
    str  r1, [r0]

# endif
#endif    /* CONFIG_S3C2400 || CONFIG_S3C2410 || CONFIG_S3C2440 */

 

S3C2440的时钟部分除了在start.S中添加外,还要分别在board/samsung/my2440/my2440.c和cpu/arm920t/s3c24x0/speed.c中修改或添加部分代码,如下:

#gedit board/samsung/my2440/my2440.c //设置主频和USB时钟频率参数与start.S中的一致

#define FCLK_SPEED       //设置默认等于2,即下面红色代码部分有效

#if FCLK_SPEED==0          
#define M_MDIV    0xC3
#define M_PDIV    0x4
#define M_SDIV    0x1
#elif FCLK_SPEED==1        
#define M_MDIV    0xA1
#define M_PDIV    0x3
#define M_SDIV    0x1
#elif FCLK_SPEED==2        
#define M_MDIV    0x7F     //这三个值根据S3C2440芯片手册“PLL VALUE SELECTION TABLE”部分进行设置
#define M_PDIV    0x2
#define M_SDIV    0x1
#endif

#define USB_CLOCK        //设置默认等于2,即下面红色代码部分有效

#if USB_CLOCK==0
#define U_M_MDIV    0xA1
#define U_M_PDIV    0x3
#define U_M_SDIV    0x1
#elif USB_CLOCK==1
#define U_M_MDIV    0x48
#define U_M_PDIV    0x3
#define U_M_SDIV    0x2
#elif USB_CLOCK==2         
#define U_M_MDIV    0x38   //这三个值根据S3C2440芯片手册“PLL VALUE SELECTION TABLE”部分进行设置
#define U_M_PDIV    0x2
#define U_M_SDIV    0x2
#endif

 

 

#gedit cpu/arm920t/s3c24x0/speed.c //根据设置的分频系数FCLK:HCLK:PCLK = 1:4:8修改获取时钟频率的函数

static ulong get_PLLCLK(int pllreg)
{
    S3C24X0_CLOCK_POWER const clk_power S3C24X0_GetBase_CLOCK_POWER();
    ulong r, m, p, s;

    if (pllreg == MPLL)
    clk_power->MPLLCON;
    else if (pllreg == UPLL)
    clk_power->UPLLCON;
    else
    hang();

    ((r 0xFF000) >> 12) 8;
    ((r 0x003F0) >> 4) 2;
    0x3;

#if defined(CONFIG_S3C2440)
    if(pllreg == MPLL)
      //参考S3C2440芯片手册上的公式:PLL=(2 * m * Fin)/(p * 2s)
        return((CONFIG_SYS_CLK_FREQ 2) (p << s));
    }
#endif

    return((CONFIG_SYS_CLK_FREQ m) (p << s));
}


ulong get_HCLK(void)
{
    S3C24X0_CLOCK_POWER const clk_power S3C24X0_GetBase_CLOCK_POWER();

#if defined(CONFIG_S3C2440)
    return(get_FCLK()/4);
#endif

    return((clk_power->CLKDIVN 0x2) get_FCLK()/2 get_FCLK());
}

 

好了!修改完毕后我们再重新编译u-boot,然后再下载到RAM中运行测试。结果终端有输出信息并且出现类似Shell的命令行,这说明这一部分移植完成。示意图如下: 
嵌入式Linux之我行——u-boot-2009.08在2440上的移植详解(一) <wbr>转


关键字:Linux  u-boot 引用地址:嵌入式Linux之我行——u-boot-2009.08在2440上的移植详解(一)

上一篇:嵌入式Linux之我行——u-boot-2009.08在2440上的移植详解(三)
下一篇:嵌入式Linux之我行——S3C2440上LCD驱动(FrameBuffer)实例开发讲解

推荐阅读最新更新时间:2024-03-16 14:51

s3c2440内存类设备访问原理
在嵌入式里面所谓内存类接口有SDRAM接口,NORFLASH接口,DM9000网卡接口等 ,他们都有一个共同点就是可以直接连S3C2440内存控制器,数据总线,地址总线;这三者缺一不可。 内存类接口可以通过地址直接访问内部数据,当然他们都有自己的一段可访问的地址范围。S3C2440将其1G地址空间划分为8个bank,每个bank有128M,所以芯片提供了8个片选信号线,每个片选信号线对应一个bank,一个片选信号连接一个设备,所以每个设备可访问的地址的范围是128M空间,128M=2的27次方个字节,所以芯片上面的地址线只有27跟,最大只能到A26。理论上32位的CPU应该有32跟地址线,因为最大可以到0xffffffff=2
[单片机]
s3c<font color='red'>2440</font>内存类设备访问原理
2440串口linux编程,S3C2440串口通讯的相关配置
UART配置的相关寄存器如下(按s3c2440手册中的顺序列出): 1.ULCONn寄存器:线性控制寄存器 功能:设置奇偶校验,停止位, 数据位(5-8位) 注意:一般设置为无校验,一个停止位,数据位为8位,也就是常说的“8N1”,此时寄存器值为0x3。(bit =0为正常模式,否则为红外模式); 2.UCONn寄存器:通道n控制器 功能:选择UART时钟源、设置UART中断方式 注意:可选择PCLK、UEXTCLK或FCLK/n。bit =1为回送模式,用于测试;bit 和bit 分别控制传输和接收模式,初学者常设置为中断请求或查询模式,bit =bit =01。 3.UFCONn寄存器:FIFO控制寄存器 功能:用于设
[单片机]
2440裸机编程之五 定时器
S3C2440A 具有5 个16 位定时器,每个定时器可以按照中断模式或DMA 模式工作。定时器0,1,2,3 具有PWM 功能。定时器4 是一个内部定时器,不具有对外输出口线。定时器0 还具有死区发生器,通常用于大电流设备。 定时器特性总结如下。 ● 5 个16 位定时器可以工作在中断模式或DMA 模式。 ● 包括2 个8 位预分频器、2 个4 位分割器。 ● 输出波形的占空比可用编程控制(即进行脉宽调制)。 ● 具有自动重载模式或单次触发模式。 ● 具有死区发生器。 与定时器相关的寄存器有:TCFG0、TCFG1、TCON、TCMPBn、TCNTBn、TCNTOn 定时器的频率由PCLK分频而来,即Ftimer = P
[单片机]
<font color='red'>2440</font>裸机编程之五 定时器
嵌入式Linux学习笔记之——代码重定位002_链接脚本的引入
① NOR启动: ② nand 启动: 上次讲到的g_char不能按照程序正确输出的原因是nor启动的时候g_char在nor flash中,其不可写的特性决定了输出结果。 现在能否修改Makefile让nor启动时讲代码拷贝到SDRAM中,这样就可以实现全局变量的可读可写了。 现在想在nor flash启动的时候将其中的代码段拷贝至SDRAM中0地址起始的空间,将全局变量g_char拷贝至0x30000000起始的空间。 编译之后发现.bin文件变成了800M,805306369-- 0x30000001,符合程序中的g_char所占1字节的设置。 但是nor flash一共才2M,不可实现。 解决方
[单片机]
嵌入式<font color='red'>Linux</font>学习笔记之——代码重定位002_链接脚本的引入
基于嵌入式Linux流媒体播放器系统软硬件解决方案
摘要:本系统选用TQ2440 开发板作为硬件平台,采用嵌入式Linux 操作系统给出流媒体播放器系统具体的软硬件解决方案,设计了一款基于嵌入式Linux 的机顶盒媒体播放器。完成了其与网络接口的实现,通过TS 流的解析实现,提供了对主流的MPEG- 2、MPEG- 4、H.264 等格式文件的支持。该系统具有良好的可移植性和可扩展性,能够满足不断变化的市场需求。   1 引言   计算机多媒体技术和网络技术飞速发展使得基于流媒体的多媒体应用也被运用在多种领域,特别是网络可视电话、远程监控、视频点播领域。伴随着计算机多媒体压缩技术的成熟和网络传输技术的发展,开发实时可靠、多功能、数字化、操作简单的基于计算机网络通讯技术和多媒体应
[模拟电子]
基于嵌入式<font color='red'>Linux</font>流媒体播放器系统软硬件解决方案
使用JLink间接烧写S3C2410、S3C2440开发板Nor、Nand Flash的方法
1. 简要说明 JLink的调试功能、烧写Flash的功能都很强大,但是对于S3C2410、S3C2440的Flash操作有些麻烦:烧写Nor Flash时需要设置SDRAM,否则速率很慢;烧写Nand Flash只是从理论上能够达到,但是还没有人直接实现这点。 本文使用一个间接的方法来实现对S3C2410、S3C2440开发板的Nor、Nand Flash的烧写。原理为:JLink可以很方便地读写内存、启动程序,那么可以把一个特制的程序下载到开发板上的SDRAM去,并运行它,然后使用这个程序来烧写。 2. 操作步骤 2.1 连接硬件 对于大多数的S3C2410、S3C2440开发板而言,它们所用的JTAG接口一般有3种(
[单片机]
使用JLink间接烧写S3C2410、S3C<font color='red'>2440</font>开发板Nor、Nand Flash的方法
嵌入式Linux平台的GPS数据采集研究
随着GPS(全球定位系统)和便携移动设备的飞速发展,各种各样以GPS为基础的便携式定位系统相继出现.嵌入式Linux以其开放性、安全性、健壮性和 稳定性越来越成为各种便携设备的主要开发平台,因此GPS模块与嵌入式Linux平台之间的通信成了实现定位系统的基础. GPS模块与嵌入式Linux平台之间进行数据传送,大多采用异步串行传送方式,GPS作为终端设备(DTE)与嵌入式平台之间通过RS-232C串行通 信接口进行数据交换.因此,与GPS的数据通信在实现上即是LinuX下的串口编程,对于两者之间的通信协议,可选的协议有很多种,而NMEA0183是 目前普遍采用的一种。 1 NMEA0183通信协议 NMEA0183是G
[测试测量]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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