--HG-- branch : dtrg-videocore rename : plat/rpi/libsys/pi_user_to_phys.s => plat/rpi/libsys/pi_fast_mode.s
		
			
				
	
	
		
			185 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			185 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| #
 | |
| /*
 | |
|  * Raspberry Pi support library for the ACK
 | |
|  * © 2013 David Given
 | |
|  * This file is redistributable under the terms of the 3-clause BSD license.
 | |
|  * See the file 'Copying' in the root of the distribution for the full text.
 | |
|  */
 | |
| 
 | |
| #include "libsysasm.h"
 | |
| 
 | |
| .sect .text
 | |
| 
 | |
| ! Because of the low system clock rate, this baud rate might be inaccurate
 | |
| ! So be careful with your serial/terminal, some adjustment may be necessary.
 | |
| TARGET_BAUD_RATE = 115200
 | |
| 
 | |
| GPFSEL1 = 0x7e200004
 | |
| GPSET0 = 0x7e20001C
 | |
| GPCLR0 = 0x7e200028
 | |
| GPPUD = 0x7e200094
 | |
| GPPUDCLK0 = 0x7e200098
 | |
| 
 | |
| AUX_ENABLES = 0x7e215004
 | |
| AUX_MU_IO_REG = 0x7e215040
 | |
| AUX_MU_IER_REG = 0x7e215044
 | |
| AUX_MU_IIR_REG = 0x7e215048
 | |
| AUX_MU_LCR_REG = 0x7e21504C
 | |
| AUX_MU_MCR_REG = 0x7e215050
 | |
| AUX_MU_LSR_REG = 0x7e215054
 | |
| AUX_MU_MSR_REG = 0x7e215058
 | |
| AUX_MU_SCRATCH = 0x7e21505C
 | |
| AUX_MU_CNTL_REG = 0x7e215060
 | |
| AUX_MU_STAT_REG = 0x7e215064
 | |
| AUX_MU_BAUD_REG = 0x7e215068
 | |
| 
 | |
| ! Sets up the mini UART for use as a console.
 | |
| 
 | |
| .define _pi_init_uart
 | |
| _pi_init_uart:
 | |
| 	! Configure TX and RX GPIO pins for Mini Uart function.
 | |
| 	mov	r1, #GPFSEL1
 | |
| 	ld	r0, (r1)
 | |
| 	and	r0, #~[7<<12]
 | |
| 	or	r0, #2<<12
 | |
| 	and	r0, #~[7<<15]
 | |
| 	or	r0, #2<<15
 | |
| 	st	r0, (r1)
 | |
| 
 | |
| 	mov	r1, #GPPUD
 | |
| 	mov	r0, #0
 | |
| 	st	r0, (r1)
 | |
| 
 | |
| delay1:
 | |
| 	add	r0, #1
 | |
| 	cmp	r0, #150
 | |
| 	b.ne delay1
 | |
| 
 | |
| 	mov	r1, #GPPUDCLK0
 | |
| 	mov	r0, #[1<<14]|[1<<15]
 | |
| 	st	r0, (r1)
 | |
| 
 | |
| 	mov	r0, #0
 | |
| delay2:
 | |
| 	add	r0, #1
 | |
| 	cmp	r0, #150
 | |
| 	b.ne delay2
 | |
| 
 | |
| 	mov	r1, #GPPUDCLK0
 | |
| 	mov	r0, #0
 | |
| 	st	r0, (r1)
 | |
| 
 | |
| 	! Set up serial port
 | |
| 	mov	r1, #AUX_ENABLES
 | |
| 	mov	r0, #1
 | |
| 	st	r0, (r1)
 | |
| 
 | |
| 	mov	r1, #AUX_MU_IER_REG
 | |
| 	mov	r0, #0
 | |
| 	st	r0, (r1)
 | |
| 
 | |
| 	mov	r1, #AUX_MU_CNTL_REG
 | |
| 	mov	r0, #0
 | |
| 	st	r0, (r1)
 | |
| 
 | |
| 	mov	r1, #AUX_MU_LCR_REG
 | |
| 	mov	r0, #3
 | |
| 	st	r0, (r1)
 | |
| 
 | |
| 	mov	r1, #AUX_MU_MCR_REG
 | |
| 	mov	r0, #0
 | |
| 	st	r0, (r1)
 | |
| 
 | |
| 	mov	r1, #AUX_MU_IER_REG
 | |
| 	mov	r0, #0
 | |
| 	st	r0, (r1)
 | |
| 
 | |
| 	mov	r1, #AUX_MU_IIR_REG
 | |
| 	mov	r0, #0xC6
 | |
| 	st	r0, (r1)
 | |
| 
 | |
| 	mov	r1, #AUX_MU_BAUD_REG
 | |
| 	ld r0, _pi_clock_speed
 | |
| 	mov r2, #TARGET_BAUD_RATE*8
 | |
| 	divu r0, r0, r2
 | |
| 	sub r0, #1
 | |
| 	st	r0, (r1)
 | |
| 
 | |
| 	mov	r1, #AUX_MU_LCR_REG
 | |
| 	mov	r0, #3
 | |
| 	st	r0, (r1)
 | |
| 
 | |
| 	mov	r1, #AUX_MU_CNTL_REG
 | |
| 	mov	r0, #3
 | |
| 	st	r0, (r1)
 | |
| 
 | |
| 	! Mark the uart as being initialised.
 | |
| 	mov r0, #1
 | |
| 	stb r0, __uart_status
 | |
| 
 | |
| 	b lr
 | |
| 
 | |
| ! Send a single byte.
 | |
| 
 | |
| .define __sys_rawwrite
 | |
| __sys_rawwrite:
 | |
| 	ldb r0, __uart_status
 | |
| 	b.eq r0, #0, 1f
 | |
| 
 | |
| 	ld r0, (sp)
 | |
| 	mov r1, #AUX_MU_LSR_REG
 | |
| 	! loop until space available in Tx buffer
 | |
| sendwait:
 | |
| 	ld	r2, (r1)
 | |
| 	and	r2, #0x20
 | |
| 	cmp	r2, #0x20
 | |
| 	b.ne sendwait
 | |
| 
 | |
| 	mov	r1, #AUX_MU_IO_REG
 | |
| 	stb	r0, (r1)
 | |
| 
 | |
| 1:
 | |
| 	b lr
 | |
| 
 | |
| ! Poll to see if there's incoming data available.
 | |
| 
 | |
| .define __sys_rawpoll
 | |
| .define __sys_rawpoll
 | |
| __sys_rawpoll:
 | |
| 	ldb r0, __uart_status
 | |
| 	b.eq r0, #0, 1b
 | |
| 
 | |
| 	mov r1, #AUX_MU_LSR_REG
 | |
| 	ld r0, (r1)
 | |
| 	and r0, #0x1 ! 0 if no data, 1 if data
 | |
| 1:
 | |
| 	b lr
 | |
| 
 | |
| ! Receive a single byte.
 | |
| 
 | |
| .define __sys_rawread
 | |
| __sys_rawread:
 | |
| 	ldb r0, __uart_status
 | |
| 	b.eq r0, #0, 1b
 | |
| 
 | |
| 	! receive 1 byte (returned in r0)
 | |
| 	mov	r1, #AUX_MU_LSR_REG
 | |
| 	mov	r2, #AUX_MU_IO_REG
 | |
| 	! loop until char available
 | |
| recvwait:
 | |
| 	ld r3, (r1)
 | |
| 	and	r3, #0x1
 | |
| 	b.ne r3, #0x1, recvwait
 | |
| 
 | |
| 	ldb	r0, (r2)
 | |
| 1:
 | |
| 	b lr
 | |
| 
 | |
| .comm __uart_status, 1
 | |
| 
 | |
| .sect .data
 | |
| .define _pi_clock_speed
 | |
| 
 | |
| ! System clock is running directly off the 19.2MHz crystal at initial reset
 | |
| _pi_clock_speed:
 | |
| 	.data4 19200000
 |