U-Boot移植

发布者:电子创意达人最新更新时间:2024-07-10 来源: elecfans关键字:u-boot  移植  s3c2440 手机看文章 扫描二维码
随时随地手机看文章

1. 安装韦东山的虚拟版的ubuntu 9, 里面交叉编译啥的都弄好了, 直接用, 然后把workstation共享目录打开, 指向uboot的压缩包所在目录.

2. 在虚拟机上, 打开ssh, 通过ssh, 进/mnt/hgfs/ 把uboot压缩包解压了.

 

3. 编辑Makefile, 在smdk2400下面增加两行, 注意要好tab键

smdk2400_config    :    unconfig
    @$(MKCONFIG) $(@:_config=) arm arm920t smdk2400 NULL s3c24x0

tx2440_config :         unconfig
    @$(MKCONFIG) $(@:_config=) arm arm920t tx2440 NULL s3c24x0

修改交叉编译命令如红色部分:

ifeq ($(ARCH),arm)
CROSS_COMPILE = arm-linux-

 

4. 把board目录下的除smdk2140目录其他全删了, 然后把smdk2140改名成tx2440

进去tx2440, 修改一下smdk2140.c改成tx2440.c

然后用vi, 修改board_init, 增加时钟的有关注释, 如下:

/* S3C2440: Mpll,Upll = (2*m * Fin) / (p * 2^s)
 * m = M (the value for divider M)+ 8, p = P (the value for divider P) + 2
 */
#define S3C2440_MPLL_400MHZ     ((0x7f<<12)|(0x02<<4)|(0x01))
#define S3C2440_UPLL_48MHZ      ((0x38<<12)|(0x02<<4)|(0x02))
#define S3C2440_CLKDIV          0x05    /* FCLK:HCLK:PCLK = 1:4:8 */
 
/* S3C2410: Mpll,Upll = (m * Fin) / (p * 2^s)
 * m = M (the value for divider M)+ 8, p = P (the value for divider P) + 2
 */

#define S3C2410_MPLL_200MHZ     ((0x5c<<12)|(0x04<<4)|(0x00))
#define S3C2410_UPLL_48MHZ      ((0x28<<12)|(0x01<<4)|(0x02))
#define S3C2410_CLKDIV          0x03    /* FCLK:HCLK:PCLK = 1:2:4 */

int board_init (void)
{
    S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
    S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO();
    /* 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;

    /*support both of S3C2410 and S3C2440*/
    if ((gpio->GSTATUS1 == 0x32410000) || (gpio->GSTATUS1 == 0x32410002))
    {
       /*FCLK:HCLK:PCLK = 1:2:4*/
       clk_power->CLKDIVN = S3C2410_CLKDIV;

       /* change to asynchronous bus mod */

        __asm__(    'mrc    p15, 0, r1, c1, c0, 0/n'    /* read ctrl register   */
                    'orr    r1, r1, #0xc0000000/n'      /* Asynchronous         */
                    'mcr    p15, 0, r1, c1, c0, 0/n'    /* write ctrl register  */
                    :::'r1'
                    );

        /* to reduce PLL lock time, adjust the LOCKTIME register */
        clk_power->LOCKTIME = 0xFFFFFF;
        /* configure MPLL */
        clk_power->MPLLCON = S3C2410_MPLL_200MHZ;
        /* some delay between MPLL and UPLL */
        delay (4000);
        /* configure UPLL */
        clk_power->UPLLCON = S3C2410_UPLL_48MHZ;
        /* some delay between MPLL and UPLL */
        delay (8000);
        /* arch number of SMDK2410-Board */

        gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;
    }
    else
    {
       /* FCLK:HCLK:PCLK = 1:4:8 */
        clk_power->CLKDIVN = S3C2440_CLKDIV;
        /* change to asynchronous bus mod */
        __asm__(    'mrc    p15, 0, r1, c1, c0, 0/n'    /* read ctrl register   */
                    'orr    r1, r1, #0xc0000000/n'      /* Asynchronous         */
                    'mcr    p15, 0, r1, c1, c0, 0/n'    /* write ctrl register  */
                    :::'r1'
                    );

        /* to reduce PLL lock time, adjust the LOCKTIME register */
        clk_power->LOCKTIME = 0xFFFFFF;
        /* configure MPLL */
        clk_power->MPLLCON = S3C2440_MPLL_400MHZ;
        /* some delay between MPLL and UPLL */
        delay (4000);
        /* configure UPLL */
        clk_power->UPLLCON = S3C2440_UPLL_48MHZ;
        /* some delay between MPLL and UPLL */
        delay (8000);
        /* arch number of SMDK2440-Board */
        gd->bd->bi_arch_number = MACH_TYPE_S3C2440;
    }

    /* adress of boot parameters */
    gd->bd->bi_boot_params = 0x30000100;
    icache_enable();
    dcache_enable();
    return 0;
}

 

接着修改这个board/tx2440/下面的Makefile

把原来的smdk2410.o改成下面:

COBJS   := tx2440.o flash.o

 

5. 进include/configs/, 把其他的都删掉, 只把smdk2140.h改名为tx2440.h

6. 把cpu/arm920t/config.mk里面-msoft-float注释掉

PLATFORM_RELFLAGS += -fno-strict-aliasing  -fno-common -ffixed-r8
#       -msoft-float

 

7. 用make tx2440_config看看有否:

Configuring for tx2440 board...

 

8. 增加对sdram的支持, 确定board/tx2440/lowlevel_init.s内存映射如下:

#define B1_BWSCON          (DW32)
#define B2_BWSCON          (DW16)
#define B3_BWSCON          (DW16 + WAIT + UBLB)
#define B4_BWSCON          (DW16)
#define B5_BWSCON          (DW16)
#define B6_BWSCON          (DW32)
#define B7_BWSCON          (DW32)

并修改REFCNT为0x4f4

#define REFCNT             0x4f4    /* period=15.6us, HCLK=60Mhz, (2048+1-15.6*60) */

 

9. 修改cpu/arm920t/s3c24X0/speed.c

增加一行:

DECLARE_GLOBAL_DATA_PTR;

增加红色的部分:

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

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

    m = ((r & 0xFF000) >> 12) + 8;
    p = ((r & 0x003F0) >> 4) + 2;
    s = r & 0x3;

/* support both of S3C2410 and S3C2440 */

    if (gd->bd->bi_arch_number == MACH_TYPE_SMDK2410)
        return((CONFIG_SYS_CLK_FREQ * m) / (p << s));
    else
        return((CONFIG_SYS_CLK_FREQ * m * 2) / (p << s));   /* S3C2440 */

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

/* return FCLK frequency */
ulong get_FCLK(void)
{
    return(get_PLLCLK(MPLL));
}

 

同时增加下面的:


/* for s3c2440 */
#define S3C2440_CLKDIVN_PDIVN        (1<<0)
#define S3C2440_CLKDIVN_HDIVN_MASK   (3<<1)
#define S3C2440_CLKDIVN_HDIVN_1      (0<<1)
#define S3C2440_CLKDIVN_HDIVN_2      (1<<1)
#define S3C2440_CLKDIVN_HDIVN_4_8    (2<<1)
#define S3C2440_CLKDIVN_HDIVN_3_6    (3<<1)
#define S3C2440_CLKDIVN_UCLK         (1<<3)

#define S3C2440_CAMDIVN_CAMCLK_MASK  (0xf<<0)
#define S3C2440_CAMDIVN_CAMCLK_SEL   (1<<4)
#define S3C2440_CAMDIVN_HCLK3_HALF   (1<<8)
#define S3C2440_CAMDIVN_HCLK4_HALF   (1<<9)
#define S3C2440_CAMDIVN_DVSEN        (1<<12)


/* return HCLK frequency */

ulong get_HCLK(void)
{
    S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
    unsigned long clkdiv;
    unsigned long camdiv;
    int hdiv = 1;

    /* support both of S3C2410 and S3C2440 */
    if (gd->bd->bi_arch_number == MACH_TYPE_SMDK2410)
        return((clk_power->CLKDIVN & 0x2) ? get_FCLK()/2 : get_FCLK());
    else
    {
        clkdiv = clk_power->CLKDIVN;
        camdiv = clk_power->CAMDIVN;
        /* work out clock scalings */
        switch (clkdiv & S3C2440_CLKDIVN_HDIVN_MASK) {
        case S3C2440_CLKDIVN_HDIVN_1:
            hdiv = 1;
            break;
 
        case S3C2440_CLKDIVN_HDIVN_2:
            hdiv = 2;
            break;

        case S3C2440_CLKDIVN_HDIVN_4_8:
            hdiv = (camdiv & S3C2440_CAMDIVN_HCLK4_HALF) ? 8 : 4;
            break;

        case S3C2440_CLKDIVN_HDIVN_3_6:
            hdiv = (camdiv & S3C2440_CAMDIVN_HCLK3_HALF) ? 6 : 3;
            break;
        }

        return get_FCLK() / hdiv;
    }
}

 

/* return PCLK frequency */

ulong get_PCLK(void)
{
    S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
    unsigned long clkdiv;
    unsigned long camdiv;
    int hdiv = 1;

    /* support both of S3C2410 and S3C2440 */

    if (gd->bd->bi_arch_number == MACH_TYPE_SMDK2410)
        return((clk_power->CLKDIVN & 0x1) ? get_HCLK()/2 : get_HCLK());
    else
    {  
        clkdiv = clk_power->CLKDIVN;
        camdiv = clk_power->CAMDIVN;

        /* work out clock scalings */

        switch (clkdiv & S3C2440_CLKDIVN_HDIVN_MASK) {

        case S3C2440_CLKDIVN_HDIVN_1:
            hdiv = 1;
            break;
 
        case S3C2440_CLKDIVN_HDIVN_2:
            hdiv = 2;
            break;

        case S3C2440_CLKDIVN_HDIVN_4_8:
            hdiv = (camdiv & S3C2440_CAMDIVN_HCLK4_HALF) ? 8 : 4;
            break;

        case S3C2440_CLKDIVN_HDIVN_3_6:
            hdiv = (camdiv & S3C2440_CAMDIVN_HCLK3_HALF) ? 6 : 3;
            break;
        }
        return get_FCLK() / hdiv / ((clkdiv & S3C2440_CLKDIVN_PDIVN)? 2:1);
    }      
}

[1] [2]
关键字:u-boot  移植  s3c2440 引用地址:U-Boot移植

上一篇:TQ2440触摸屏
下一篇:ALSA声卡_从零编写之数据传输(基于优龙FS2410开发板,UDA1341声卡)

推荐阅读最新更新时间:2024-11-11 12:49

tiny4412 串口驱动分析一 --- u-boot中的串口驱动
开发板:tiny4412ADK+S700 4GB Flash 主机:Wind7 64位 虚拟机:Vmware+Ubuntu12_04 u-boot:U-Boot 2010.12 Linux内核版本:linux-3.0.31 Android版本:android-4.1.2 我们以tiny4412为例分析串口驱动,下面我们从u-boot开始分析,然后再分析到Linux。 串口初始化 关于这部分代码流程参考件: tiny4412 u-boot 启动.pdf ,这里主要分析函数:uart_asm_init 在初始化串口驱动之前已经进行了系统时钟以及内存的初始化。下面的代码取自board/samsung/tiny441
[单片机]
tiny4412 串口驱动分析一 --- <font color='red'>u-boot</font>中的串口驱动
S3C2440开发板上BMP图片的显示之三
三、BMP图片显示功能扩展 1、图片显示的功能扩展 (1)能够调整图片的显示区域,比如我准备了一张 480x384的图片,液晶屏大小只有它的九分之一,要通过键盘控制,“看到整张图片”。 (2)能够显示单色、16色、256色、24位真彩色图片。 (3)能够对图片进行缩小显示,比如前面那个480x384的图片,能够缩小比例显示在液晶屏上。这个实现应该不难,但是放大就比较麻烦了,要用到数学上的插值,这个稍微做一下尝试。 2、图片的移动 (1)分析 首先一个要明确的概念,我们所谓“移动图片”,实质不是在移动图片,而是在移动观测图片的 “显示窗口”。 比如一张比显示屏大的图片,现在只显示了上半部分,我们要看它的下半部分,可以按下方向键“
[单片机]
S3c2440裸机程序【1】跑马灯
由JZ2440v2原理图可知: nLED1--- GPF4,nLED2--- GPF5,nLED3--- GPF6 S3C2440芯片手册关于IO口配置: 程序代码: #define GPFCON (*(volatile unsigned long *)0x56000050) #define GPFDAT (*(volatile unsigned long *)0x56000054) #define Led1_On ~(1 4) #define Led1_Off (1 4) #define Led2_On ~(1 5) #define Led2_Off (1 5) #define Led3_On
[单片机]
<font color='red'>S3c2440</font>裸机程序【1】跑马灯
OK6410A 开发板 (三) 16 u-boot-2021.01 boot 解析 U-boot 镜像运行部分 irq
硬件 When an IRQ is detected, the following actions are performed: R14_irq = address of next instruction to be executed + 4 SPSR_irq = CPSR CPSR = 0b10010 /* Enter IRQ mode */ CPSR = 0 /* Execute in ARM state */ /* CPSR is unchanged */ CPSR = 1 /* Disable normal interrupts */ CPSR = 1 /* Disable Imp
[单片机]
S3C2440之UART操作(FIFO中断模式)
3个独立的串口,每一个都可以利用DMA 和中断方式操作。每个包含2个64字节FIFO,一个接,一个发。 非FIFO模式相当于FIFO模式的一个寄存器缓冲模式。 每一个UART有7种状态,overrun错误,校验错误,帧错误,断点,接收缓冲区准备好,发送缓冲区为空,发送移位寄存器为空。 当接收移位寄存器中的数据传给FIFO的时候,且接收的数据触发了Rx FIFO的阀值,Rx中断产生了。 发送器中FIFO的还未发得数据到达Tx FIFO阀值的时候,Tx中断产生了。(我觉得应该理解为:发送器中FIFO发送结束,即为空的时候产生中断。) 功能:在串口上输入16字节,包括回车,然后会把输入的字符回显在串口终端
[单片机]
STM32F407上移植emwin
环境: 主机:WIN8 开发环境:MDK5.13 emwin版本:STemWinLibrary522 mcu: stm32f407VGT6 开发板:安富莱STM32-X3 TFT型号:艾蓝2.8寸TFT,主控芯片:ILI9325 说明: 在STM32F407上移植emwin,驱动屏幕接口为FSMC 移植步骤: 1.MDK新建文件结构: 2.GUIConf.c文件修改 a)增加宏定义: #define GUI_NUMBYTES (1024 * 80) #define GUI_BLOCKSIZE 0x80 b)GUI_X_Config(void)函数中增加语句: GUI_ALLOC_S
[单片机]
STM32F407上<font color='red'>移植</font>emwin
ARM-Linux s3c2440 之中断分析(二)
软件篇: 上一篇文章回顾了s3c2440的中断控制器原理的相关硬件知识,有了这个基础再来分析Linux中的软件分析方式,心里就有底了。面对浩瀚如海的Linux源代码,s3c2440的中断到底是怎样呢,如何处理,如何实现的呢?一步一步来揭开它神秘的面纱吧,当然需要从Linux内核源码入手! 在Linux中start_kernel()时会进行体系结构的初始化:init_IRQ(), 故名思议,其源代码如下: view plain copy void __init init_IRQ(void) { intirq; for(irq = 0; irq NR_IRQS; i
[单片机]
基於tiny4412的Linux內核移植--- 中斷和GPIO學習(2)
平臺 tiny4412 ADK Linux-4.4.4 u-boot使用的U-Boot 2010.12,是友善自帶的,爲支持設備樹和uImage做了稍許改動 平臺 tiny4412 ADK Linux-4.4.4 u-boot使用的U-Boot 2010.12,是友善自帶的,爲支持設備樹和uImage做了稍許改動 我們以控制tiny4412上的LED1和LED2爲例,使用的GPIO是GPM4_0和GPM4_1對應的原理圖如下: datasheet如下: 在samsung的pinctrl驅動中加一些調試用的log: 1 diff --git a/drivers/gpio/gpiolib.c
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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