<var id="fnfpo"><source id="fnfpo"></source></var>
<rp id="fnfpo"></rp>

<em id="fnfpo"><object id="fnfpo"><input id="fnfpo"></input></object></em>
<em id="fnfpo"><acronym id="fnfpo"></acronym></em>
  • <th id="fnfpo"><track id="fnfpo"></track></th>
  • <progress id="fnfpo"><track id="fnfpo"></track></progress>
  • <tbody id="fnfpo"><pre id="fnfpo"></pre></tbody>

  • x
    x
    查看: 9711|回復: 10
    打印 上一主題 下一主題

    uboot移植到an2410全記錄

    [復制鏈接]
    跳轉到指定樓層
    樓主
    發表于 2009-12-21 00:45:20 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
    關鍵詞: uboot , 記錄 , 移植
    這段時間一直在學習uboot,從閱讀源代碼到開始動手移植。這塊an2410跟smdk2410幾乎
    一樣,所以移植起來參照include/configs/下的smdk2410.h,不會太復雜。移植成功后
    再回頭看看原來的調試過程,才發現犯的錯誤都挺離譜的。今天重新解壓了一份
    開凈的u-boot源代碼移植到板子上,并將整個過程記錄下來,以供備忘,也給正在
    an2410上移植uboot的朋友做個參考。


    下面僅記錄移植步驟及改動的地方,關于代碼細節可參考網上的相關文章。下面兩篇是我閱讀代碼的一點記錄
    http://blog.chinaunix.net/u3/93566/showart_2097734.html
    http://blog.chinaunix.net/u3/93566/showart_2097507.html

    目標板: an2410-ssb (阿南的板子)
    移植重點: 從nand flash啟動 k9f1208
              這塊板子上沒有nor flash
    others: 網卡芯片 cs8900a
            sdram 64M 2塊ks562632

    uboot版本 : u-boot-1.3.4

    移植步驟:

    1. 在board下建立an2410文件夾,這里直接將board/smdk2410 復制為 board/an2410

    2. 在頂層的Makefile里添加如下兩行(可先搜索smdk2410,然后再其上添加)
            an2410_config:    unconfig
                    @$(MKCONFIG) $(@:_config=) arm arm920t an2410 NULL s3c24x0
       同時搜索CROSS_COMPILE,并修改其下面arm對應相的交叉編譯路徑

    3. 將include/configs/smkd2410.h 復制為 include/configs/an2410.h

    4. 修改cpu/arm920t/start.S,這個文件是uboot代碼的匯編部分,其中修改的有以下幾
    個部分

    (1)

    ====上面是設置時鐘分頻比====
        /*
         * we do sys-critical inits only at reboot,
         * not when booting from ram!
         */
    #ifndef CONFIG_SKIP_LOWLEVEL_INIT
    這里加上下面三句,主要目的是調試的時候用,在調試的時候,是把uboot直接加載到
    sdram上去,所以就不需要設置sdram,這里的3句會檢測是否是調試狀態,若是則跳過
            adr     r0, _start /* 加載此時的啟始地址到r0 */
            ldr     r1, _TEXT_BASE /* 加載默認的連接地址到r1 */
            cmp     r0, r1 /* 若r0與r1相等,則說明此時是在ram上,否則,是從
                            * nand上啟動,需要重新設定sdram
                            */
        blne    cpu_init_crit
    #endif

    (2) 緊接著上面,這里要先設置芯片的時鐘。在uboot里,原來設置cpu時鐘是在
    start_armboot里,即board_init里。這里提前設置時鐘,cpu也會跑快些
    由于設置時鐘用的C函數,所以把堆棧的設置提前了
            /*
             * Setup the stack,下面調用C函數之前,先設置棧指針
             */
    stack_setup:
        ldr    r0, _TEXT_BASE    /* upper 128 KiB: relocated uboot */
        sub    r0, r0, #CFG_MALLOC_LEN    /* malloc area */
        sub    r0, r0, #CFG_GBL_DATA_SIZE /* bdinfo */
    #ifdef CONFIG_USE_IRQ
        sub    r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
    #endif
        sub    sp, r0, #12    /* leave 3 words for abort-stack */

    #ifndef CFG_SKIP_LOWLEVEL_INIT
            bl      clock_init /* 現在就設置時鐘頻率 */
    #endif

    (3) 設置nand ,由于下面馬上就要從nand上copy代碼了,所以這里先設置nand,代碼參考
    vivi中的head.S,這里加了一個預定義CFG_BOOT_FROM_NAND,所以在an2410.h中需要定義


    #if CFG_BOOT_FROM_NAND
    #define NAND_CTL_BASE 0x4e000000
    #define oNFCONF 0x00
    #define oNFCMD  0x04
    #define oNFSTAT 0x10
            mov     r1, #NAND_CTL_BASE
            ldr     r2, =0xf830    @ configure nand flash
            str     r2, [r1, #oNFCONF]
            ldr     r2, [r1, #oNFCONF]
            bic     r2, r2, #0x800 @ enable chip
            str     r2, [r1, #oNFCONF]
            mov     r2, #0xff      @ reset command
            strb    r2, [r1, #oNFCMD]
            mov     r3, #0         @ wait
    1:
            add     r3, r3, #0x1
            cmp     r3, #0xa
            blt     1b
    2:
            ldr     r2, [r1, #oNFSTAT]
            tst     r2, #0x1      @ wait ready
            beq     2b
            ldr     r2, [r1, #oNFCONF]
            orr     r2, r2, #0x800  @ disable chip
            str     r2, [r1, #oNFCONF]
    #endif

    (3) 復制代碼,nand_read_ll同樣也是取自于vivi
    其中需要有修改的地方,見patch
    #ifndef CONFIG_SKIP_RELOCATE_UBOOT
    relocate:            /* relocate U-Boot to RAM */
        adr    r0, _start    /* r0 <- current position of code */
        ldr    r1, _TEXT_BASE    /* test if we run from flash or RAM */
        cmp     r0, r1          /* don't reloc during debug */
    /*    beq     stack_setup */  /* 之前已經設置了棧指針 */
            beq     clear_bss

        ldr    r2, _armboot_start
        ldr    r3, _bss_start
        sub    r2, r3, r2    /* r2 <- size of armboot */
    #if CFG_BOOT_FROM_NAND
            bl      nand_read_ll    /* 將u-boot從nand復制到ram */
    #else
        add    r2, r0, r2    /* r2 <- source end address */


    5. 修改 board/an2410/lowlevel_init.S

    #define B3_BWSCON        (DW16 + UBLB) /* CS8900A*/

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

    6. 添加board/an2410/nand_boot.c , 其中有兩個函數 nand_read_ll, 這個是取自
    vivi,用來復制代碼;另一個是clock_init, 用來初始化cpu時鐘
    代碼見patch

    7. 修改 board/an2410/Makefile ,去掉flash.o ,添加nand_boot.o

    #COBJS    := smdk2410.o flash.o
    COBJS    := smdk2410.o nand_boot.o

    8. 由于clock_init已經設置了時鐘,所以在board/an2410/smdk2410.c中的
    board_init函數里去掉時鐘初始化相關部分

    9. 修改an2410.h,其中有多處要修改的

    增加下面幾行
    #define CONFIG_JFFS2_CMDLINE 1
    #define CONFIG_JFFS2_NAND 1
    #define MTDIDS_DEFAULT "nand0=nandflash0"
    #define MTDPARTS_DEFAULT ""

    /* 下面增加幾個命令 */
    #define CONFIG_CMD_JFFS2
    #define CONFIG_CMD_NAND
    #define CONFIG_CMD_REGINFO
    #define CONFIG_CMD_PING

    #define CONFIG_BOOTDELAY    3
    #define CONFIG_BOOTARGS    "noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0"
    #define CONFIG_ETHADDR    08:00:3e:26:0a:5b
    #define CONFIG_NETMASK          255.255.255.0
    #define CONFIG_IPADDR        192.68.0.10
    #define CONFIG_SERVERIP        192.168.0.100

    參數taglist
    #define CONFIG_SETUP_MEMORY_TAGS 1
    #define CONFIG_CMDLINE_TAG 1
    #define CONFIG_BOOTCOMMAND    "nand read.jffs2 0x30007fc0 kernel; bootm 0x30007fc0"

    去掉flash
    #define CFG_NO_FLASH 1
    //#define CONFIG_AMD_LV400    1    /* uncomment this if you have a LV400 flash */
    #if 0
    #define CONFIG_AMD_LV800    1    /* uncomment this if you have a LV800 flash */
    #endif

    環境變量都保存在nand里
    //#define    CFG_ENV_IS_IN_FLASH    1
    #define    CFG_ENV_IS_IN_NAND      1
    #define CFG_ENV_SIZE    0x10000    /* Total Size of Environment Sector */
    #define CFG_ENV_OFFSET  0x40000

    #define CFG_NAND_BASE   0
    #define CFG_MAX_NAND_DEVICE 1
    #define CFG_MAX_NAND_CHIP 1
    #define CFG_BOOT_FROM_NAND 1



    主要的修改就是上面的了,uboot的可移植非常好,所以只要幾步就可以移植到特定的開
    方板上。啟動信息如下(沒有開debug, 沒有內核)

    U-Boot 1.3.4 (Dec 21 2009 - 00:08:13)

    DRAM:  64 MB
    NAND:  64 MiB
    In:    serial
    Out:   serial
    Err:   serial
    Hit any key to stop autoboot:  0

    NAND read: device 0 offset 0x60000, size 0x200000

    Reading data from 0x25fe00 -- 100% complete.
    2097152 bytes read: OK
    Wrong Image Format for bootm command
    ERROR: can't get kernel image!
    an2410 >


    uboot.tar (160 KB)
    patch.tar (50 KB)
    沙發
     樓主| 發表于 2009-12-21 00:53:09 | 只看該作者
    uboot.tar里是生成的u-boot.bin可燒到nand里

    patch.tar是生成的patch,可在u-boot-1.3.4目錄里打patch

    ps:怎么論壇里加了這么多的廣告!且篇幅很大!
    板凳
    發表于 2010-7-9 22:54:01 | 只看該作者
    不錯啊,偶正在移植u-boot,正好參考一下
    地板
    發表于 2010-9-25 22:02:50 | 只看該作者
    不錯啊
    地下室
    發表于 2010-9-29 19:23:28 | 只看該作者
    學習學習!
    6
    發表于 2010-10-3 12:18:44 | 只看該作者
    學習學習!
    7
    發表于 2011-4-26 10:30:39 | 只看該作者
    謝謝
    8
    發表于 2011-4-26 10:31:09 | 只看該作者
    學習學習
    9
    發表于 2011-4-28 10:39:07 | 只看該作者
    10
    發表于 2012-2-25 11:15:08 | 只看該作者
    瞧瞧了
    11
    發表于 2012-3-7 14:37:03 | 只看該作者
    學習了
    您需要登錄后才可以回帖 登錄 | 立即注冊

    本版積分規則

    關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
    電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
    快速回復 返回頂部 返回列表
    精品一区二区三区自拍图片区_国产成人亚洲精品_亚洲Va欧美va国产综合888_久久亚洲国产精品五月天婷