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

  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, =0xff000fffbic 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, =<constant-expression>,将<constant-expression>放入 r1 中,可以是地址,这里所用为伪汇编

  

  bic语法格式为 BIC{<cond>}{S} <Rd>,<Rn>,<shifter_operand>,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_NANDmov r0, #0x1000bl  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, #12mov fp, #0          /* no previous frame, so fp=0 */mov r9, #0x1000bl  copy_uboot_to_ram3:  tst     r0, #0x0bne copy_failedldr r0, =0x0c000000ldr r1, _TEXT_PHY_BASE
1:  ldr r3, [r0], #4ldr r4, [r1], #4teq r3, r4bne compare_failed  /* not matched */subs    r9, r9, #4bne 1b4:  mov lr, r10     /* all is OK */mov pc, lrcopy_failed:nop         /* copy from nand failed */b   copy_failedcompare_failed:nop         /* compare failed */b   compare_failed

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

 

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

  代码如下

#include <common.h>#ifdef CONFIG_S3C64XX#include <asm/io.h>#include <linux/mtd/nand.h>#include <asm/arch/s3c6410.h>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<<page_shift)){nandll_read_page(buf, i, large_block);}}else{for (i = 0; i < (0x3c000>>page_shift); i++, buf+=(1<<page_shift)){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 0x04NFCONT_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 0x08NFCMD_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 0x0CNFADDR_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 0x50000000CONFIG_SYS_PHY_UBOOT_BASE = 0x57e0 00000x3 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*/
//#define CONFIG_SYS_MALLOC_LEN         (CONFIG_ENV_SIZE + 1024 * 1024)
#define CONFIG_SYS_MALLOC_LEN           (CONFIG_ENV_SIZE + 512 * 1024)

  10、修改开机延迟时间

#define CONFIG_BOOTDELAY    3

  11、设置SDRAM大小

//#define PHYS_SDRAM_1_SIZE 0x08000000 /* 128 MB in Bank #1 */
#define PHYS_SDRAM_1_SIZE 0x10000000 /* 256 MB in Bank #1 */
/* 后面的大小自己设定 这里是256MB的SDRAM */
 12、修改SDROM大小
//#define CONFIG_SYS_MEMTEST_END        (CONFIG_SYS_SDRAM_BASE + 0x7e00000) /* 126MB in DRAM */
#define CONFIG_SYS_MEMTEST_END      (CONFIG_SYS_SDRAM_BASE + 0x9e00000) /* 256MB in DRAM */

  13、PWM设置

//#define CONFIG_SYS_HZ         1000
#define CONFIG_SYS_HZ           1562500

  14、堆栈大小

/*-----------------------------------------------------------------------* Stack sizes** The stack sizes are set up in start.S using the settings below*/
//#define CONFIG_STACKSIZE  0x40000     /* regular stack 256KB */
#define CONFIG_STACKSIZE    0x80000     /* regular stack 512KB */

  15、环境变量空间

//#define CONFIG_ENV_SIZE       0x4000  /* Total Size of Environment Sector */
#define CONFIG_ENV_SIZE     0x80000 /* Total Size of Environment Sector */

  16、环境变量偏移地址

//#define CONFIG_ENV_OFFSET     0x0040000
#define CONFIG_ENV_OFFSET       0x0080000

  17、BOOTCOMMAND

  更改后的内容为

#ifdef CONFIG_ENABLE_MMU
#define CONFIG_SYS_MAPPED_RAM_BASE      0xc0000000
#define CONFIG_BOOTCOMMAND      "nand read 0xc0008000 0x100000 0x500000;" \"bootm 0xc0008000"
#else
#define CONFIG_SYS_MAPPED_RAM_BASE      CONFIG_SYS_SDRAM_BASE
#define CONFIG_BOOTCOMMAND      "nand read 0x50008000 0x100000 0x500000;" \"bootm 0x50008000"
#endif

  

  然后开始添加内容到u-boot.lds,在目录cpu/arm1176/还有uboot根目录下面都有

  完善如下代码段

    . = ALIGN(4);.text :{   cpu/arm1176/start.o (.text)cpu/arm1176/s3c64xx/cpu_init.o (.text)board/samsung/smdk6410/lowlevel_init.o (.text)cpu/arm1176/nand_cp.o (.text)lib_arm/board.o (.text)*(.text)}   

  添加内容到u-boot-nand.lds,在目录/board/samsung/smdk6410中

  完善如下代码

        . = ALIGN(4);.text      :{cpu/arm1176/start.o     (.text)cpu/arm1176/s3c64xx/cpu_init.o  (.text)board/samsung/smdk6410/lowlevel_init.o  (.text)cpu/arm1176/nand_cp.o   (.text)lib_arm/board.o (.text)*(.text)}

  接着就可以回到根目录进行make了。

  然后就可以看到你的uboot正式运转了…、

 

 

 

 

 

 

 

  

 

 

 

转载于:https://www.cnblogs.com/plinx/archive/2013/04/11/2963823.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/494147.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[修订版]”大脑“爆发背后是50年互联网架构重大变革

前言&#xff1a;面对即将到来的2019年&#xff0c;互联网诞生50年将是诸多纪念活动中重要的一个&#xff0c;经过50年的发展&#xff0c;互联网究竟发生什么重要的变化&#xff0c;通过这篇文章试图进行一次总结&#xff0c;也提前向互联网50年致敬。作者&#xff1a;刘锋 互…

智慧城市建设:科技创业的下一个浪潮

来源&#xff1a;资本实验室随着全球城市化进程的加速&#xff0c;越来越多的人涌进城市&#xff0c;这为城市建设带来了一系列的挑战&#xff1a;一方面&#xff0c;城市需要面对大量的越来越老化的基础设施&#xff1b;另一方面&#xff0c;需要为新涌入的城市居民提供新的&a…

Android之ViewDragHelper

在自定义ViewGroup中&#xff0c;很多效果都包含用户手指去拖动其内部的某个View(eg:侧滑菜单等)&#xff0c;针对具体的需要去写好onInterceptTouchEvent和onTouchEvent这两个方法是一件很不容易的事&#xff0c;需要自己去处理&#xff1a;多手指的处理、加速度检测等等。 好…

DARPA人工智能技术研究情况一览

来源&#xff1a;一体化指挥调度国家工程实验室、高端装备发展研究中心摘要&#xff1a;20世纪60年代初&#xff0c;DARPA&#xff08;当时为ARPA&#xff09;开始介入自主技术研究&#xff0c;并很快成为该领域的主要研究机构。DARPA意识到&#xff0c;人工智能可以满足大量的…

深入“肠-脑”神经高速通道,揭开“第六感觉”面纱

来源&#xff1a;中国生物技术网直觉是什么&#xff1f;通常被描述为超感官的第六感觉&#xff0c;它在英文里直译就是肠道感觉。肠道作为“第二大脑”的事实已经家喻户晓了。如果你曾在重要的演讲前感到心慌恶心&#xff0c;或者在一顿大餐后感到头昏眼花&#xff0c;那就是肠…

Andoird自定义ViewGroup实现竖向引导界面

一般进入APP都有欢迎界面&#xff0c;基本都是水平滚动的&#xff0c;今天和大家分享一个垂直滚动的例子。 先来看看效果把&#xff1a; 首先是布局文件&#xff1a; <com.example.verticallinearlayout.VerticalLinearLayout xmlns:android"http://schemas.android.…

科技|全球首款飞行汽车开始量产!下月开始预售,2023年后或可实现一键打“飞车”...

来源&#xff1a; 世界科技创新论坛飞机与汽车结合的产物真的要来了。在2018全球未来出行大会上&#xff0c;吉利副总裁杨学良透露&#xff0c;由吉利控股的全资子公司、全球首家飞行汽车公司美国太力飞行汽车公司推出的“全球首款量产飞行汽车”——Transition&#xff0c;将于…

Android手势锁实现

最终效果如下 整体思路 a、自定义了一个RelativeLayout(GestureLockViewGroup)在里面会根据传入的每行的个数&#xff0c;生成多个GestureLockView&#xff08;就是上面一个个小圈圈&#xff09;&#xff0c;然后会自动进行布局&#xff0c;里面的宽度&#xff0c;间距&#x…

智能连接:5G与人工智能、物联网等技术的超级融合

来源&#xff1a;资本实验室随着新技术的成熟&#xff0c;新型的、先进的应用将来自5G、人工智能&#xff08;AI&#xff09;和物联网&#xff08;IoT&#xff09;的融合。这种融合将创造出一个智能连接的世界&#xff0c;对所有个人、行业、社会和经济产生积极影响。从现在到2…

一个绚丽的loading动效分析与实现!

最终效果如下 从效果上看&#xff0c;我们需要考虑以下几个问题&#xff1a; 1.叶子的随机产生&#xff1b; 2.叶子随着一条正余弦曲线移动&#xff1b; 3.叶子在移动的时候旋转&#xff0c;旋转方向随机&#xff0c;正时针或逆时针&#xff1b; 4.叶子遇到进度条&#xff…

20岁的谷歌,和它“最成功”的大败笔

来源&#xff1a;大数据文摘编译&#xff1a;张驰、JIN、涂世文、钱天培谷歌20岁了&#xff01;20年中&#xff0c;谷歌打造了无数或成功或流产的产品&#xff0c;其中&#xff0c;这一名为“谷歌光纤”计划的失败或许是它最“成功”的“大败笔”。2010年&#xff0c;谷歌宣布了…

自定义viewgroup实现ArcMenu

最终效果如下 实现思路 通过效果图&#xff0c;会有几个问题&#xff1a; a、动画效果如何实现 可以看出动画是从顶点外外发射的&#xff0c;可能有人说&#xff0c;那还不简单&#xff0c;默认元素都在定点位置&#xff0c;然后TraslateAnimation就好了&#xff1b;这样忽略…

也谈谈Atiyah关于黎曼猜想的证明

来源&#xff1a;潇轩社作者&#xff1a;叶扬波 著名数学家&#xff0c;美国爱荷华大学教授。作为数论学家&#xff0c;他在中国大陆出版有《迹公式与模形式》等专著。以下是他谈Atiyah关于黎曼猜想的证明的文章&#xff0c;观点专业而且独到&#xff0c;转载此文&#xff0c;…

大型Javascript应用架构的模式(译文)

附上翻译好的word文件 http://files.cnblogs.com/lizhug/Patterns_For_Large-Scale_JavaScript_Application_Architecture.zip 作者&#xff1a;Addy Osmani 技术评审&#xff1a;Andree Hansson 翻译&#xff1a;李珠刚 珠刚参上 今天我们将要探讨一系列用于大型Javascri…

Animation Property Animation 使用

本篇主要讲Animation 和 Property Animation的使用&#xff0c;最后会讲QQ管家桌面火箭作为例子&#xff1a; 在Android中开发动效有两套框架可以使用&#xff0c;分别为 Animation 和 Property Animation&#xff1b; 相对来说&#xff0c;Animator比Animation要强大太多&…

华为云力推“普惠AI”,EI智能体正在落地行业

来源&#xff1a;北京物联网智能技术应用协会云计算和人工智能是什么关系&#xff1f;一般认为&#xff0c;云计算是人工智能的基础之一。而华为云则认为&#xff0c;要推动人工智能的落地&#xff0c;拥有“算法、算力和数据”还是不足够的&#xff0c;还需要“行业智慧”&…

Android中mesure过程详解

我们在编写layout的xml文件时会碰到layout_width和layout_height两个属性&#xff0c;对于这两个属性我们有三种选择&#xff1a;赋值成具体的数值&#xff0c;match_parent或者wrap_content&#xff0c;而measure过程就是用来处理match_parent或者wrap_content&#xff0c;假如…

黑科技揭秘 | 阿里云“天空物联网”连接范围如何达到700平方公里

来源&#xff1a;阿里云还记得前不久在2018杭州云栖大会上&#xff0c;由飞在天上的飞艇、地下基站共同搭建的阿里云“天空物联网”吗&#xff1f;它实现从地面40000米高空到地下20米的覆盖&#xff0c;并持续为大会服务。体现了持续加码的阿里巴巴物联网战略。在飞艇背后&…

JAVA-用栈机制实现单词逆序排列

就是IO那一段还没学到。 之前的PUCH,POP,STRING和CHAR的关系搞得懂了。 学到一个定位STRING当中CHAR的转换函数。 char String.charAt(x) 1 import java.io.*;2 3 4 class stackString5 {6 private int maxSize;7 private char[] stackX;8 private int top;9 …

Android自定义实现FlowLayout

实现FlowLayout 何为FlowLayout&#xff0c;如果对Java的Swing比较熟悉的话一定不会陌生&#xff0c;就是控件根据ViewGroup的宽&#xff0c;自动的往右添加&#xff0c;如果当前行剩余空间不足&#xff0c;则自动添加到下一行。有点所有的控件都往左飘的感觉&#xff0c;第一…