S3C6410移植u-boot-2010.3(2)基本的启动信息修改

发布者:MindfulBeing最新更新时间:2024-09-03 来源: cnblogs关键字:S3C6410  移植  u-boot 手机看文章 扫描二维码
随时随地手机看文章

  1、启动模块修改


  进入/cpu/arm1176/目录,修改start.S文件


  首先找到需要修改的CONFIG_NAND_SPL汇编原码,修改如下:


#ifndef CONFIG_NAND_SPL

/*

 * flush v4 I/D caches

 */

mov r0, #0

mcr p15, 0, r0, c7, c7, 0 /* flush v3/v4 cache */

mcr p15, 0, r0, c8, c7, 0 /* flush v4 TLB */

/*

 * disable MMU stuff and caches

 */

mrc p15, 0, r0, c1, c0, 0

bic r0, r0, #0x00002300 @ clear bits 13, 9:8 (--V- --RS)

bic r0, r0, #0x00000087 @ clear bits 7, 2:0 (B--- -CAM)

orr r0, r0, #0x00000002 @ set bit 2 (A) Align

orr r0, r0, #0x00001000 @ set bit 12 (I) I-Cache

//将原来之间的内容删除

mcr p15, 0, r0, c1, c0, 0

#endif


  检索到“lowlevel_init”


  添加如下内容,功能看注释


    /* when we already run in ram, we don't need to relocate U-Boot.

     * and actually, memory controller must be configured before U-Boot

     * is running in ram.

     */

    

     ldr    r0, =0xff000fff

  

     bic r1, pc, r0      /* r0 <- current base addr of code */

     ldr r2, _TEXT_BASE      /* r1 <- original base addr in ram */

     bic r2, r2, r0      /* r0 <- current base addr of code */

     cmp     r1, r2                  /* compare r0, r1                  */

     beq     after_copy      /* r0 == r1 then skip flash copy   */


  此处顺便温习arm汇编


  ldr汇编码与伪汇编码区别在于是否有“=”号


  ldr汇编为  ldr  r1, [r2], 将 r2 当作地址放入 r1 寄存器,而intel与at&t汇编的mov指令是无法对地址直接操作的。


  ldr伪汇编为 ldr  r1, =,将放入 r1 中,可以是地址,这里所用为伪汇编


  


  bic语法格式为 BIC{}{S} ,,,shifter_operand取反后,和Rn与运算,值传回Rd


  bic一般用于清零处理:


  1、此处若系统从nandflash中启动,则pc小于4k,取反、与运算后,将0传给r1


  此处_TEXT_BASE可能为0x57e00000或者0c7e00000,取反、与运算后,将0x00e00000传回r2


  beq相等则跳转指令,此处 r1,r2不相等,故不跳转,继续往下执行


  


  2、此处若系统从ram中启动,则此处的pc应该与_TEXT_BASE相等,故直接跳转至after_copy(复制


完成)处运行。


   紧接着前面的代码添加下面一段代码:


#ifdef CONFIG_BOOT_NAND

    mov r0, #0x1000

    bl  copy_from_nand

#endif

  此处的 bl 为调用子程序,接着上面的是因为未复制完成从新跳回 copy_from_nand 从新复制nandflash


  然后找到_mmu_table_base,在它的#endif之后,添加如下代码,即上面所跳转的目标代码


/*

 * copy U-Boot to SDRAM and jump to ram (from NAND or OneNAND)

 * r0: size to be compared

 * Load 1'st 2blocks to RAM because U-boot's size is larger than 1block(128k) size

 */

    .globl copy_from_nand

copy_from_nand:

    mov r10, lr     /* save return address */


    mov r9, r0

    /* get ready to call C functions */

    ldr sp, _TEXT_PHY_BASE  /* setup temp stack pointer */

    sub sp, sp, #12

    mov fp, #0          /* no previous frame, so fp=0 */

    mov r9, #0x1000

    bl  copy_uboot_to_ram


3:  tst     r0, #0x0

    bne copy_failed


    ldr r0, =0x0c000000

    ldr r1, _TEXT_PHY_BASE

1:  ldr r3, [r0], #4

    ldr r4, [r1], #4

    teq r3, r4

    bne compare_failed  /* not matched */

    subs    r9, r9, #4

    bne 1b


4:  mov lr, r10     /* all is OK */

    mov pc, lr


copy_failed:

    nop         /* copy from nand failed */

    b   copy_failed


compare_failed:

    nop         /* compare failed */

    b   compare_failed


  至此,start.S文件修改完成。


 


  接着在/cpu/arm1176/目录下添加一个nand_cp.c文件


  代码如下


#include


#ifdef CONFIG_S3C64XX


#include


#include


#include




static int nandll_read_page (uchar *buf, ulong addr, int large_block)


{


    int i;


    int page_size = 512;


    /* 2K */


    if (large_block==1)


        page_size = 2048;


    /* 4K */


    if (large_block==2)


        page_size = 4096;


    NAND_ENABLE_CE();


    NFCMD_REG = NAND_CMD_READ0;


    /* Write Address */


    NFADDR_REG = 0;


    if (large_block)


        NFADDR_REG = 0;


    NFADDR_REG = (addr) & 0xff;


    NFADDR_REG = (addr >> 8) & 0xff;


    NFADDR_REG = (addr >> 16) & 0xff;


    


    if (large_block)


        NFCMD_REG = NAND_CMD_READSTART;




    NF_TRANSRnB();


    


    /* for compatibility(2460). u32 cannot be used. by scsuh */


    for(i=0; i < page_size; i++)


    {


        *buf++ = NFDATA8_REG;


    }


    


    NAND_DISABLE_CE();


    return 0;


}


static int nandll_read_blocks (ulong dst_addr, ulong size, int large_block)


{


    uchar *buf = (uchar *)dst_addr;


    int i;


    uint page_shift = 9;


    if (large_block==1)


        page_shift = 11;


    /* Read pages */


    if(large_block==2)


        page_shift = 12;


    if(large_block == 2)


    {


        /* Read pages */


        for (i = 0; i < 4; i++, buf+=(1<<(page_shift-1)))


        {


            nandll_read_page(buf, i, large_block);


        }


        /* Read pages */


        /* 0x3c000 = 11 1100 0000 0000 0000 */


        for (i = 4; i < (0x3c000>>page_shift); i++, buf+=(1<

        {


            nandll_read_page(buf, i, large_block);


        }


    }


    else


    {


        for (i = 0; i < (0x3c000>>page_shift); i++, buf+=(1<

        {


            nandll_read_page(buf, i, large_block);


        }


    }


    return 0;


}


int copy_uboot_to_ram(void)


{


    int large_block = 0;


    int i;


    vu_char id;


    /*


#define NAND_ENABLE_CE() (NFCONT_REG &= ~(1 << 1))


#define NFCONT_REG


__REG(ELFIN_NAND_BASE + NFCONT_OFFSET)


#define __REG(x) (*((volatile u32 *)(x)))


#define ELFIN_NAND_BASE 0x70200000


#define NFCONT_OFFSET 0x04


NFCONT_REG = ( *( (volatile u32 *) (0x70200004) ) )


NFCONT 0x70200004 读/写NAND Flash 控制寄存器


[0]1:NAND Flash 控制器使能


     */


    NAND_ENABLE_CE();


    /*


#define NFCMD_REG


__REG(ELFIN_NAND_BASE + NFCMMD_OFFSET)


#define ELFIN_NAND_BASE 0x70200000


#define NFCMMD_OFFSET 0x08


NFCMD_REG = ( *( (volatile u32 *) (0x70200008) ) )


NFCMMD 0x70200008 NAND Flash 命令设置寄存器0


#define NAND_CMD_READID 0x90


     */


    NFCMD_REG = NAND_CMD_READID;


    /*


#define NFADDR_REG


__REG(ELFIN_NAND_BASE + NFADDR_OFFSET)


#define ELFIN_NAND_BASE 0x70200000


#define NFADDR_OFFSET 0x0C


NFADDR_REG = ( *( (volatile u32 *) (0x7020000C) ) )


NFADDR 0x7020000C NAND Flash 地址设置寄存器


     */


    NFADDR_REG = 0x00;


    /*


#define NFDATA8_REG


__REGb(ELFIN_NAND_BASE + NFDATA_OFFSET)


#define __REGb(x) (*(vu_char *)(x))


NFDATA8_REG = ( *( (vu_char *) (0x70200010) ) )


NFDATA 0x70200010 读/写NAND Flash 数据寄存器


NAND Flash 读/烧写数据值用于I/O


     */


    /* wait for a while */


    for (i=0; i<200; i++);


    id = NFDATA8_REG;


    id = NFDATA8_REG;


    if (id > 0x80)


        large_block = 1;


    if(id == 0xd5)


        large_block = 2;


    /* read NAND Block.


     * 128KB ->240KB because of U-Boot size increase. by scsuh


     * So, read 0x3c000 bytes not 0x20000(128KB).


     */


    /*


#define CONFIG_SYS_PHY_UBOOT_BASE


(CONFIG_SYS_SDRAM_BASE + 0x07e00000)


#define CONFIG_SYS_SDRAM_BASE 0x50000000


CONFIG_SYS_PHY_UBOOT_BASE = 0x57e0 0000


0x3 c000 = 1M


     */


    return nandll_read_blocks(CONFIG_SYS_PHY_UBOOT_BASE, 0x3c000, large_block);


}


#endif


  然后在/cpu/arm1176/makefile中添加一个依赖到COBJS目标后面

COBJS = cpu.o nand_cp.o

  接着在/nand_spl/board/samsung/smdk6410/Makefile中添加一个依赖到COBJS后面


COBJS   = nand_boot.o nand_ecc.o s3c64xx.o nand_cp.o

  补全规则


# from SoC directory

$(obj)cpu_init.S:

    @rm -f $@

    @ln -s $(TOPDIR)/cpu/arm1176/s3c64xx/cpu_init.S $@

$(obj)nand_cp.c:

    @rm -f $@

    @ln -s $(TOPDIR)/cpu/arm1176/nand_cp.c $@


  接着修改smdk6410.h文件(在/include/configs/目录下):


  1、添加宏定义


#define virt_to_phys(x) virt_to_phy_smdk6410(x)

  2、用户名回显修改


#define CONFIG_SYS_PROMPT  'SMDK6400 #' 

 3、添加smdk6410 ID

 检索到MACH_TYPE,将其注释掉,然后添加smdk6410 ID如下

#define MACH_TYPE       1626

 4、增加NAND config的内容

  添加位置 /* NAND configuration */


#define NAND_DISABLE_CE()(NFCONT_REG |=(1<<1))

#define NAND_ENABLE_CE()(NFCONT_REG &=~(1<<1))

#define NF_TRANSRnB() do{while(!(NFSTAT_REG&(1<<0)));}while(0)

  5、NAND flash 大小


//#define PHYS_SDRAM_1_SIZE 0x08000000  /* 128 MB in Bank #1    */

#define PHYS_SDRAM_1_SIZE   0x10000000  /* 256 MB in Bank #1    */

  6、NAND flash块大小


/* NAND chip block size     */

//#define CONFIG_SYS_NAND_BLOCK_SIZE    (128 * 1024)

#define CONFIG_SYS_NAND_BLOCK_SIZE  (512 * 1024)

  7、NAND flash页大小


/* NAND chip page size      */

//#define CONFIG_SYS_NAND_PAGE_SIZE 2048

#define CONFIG_SYS_NAND_PAGE_SIZE   4096

 8、位校验

/* NAND chip page per block count  */

//#define CONFIG_SYS_NAND_PAGE_COUNT    64

#define CONFIG_SYS_NAND_PAGE_COUNT  128

 9、更改内存分配空间

/*

 * Size of malloc() pool

[1] [2]
关键字:S3C6410  移植  u-boot 引用地址:S3C6410移植u-boot-2010.3(2)基本的启动信息修改

上一篇:S3C6410移植u-boot-2010.3(3)正常化配置
下一篇:S3C6410移植u-boot

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

net-snmp移植到arm
关于net-snmp的移植,是基于静态编译的,动态的没有做成功,在arm上的移植过程大致如下: 如果没有涉及到扩展agent,则蓝色字体不需要理会。 1.将源码包另找一个路径放下,解压 tar -xzvf net-snmp-5.4.1.tar.gz, 若想扩展agent,则可以将此模块的.c和.h文件先放到net-snmp-5.4.4/agent/mibgroup下一起配置编译; 例如我这里想用代理读写encoder模块,那么先将写好的encoder源文件复制到net-snmp-5.4.4/agent/mibgroup路径下 ; 2.CC=arm-linux-gcc ./configure --prefix=/home/a
[单片机]
uboot在2440上的移植
Bootloard代码是芯片复位后进入操作系统之前执行的一段代码,主要用于完成由硬件启动到操作系统启动的过渡,从而为操作系统提供基本的运行环境,如初始化CPU、堆栈、储存器系统等。由于Bootloard代码与CPU芯片的内核结构、具体型号、应用系统的配置及使用的操作系统等因素有关,其功能类似与PC机的BIOS。因此不可能有通用的Bootloard,开发时应根据具体的配置进行移植。 为什么我们要用U-BOOT?显然可以将操作系统直接烧入flash中执行,但从软件的升级和程序修补来说则是不可少的。 U-BOOT 目录结构分析: 1. board:开发板相关目录 2. common:通用的命令函数 3. cpu:特定
[单片机]
美首例机器人肝移植手术成功
移植外科医生阿迪尔·汗医学博士正在控制手术机器人。图片来源:圣路易斯华盛顿大学 据美国圣路易斯华盛顿大学医学院官网报道,该院一个外科团队今年5月完成了美国第一例机器人肝脏移植手术。术后一个月,患者不仅行走自如,还恢复了一定的运动能力。此次成功意味着微创机器人手术的优势扩展到了肝脏移植领域,可实现更小切口、更少疼痛和更快恢复,并且具备最有挑战性的腹部手术之一所需的精确度。 大多数移植手术无论是通过腹腔镜还是机器人进行,都过于复杂,不能采用微创方法,而肝脏移植尤其具有挑战性。患病的肝脏在手术切除过程中容易出血过多,而将新肝脏连接到患者的循环系统需要将几个微小的血管精细地缝合在一起。 此次的机器人手术是一种微创手术。外科医生保持对机
[医疗电子]
美首例机器人肝<font color='red'>移植</font>手术成功
OpenHarmony瘦设备内核移植实战(一)
背景 在各行各业存在很多不同的智能设备,每个设备都使用芯片去实现不同的业务场景需求。本文将以常用的STM32F407ZG芯片为例,介绍OpenHarmony瘦设备内核移植方法,希望能对热爱OpenHarmony的开发小伙伴有所帮助。 认识芯片架构、Soc、开发板 芯片架构是指芯片的内部器件构造以及对应的指令集,比如PC使用的英特尔i7或者AMD的R7-4800都是x86架构,手机使用的骁龙8Gen2芯片使用的则是ARM架构。 SoC是指具体的芯片架构实现,芯片厂商针对不同的应用场景开发出的芯片各不相同,但要符合架构定义,比如STM32F470就会有不同的定制版本,有些Flash会大一些,有些则是芯片封装或者引脚数
[单片机]
OpenHarmony瘦设备内核<font color='red'>移植</font>实战(一)
OK6410A 开发板 (三) 25 u-boot-2021.01 boot 解析 U-boot 内存命令 md
md.b $address $count (从地址$address处显示$count个字节的数据 b=byte,字节,8位) md.w $address $count (从地址$address处显示$count个字的数据 w=word,字 ,16位) md.l $address $count (从地址$address处显示$count个双字的数据 l=long,双字,32位) 内存里的数据 = tftp 51000000 2led_c.bin dm9000 i/o: 0x18000300, id: 0x90000a46 DM9000: running in 16 bit mode MAC: 76:c5:cb:38
[单片机]
linux串口终端ttySAC,Linux串口终端驱动——S3C6410平台
1、serial文件夹下Kconfig分析 config SERIAL_SAMSUNG tristate Samsung SoC serial support depends on ARM && PLAT_S3C select SERIAL_CORE help Support for the on-chip UARTs on the Samsung S3C24XX series CPUs,为支持三星的片上UARTs控制器 providing /dev/ttySAC0, 1 and 2 (note, some machines may not provide all of these ports, depending on how
[单片机]
stm32之nRF24L01无线模块(1):SPI2到SPI1的移植
本来要接着写滴答定时器的,但是趁热打铁写下SPI2到SPI1的移植。 为什么SPI2到SPI1的移植要放在nRF24L01模块里写呢,因为无线模块最重要的数据传输就是通过SPI实现的。为什么需要移植呢,因为即使是一个厂家的板子,不同型号之间它的无线模块引脚也有可能是不同的,顺便稿下移植,加深下理解。SPI2移植到SPI1呢,自己做的时候遇到了一些问题,就从遇到的问题顺便讲下初始化。 1.引脚问题 看stm32的手册,不知道为什么,无论在GPIO还是在SPI里都没有看到这个引脚的问题(初学者有可能移植的时候可能纳闷为什么是这些引脚),只有在引脚复用AFIO那里才提了一下,如下图 这样才知道SPI1的引脚,但是
[单片机]
stm32之nRF24L01无线模块(1):SPI2到SPI1的<font color='red'>移植</font>
【GD32 MCU 移植教程】2、从 GD32F303 移植到 GD32F503
1. 前言 GD32E503 系列是 GD 推出的 Cortex_M33 系列产品,该系列资源上与 GD32F303 兼容度非常高,本应用笔记旨在帮助您快速将应用程序从 GD32F303 系列微控制器移植到 GD32E503 系列微控制器。 2. 引脚兼容性 GD32F303 与 GD32E503 在相同封装下是 Pin To Pin 兼容的。但由于 GD32E503 较 GD32F303多了 SHRTIMER、SQPI 功能,所以两者引脚定义有细微差别,如下表所示: 表 1 GD32F303 系列和 GD32E503 系列引脚区别 3. 内部资源兼容性 下表给出了 GD32F303 与 GD32F503 的资源对比总览(
[单片机]
【GD32 MCU <font color='red'>移植</font>教程】2、从 GD32F303 <font color='red'>移植</font>到 GD32F503
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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