forked from Github_Repos/cvw
		
	
		
			
				
	
	
		
			155 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
			
		
		
	
	
			155 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
| 	# start by writting the clock divider to 4 setting SDC to 25MHz
 | |
| 	la	x3, 0x12100
 | |
| 	li	x4, -4
 | |
| 	sw	x4, 0x0(x3)
 | |
| 
 | |
| 	# start by writting the clock divider to 1 setting SDC to 100MHZ
 | |
| 	la	x3, 0x12100
 | |
| 	li	x4, 1
 | |
| 	sw	x4, 0x0(x3)
 | |
| 
 | |
| 
 | |
| 	# wait until the SDC is done with initialization
 | |
| 	li	x4, 0x1
 | |
| wait_sdc_done_init:	
 | |
| 	lw	x5, 4(x3)
 | |
| 	and	x5, x5, x4
 | |
| 	bne	x5, x4, wait_sdc_done_init
 | |
| 
 | |
| 	# now that it is done lets setup for a read
 | |
| 	li	x6, 0x20000000
 | |
| 	sd	x6, 0x10(x3)    # write address register
 | |
| 
 | |
| 	# send read by writting to command register
 | |
| 	li	x7, 0x4
 | |
| 	sw	x7, 0x8(x3)
 | |
| 
 | |
| 	li 	x4, 0x2
 | |
| wait_sdc_done_read:	
 | |
| 	lw	x5, 4(x3)
 | |
| 	and	x5, x5, x4
 | |
| 	beq	x5, x4, wait_sdc_done_read
 | |
| 
 | |
| 	# copy data from mailbox
 | |
| 	li	x11, 0x80000000
 | |
| 	li	x9, 0
 | |
| copy_sdc:	
 | |
| 	li 	x8, 512/8
 | |
| 	ld	x10, 0x18(x3)  # read the mailbox
 | |
| 	sd	x10, 0x0(x11)  # write to dram
 | |
| 	addi	x9, x9, 1
 | |
| 	addi	x11, x11, 8
 | |
| 	blt	x9, x8, copy_sdc
 | |
| 
 | |
| 	# second read of sdc
 | |
| 	# now that it is done lets setup for a read
 | |
| 	li	x6, 0x20000200
 | |
| 	sd	x6, 0x10(x3)    # write address register
 | |
| 
 | |
| 	# send read by writting to command register
 | |
| 	li	x7, 0x4
 | |
| 	sw	x7, 0x8(x3)
 | |
| 
 | |
| 	li 	x4, 0x2
 | |
| wait_sdc_done_read2:	
 | |
| 	lw	x5, 4(x3)
 | |
| 	and	x5, x5, x4
 | |
| 	beq	x5, x4, wait_sdc_done_read2
 | |
| 
 | |
| 	# copy data from mailbox
 | |
| 	li	x11, 0x80000200
 | |
| 	li	x9, 0
 | |
| copy_sdc2:	
 | |
| 	li 	x8, 512/8
 | |
| 	ld	x10, 0x18(x3)  # read the mailbox
 | |
| 	sd	x10, 0x0(x11)  # write to dram
 | |
| 	addi	x9, x9, 1
 | |
| 	addi	x11, x11, 8
 | |
| 	blt	x9, x8, copy_sdc2
 | |
| 	
 | |
| 
 | |
| 
 | |
| 	# write to gpio
 | |
| 	li	x2, 0xFF
 | |
| 	la	x3, 0x10012000
 | |
| 
 | |
| 	# +8 is output enable
 | |
| 	# +C is output value
 | |
| 
 | |
| 	addi	x4, x3, 8
 | |
| 	addi	x5, x3, 0xC
 | |
| 
 | |
| 	# write initial value of 0xFF to GPO
 | |
| 	sw	x2, 0x0(x5)
 | |
| 	# enable output
 | |
| 	sw	x2, 0x0(x4)
 | |
| 
 | |
| 	# before jumping to led loop
 | |
| 	# lets try writting to dram.
 | |
| 
 | |
| 	li	x21, 0
 | |
| 	li	x23, 4096*16    # 64KB of data
 | |
| 
 | |
| 	li	x22, 0x80000000
 | |
| 	li	x24, 0
 | |
| 
 | |
| write_loop:
 | |
| 	add	x25, x22, x24
 | |
| 	sw	x24, 0(x25)
 | |
| 	addi	x24, x24, 4
 | |
| 	blt	x24, x23, write_loop
 | |
| 
 | |
| 	li	x24, 0
 | |
| read_loop:
 | |
| 	add	x25, x22, x24
 | |
| 	lw	x21, 0(x25)
 | |
| 
 | |
| 	# check value
 | |
| 	bne	x21, x24, fail_loop
 | |
| 
 | |
| 	addi	x24, x24, 4
 | |
| 	
 | |
| 	#
 | |
| 	blt	x24, x23, read_loop
 | |
| 
 | |
| 	
 | |
| 
 | |
| loop:
 | |
| 
 | |
| 	# delay
 | |
| 	li	x20, PERIOD
 | |
| delay1:	
 | |
| 	addi	x20, x20, -1
 | |
| 	bge	x20, x0, delay1
 | |
| 
 | |
| 	# new GPO
 | |
| 	addi	x2, x2, 1
 | |
| 	sw	x2, 0x0(x5)
 | |
| 
 | |
| 	j	loop
 | |
| 
 | |
| 
 | |
| fail_loop:
 | |
| 
 | |
| 	# delay
 | |
| 	li	x20, PERIOD/20
 | |
| fail_delay1:	
 | |
| 	addi	x20, x20, -1
 | |
| 	bge	x20, x0, fail_delay1
 | |
| 
 | |
| 	# clear GPO
 | |
| 	sw	x0, 0x0(x5)
 | |
| 
 | |
| 	# delay
 | |
| 	li	x20, PERIOD/20
 | |
| fail_delay2:	
 | |
| 	addi	x20, x20, -1
 | |
| 	bge	x20, x0, fail_delay2
 | |
| 
 | |
| 	# write GPO
 | |
| 	sw	x2, 0x0(x5)
 | |
| 
 | |
| 	j	fail_loop
 | |
| 
 | |
| 
 |