crcek.S 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. /**
  2. * (C) Copyright 2005
  3. * 2N Telekomunikace, Ladislav Michl <michl@2n.cz>
  4. *
  5. * This program is free software; you can redistribute it and/or
  6. * modify it under the terms of the GNU General Public License
  7. * version 2.
  8. *
  9. * Image layout looks like following:
  10. * u32 - size
  11. * u32 - version
  12. * ... - data
  13. * u32 - crc32
  14. */
  15. #include "crcek.h"
  16. /**
  17. * do_crc32 - calculate CRC32 of given buffer
  18. * r0 - crc
  19. * r1 - pointer to buffer
  20. * r2 - buffer len
  21. */
  22. .macro do_crc32
  23. ldr r5, FFFFFFFF
  24. eor r0, r0, r5
  25. adr r3, CRC32_TABLE
  26. 1:
  27. ldrb r4, [r1], #1
  28. eor r4, r4, r0
  29. and r4, r4, #0xff
  30. ldr r4, [r3, r4, lsl#2]
  31. eor r0, r4, r0, lsr#8
  32. subs r2, r2, #0x1
  33. bne 1b
  34. eor r0, r0, r5
  35. .endm
  36. .macro crcuj, offset, size
  37. mov r0, #0
  38. ldr r1, \offset
  39. ldr r2, [r1]
  40. cmp r2, r0 @ no data, no problem
  41. beq 2f
  42. tst r2, #3 @ unaligned size
  43. bne 2f
  44. ldr r3, \size
  45. cmp r2, r3 @ bogus size
  46. bhi 2f
  47. add r1, r1, #4
  48. do_crc32
  49. ldr r1, [r1]
  50. 2:
  51. cmp r0, r1
  52. .endm
  53. .macro wait, reg
  54. mov \reg, #0x1000
  55. 3:
  56. subs \reg, \reg, #0x1
  57. bne 3b
  58. .endm
  59. .text
  60. .globl crcek
  61. crcek:
  62. b crc2_bad
  63. mov r6, #0
  64. crcuj _LOADER1_OFFSET, _LOADER_SIZE
  65. bne crc1_bad
  66. orr r6, r6, #1
  67. crc1_bad:
  68. crcuj _LOADER2_OFFSET, _LOADER_SIZE
  69. bne crc2_bad
  70. orr r6, r6, #2
  71. crc2_bad:
  72. ldr r3, _LOADER1_OFFSET
  73. ldr r4, _LOADER2_OFFSET
  74. b boot_2nd
  75. tst r6, #3
  76. beq one_is_bad @ one of them (or both) has bad crc
  77. ldr r1, [r3, #4]
  78. ldr r2, [r4, #4]
  79. cmp r1, r2 @ boot 2nd loader if versions differ
  80. beq boot_1st
  81. b boot_2nd
  82. one_is_bad:
  83. tst r6, #1
  84. bne boot_1st
  85. tst r6, #2
  86. bne boot_2nd
  87. @ We are doomed, so let user know.
  88. ldr r0, GPIO_BASE @ configure GPIO pins
  89. ldr r1, GPIO_DIRECTION
  90. strh r1, [r0, #0x08]
  91. blink_loop:
  92. mov r1, #0x08
  93. strh r1, [r0, #0x04]
  94. wait r3
  95. mov r1, #0x10
  96. strh r1, [r0, #0x04]
  97. wait r3
  98. b blink_loop
  99. boot_1st:
  100. add pc, r3, #8
  101. boot_2nd:
  102. add pc, r4, #8
  103. _LOADER_SIZE:
  104. .word LOADER_SIZE - 8 @ minus size and crc32
  105. _LOADER1_OFFSET:
  106. .word LOADER1_OFFSET
  107. _LOADER2_OFFSET:
  108. .word LOADER2_OFFSET
  109. FFFFFFFF:
  110. .word 0xffffffff
  111. CRC32_TABLE:
  112. .word 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419
  113. .word 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4
  114. .word 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07
  115. .word 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de
  116. .word 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856
  117. .word 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9
  118. .word 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4
  119. .word 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b
  120. .word 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3
  121. .word 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a
  122. .word 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599
  123. .word 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924
  124. .word 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190
  125. .word 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f
  126. .word 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e
  127. .word 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01
  128. .word 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed
  129. .word 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950
  130. .word 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3
  131. .word 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2
  132. .word 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a
  133. .word 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5
  134. .word 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010
  135. .word 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f
  136. .word 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17
  137. .word 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6
  138. .word 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615
  139. .word 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8
  140. .word 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344
  141. .word 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb
  142. .word 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a
  143. .word 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5
  144. .word 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1
  145. .word 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c
  146. .word 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef
  147. .word 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236
  148. .word 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe
  149. .word 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31
  150. .word 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c
  151. .word 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713
  152. .word 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b
  153. .word 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242
  154. .word 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1
  155. .word 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c
  156. .word 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278
  157. .word 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7
  158. .word 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66
  159. .word 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9
  160. .word 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605
  161. .word 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8
  162. .word 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b
  163. .word 0x2d02ef8d
  164. GPIO_BASE:
  165. .word 0xfffce000
  166. GPIO_DIRECTION:
  167. .word 0x0000ffe7
  168. .end