
################################################################################
# the main loop
################################################################################
main_loop:		ldr	r1, =0x18000c00		//cmd word
			mov	r2,#0		
			str	r2,[r1,#0]		//set to zero

main_loop_wait:		ldr	r0, [r1,#0]
			cmp	r0, r2
			beq	main_loop_wait
			
			ldr	r4, =FLASH_BASE
			
			mov	r7,r0			//address
			ldr	r2,=0xFFFFFF00
			and	r7,r2
			mov	r2,#0xff
			and	r0,r2			

			cmp	r0, #0x54		// prog main flash
			beq	erase_flash

			cmp	r0, #0x52		// prog main flash
			beq	prog_flash

tloop:			b	main_loop

################################################################################
# program 2K flash
################################################################################
prog_flash:		bl	main_unlock		//unlock

			ldr	r1, =0x20000400		//buffer base
			ldr	r6, =0x100		//lwords to do			

			mov	r2,#0x01		//set PG
			str	r2, [r4,#FLASH_CR]
			
prog_flash_1:		ldr	r0,[r1,#0]		//get data 1
			str	r0,[r7,#0]		//store word 1

			add	r7,#4			//flash addr
			add	r1,#4			//buffer addr

			ldr	r0,[r1,#0]		//get data 1
			str	r0,[r7,#0]		//store word 2

			ldr	r3, =0x010000		//BSY
prog_flash_3:		ldr	r2, [r4,#FLASH_SR]
			tst	r2,r3
			bne	prog_flash_3		//BNE

prog_flash_4:		add	r7,#4			//flash addr
			add	r1,#4			//buffer addr

			sub	r6,#1
			bne	prog_flash_1			
			
			b	main_loop


################################################################################
# program option bytes
################################################################################
prog_opt:		ldr	r2, =0x08192A3B		//key 1
			ldr	r3, =0x4C5D6E7F		//key 2
//			str	r2,[r4,#FLASH_KEYR]	//write key 1	
//			str	r3,[r4,#FLASH_KEYR]	//write key 2	
			str	r2,[r4,#FLASH_OPTKEYR]	//write key 1	
			str	r3,[r4,#FLASH_OPTKEYR]	//write key 2	
	
			ldr	r1, =0x20000400		//buffer base

			ldr	r4, =FLASH_BASE
			mov	r3,#0
			str	r3,[r4,#FLASH_CR]

prog_opt_1:		ldr	r0,[r1,#0]		//get data
			ldr	r2, = 0x80FFFFEC
			and	r0,r2
			str	r0,[r4,#FLASH_CR]
			mov	r2,#0x02
			orr	r0,r2
			str	r0,[r4,#FLASH_CR]
			
			ldr	r3, =0x010000		//BSY
prog_opt_3:		ldr	r2, [r4,#FLASH_SR]
			tst	r2,r3
			bne	prog_opt_3
			
			b	main_loop

			.align 2
		

		