zoukankan      html  css  js  c++  java
  • uboot2010.03 移植篇(二)修改start.S,支持nand启动 .

    参考:http://blog.csdn.net/yyttiao/article/details/7961381

    ----------------------------------------------------------
    使用环境
    PC:     Centos5.4

    kernel: 3.0.1

    corss:  arm-linux-gcc 4.4.1

    arm:    s3c6410
    uboot:  uboot-2010-03
    ----------------------------------------------------------


    uboot的第一阶段,其实做的事情也是比较多的,,但是一般来说,重点就是配置各种硬件环境,来保证第二阶段能正常启动.
    而该部分根据不同的硬件也是不同的..像我的,s3c6410有2片dram,和一片nand..所以我为了保证我的代码能正常执行,
    我必须得把代码搬移到内存里面去.不然代码在nand中也没法执行...但是为什么代码在nand中不能执行呢?其中一个比较
    重要的原因就是nand并不是挂在CPU总线上面的,而是采用专门的硬件处理单元来控制的...nand控制器.
    在你不添加任何代码的情况下,是不能控制外围的nand芯片的...但是怎么办.cpu内根本没有代码,怎么才能读取nand中的
    代码到内存中去呢?没错-----s3c6410在启动的时候会帮我们以nand的最基本的时序.搬移nand中的前8K代码,到stepping
    这样就可以执行了.而uboot的代码远比这个大..以至于我们得紧靠这部分代码,来完成剩下的代码部分的搬移....

    今天的重点就是这个了.主要是来完成nand中剩余部分的uboot搬移到ram中,以便uboot能正常启动起来....好了.直接开始..

    首先,你得有smdk6410_config 编译目标,不然怎么开始.....此处省略N字...请看我的移植篇第一篇...

    下面开始.打开start.S (cpu/arm1176/start.S)和smdk6410.h (include/configs/smdk6410.h)
    我们得一边参看头文件中的配置,一边修改代码,来达到我们的目的..
    start.S 中,最开始就是一段啥?异常向量表,此处忽略,请参考分析篇中对start.S的分析

    前面一部分是MMU啥的...直接招待after_copy:这个标签
    什么?之前没有任何copy的东西???怎么有after_copy一说呢?
    没错..所以我们得把copy代码添加在这里..从nand中把数据搬移出来,放到这之前完成,这样才对得起这个after_copy的标签
    说干就干,这里我是调用的C代码,你也可以用汇编来完成的,只要功能一样就行了

    图片转文字

     ldr r0, =0xff000fff
     bic r1, pc, r0
     ldr r2, _TEXT_BASE
     bic r2, r2, r0
     cmp r1, r2
     beq     after_copy
    #ifdef CONFIG_NAND_BOOT
     mov r0, #0x1000
     bl copy_from_nand
    #endif


    这里我们得向我们的配置头文件内添加一个宏,就是 #define CONFIG_NAND_BOOT
    接着,我们要去添加我们要调用的copy_from_nand
    这个文件比较大,分析篇我会重点分析,究竟nand是如何搬移数据的. 在cpu/arm1176/下创建个文件nand_cp.c,这里我们只要复制下好了,

    1. #include <common.h>   
    2. #ifdef CONFIG_S3C64XX   
    3. #include <asm/io.h>   
    4. #include <linux/mtd/nand.h>   
    5. #include <asm/arch/s3c6400.h>  
    6.   
    7. static int nandll_read_page(uchar * buf, ulong addr, int large_block)  
    8. {  
    9.     int i;  
    10.     int page_size = 512;  
    11.   
    12.     if (large_block == 1)  
    13.         page_size = 2048;  
    14.     if (large_block == 2)  
    15.         page_size = 4096;  
    16.   
    17.     NAND_ENABLE_CE();  
    18.   
    19.     NFCMD_REG = NAND_CMD_READ0;  
    20.   
    21.     /* Write Address */  
    22.     NFADDR_REG = 0;  
    23.   
    24.     if (large_block)  
    25.         NFADDR_REG = 0;  
    26.   
    27.     NFADDR_REG = (addr) & 0xff;  
    28.     NFADDR_REG = (addr >> 8) & 0xff;  
    29.     NFADDR_REG = (addr >> 16) & 0xff;  
    30.   
    31.     if (large_block)  
    32.         NFCMD_REG = NAND_CMD_READSTART;  
    33.   
    34.     NF_TRANSRnB();  
    35.   
    36.     /* for compatibility(2460). u32 cannot be used. by scsuh */  
    37.     for (i = 0; i < page_size; i++) {  
    38.         *buf++ = NFDATA8_REG;  
    39.     }  
    40.   
    41.     NAND_DISABLE_CE();  
    42.     return 0;  
    43. }  
    44.   
    45. static int nandll_read_blocks(ulong dst_addr, ulong size, int large_block)  
    46. {  
    47.     uchar *buf = (uchar *) dst_addr;  
    48.     int i;  
    49.     uint page_shift = 9;  
    50.   
    51.     if (large_block == 1)  
    52.         page_shift = 11;  
    53.   
    54.     /* Read pages */  
    55.     if (large_block == 2)  
    56.         page_shift = 12;  
    57.   
    58.     if (large_block == 2) {  
    59.         /* Read pages */  
    60.         for (i = 0; i < 4; i++, buf += (1 << (page_shift - 1))) {  
    61.             nandll_read_page(buf, i, large_block);  
    62.         }  
    63.         /* Read pages */  
    64.         for (i = 4; i < (0x60000 >> page_shift);i++, buf += (1 << page_shift)) {  
    65.             nandll_read_page(buf, i, large_block);  
    66.         }  
    67.     } else {  
    68.         for (i = 0; i < (0x60000 >> page_shift);i++, buf += (1 << page_shift)) {  
    69.             nandll_read_page(buf, i, large_block);  
    70.         }  
    71.     }  
    72.   
    73.     return 0;  
    74. }  
    75.   
    76. int copy_uboot_to_ram(void)  
    77. {  
    78.     int large_block = 0;  
    79.     int i;  
    80.     vu_char id;  
    81.   
    82.     NAND_ENABLE_CE();  
    83.     NFCMD_REG = NAND_CMD_READID;  
    84.     NFADDR_REG = 0x00;  
    85.   
    86.     /* wait for a while */  
    87.     for (i = 0; i < 200; i++) ;  
    88.         id = NFDATA8_REG;  
    89.     id = NFDATA8_REG;  
    90.   
    91.     if (id > 0x80)  
    92.         large_block = 1;  
    93.     if (id == 0xd5)  
    94.         large_block = 2;  
    95.   
    96.     /* read NAND Block. 
    97.      * 128KB ->240KB because of U-Boot size increase. by scsuh 
    98.      * So, read 0x3c000 bytes not 0x20000(128KB). 
    99.      */  
    100.     return nandll_read_blocks(CONFIG_SYS_PHY_UBOOT_BASE, 0x60000,large_block);  
    101. }  
    102.   
    103. #endif  

    然后修改Makefile 把我们的nand_cp.c添加到uboot中去编译

    最后make下.你会发现.编译好了....编译器记得重新make smdk6410_config下.因为我们修改了头文件,需要重新生成.mk文件

    今天的任务基本完成了,今天比较轻松,接着我们稍微修改下smdk6410.h中的配置.
    主要是改几个名字,把什么6400的改成6410就好了..
    没错,你只要查找替换就行了...因为我们现在编译的已经是6410了.不是6400了...

    修改完之后,有一个地方得稍微改下.


    cpu/arm1176/s3c64xx/Makefile



    6400改成64XX因为,我们的配置文件里面已经没有6400了....
    这个请查看头文件中的配置定义...


    finish,thanks

  • 相关阅读:
    关系数据理论之第三范式
    关系数据理论之第二范式
    关系数据理论之第一范式
    排序之外部排序
    排序之选择排序
    排序之希尔排序
    排序之基数排序
    排序之计数排序
    排序之堆排序
    排序之归并排序
  • 原文地址:https://www.cnblogs.com/start530/p/3834394.html
Copyright © 2011-2022 走看看