imx6开启启动之后,运行板子上的ROM程序。ROM确定启动的设备,进行一些初始化,然后读取IVT,进行寄存器初始化,最后运行uboot/cpu/arm_cortexa8/start.S中的_start函数。

参考

http://blog.csdn.net/njuitjf/article/details/20563867

http://blog.csdn.net/sz_zh/article/details/7930341

截取IMX6SDLRM.pdf部分内容

  1. 8.6.1 Image Vector Table and Boot Data
  2. # ROM读取IVT中内容。
  3. The Image Vector Table (IVT) is the data structure that the ROM reads from the boot
  4. device supplying the program image containing the required data components to perform
  5. a successful boot.
  6. # IVT包含DCD的入口点和其他的入口点,给ROM使用。
  7. # IVT在设备中的地址是固定的,这样ROM才能够找到。
  8. The IVT includes the program image entry point, a pointer to Device Configuration Data
  9. (DCD) and other pointers used by the ROM during the boot process.The ROM locates
  10. the IVT at a fixed address that is determined by the boot device connected to the Chip.
  11. The IVT offset from the base address and initial load region size for each boot device
  12. type is defined in the table below. The location of the IVT is the only fixed requirement
  13. by the ROM. The remainder or the image memory map is flexible and is determined by
  14. the contents of the IVT.
  15. # IVT表在不同设备中的偏移地址和空间的大小
  16. Table 8-24. Image Vector Table Offset and Initial Load Region Size
  17. Boot Device Type Image Vector Table Offset Initial Load Region Size
  18. NOR 4 Kbyte = 0x1000 bytes Entire Image Size
  19. NAND 1 Kbyte = 0x400 bytes 4 Kbyte
  20. OneNAND 256 bytes = 0x100 bytes 1 Kbyte
  21. SD/MMC/eSD/eMMC/SDXC 1 Kbyte = 0x400 bytes 4 Kbyte
  22. I2C/SPI EEPROM 1 Kbyte = 0x400 bytes 4 Kbyte
  23. # DCD
  24. 8.6.2 Device Configuration Data (DCD)
  25. # 开启启动的时候根据需要更改寄存器的默认值,方便一些外设一开机就配置
  26. Upon reset, the Chip uses the default register values for all peripherals in the system.
  27. However, these settings typically are not ideal for achieving optimal system performance
  28. and there are even some peripherals that must be configured before they can be used.
  29. The DCD is configuration information contained in a Program Image, external to the
  30. ROM, that the ROM interprets to configure various peripherals on the Chip.

flash_header.S分析

  1. #include <config.h>
  2. #include <asm/arch/mx6.h>
  3. #ifdef CONFIG_FLASH_HEADER
  4. #ifndef CONFIG_FLASH_HEADER_OFFSET
  5. # error "Must define the offset of flash header"
  6. #endif
  7. #define CPU_2_BE_32(l) \
  8. ((((l) & 0x000000FF) << 24) | \
  9. (((l) & 0x0000FF00) << 8) | \
  10. (((l) & 0x00FF0000) >> 8) | \
  11. (((l) & 0xFF000000) >> 24))
  12. #define MXC_DCD_ITEM(i, addr, val) \
  13. dcd_node_##i: \
  14. .word CPU_2_BE_32(addr) ; \ # 存放寄存器地址, 4字节
  15. .word CPU_2_BE_32(val) ; \ # 存放设置的值, 4字节
  16. .section ".text.flasheader", "x"
  17. b _start
  18. .org CONFIG_FLASH_HEADER_OFFSET
  19. # ivt header
  20. ivt_header: .word 0x402000D1 /* Tag=0xD1, Len=0x0020, Ver=0x40 */
  21. # entry
  22. app_code_jump_v: .word _start
  23. reserv1: .word 0x0
  24. dcd_ptr: .word dcd_hdr
  25. boot_data_ptr: .word boot_data
  26. self_ptr: .word ivt_header
  27. #ifdef CONFIG_SECURE_BOOT
  28. app_code_csf: .word __hab_data
  29. #else
  30. app_code_csf: .word 0x0
  31. #endif
  32. reserv2: .word 0x0
  33. boot_data: .word TEXT_BASE
  34. #ifdef CONFIG_SECURE_BOOT
  35. image_len: .word __hab_data_end - TEXT_BASE + CONFIG_FLASH_HEADER_OFFSET
  36. #else
  37. image_len: .word _end_of_copy - TEXT_BASE + CONFIG_FLASH_HEADER_OFFSET
  38. #endif
  39. plugin: .word 0x0
  40. #if defined CONFIG_MX6DL_DDR3
  41. #if defined CONFIG_DDR_32BIT
  42. dcd_hdr: .word 0x40E001D2 /* Tag=0xD2, Len=59*8 + 4 + 4, Ver=0x40 */
  43. write_dcd_cmd: .word 0x04DC01CC /* Tag=0xCC, Len=59*8 + 4, Param=0x04 */
  44. # 各种DDR寄存器的初始化
  45. MXC_DCD_ITEM(1, IOMUXC_BASE_ADDR + 0x774, 0x000C0000) // DDR3
  46. MXC_DCD_ITEM(2, IOMUXC_BASE_ADDR + 0x754, 0x00000000) // DDR Pull/Kepper Disable
  47. MXC_DCD_ITEM(3, IOMUXC_BASE_ADDR + 0x4ac, 0x00000030)
  48. MXC_DCD_ITEM(4, IOMUXC_BASE_ADDR + 0x4b0, 0x00000030)
  49. MXC_DCD_ITEM(5, IOMUXC_BASE_ADDR + 0x464, 0x00000030)
  50. MXC_DCD_ITEM(6, IOMUXC_BASE_ADDR + 0x490, 0x00000030)
  51. MXC_DCD_ITEM(7, IOMUXC_BASE_ADDR + 0x74c, 0x00000030)
  52. MXC_DCD_ITEM(8, IOMUXC_BASE_ADDR + 0x494, 0x00000030)
  53. MXC_DCD_ITEM(9, IOMUXC_BASE_ADDR + 0x4a0, 0x00000000)
  54. MXC_DCD_ITEM(10, IOMUXC_BASE_ADDR + 0x4b4, 0x00000030)
  55. MXC_DCD_ITEM(11, IOMUXC_BASE_ADDR + 0x4b8, 0x00000030)
  56. MXC_DCD_ITEM(12, IOMUXC_BASE_ADDR + 0x76c, 0x00000030)
  57. MXC_DCD_ITEM(13, IOMUXC_BASE_ADDR + 0x750, 0x00020000)
  58. MXC_DCD_ITEM(14, IOMUXC_BASE_ADDR + 0x4bc, 0x00000030)
  59. MXC_DCD_ITEM(15, IOMUXC_BASE_ADDR + 0x4c0, 0x00000030)
  60. MXC_DCD_ITEM(16, IOMUXC_BASE_ADDR + 0x4c4, 0x00000030)
  61. MXC_DCD_ITEM(17, IOMUXC_BASE_ADDR + 0x4c8, 0x00000030)
  62. MXC_DCD_ITEM(18, IOMUXC_BASE_ADDR + 0x760, 0x00020000)
  63. MXC_DCD_ITEM(19, IOMUXC_BASE_ADDR + 0x764, 0x00000030)
  64. MXC_DCD_ITEM(20, IOMUXC_BASE_ADDR + 0x770, 0x00000030)
  65. MXC_DCD_ITEM(21, IOMUXC_BASE_ADDR + 0x778, 0x00000030)
  66. MXC_DCD_ITEM(22, IOMUXC_BASE_ADDR + 0x77c, 0x00000030)
  67. MXC_DCD_ITEM(23, IOMUXC_BASE_ADDR + 0x470, 0x00000030)
  68. MXC_DCD_ITEM(24, IOMUXC_BASE_ADDR + 0x474, 0x00000030)
  69. MXC_DCD_ITEM(25, IOMUXC_BASE_ADDR + 0x478, 0x00000030)
  70. MXC_DCD_ITEM(26, IOMUXC_BASE_ADDR + 0x47c, 0x00000030)
  71. MXC_DCD_ITEM(27, MMDC_P0_BASE_ADDR + 0x800, 0xA1390003)
  72. MXC_DCD_ITEM(28, MMDC_P0_BASE_ADDR + 0x80c, 0x001F001F)
  73. MXC_DCD_ITEM(29, MMDC_P0_BASE_ADDR + 0x810, 0x001F001F)
  74. MXC_DCD_ITEM(30, MMDC_P0_BASE_ADDR + 0x83c, 0x42190219)
  75. MXC_DCD_ITEM(31, MMDC_P0_BASE_ADDR + 0x840, 0x017B0177)
  76. MXC_DCD_ITEM(32, MMDC_P0_BASE_ADDR + 0x848, 0x4B4D4E4D)
  77. MXC_DCD_ITEM(33, MMDC_P0_BASE_ADDR + 0x850, 0x3F3E2D36)
  78. MXC_DCD_ITEM(34, MMDC_P0_BASE_ADDR + 0x81c, 0x33333333)
  79. MXC_DCD_ITEM(35, MMDC_P0_BASE_ADDR + 0x820, 0x33333333)
  80. MXC_DCD_ITEM(36, MMDC_P0_BASE_ADDR + 0x824, 0x33333333)
  81. MXC_DCD_ITEM(37, MMDC_P0_BASE_ADDR + 0x828, 0x33333333)
  82. MXC_DCD_ITEM(38, MMDC_P0_BASE_ADDR + 0x8b8, 0x00000800)
  83. MXC_DCD_ITEM(39, MMDC_P0_BASE_ADDR + 0x004, 0x0002002D)
  84. MXC_DCD_ITEM(40, MMDC_P0_BASE_ADDR + 0x008, 0x00333030)
  85. MXC_DCD_ITEM(41, MMDC_P0_BASE_ADDR + 0x00c, 0x3F435313)
  86. MXC_DCD_ITEM(42, MMDC_P0_BASE_ADDR + 0x010, 0xB66E8B63)
  87. MXC_DCD_ITEM(43, MMDC_P0_BASE_ADDR + 0x014, 0x01FF00DB)
  88. MXC_DCD_ITEM(44, MMDC_P0_BASE_ADDR + 0x018, 0x00001740)
  89. MXC_DCD_ITEM(45, MMDC_P0_BASE_ADDR + 0x01c, 0x00008000)
  90. MXC_DCD_ITEM(46, MMDC_P0_BASE_ADDR + 0x02c, 0x000026d2)
  91. MXC_DCD_ITEM(47, MMDC_P0_BASE_ADDR + 0x030, 0x00431023)
  92. MXC_DCD_ITEM(48, MMDC_P0_BASE_ADDR + 0x040, 0x00000017)
  93. MXC_DCD_ITEM(49, MMDC_P0_BASE_ADDR + 0x000, 0x83190000)
  94. MXC_DCD_ITEM(50, MMDC_P0_BASE_ADDR + 0x01c, 0x04008032)
  95. MXC_DCD_ITEM(51, MMDC_P0_BASE_ADDR + 0x01c, 0x00008033)
  96. MXC_DCD_ITEM(52, MMDC_P0_BASE_ADDR + 0x01c, 0x00048031)
  97. MXC_DCD_ITEM(53, MMDC_P0_BASE_ADDR + 0x01c, 0x05208030)
  98. MXC_DCD_ITEM(54, MMDC_P0_BASE_ADDR + 0x01c, 0x04008040)
  99. MXC_DCD_ITEM(55, MMDC_P0_BASE_ADDR + 0x020, 0x00005800)
  100. MXC_DCD_ITEM(56, MMDC_P0_BASE_ADDR + 0x818, 0x00011117)
  101. MXC_DCD_ITEM(57, MMDC_P0_BASE_ADDR + 0x004, 0x0002556d)
  102. MXC_DCD_ITEM(58, MMDC_P0_BASE_ADDR + 0x404, 0x00011006)
  103. MXC_DCD_ITEM(59, MMDC_P0_BASE_ADDR + 0x01c, 0x00000000)
  104. #else /* i.MX6DL 64BIT-DDR */
  105. dcd_hdr: .word 0x40A002D2 /* Tag=0xD2, Len=83*8 + 4 + 4, Ver=0x40 */
  106. write_dcd_cmd: .word 0x049C02CC /* Tag=0xCC, Len=83*8 + 4, Param=0x04 */
  107. # IOMUXC_BASE_ADDR = 0x20e0000
  108. # DDR IO TYPE
  109. MXC_DCD_ITEM(1, IOMUXC_BASE_ADDR + 0x774, 0x000c0000)
  110. MXC_DCD_ITEM(2, IOMUXC_BASE_ADDR + 0x754, 0x00000000)
  111. # Clock
  112. MXC_DCD_ITEM(3, IOMUXC_BASE_ADDR + 0x4ac, 0x00000030)
  113. MXC_DCD_ITEM(4, IOMUXC_BASE_ADDR + 0x4b0, 0x00000030)
  114. # Address
  115. MXC_DCD_ITEM(5, IOMUXC_BASE_ADDR + 0x464, 0x00000030)
  116. MXC_DCD_ITEM(6, IOMUXC_BASE_ADDR + 0x490, 0x00000030)
  117. MXC_DCD_ITEM(7, IOMUXC_BASE_ADDR + 0x74c, 0x00000030)
  118. # Control
  119. MXC_DCD_ITEM(8, IOMUXC_BASE_ADDR + 0x494, 0x00000030)
  120. MXC_DCD_ITEM(9, IOMUXC_BASE_ADDR + 0x4a0, 0x00000000)
  121. MXC_DCD_ITEM(10, IOMUXC_BASE_ADDR + 0x4b4, 0x00000030)
  122. MXC_DCD_ITEM(11, IOMUXC_BASE_ADDR + 0x4b8, 0x00000030)
  123. MXC_DCD_ITEM(12, IOMUXC_BASE_ADDR + 0x76c, 0x00000030)
  124. # Data Strobe
  125. MXC_DCD_ITEM(13, IOMUXC_BASE_ADDR + 0x750, 0x00020000)
  126. MXC_DCD_ITEM(14, IOMUXC_BASE_ADDR + 0x4bc, 0x00000030)
  127. MXC_DCD_ITEM(15, IOMUXC_BASE_ADDR + 0x4c0, 0x00000030)
  128. MXC_DCD_ITEM(16, IOMUXC_BASE_ADDR + 0x4c4, 0x00000030)
  129. MXC_DCD_ITEM(17, IOMUXC_BASE_ADDR + 0x4c8, 0x00000030)
  130. MXC_DCD_ITEM(18, IOMUXC_BASE_ADDR + 0x4cc, 0x00000030)
  131. MXC_DCD_ITEM(19, IOMUXC_BASE_ADDR + 0x4d0, 0x00000030)
  132. MXC_DCD_ITEM(20, IOMUXC_BASE_ADDR + 0x4d4, 0x00000030)
  133. MXC_DCD_ITEM(21, IOMUXC_BASE_ADDR + 0x4d8, 0x00000030)
  134. MXC_DCD_ITEM(22, IOMUXC_BASE_ADDR + 0x760, 0x00020000)
  135. MXC_DCD_ITEM(23, IOMUXC_BASE_ADDR + 0x764, 0x00000030)
  136. MXC_DCD_ITEM(24, IOMUXC_BASE_ADDR + 0x770, 0x00000030)
  137. MXC_DCD_ITEM(25, IOMUXC_BASE_ADDR + 0x778, 0x00000030)
  138. MXC_DCD_ITEM(26, IOMUXC_BASE_ADDR + 0x77c, 0x00000030)
  139. MXC_DCD_ITEM(27, IOMUXC_BASE_ADDR + 0x780, 0x00000030)
  140. MXC_DCD_ITEM(28, IOMUXC_BASE_ADDR + 0x784, 0x00000030)
  141. MXC_DCD_ITEM(29, IOMUXC_BASE_ADDR + 0x78c, 0x00000030)
  142. MXC_DCD_ITEM(30, IOMUXC_BASE_ADDR + 0x748, 0x00000030)
  143. MXC_DCD_ITEM(31, IOMUXC_BASE_ADDR + 0x470, 0x00000030)
  144. MXC_DCD_ITEM(32, IOMUXC_BASE_ADDR + 0x474, 0x00000030)
  145. MXC_DCD_ITEM(33, IOMUXC_BASE_ADDR + 0x478, 0x00000030)
  146. MXC_DCD_ITEM(34, IOMUXC_BASE_ADDR + 0x47c, 0x00000030)
  147. MXC_DCD_ITEM(35, IOMUXC_BASE_ADDR + 0x480, 0x00000030)
  148. MXC_DCD_ITEM(36, IOMUXC_BASE_ADDR + 0x484, 0x00000030)
  149. MXC_DCD_ITEM(37, IOMUXC_BASE_ADDR + 0x488, 0x00000030)
  150. MXC_DCD_ITEM(38, IOMUXC_BASE_ADDR + 0x48c, 0x00000030)
  151. # MMDC_P0_BASE_ADDR = 0x021b0000
  152. # MMDC_P1_BASE_ADDR = 0x021b4000
  153. # Calibrations
  154. # ZQ
  155. MXC_DCD_ITEM(39, MMDC_P0_BASE_ADDR + 0x800, 0xa1390003)
  156. # write leveling
  157. MXC_DCD_ITEM(40, MMDC_P0_BASE_ADDR + 0x80c, 0x001F001F)
  158. MXC_DCD_ITEM(41, MMDC_P0_BASE_ADDR + 0x810, 0x001F001F)
  159. MXC_DCD_ITEM(42, MMDC_P1_BASE_ADDR + 0x80c, 0x001F001F)
  160. MXC_DCD_ITEM(43, MMDC_P1_BASE_ADDR + 0x810, 0x001F001F)
  161. # DQS gating, read delay, write delay calibration values
  162. # based on calibration compare of 0x00ffff00
  163. MXC_DCD_ITEM(44, MMDC_P0_BASE_ADDR + 0x83c, 0x42480248)
  164. MXC_DCD_ITEM(45, MMDC_P0_BASE_ADDR + 0x840, 0x0211020B)
  165. MXC_DCD_ITEM(46, MMDC_P1_BASE_ADDR + 0x83C, 0x417F0211)
  166. MXC_DCD_ITEM(47, MMDC_P1_BASE_ADDR + 0x840, 0x015D0166)
  167. MXC_DCD_ITEM(48, MMDC_P0_BASE_ADDR + 0x848, 0x4B4C504D)
  168. MXC_DCD_ITEM(49, MMDC_P1_BASE_ADDR + 0x848, 0x494C4F48)
  169. MXC_DCD_ITEM(50, MMDC_P0_BASE_ADDR + 0x850, 0x3F3F2E31)
  170. MXC_DCD_ITEM(51, MMDC_P1_BASE_ADDR + 0x850, 0x2B35382B)
  171. MXC_DCD_ITEM(52, MMDC_P0_BASE_ADDR + 0x81c, 0x33333333)
  172. MXC_DCD_ITEM(53, MMDC_P0_BASE_ADDR + 0x820, 0x33333333)
  173. MXC_DCD_ITEM(54, MMDC_P0_BASE_ADDR + 0x824, 0x33333333)
  174. MXC_DCD_ITEM(55, MMDC_P0_BASE_ADDR + 0x828, 0x33333333)
  175. MXC_DCD_ITEM(56, MMDC_P1_BASE_ADDR + 0x81c, 0x33333333)
  176. MXC_DCD_ITEM(57, MMDC_P1_BASE_ADDR + 0x820, 0x33333333)
  177. MXC_DCD_ITEM(58, MMDC_P1_BASE_ADDR + 0x824, 0x33333333)
  178. MXC_DCD_ITEM(59, MMDC_P1_BASE_ADDR + 0x828, 0x33333333)
  179. MXC_DCD_ITEM(60, MMDC_P0_BASE_ADDR + 0x8b8, 0x00000800)
  180. MXC_DCD_ITEM(61, MMDC_P1_BASE_ADDR + 0x8b8, 0x00000800)
  181. # MMDC init:
  182. # in DDR3, 64-bit mode, only MMDC0 is initiated:
  183. MXC_DCD_ITEM(62, MMDC_P0_BASE_ADDR + 0x004, 0x0002002D)
  184. MXC_DCD_ITEM(63, MMDC_P0_BASE_ADDR + 0x008, 0x00333030)
  185. MXC_DCD_ITEM(64, MMDC_P0_BASE_ADDR + 0x00c, 0x3F435313)
  186. MXC_DCD_ITEM(65, MMDC_P0_BASE_ADDR + 0x010, 0xB66E8B63)
  187. MXC_DCD_ITEM(66, MMDC_P0_BASE_ADDR + 0x014, 0x01FF00DB)
  188. MXC_DCD_ITEM(67, MMDC_P0_BASE_ADDR + 0x018, 0x00081740)
  189. MXC_DCD_ITEM(68, MMDC_P0_BASE_ADDR + 0x01c, 0x00008000)
  190. MXC_DCD_ITEM(69, MMDC_P0_BASE_ADDR + 0x02c, 0x000026d2)
  191. MXC_DCD_ITEM(70, MMDC_P0_BASE_ADDR + 0x030, 0x00431023)
  192. MXC_DCD_ITEM(71, MMDC_P0_BASE_ADDR + 0x040, 0x00000027)
  193. MXC_DCD_ITEM(72, MMDC_P0_BASE_ADDR + 0x000, 0x831A0000)
  194. # Initialize 2GB DDR3 - Micron MT41J128M
  195. MXC_DCD_ITEM(73, MMDC_P0_BASE_ADDR + 0x01c, 0x04008032)
  196. MXC_DCD_ITEM(74, MMDC_P0_BASE_ADDR + 0x01c, 0x00008033)
  197. MXC_DCD_ITEM(75, MMDC_P0_BASE_ADDR + 0x01c, 0x00048031)
  198. MXC_DCD_ITEM(76, MMDC_P0_BASE_ADDR + 0x01c, 0x05208030)
  199. MXC_DCD_ITEM(77, MMDC_P0_BASE_ADDR + 0x01c, 0x04008040)
  200. MXC_DCD_ITEM(78, MMDC_P0_BASE_ADDR + 0x020, 0x00005800)
  201. MXC_DCD_ITEM(79, MMDC_P0_BASE_ADDR + 0x818, 0x00011117)
  202. MXC_DCD_ITEM(80, MMDC_P1_BASE_ADDR + 0x818, 0x00011117)
  203. MXC_DCD_ITEM(81, MMDC_P0_BASE_ADDR + 0x004, 0x0002556d)
  204. MXC_DCD_ITEM(82, MMDC_P1_BASE_ADDR + 0x404, 0x00011006)
  205. MXC_DCD_ITEM(83, MMDC_P0_BASE_ADDR + 0x01c, 0x00000000)
  206. #endif
  207. #else /* i.MX6Q */
  208. dcd_hdr: .word 0x40a002D2 /* Tag=0xD2, Len=83*8 + 4 + 4, Ver=0x40 */
  209. write_dcd_cmd: .word 0x049c02CC /* Tag=0xCC, Len=83*8 + 4, Param=0x04 */
  210. /* DCD */
  211. MXC_DCD_ITEM(1, IOMUXC_BASE_ADDR + 0x798, 0x000C0000)
  212. MXC_DCD_ITEM(2, IOMUXC_BASE_ADDR + 0x758, 0x00000000)
  213. MXC_DCD_ITEM(3, IOMUXC_BASE_ADDR + 0x588, 0x00000030)
  214. MXC_DCD_ITEM(4, IOMUXC_BASE_ADDR + 0x594, 0x00000030)
  215. MXC_DCD_ITEM(5, IOMUXC_BASE_ADDR + 0x56c, 0x00000030)
  216. MXC_DCD_ITEM(6, IOMUXC_BASE_ADDR + 0x578, 0x00000030)
  217. MXC_DCD_ITEM(7, IOMUXC_BASE_ADDR + 0x74c, 0x00000030)
  218. MXC_DCD_ITEM(8, IOMUXC_BASE_ADDR + 0x57c, 0x00000030)
  219. MXC_DCD_ITEM(9, IOMUXC_BASE_ADDR + 0x58c, 0x00000000)
  220. MXC_DCD_ITEM(10, IOMUXC_BASE_ADDR + 0x59c, 0x00000030)
  221. MXC_DCD_ITEM(11, IOMUXC_BASE_ADDR + 0x5a0, 0x00000030)
  222. MXC_DCD_ITEM(12, IOMUXC_BASE_ADDR + 0x78c, 0x00000030)
  223. MXC_DCD_ITEM(13, IOMUXC_BASE_ADDR + 0x750, 0x00020000)
  224. MXC_DCD_ITEM(14, IOMUXC_BASE_ADDR + 0x5a8, 0x00000030)
  225. MXC_DCD_ITEM(15, IOMUXC_BASE_ADDR + 0x5b0, 0x00000030)
  226. MXC_DCD_ITEM(16, IOMUXC_BASE_ADDR + 0x524, 0x00000030)
  227. MXC_DCD_ITEM(17, IOMUXC_BASE_ADDR + 0x51c, 0x00000030)
  228. MXC_DCD_ITEM(18, IOMUXC_BASE_ADDR + 0x518, 0x00000030)
  229. MXC_DCD_ITEM(19, IOMUXC_BASE_ADDR + 0x50c, 0x00000030)
  230. MXC_DCD_ITEM(20, IOMUXC_BASE_ADDR + 0x5b8, 0x00000030)
  231. MXC_DCD_ITEM(21, IOMUXC_BASE_ADDR + 0x5c0, 0x00000030)
  232. MXC_DCD_ITEM(22, IOMUXC_BASE_ADDR + 0x774, 0x00020000)
  233. MXC_DCD_ITEM(23, IOMUXC_BASE_ADDR + 0x784, 0x00000030)
  234. MXC_DCD_ITEM(24, IOMUXC_BASE_ADDR + 0x788, 0x00000030)
  235. MXC_DCD_ITEM(25, IOMUXC_BASE_ADDR + 0x794, 0x00000030)
  236. MXC_DCD_ITEM(26, IOMUXC_BASE_ADDR + 0x79c, 0x00000030)
  237. MXC_DCD_ITEM(27, IOMUXC_BASE_ADDR + 0x7a0, 0x00000030)
  238. MXC_DCD_ITEM(28, IOMUXC_BASE_ADDR + 0x7a4, 0x00000030)
  239. MXC_DCD_ITEM(29, IOMUXC_BASE_ADDR + 0x7a8, 0x00000030)
  240. MXC_DCD_ITEM(30, IOMUXC_BASE_ADDR + 0x748, 0x00000030)
  241. MXC_DCD_ITEM(31, IOMUXC_BASE_ADDR + 0x5ac, 0x00000030)
  242. MXC_DCD_ITEM(32, IOMUXC_BASE_ADDR + 0x5b4, 0x00000030)
  243. MXC_DCD_ITEM(33, IOMUXC_BASE_ADDR + 0x528, 0x00000030)
  244. MXC_DCD_ITEM(34, IOMUXC_BASE_ADDR + 0x520, 0x00000030)
  245. MXC_DCD_ITEM(35, IOMUXC_BASE_ADDR + 0x514, 0x00000030)
  246. MXC_DCD_ITEM(36, IOMUXC_BASE_ADDR + 0x510, 0x00000030)
  247. MXC_DCD_ITEM(37, IOMUXC_BASE_ADDR + 0x5bc, 0x00000030)
  248. MXC_DCD_ITEM(38, IOMUXC_BASE_ADDR + 0x5c4, 0x00000030)
  249. MXC_DCD_ITEM(39, MMDC_P0_BASE_ADDR + 0x800, 0xA1390003)
  250. MXC_DCD_ITEM(40, MMDC_P0_BASE_ADDR + 0x80c, 0x001F001F)
  251. MXC_DCD_ITEM(41, MMDC_P0_BASE_ADDR + 0x810, 0x001F001F)
  252. MXC_DCD_ITEM(42, MMDC_P1_BASE_ADDR + 0x80c, 0x001F001F)
  253. MXC_DCD_ITEM(43, MMDC_P1_BASE_ADDR + 0x810, 0x001F001F)
  254. MXC_DCD_ITEM(44, MMDC_P0_BASE_ADDR + 0x83c, 0x4333033F)
  255. MXC_DCD_ITEM(45, MMDC_P0_BASE_ADDR + 0x840, 0x032C031D)
  256. MXC_DCD_ITEM(46, MMDC_P1_BASE_ADDR + 0x83c, 0x43200332)
  257. MXC_DCD_ITEM(47, MMDC_P1_BASE_ADDR + 0x840, 0x031A026A)
  258. MXC_DCD_ITEM(48, MMDC_P0_BASE_ADDR + 0x848, 0x4D464746)
  259. MXC_DCD_ITEM(49, MMDC_P1_BASE_ADDR + 0x848, 0x47453F4D)
  260. MXC_DCD_ITEM(50, MMDC_P0_BASE_ADDR + 0x850, 0x3E434440)
  261. MXC_DCD_ITEM(51, MMDC_P1_BASE_ADDR + 0x850, 0x47384839)
  262. MXC_DCD_ITEM(52, MMDC_P0_BASE_ADDR + 0x81c, 0x33333333)
  263. MXC_DCD_ITEM(53, MMDC_P0_BASE_ADDR + 0x820, 0x33333333)
  264. MXC_DCD_ITEM(54, MMDC_P0_BASE_ADDR + 0x824, 0x33333333)
  265. MXC_DCD_ITEM(55, MMDC_P0_BASE_ADDR + 0x828, 0x33333333)
  266. MXC_DCD_ITEM(56, MMDC_P1_BASE_ADDR + 0x81c, 0x33333333)
  267. MXC_DCD_ITEM(57, MMDC_P1_BASE_ADDR + 0x820, 0x33333333)
  268. MXC_DCD_ITEM(58, MMDC_P1_BASE_ADDR + 0x824, 0x33333333)
  269. MXC_DCD_ITEM(59, MMDC_P1_BASE_ADDR + 0x828, 0x33333333)
  270. MXC_DCD_ITEM(60, MMDC_P0_BASE_ADDR + 0x8b8, 0x00000800)
  271. MXC_DCD_ITEM(61, MMDC_P1_BASE_ADDR + 0x8b8, 0x00000800)
  272. MXC_DCD_ITEM(62, MMDC_P0_BASE_ADDR + 0x004, 0x00020036)
  273. MXC_DCD_ITEM(63, MMDC_P0_BASE_ADDR + 0x008, 0x09444040)
  274. MXC_DCD_ITEM(64, MMDC_P0_BASE_ADDR + 0x00c, 0x555A7975)
  275. MXC_DCD_ITEM(65, MMDC_P0_BASE_ADDR + 0x010, 0xFF538F64)
  276. MXC_DCD_ITEM(66, MMDC_P0_BASE_ADDR + 0x014, 0x01FF00DB)
  277. MXC_DCD_ITEM(67, MMDC_P0_BASE_ADDR + 0x018, 0x00001740)
  278. MXC_DCD_ITEM(68, MMDC_P0_BASE_ADDR + 0x01c, 0x00008000)
  279. MXC_DCD_ITEM(69, MMDC_P0_BASE_ADDR + 0x02c, 0x000026D2)
  280. MXC_DCD_ITEM(70, MMDC_P0_BASE_ADDR + 0x030, 0x005A1023)
  281. MXC_DCD_ITEM(71, MMDC_P0_BASE_ADDR + 0x040, 0x00000027)
  282. MXC_DCD_ITEM(72, MMDC_P0_BASE_ADDR + 0x000, 0x831A0000)
  283. MXC_DCD_ITEM(73, MMDC_P0_BASE_ADDR + 0x01c, 0x04088032)
  284. MXC_DCD_ITEM(74, MMDC_P0_BASE_ADDR + 0x01c, 0x00008033)
  285. MXC_DCD_ITEM(75, MMDC_P0_BASE_ADDR + 0x01c, 0x00048031)
  286. MXC_DCD_ITEM(76, MMDC_P0_BASE_ADDR + 0x01c, 0x09408030)
  287. MXC_DCD_ITEM(77, MMDC_P0_BASE_ADDR + 0x01c, 0x04008040)
  288. MXC_DCD_ITEM(78, MMDC_P0_BASE_ADDR + 0x020, 0x00005800)
  289. MXC_DCD_ITEM(79, MMDC_P0_BASE_ADDR + 0x818, 0x00011117)
  290. MXC_DCD_ITEM(80, MMDC_P1_BASE_ADDR + 0x818, 0x00011117)
  291. MXC_DCD_ITEM(81, MMDC_P0_BASE_ADDR + 0x004, 0x00025576)
  292. MXC_DCD_ITEM(82, MMDC_P0_BASE_ADDR + 0x404, 0x00011006)
  293. MXC_DCD_ITEM(83, MMDC_P0_BASE_ADDR + 0x01c, 0x00000000)
  294. #endif
  295. #endif

查看u-boot.lds可以了解uboot编译之后的布局

  1. OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
  2. OUTPUT_ARCH(arm)
  3. ENTRY(_start)
  4. SECTIONS
  5. {
  6. . = 0x00000000;
  7. . = ALIGN(4);
  8. .text :
  9. {
  10. /* WARNING - the following is hand-optimized to fit within */
  11. /* the sector layout of our flash chips! XXX FIXME XXX */
  12. board/freescale/mx6q_sabresd/flash_header.o (.text.flasheader) # flash_header.S
  13. cpu/arm_cortexa8/start.o # start.S
  14. board/freescale/mx6q_sabresd/libmx6q_sabresd.a (.text)
  15. lib_arm/libarm.a (.text)
  16. net/libnet.a (.text)
  17. drivers/mtd/libmtd.a (.text)
  18. drivers/mmc/libmmc.a (.text)
  19. . = DEFINED(env_offset) ? env_offset : .;
  20. common/env_embedded.o(.text)
  21. *(.text)
  22. }
  23. . = ALIGN(4);
  24. .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
  25. . = ALIGN(4);
  26. .data : { *(.data) }
  27. . = ALIGN(4);
  28. .got : { *(.got) }
  29. . = .;
  30. __u_boot_cmd_start = .;
  31. .u_boot_cmd : { *(.u_boot_cmd) }
  32. __u_boot_cmd_end = .;
  33. . = ALIGN(4);
  34. _end_of_copy = .; /* end_of ROM copy code here */
  35. /* Extend to align to 0x1000, then put the Hab Data */
  36. . = ALIGN(0x1000);
  37. __hab_data = .;
  38. . = . + 0x2000;
  39. __data_enc_key = .;
  40. /* actually, only 64bytes are needed, but this generates
  41. a size multiple of 512bytes, which is optimal for SD boot */
  42. . = . + 0x200;
  43. __hab_data_end = .;
  44. /* End of Hab Data, Place it before BSS section */
  45. __bss_start = .;
  46. .bss : { *(.bss) }
  47. _end = .;
  48. }

查看编译uboot生成的System.map也能够知道大概的分布情况。

System.map

  1. # 对应flash_header.S中的内容,地址连续
  2. 27800400 t ivt_header # 首先是ivt header
  3. 27800404 t app_code_jump_v # _start
  4. 27800408 t reserv1
  5. 2780040c t dcd_ptr
  6. 27800410 t boot_data_ptr
  7. 27800414 t self_ptr
  8. 27800418 t app_code_csf
  9. 2780041c t reserv2
  10. 27800420 t boot_data
  11. 27800424 t image_len
  12. 27800428 t plugin
  13. 2780042c t dcd_hdr
  14. 27800430 t write_dcd_cmd
  15. # 对应 flash_header.S中的内容,每个dcd_node大小8字节。
  16. # 前4个字节存放寄存器的地址,后4个字节设置寄存器的值。
  17. 27800434 t dcd_node_1
  18. 2780043c t dcd_node_2
  19. 27800444 t dcd_node_3
  20. 2780044c t dcd_node_4
  21. 27800454 t dcd_node_5
  22. 2780045c t dcd_node_6
  23. 27800464 t dcd_node_7
  24. 2780046c t dcd_node_8
  25. 27800474 t dcd_node_9
  26. 2780047c t dcd_node_10
  27. 27800484 t dcd_node_11
  28. 2780048c t dcd_node_12
  29. 27800494 t dcd_node_13
  30. 2780049c t dcd_node_14
  31. 278004a4 t dcd_node_15
  32. 278004ac t dcd_node_16
  33. 278004b4 t dcd_node_17
  34. 278004bc t dcd_node_18
  35. 278004c4 t dcd_node_19
  36. ......
  37. # uboot, start函数。对应cpu/arm_cortexa8/start.S中的内容
  38. 278006e0 T _start
  39. 27800700 t _undefined_instruction
  40. 27800704 t _software_interrupt
  41. 27800708 t _prefetch_abort
  42. 2780070c t _data_abort
  43. 27800710 t _not_used
  44. 27800714 t _irq
  45. 27800718 t _fiq
  46. 2780071c t _pad
  47. 27800720 T _end_vect
  48. 27800720 t _TEXT_BASE
  49. 27800724 T _armboot_start
  50. 27800728 T _bss_start
  51. 2780072c T _bss_end
  52. 27800730 t reset
  53. ...

imx6开启启动之后,运行板子上的ROM程序。ROM确定启动的设备,进行一些初始化,然后读取IVT,进行寄存器初始化,最后运行uboot/cpu/arm_cortexa8/start.S中的_start函数。

IVT中记录了寄存器的地址和要设置的值,以及uboot的_start函数。

初始化完成之后,最后运行uboot/cpu/arm_cortexa8/start.S中的 _start函数,进行uboot的初始化。

start.S

  1. .global _start
  2. _start: b reset
  3. ldr pc, _undefined_instruction
  4. ldr pc, _software_interrupt
  5. ldr pc, _prefetch_abort
  6. ldr pc, _data_abort
  7. ldr pc, _not_used
  8. ldr pc, _irq
  9. ldr pc, _fiq

Tony Liu

2016-12-20, Shenzhen

imx6 Image Vector Table (IVT)的更多相关文章

  1. NXP ARM Vector Table CheckSum

    Signature Creator for NXP Cortex-M Devices Algorithm for creating the checksum The reserved Cortex-M ...

  2. STM32F4XX devices vector table for EWARM toolchain.

    ;/******************** (C) COPYRIGHT 2015 STMicroelectronics ******************** ;* File Name : sta ...

  3. STM32F1XX devices vector table for EWARM toolchain.

    ;******************** (C) COPYRIGHT 2014 STMicroelectronics ******************* ;* File Name : start ...

  4. 【ARM-Linux开发】ARM嵌入式设备Linux系统启动步骤和方式

    1). 简介 本文简单介绍ARM嵌入式设备基于嵌入式Linux操作系统时候的启动步骤和启动方式, 区别与X86平台,ARM平台下并没有一个标准的启动步骤,不同ARM SoC都会使用各自定义的boot ...

  5. 《30天自制操作系统》读书笔记(5) GDT&IDT

    梳理项目结构 项目做到现在, 前头的好多东西都忘了, 还是通过Makefile重新理解一下整个项目是如何编译的: 现在我们拥有这么9个文件: ipl10.nas    InitialProgramLo ...

  6. I.MX6 eMMC 中启动U-boot存放的首地址

    /************************************************************************************ * I.MX6 eMMC 中 ...

  7. Reentrant protected mode kernel using virtual 8086 mode interrupt service routines

    A method for allowing a protected mode kernel to service, in virtual 8086 mode, hardware interrupts ...

  8. i.MX rt 系列微控制器的学习记录

    杂记 前言 我总是很希望自己能产生一种感知电压变化的能力,就像B站上的教学动图中,电流从电源流出时导线就像LED亮起来一样,我将指尖触到导线上就能感受到实时的电压变化.我在上学和工作时经常由于无法理解 ...

  9. 痞子衡嵌入式:IVT里的不同entry设置可能会造成i.MXRT1xxx系列启动App后发生异常跑飞

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IVT里的不同entry设置可能会造成i.MXRT1xxx系列启动App后发生异常跑飞问题的分析解决经验. 事情缘起恩智浦官方论坛上的一 ...

随机推荐

  1. 异或之(bzoj 3689)

    Description 给定n个非负整数A[1], A[2], --, A[n].对于每对(i, j)满足1 <= i < j <= n,得到一个新的数A[i] xor A[j],这 ...

  2. SQL语句汇总

    1.查询出来数据保留小数点2位,并且0.01时候,不会展示为.01. select     to_char(0.1,'fm9999999990.00') from dual; 2.wm_concat ...

  3. Java Mysql连接池配置和案例分析--超时异常和处理

    前言: 最近在开发服务的时候, 发现服务只要一段时间不用, 下次首次访问总是失败. 该问题影响虽不大, 但终究影响用户体验. 观察日志后发现, mysql连接因长时间空闲而被关闭, 使用时没有死链检测 ...

  4. GitHub使用心得

    PHP今天算是学习结束了;版本控制也了解很久了,比较熟悉的是svn,Git一直都不太熟,也可能是它是英文的缘故,感觉很费劲,所以用的不多,但不得不说,它功能真的很强大;今天试着和朋友用Git开发一个简 ...

  5. Lamp搭建bugfree

    1.下载bugfree安装包 2.将bugfree安装包解压到/home/wwwroot/default目录下 unzip bugfree.zip  -d /home/wwwroot/default/ ...

  6. opencv2 使用鼠标绘制矩形并截取和保存矩形区域图像

    前言 好长时间没写博文了,今天偷偷懒写篇关于opencv2中鼠标响应操作的文章. 鼠标操作属于用户接口设计,以前一直使用Qt来做,但是如果只需要简单的鼠标,键盘操作,直接调用opencv库的函数也未尝 ...

  7. 【maven】maven创建web项目-pom文件提示web.xml is missing and <failOnMissingWebXml> is set to true

    使用maven创建web项目,选择war类型后,pom文件红叉 提示web.xml is missing and <failOnMissingWebXml> is set to true ...

  8. Microchip微芯HCS301解密HCS360解密HCS361芯片解密多少钱?

    Microchip微芯HCS系列芯片解密型号: HCS101 | HCS200 | HCS201 | HCS201T | HCS300 | HCS300T HCS301 | HCS301T | HCS ...

  9. 关闭英文拼写检查,关闭xml验证

    http://blog.sina.com.cn/s/blog_70b623e4010173ce.html eclipse里面的许多设置对于国内开发者日常使用不太适用,反而会成为干扰.既然是完全可配置的 ...

  10. HDU5900 QSC and Master(区间DP + 最小费用最大流)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5900 Description Every school has some legends, ...