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 mov.w r8, ISP_KEY_ADDRESS
00102 mov.w r9, AVR32_WDT_ADDRESS
00103 mov.w r10, AVR32_FLASHC_ADDRESS
00104 mov.w r11, AVR32_PM_ADDRESS
00105 ld.w r0, r8[0]
00106 mov.w r1, ISP_KEY_VALUE
00107 ld.w r2, r10[AVR32_FLASHC_FGPFRLO]
00108 bld r2, ISP_GPFB_BOD_EN_OFFSET
00109 brcc test_isp_gpfb_force
00110 ld.w r3, r11[AVR32_PM_BOD]
00111 mov.w r4, AVR32_BOD_KEY << AVR32_PM_BOD_KEY_OFFSET
00112 or.w r3, AVR32_PM_BOD_FCD_MASK |\
00113 ((~AVR32_BOD_KEY << AVR32_PM_BOD_KEY_OFFSET) & AVR32_PM_BOD_KEY_MASK)
00114 mov.w r5, AVR32_PM_BOD_CTRL_ENABLED_NORESET
00115 bfins r3, r5, AVR32_PM_BOD_CTRL_OFFSET, AVR32_PM_BOD_CTRL_SIZE
00116 st.w r11[AVR32_PM_BOD], r4
00117 st.w r11[AVR32_PM_BOD], r3
00118 mov.w r5, AVR32_PM_BOD_CTRL_ENABLED
00119 bfins r3, r5, AVR32_PM_BOD_CTRL_OFFSET, AVR32_PM_BOD_CTRL_SIZE
00120 st.w r11[AVR32_PM_BOD], r4
00121 st.w r11[AVR32_PM_BOD], r3
00122 test_isp_gpfb_force:
00123 bld r2, ISP_GPFB_FORCE_OFFSET
00124 brcs start_loader
00125 ld.w r3, r11[AVR32_PM_RCAUSE]
00126 mov.w r4, AVR32_PM_RCAUSE_POR_MASK |\
00127 AVR32_PM_RCAUSE_EXT_MASK |\
00128 AVR32_PM_RCAUSE_JTAG_MASK |\
00129 AVR32_PM_RCAUSE_OCDRST_MASK |\
00130 AVR32_PM_RCAUSE_JTAGHARD_MASK
00131 tst r3, r4
00132 brne manage_io_cond
00133 bld r3, AVR32_PM_RCAUSE_WDT_OFFSET
00134 brcs start_program
00135 cp.w r0, r1
00136 brne start_program_no_isp_key
00137
00138 start_loader:
00139 rcall disable_wdt
00140 st.w r8[0], r1
00141
00142
00143 mov sp, _estack
00144
00145
00146 ssrf AVR32_SR_EM_OFFSET
00147
00148
00149 mov r0, _evba
00150 mtsr AVR32_EVBA, r0
00151
00152
00153 mov r0, _data
00154 mov r1, _edata
00155 sub r2, pc, $ - _data_lma
00156 rcall load_idata
00157
00158
00159 mov r0, __bss_start
00160 mov r1, _end
00161 mov.w r2, 0
00162 mov.w r3, 0
00163 rjmp clear_udata
00164 clear_udata_loop:
00165 st.d r0++, r2
00166 clear_udata:
00167 cp.w r0, r1
00168 brlo clear_udata_loop
00169
00170
00171 mov r0, _const
00172 mov r1, _econst
00173 sub r2, pc, $ - _const_lma
00174 rcall load_idata
00175
00176
00177 call main
00178
00179 manage_io_cond:
00180 bld r2, ISP_GPFB_IO_COND_EN_OFFSET
00181 brcc start_program
00182 mov.w r10, ISP_CFG_ADDRESS
00183 ld.w r2, r10[0]
00184 mov.w r3, ISP_CFG_CRC8_POLYNOMIAL
00185 mov r4, r2
00186 rjmp test_crc8_end
00187 crc8:
00188 clz r5, r4
00189 rsub r5, r5, 32 - 9
00190 lsl r5, r3, r5
00191 eor r4, r5
00192 test_crc8_end:
00193 cp.w r4, 0xFF
00194 brhi crc8
00195 cp.w r4, 0
00196 brne start_loader
00197 bfextu r3, r2, ISP_CFG_BOOT_KEY_OFFSET, ISP_CFG_BOOT_KEY_SIZE
00198 cp.w r3, ISP_CFG_BOOT_KEY_VALUE
00199 brne start_loader
00200 bfextu r3, r2, ISP_CFG_IO_COND_PIN_OFFSET, ISP_CFG_IO_COND_PIN_SIZE
00201 cp.w r3, AVR32_GPIO_NUMBER_OF_PINS
00202 brhs start_loader
00203 mov.w r10, AVR32_GPIO_ADDRESS
00204 lsr r4, r3, 5
00205 lsl r4, 8
00206 add r10, r4
00207 ld.w r4, r10[AVR32_GPIO_PVR]
00208 andl r3, 0x1F
00209 lsr r4, r4, r3
00210 bfextu r3, r2, ISP_CFG_IO_COND_LEVEL_OFFSET, ISP_CFG_IO_COND_LEVEL_SIZE
00211 eor r4, r3
00212 bld r4, 0
00213 brcc start_loader
00214
00215 start_program:
00216 cp.w r0, r1
00217 brne start_program_no_isp_key
00218 rcall disable_wdt
00219 .global boot_program
00220 .type boot_program, @function
00221 boot_program:
00222 mov.w r8, ISP_KEY_ADDRESS
00223 mov.w r0, 0
00224 st.w r8[0], r0
00225 start_program_no_isp_key:
00226 mov.w r0, AVR32_SR_GM_MASK | AVR32_SR_EM_MASK | (AVR32_SR_M_SUP << AVR32_SR_M_OFFSET)
00227 mtsr AVR32_SR, r0
00228 .irp rd, r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, sp, lr
00229 mov.w \rd, 0
00230 .endr
00231 mtsr AVR32_EVBA, r0
00232 mtsr AVR32_COUNT, r0
00233 lddpc pc, program_start_address
00234
00235 disable_wdt:
00236 mov.w r2, AVR32_WDT_KEY_VALUE << AVR32_WDT_CTRL_KEY_OFFSET
00237 st.w r9[AVR32_WDT_CTRL], r2
00238 eor.w r2, AVR32_WDT_CTRL_KEY_MASK
00239 st.w r9[AVR32_WDT_CTRL], r2
00240 mov pc, lr
00241
00242 load_idata_loop:
00243 ld.d r4, r2++
00244 st.d r0++, r4
00245 load_idata:
00246 cp.w r0, r1
00247 brlo load_idata_loop
00248 mov pc, lr
00249
00250
00251
00252
00253 .balign 4
00254
00255 program_start_address:
00256 .word PROGRAM_START_ADDRESS
00257
00258
00259 .section .evba, "ax", @progbits
00260
00261
00262 .balign 2
00263
00264
00265 .global _evba
00266 .type _evba, @function
00267 _evba:
00268 lda.w r8, _start
00269 mov.w r9, AVR32_SR_GM_MASK | AVR32_SR_EM_MASK | (AVR32_SR_M_SUP << AVR32_SR_M_OFFSET)
00270 mov sp, _estack - 6 * 4
00271 pushm r8-r9
00272 rete
00273
00274