免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1851 | 回复: 2
打印 上一主题 下一主题

有做过U-BOOT移植的高手进来一下 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-17 21:52 |只看该作者 |倒序浏览
最近在做U-BOOT移植到S3C2410的移植,但是发现编译了U-BOOT-1.2.0下载的开发板上面以后,完全没反应。开发板是没有norflash的,手里也只有一根wiggler,所以也不知道怎么单步调试。所以就想到的传说中的“点灯大法”,就是在/cpu/arm920t/start.S中用汇编写一个死循环,在进行完CPU初始化以后,不断的点亮一个LED,但是发现这样也不成功。实在是没办法了。把start.s中的代码发上来。


  1. #include <config.h>
  2. #include <version.h>

  3. /*
  4. *************************************************************************
  5. *
  6. * Jump vector table as in table 3.1 in [1]
  7. *
  8. *************************************************************************
  9. */

  10. .globl _start
  11. _start:        b       reset
  12.         ldr        pc, _undefined_instruction
  13.         ldr        pc, _software_interrupt
  14.         ldr        pc, _prefetch_abort
  15.         ldr        pc, _data_abort
  16.         ldr        pc, _not_used
  17.         ldr        pc, _irq
  18.         ldr        pc, _fiq

  19. _undefined_instruction:        .word undefined_instruction
  20. _software_interrupt:        .word software_interrupt
  21. _prefetch_abort:        .word prefetch_abort
  22. _data_abort:                .word data_abort
  23. _not_used:                .word not_used
  24. _irq:                        .word irq
  25. _fiq:                        .word fiq

  26.         .balignl 16,0xdeadbeef


  27. /*
  28. *************************************************************************
  29. *
  30. * Startup Code (reset vector)
  31. *
  32. * do important init only if we don't start from memory!
  33. * relocate armboot to ram
  34. * setup stack
  35. * jump to second stage
  36. *
  37. *************************************************************************
  38. */

  39. _TEXT_BASE:
  40.         .word        TEXT_BASE

  41. .globl _armboot_start
  42. _armboot_start:
  43.         .word _start

  44. /*
  45. * These are defined in the board-specific linker script.
  46. */
  47. .globl _bss_start
  48. _bss_start:
  49.         .word __bss_start

  50. .globl _bss_end
  51. _bss_end:
  52.         .word _end

  53. #ifdef CONFIG_USE_IRQ
  54. /* IRQ stack memory (calculated at run-time) */
  55. .globl IRQ_STACK_START
  56. IRQ_STACK_START:
  57.         .word        0x0badc0de

  58. /* IRQ stack memory (calculated at run-time) */
  59. .globl FIQ_STACK_START
  60. FIQ_STACK_START:
  61.         .word 0x0badc0de
  62. #endif


  63. /*
  64. * the actual reset code
  65. */

  66. reset:
  67.         /*
  68.          * set the cpu to SVC32 mode
  69.          */
  70.         mrs        r0,cpsr
  71.         bic        r0,r0,#0x1f
  72.         orr        r0,r0,#0xd3
  73.         msr        cpsr,r0

  74. /* turn off the watchdog */
  75. #if defined(CONFIG_S3C2400)
  76. # define pWTCON                0x15300000
  77. # define INTMSK                0x14400008        /* Interupt-Controller base addresses */
  78. # define CLKDIVN        0x14800014        /* clock divisor register */
  79. #elif defined(CONFIG_S3C2410)
  80. # define pWTCON                0x53000000
  81. # define INTMSK                0x4A000008        /* Interupt-Controller base addresses */
  82. # define INTSUBMSK        0x4A00001C
  83. # define CLKDIVN        0x4C000014        /* clock divisor register */
  84. #endif

  85. #if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)
  86.         ldr     r0, =pWTCON
  87.         mov     r1, #0x0
  88.         str     r1, [r0]

  89.         /*
  90.          * mask all IRQs by setting all bits in the INTMR - default
  91.          */
  92.         mov        r1, #0xffffffff
  93.         ldr        r0, =INTMSK
  94.         str        r1, [r0]
  95. # if defined(CONFIG_S3C2410)
  96.         ldr        r1, =0x3ff
  97.         ldr        r0, =INTSUBMSK
  98.         str        r1, [r0]
  99. # endif

  100.         /* FCLK:HCLK:PCLK = 1:2:4 */
  101.         /* default FCLK is 120 MHz ! */
  102.         ldr        r0, =CLKDIVN
  103.         mov        r1, #3
  104.         str        r1, [r0]
  105. #endif        /* CONFIG_S3C2400 || CONFIG_S3C2410 */

  106.         /*
  107.          * we do sys-critical inits only at reboot,
  108.          * not when booting from ram!
  109.          */
  110. #ifndef CONFIG_SKIP_LOWLEVEL_INIT
  111.         bl        cpu_init_crit
  112. #endif
  113. /*这是我自己加的代码*************************


  114. *****************************************/
  115. #define GPFCON 0x56000050
  116. #define GPFDAT  0x56000054

  117.         mov r1, #0x0100
  118.         ldr   r0,  =GPFCON
  119.         str   r1,[r0]

  120. led:
  121.         mov   r1, #0x10
  122.         ldr   r0,=GPFDAT
  123.         str   r1,[r0]
  124.         nop
  125.         nop
  126.         nop
  127.         nop
  128.         nop
  129.         nop
  130.         nop
  131.         nop
  132.         nop
  133.         nop
  134.         nop
  135.         nop
  136.         nop
  137.         nop
  138.         nop
  139.         nop
  140.         nop
  141.         nop
  142.         mov   r1,#0x00


  143. #ifndef CONFIG_SKIP_RELOCATE_UBOOT
  144. relocate:                                /* relocate U-Boot to RAM            */
  145.         adr        r0, _start                /* r0 <- current position of code   */
  146.         ldr        r1, _TEXT_BASE                /* test if we run from flash or RAM */
  147.         cmp     r0, r1                  /* don't reloc during debug         */
  148.         beq     stack_setup

  149.         ldr        r2, _armboot_start
  150.         ldr        r3, _bss_start
  151.         sub        r2, r3, r2                /* r2 <- size of armboot            */
  152.         add        r2, r0, r2                /* r2 <- source end address         */

  153. copy_loop:
  154.         ldmia        r0!, {r3-r10}                /* copy from source address [r0]    */
  155.         stmia        r1!, {r3-r10}                /* copy to   target address [r1]    */
  156.         cmp        r0, r2                        /* until source end addreee [r2]    */
  157.         ble        copy_loop
  158. #endif        /* CONFIG_SKIP_RELOCATE_UBOOT */

  159.         /* Set up the stack                                                    */
  160. stack_setup:
  161.         ldr        r0, _TEXT_BASE                /* upper 128 KiB: relocated uboot   */
  162.         sub        r0, r0, #CFG_MALLOC_LEN        /* malloc area                      */
  163.         sub        r0, r0, #CFG_GBL_DATA_SIZE /* bdinfo                        */
  164. #ifdef CONFIG_USE_IRQ
  165.         sub        r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
  166. #endif
  167.         sub        sp, r0, #12                /* leave 3 words for abort-stack    */

  168. clear_bss:
  169.         ldr        r0, _bss_start                /* find start of bss segment        */
  170.         ldr        r1, _bss_end                /* stop here                        */
  171.         mov         r2, #0x00000000                /* clear                            */

  172. clbss_l:str        r2, [r0]                /* clear loop...                    */
  173.         add        r0, r0, #4
  174.         cmp        r0, r1
  175.         ble        clbss_l

  176. #if 0
  177.         /* try doing this stuff after the relocation */
  178.         ldr     r0, =pWTCON
  179.         mov     r1, #0x0
  180.         str     r1, [r0]

  181.         /*
  182.          * mask all IRQs by setting all bits in the INTMR - default
  183.          */
  184.         mov        r1, #0xffffffff
  185.         ldr        r0, =INTMR
  186.         str        r1, [r0]

  187.         /* FCLK:HCLK:PCLK = 1:2:4 */
  188.         /* default FCLK is 120 MHz ! */
  189.         ldr        r0, =CLKDIVN
  190.         mov        r1, #3
  191.         str        r1, [r0]
  192.         /* END stuff after relocation */
  193. #endif

  194.         ldr        pc, _start_armboot

  195. _start_armboot:        .word start_armboot


  196. /*
  197. *************************************************************************
  198. *
  199. * CPU_init_critical registers
  200. *
  201. * setup important registers
  202. * setup memory timing
  203. *
  204. *************************************************************************
  205. */


  206. #ifndef CONFIG_SKIP_LOWLEVEL_INIT
  207. cpu_init_crit:
  208.         /*
  209.          * flush v4 I/D caches
  210.          */
  211.         mov        r0, #0
  212.         mcr        p15, 0, r0, c7, c7, 0        /* flush v3/v4 cache */
  213.         mcr        p15, 0, r0, c8, c7, 0        /* flush v4 TLB */

  214.         /*
  215.          * disable MMU stuff and caches
  216.          */
  217.         mrc        p15, 0, r0, c1, c0, 0
  218.         bic        r0, r0, #0x00002300        @ clear bits 13, 9:8 (--V- --RS)
  219.         bic        r0, r0, #0x00000087        @ clear bits 7, 2:0 (B--- -CAM)
  220.         orr        r0, r0, #0x00000002        @ set bit 2 (A) Align
  221.         orr        r0, r0, #0x00001000        @ set bit 12 (I) I-Cache
  222.         mcr        p15, 0, r0, c1, c0, 0

  223.         /*
  224.          * before relocating, we have to setup RAM timing
  225.          * because memory timing is board-dependend, you will
  226.          * find a lowlevel_init.S in your board directory.
  227.          */
  228.         mov        ip, lr
  229.         bl        lowlevel_init
  230.         mov        lr, ip
  231.         mov        pc, lr
  232. #endif /* CONFIG_SKIP_LOWLEVEL_INIT */

  233. /*
  234. *************************************************************************
  235. *
  236. * Interrupt handling
  237. *
  238. *************************************************************************
  239. */

  240. @
  241. @ IRQ stack frame.
  242. @
  243. #define S_FRAME_SIZE        72

  244. #define S_OLD_R0        68
  245. #define S_PSR                64
  246. #define S_PC                60
  247. #define S_LR                56
  248. #define S_SP                52

  249. #define S_IP                48
  250. #define S_FP                44
  251. #define S_R10                40
  252. #define S_R9                36
  253. #define S_R8                32
  254. #define S_R7                28
  255. #define S_R6                24
  256. #define S_R5                20
  257. #define S_R4                16
  258. #define S_R3                12
  259. #define S_R2                8
  260. #define S_R1                4
  261. #define S_R0                0

  262. #define MODE_SVC 0x13
  263. #define I_BIT         0x80

  264. /*
  265. * use bad_save_user_regs for abort/prefetch/undef/swi ...
  266. * use irq_save_user_regs / irq_restore_user_regs for IRQ/FIQ handling
  267. */

  268.         .macro        bad_save_user_regs
  269.         sub        sp, sp, #S_FRAME_SIZE
  270.         stmia        sp, {r0 - r12}                        @ Calling r0-r12
  271.         ldr        r2, _armboot_start
  272.         sub        r2, r2, #(CONFIG_STACKSIZE+CFG_MALLOC_LEN)
  273.         sub        r2, r2, #(CFG_GBL_DATA_SIZE+8)  @ set base 2 words into abort stack
  274.         ldmia        r2, {r2 - r3}                        @ get pc, cpsr
  275.         add        r0, sp, #S_FRAME_SIZE                @ restore sp_SVC

  276.         add        r5, sp, #S_SP
  277.         mov        r1, lr
  278.         stmia        r5, {r0 - r3}                        @ save sp_SVC, lr_SVC, pc, cpsr
  279.         mov        r0, sp
  280.         .endm

  281.         .macro        irq_save_user_regs
  282.         sub        sp, sp, #S_FRAME_SIZE
  283.         stmia        sp, {r0 - r12}                        @ Calling r0-r12
  284.         add     r8, sp, #S_PC
  285.         stmdb   r8, {sp, lr}^                   @ Calling SP, LR
  286.         str     lr, [r8, #0]                    @ Save calling PC
  287.         mrs     r6, spsr
  288.         str     r6, [r8, #4]                    @ Save CPSR
  289.         str     r0, [r8, #8]                    @ Save OLD_R0
  290.         mov        r0, sp
  291.         .endm

  292.         .macro        irq_restore_user_regs
  293.         ldmia        sp, {r0 - lr}^                        @ Calling r0 - lr
  294.         mov        r0, r0
  295.         ldr        lr, [sp, #S_PC]                        @ Get PC
  296.         add        sp, sp, #S_FRAME_SIZE
  297.         subs        pc, lr, #4                        @ return & move spsr_svc into cpsr
  298.         .endm

  299.         .macro get_bad_stack
  300.         ldr        r13, _armboot_start                @ setup our mode stack
  301.         sub        r13, r13, #(CONFIG_STACKSIZE+CFG_MALLOC_LEN)
  302.         sub        r13, r13, #(CFG_GBL_DATA_SIZE+8) @ reserved a couple spots in abort stack

  303.         str        lr, [r13]                        @ save caller lr / spsr
  304.         mrs        lr, spsr
  305.         str     lr, [r13, #4]

  306.         mov        r13, #MODE_SVC                        @ prepare SVC-Mode
  307.         @ msr        spsr_c, r13
  308.         msr        spsr, r13
  309.         mov        lr, pc
  310.         movs        pc, lr
  311.         .endm

  312.         .macro get_irq_stack                        @ setup IRQ stack
  313.         ldr        sp, IRQ_STACK_START
  314.         .endm

  315.         .macro get_fiq_stack                        @ setup FIQ stack
  316.         ldr        sp, FIQ_STACK_START
  317.         .endm

  318. /*
  319. * exception handlers
  320. */
  321.         .align  5
  322. undefined_instruction:
  323.         get_bad_stack
  324.         bad_save_user_regs
  325.         bl         do_undefined_instruction

  326.         .align        5
  327. software_interrupt:
  328.         get_bad_stack
  329.         bad_save_user_regs
  330.         bl         do_software_interrupt

  331.         .align        5
  332. prefetch_abort:
  333.         get_bad_stack
  334.         bad_save_user_regs
  335.         bl         do_prefetch_abort

  336.         .align        5
  337. data_abort:
  338.         get_bad_stack
  339.         bad_save_user_regs
  340.         bl         do_data_abort

  341.         .align        5
  342. not_used:
  343.         get_bad_stack
  344.         bad_save_user_regs
  345.         bl         do_not_used

  346. #ifdef CONFIG_USE_IRQ

  347.         .align        5
  348. irq:
  349.         get_irq_stack
  350.         irq_save_user_regs
  351.         bl         do_irq
  352.         irq_restore_user_regs

  353.         .align        5
  354. fiq:
  355.         get_fiq_stack
  356.         /* someone ought to write a more effiction fiq_save_user_regs */
  357.         irq_save_user_regs
  358.         bl         do_fiq
  359.         irq_restore_user_regs

  360. #else

  361.         .align        5
  362. irq:
  363.         get_bad_stack
  364.         bad_save_user_regs
  365.         bl         do_irq

  366.         .align        5
  367. fiq:
  368.         get_bad_stack
  369.         bad_save_user_regs
  370.         bl         do_fiq

  371. #endif
复制代码


顺便把接口的电路也发上来吧。

[ 本帖最后由 骄傲的唐 于 2009-2-17 21:56 编辑 ]

论坛徽章:
5
2 [报告]
发表于 2009-02-17 23:59 |只看该作者
原帖由 骄傲的唐 于 2009/2/17 21:52 发表
最近在做U-BOOT移植到S3C2410的移植,但是发现编译了U-BOOT-1.2.0下载的开发板上面以后,完全没反应。开发板是没有norflash的,手里也只有一根wiggler,所以也不知道怎么单步调试。所以就想到的传说中的“点灯大 ...


怎么下载的? 板上已有其它loader在运行吗?

论坛徽章:
0
3 [报告]
发表于 2009-02-18 10:00 |只看该作者
原帖由 yidou 于 2009-2-17 23:59 发表


怎么下载的? 板上已有其它loader在运行吗?



因为没有norflash,用的是sjflash那个软件,板子上面没有其他的loader了,因为我是把u-boot.bin现在到扇区0的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP