00001
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045 #include <avr32/io.h>
00046 #include "conf_isp.h"
00047
00048
00051
00052
00053
00054
00055
00056 .macro eor.w rd, imm
00057 .if \imm & 0x0000FFFF
00058 eorl \rd, LO(\imm)
00059 .endif
00060 .if \imm & 0xFFFF0000
00061 eorh \rd, HI(\imm)
00062 .endif
00063 .endm
00064
00065
00066 .macro mov.w rd, imm
00067 .if ((-(1 << (21 - 1))) <= \imm) && (\imm <= ((1 << (21 - 1)) - 1))
00068 mov \rd, \imm
00069 #if __AVR32_UC__ >= 2
00070 .elseif !(\imm & 0x0000FFFF)
00071 movh \rd, HI(\imm)
00072 #endif
00073 .else
00074 mov \rd, LO(\imm)
00075 orh \rd, HI(\imm)
00076 .endif
00077 .endm
00078
00079
00080
00081
00082 .macro or.w rd, imm
00083 .if \imm & 0x0000FFFF
00084 orl \rd, LO(\imm)
00085 .endif
00086 .if \imm & 0xFFFF0000
00087 orh \rd, HI(\imm)
00088 .endif
00089 .endm
00090
00091
00092 .section .reset, "ax", @progbits
00093
00094
00095 .balign 2
00096
00097
00098 .global _start
00099 .type _start, @function
00100 _start:
00101
00102 add r0, r0
00103 add r0, r0
00104 add r0, r0
00105 add r0, r0
00106 add r0, r0
00107 add r0, r0
00108 add r0, r0
00109 add r0, r0
00110 add r0, r0
00111 add r0, r0
00112 add r0, r0
00113 add r0, r0
00114 add r0, r0
00115 add r0, r0
00116 add r0, r0
00117 add r0, r0
00118 mov.w r8, ISP_KEY_ADDRESS
00119 mov.w r9, AVR32_WDT_ADDRESS
00120 mov.w r10, ISP_CFG1_ADDRESS
00121 mov.w r11, AVR32_PM_ADDRESS
00122 ld.w r0, r8[0]
00123 mov.w r1, ISP_KEY_VALUE
00124
00125
00126 ld.w r2, r10[0]
00127 mov.w r3, ISP_CFG1_CRC8_POLYNOMIAL
00128 mov r4, r2
00129 rcall test_crc8_end
00130 brne start_loader
00131
00132
00133 bfextu r3, r2, ISP_CFG1_BOOT_KEY1_OFFSET, ISP_CFG1_BOOT_KEY1_SIZE
00134 cp.w r3, ISP_CFG1_BOOT_KEY1_VALUE
00135 brne start_loader
00136
00137
00138 test_isp_force:
00139 bld r2, ISP_CFG1_FORCE_OFFSET
00140 brcs start_loader
00141
00142
00143 ld.w r3, r11[AVR32_PM_RCAUSE]
00144 mov.w r4, AVR32_PM_RCAUSE_POR_MASK |\
00145 AVR32_PM_RCAUSE_EXT_MASK |\
00146 AVR32_PM_RCAUSE_JTAG_MASK |\
00147 AVR32_PM_RCAUSE_OCDRST_MASK |\
00148 AVR32_PM_RCAUSE_JTAGHARD_MASK
00149 tst r3, r4
00150 brne manage_io_cond
00151
00152
00153 bld r3, AVR32_PM_RCAUSE_WDT_OFFSET
00154 brcs start_program
00155
00156
00157 cp.w r0, r1
00158 brne start_program_no_isp_key
00159
00160
00161 start_loader:
00162 rcall disable_wdt
00163 st.w r8[0], r1
00164
00165
00166 mov sp, _estack
00167
00168
00169 ssrf AVR32_SR_EM_OFFSET
00170
00171
00172 mov r0, _evba
00173 mtsr AVR32_EVBA, r0
00174
00175
00176 mov r0, _data
00177 mov r1, _edata
00178 sub r2, pc, $ - _data_lma
00179 rcall load_idata
00180
00181
00182 mov r0, __bss_start
00183 mov r1, _end
00184 mov.w r2, 0
00185 mov.w r3, 0
00186 rjmp clear_udata
00187 clear_udata_loop:
00188 st.d r0++, r2
00189 clear_udata:
00190 cp.w r0, r1
00191 brlo clear_udata_loop
00192
00193
00194 mov r0, _const
00195 mov r1, _econst
00196 sub r2, pc, $ - _const_lma
00197 rcall load_idata
00198
00199
00200 call main
00201
00202
00203 manage_io_cond:
00204
00205 bld r2, ISP_CFG1_IO_COND_EN_OFFSET
00206 brcc start_program
00207
00208
00209 mov.w r10, ISP_CFG2_ADDRESS
00210 ld.w r2, r10[0]
00211 mov.w r3, ISP_CFG2_CRC8_POLYNOMIAL
00212 mov r4, r2
00213 rcall test_crc8_end
00214 brne start_loader
00215
00216
00217 bfextu r3, r2, ISP_CFG2_BOOT_KEY_OFFSET, ISP_CFG2_BOOT_KEY_SIZE
00218 cp.w r3, ISP_CFG2_BOOT_KEY_VALUE
00219 brne start_loader
00220
00221
00222 bfextu r3, r2, ISP_CFG2_IO_COND_PIN_OFFSET, ISP_CFG2_IO_COND_PIN_SIZE
00223 cp.w r3, AVR32_GPIO_NUMBER_OF_PINS
00224 brhs start_loader
00225
00226
00227 mov.w r10, AVR32_GPIO_ADDRESS
00228 lsr r4, r3, 5
00229 lsl r4, 8
00230 add r10, r4
00231 ld.w r4, r10[AVR32_GPIO_PVR]
00232 andl r3, 0x1F
00233 lsr r4, r4, r3
00234 bfextu r3, r2, ISP_CFG2_IO_COND_LEVEL_OFFSET, ISP_CFG2_IO_COND_LEVEL_SIZE
00235 eor r4, r3
00236 bld r4, 0
00237 brcc start_loader
00238
00239 start_program:
00240 cp.w r0, r1
00241 brne start_program_no_isp_key
00242 rcall disable_wdt
00243 .global boot_program
00244 .type boot_program, @function
00245 boot_program:
00246
00247 mov.w r8, ISP_KEY_ADDRESS
00248 mov.w r0, 0
00249 st.w r8[0], r0
00250 start_program_no_isp_key:
00251 mov.w r0, AVR32_SR_GM_MASK | AVR32_SR_EM_MASK | (AVR32_SR_M_SUP << AVR32_SR_M_OFFSET)
00252 mtsr AVR32_SR, r0
00253 .irp rd, r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, sp, lr
00254 mov.w \rd, 0
00255 .endr
00256 mtsr AVR32_EVBA, r0
00257 mtsr AVR32_COUNT, r0
00258 lddpc pc, program_start_address
00259
00260 disable_wdt:
00261 mov.w r2, AVR32_WDT_KEY_VALUE << AVR32_WDT_CTRL_KEY_OFFSET
00262 st.w r9[AVR32_WDT_CTRL], r2
00263 eor.w r2, AVR32_WDT_CTRL_KEY_MASK
00264 st.w r9[AVR32_WDT_CTRL], r2
00265 mov pc, lr
00266
00267 load_idata_loop:
00268 ld.d r4, r2++
00269 st.d r0++, r4
00270 load_idata:
00271 cp.w r0, r1
00272 brlo load_idata_loop
00273 mov pc, lr
00274
00275
00276 crc8:
00277 clz r5, r4
00278 rsub r5, r5, 32 - 9
00279 lsl r5, r3, r5
00280 eor r4, r5
00281 #if 0
00282 .global test_crc8_end
00283 .type test_crc8_end, @function
00284 #endif
00285 test_crc8_end:
00286 cp.w r4, 0xFF
00287 brhi crc8
00288 cp.w r4, 0
00289 retal r4
00290
00291
00292
00293
00294 .balign 4
00295
00296 program_start_address:
00297 .word PROGRAM_START_ADDRESS
00298
00299
00300 .section .evba, "ax", @progbits
00301
00302
00303 .balign 2
00304
00305
00306 .global _evba
00307 .type _evba, @function
00308 _evba:
00309 lda.w r8, _start
00310 mov.w r9, AVR32_SR_GM_MASK | AVR32_SR_EM_MASK | (AVR32_SR_M_SUP << AVR32_SR_M_OFFSET)
00311 mov sp, _estack - 6 * 4
00312 pushm r8-r9
00313 rete
00314
00315