Chinaunix首页 | 论坛 | 博客
  • 博客访问: 466967
  • 博文数量: 62
  • 博客积分: 1742
  • 博客等级: 中尉
  • 技术积分: 859
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-06 00:13
个人简介

这是一句很长很长而且又很啰嗦并且很无聊的废话...

文章分类

全部博文(62)

文章存档

2013年(1)

2012年(13)

2011年(48)

分类: LINUX

2011-07-31 22:46:34

按以往的惯例,先贴代码再总结.

start.s
  1. .globl _start
  2. _start:
  3. b _reset
  4. ldr pc,=_undefined
  5. ldr pc,=_swi
  6. ldr pc,=_prefetch_abort
  7. ldr pc,=_data_abort
  8. nop
  9. adr pc,_irq
  10. ldr pc,=_fiq
  11. _reset:
  12. /* set cpu is svc mode,arm state and close the irq,fiq */
  13. msr cpsr_c,#211
  14. /* close the dog */
  15. ldr r0,=0x53000000
  16. mov r1,#0
  17. str r1,[r0]
  18. /* icache */
  19. mrc p15,0,r2,c1,c0,0
  20. orr r2,r2,#(1<<12)
  21. mcr p15,0,r2,c1,c0,0
  22. /* set the close 202MHz */
  23. ldr r0,=0x4C000014 /* CLKDIVN */
  24. ldr r1,=1
  25. str r1,[r0]
  26. ldr r0,=0x4C000004 /* SET MLL 202MHz */
  27. ldr r1,=0x0A1031
  28. str r1,[r0]
  29. /* init menory controller */
  30. ldr r0,=0x48000000
  31. ldr r3,=0x48000034
  32. adr r1,memini_data
  33. i_m_c_loop:
  34. ldr r2,[r1],#4
  35. str r2,[r0],#4
  36. cmp r0,r3
  37. bne i_m_c_loop
  38. /* init nand flash */
  39. ldr r0,=0x4E000000
  40. ldr r1,=0x00009852
  41. str r1,[r0]
  42. ldr r1,[r0] /* select chip */
  43. bic r1,r1,#0x00000800
  44. str r1,[r0]
  45. ldr r1,=0x4E000004 /* send the reset cmd */
  46. ldrb r2,=0x000000FF
  47. strb r2,[r1]
  48. ldr r1,=0x4E000010 /* check nand conf stat */
  49. _stat_check:
  50. ldr r2,[r1]
  51. ands r2,r2,#1
  52. beq _stat_check
  53. ldr r1,[r0] /* unselect chip */
  54. orr r1,r1,#0x00000800
  55. str r1,[r0]
  56. /* -------------- test key int -------------- */
  57. ldr r1,=0x22222222
  58. ldr r0,=0x5600008C /* EXTINT1 */
  59. str r1,[r0]
  60. ldr r0,=0x56000090 /* EXTINT2 */
  61. str r1,[r0]
  62. ldr r1,=0x0
  63. ldr r0,=0x4A000008 /* INTMASK */
  64. str r1,[r0]
  65. ldr r0,=0x560000A4 /* EINTMASK */
  66. str r1,[r0]
  67. ldr r0,=0x56000060 /* GPGCON_EINT11_EINT19 */
  68. ldr r1,=0x800080
  69. str r1,[r0]
  70. ldr r0,=0x56000040 /* GPECON_KSCAN0 */
  71. ldr r1,[r0]
  72. ldr r2,=0xC00000
  73. bic r1,r1,r2
  74. orr r1,r1,#0x400000
  75. str r1,[r0]
  76. ldr r0,=0x56000044 /* GPEDATA */
  77. ldr r1,[r0]
  78. bic r1,r1,#0x800
  79. str r1,[r0]
  80. ldr r0,=0x56000060 /* GPGCON_KSCAN1 */
  81. ldr r1,[r0]
  82. ldr r2,=0x3000
  83. bic r1,r1,r2
  84. orr r1,r1,#0x1000
  85. str r1,[r0]
  86. ldr r0,=0x56000064 /* GPGDATA */
  87. ldr r1,[r0]
  88. bic r1,r1,#0x40
  89. str r1,[r0]
  90. /* open the irq */
  91. msr cpsr_c,#83
  92. /* -----------------light flash----------------- */
  93. _loop_led:
  94. /* show the led light */
  95. ldr r0,=0x56000050
  96. ldr r1,=0x5500
  97. str r1,[r0] /* SET LED GPIO IS OUTPUT */
  98. ldr r0,=0x56000054 ;/* BEGIN CLOSE LED */
  99. ldr r1,=0xF0
  100. str r1,[r0]
  101. ldr r0,=0xFFFFFF ;/* delay... */
  102. bl _delay
  103. ldr r0,=0x56000054 ;/* SET LIGHT LED */
  104. ldr r1,=0
  105. str r1,[r0]
  106. ldr r0,=0xFFFFFF
  107. bl _delay
  108. b _loop_led
  109. _bleak:
  110. b _bleak
  111. _delay:
  112. subs r0,r0,#1
  113. bne _delay
  114. mov pc,lr
  115. /* exception jump */
  116. _undefined:
  117. b _undefined
  118. _swi:
  119. b _swi
  120. _prefetch_abort:
  121. b _prefetch_abort
  122. _data_abort:
  123. b _data_abort
  124. _irq:
  125. ldr r0,=0x56000054 ;/* CLOSE LED */
  126. ldr r1,=0xF0
  127. str r1,[r0]
  128. _irq_loop:
  129. b _irq_loop
  130. _fiq:
  131. b _fiq
  132. memini_data:
  133. .long 0x22011110 /* BWSCON */
  134. .long 0x00000700 /* BANKCON0 */
  135. .long 0x00000700 /* BANKCON1 */
  136. .long 0x00000700 /* BANKCON2 */
  137. .long 0x00000700 /* BANKCON3 */
  138. .long 0x00000700 /* BANKCON4 */
  139. .long 0x00000700 /* BANKCON5 */
  140. .long 0x00018005 /* BANKCON6 */
  141. .long 0x00018005 /* BANKCON7 */
  142. .long 0x008C01D1 /* REFRESH */
  143. .long 0x000000B1 /* BANKSIZE */
  144. .long 0x00000030 /* MRSRB6 */
  145. .long 0x00000030 /* MRSRB7 */
start.lds
  1. ENTRY(_start)
  2. SECTIONS
  3. {
  4. . = 0x03FC0000;
  5. _code_start = .;
  6. .text :
  7. {
  8. * (.text)
  9. }
  10. . = ALIGN(4);
  11. .rodata :
  12. {
  13. * (.rodata)
  14. }
  15. . = ALIGN(4);
  16. .data :
  17. {
  18. * (.data)
  19. }
  20. _bss_start = .;
  21. . = ALIGN(4);
  22. .bss :
  23. {
  24. * (.bss)
  25. }
  26. _bss_end = .;
  27. }
Makefile
  1. boot.bin:start.o
  2. arm-none-eabi-ld -T start.lds -o boot.elf $^
  3. arm-none-eabi-objcopy -O binary boot.elf boot.bin
  4. %.o:%.s
  5. arm-none-eabi-gcc -fno-builtin -c -o $@ $<
  6. %.o:%.c
  7. arm-none-eabi-gcc -fno-builtin -c -o $@ $<
  8. clean:
  9. rm *.o boot.elf boot.bin boot.dis
上面的代码中,前面一部分都是在初始化一些外设,后面我是把GPG3和GPG11设为中断输入,再配置VIC,这里为了简单测试,我全开了.打开IRQ后便进入无限循环,让4个LED灯闪烁.我的逻辑是,进入循环后,按理说如果我按下按键,便触发IRQ中断,使PC跳到0x18处,如此一来,就算我的中断例程什么事也不做,一直无限循环,那么实现的效果是LDE灯不会再闪烁.
但一开始,我遇到的问题是,无论我怎样按按键都没反应.这话我不是随便说的,VIC的设置和按键的设置我都是细心地按着手册说明来做.各种试验,各种猜想,还是无果....但是,我锁定的问题范围就是VIC或外设引脚设置那一块,因为只要中断一触发,导致PC改变,我板子的灯就不会闪烁.后来经过一老师的帮助下,终于发现了问题所在.是按键对应的KSCAN没设置...(我设置的中断是按下降沿触发的,一上电按键电路连接的是高电平,如果一开始不把对应的KSCAN的电平拉低的话,当按键按下,GPG引脚依然是高电平.这就是为什么一直无法触发中断的原因)
我看着设备的电路图,完全看不出来.我承认自己对电子那一块几乎是零...
阅读(2118) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~