1 // SPDX-License-Identifier: GPL-2.0
2 
3 // Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED.
4 
5 #include <platform.h>
6 
7 @******************************************************************************
8 @
9 @  void uart_early_init(void);
10 @
11 .text
12 .align	2
13 .global	uart_early_init
14 .type	uart_early_init, %function
15 uart_early_init:
16 	ldr	a4, uart_base_addr_L0
17 	mov	a3, #0
18 	/* Disable UART */
19 	str	a3, [a4, #48]
20 	/* Set baud rate to 115200, uart clock:24M */
21 	add	a3, a3, #13
22 	str	a3, [a4, #36]
23 	mov	a3, #1
24 	str	a3, [a4, #40]
25 	/* Set the UART to be 8 bits, 1 stop bit, no parity, fifo enabled. */
26 	ldr	a3, =112
27 	str	a3, [a4, #44]
28 	/* Enable UART */
29 	ldr	a3, =769
30 	str	a3, [a4, #48]
31 	bx	lr
32 uart_base_addr_L0:
33 	.word UART0_REG_BASE
34 
35 @******************************************************************************
36 @
37 @  void uart_early_puts(const char *ss);
38 @
39 .align	2
40 .global	uart_early_puts
41 .type	uart_early_puts, %function
42 uart_early_puts:
43 #if !defined(CONFIG_SUPPORT_CA_RELEASE)
44 	ldr	a2, uart_base_addr_L1
45 	b	next_char
46 output:
47 	ldr	a4, [a2, #24]
48 	tst	a4, #32
49 	bne	output
50 	str	a3, [a2, #0]
51 	add	a1, a1, #1
52 next_char:
53 	ldrb	a3, [a1]
54 	cmp	a3, #0
55 	bne	output
56 #endif /* CONFIG_SUPPORT_CA_RELEASE */
57 	bx	lr
58 uart_base_addr_L1:
59 	.word UART0_REG_BASE
60 
61 @******************************************************************************
62 @
63 @  void uart_early_put_hex(int hex);
64 @
65 @  call example:
66 @    mov	r0, sp
67 @    bl	uart_early_put_hex
68 @
69 .align	2
70 .global	uart_early_put_hex
71 .type	uart_early_put_hex, %function
72 uart_early_put_hex:
73 #if !defined(CONFIG_SUPPORT_CA_RELEASE)
74 	ldr	a2, uart_base_addr_L2
75 	mov	a3, #28
76 wait2:
77 	ldr	a4, [a2, #24]
78 	tst	a4, #32
79 	bne	wait2
80 
81 	mov	a4, #0xF
82 	and	a4, a4, a1, lsr a3
83 	cmp	a4, #9
84 	addle	a4, a4, #0x30	@ a4 = a4 + '0'
85 	addgt	a4, a4, #55	@ a4 = a4 - 10 + 'A'
86 	str	a4, [a2, #0]
87 	cmp	a3, #0
88 	beq	exit2
89 	sub	a3, a3, #4
90 	b	wait2
91 exit2:
92 #endif /* CONFIG_SUPPORT_CA_RELEASE */
93 	bx	lr
94 uart_base_addr_L2:
95 	.word UART0_REG_BASE
96 
97 @******************************************************************************
98 @
99 @  void uart_early_putc(int chr);
100 @
101 @  call example:
102 @    mov	r0, #'A'
103 @    bl	uart_early_putc
104 @
105 .align	2
106 .global	uart_early_putc
107 .type	uart_early_putc, %function
108 uart_early_putc:
109 #if !defined(CONFIG_SUPPORT_CA_RELEASE)
110 	ldr	a2, uart_base_addr_L3
111 wait3:
112 	ldr	a4, [a2, #24]
113 	tst	a4, #32
114 	bne	wait3
115 	str	a1, [a2, #0]
116 
117 #endif /* CONFIG_SUPPORT_CA_RELEASE */
118 	bx	lr
119 uart_base_addr_L3:
120 	.word UART0_REG_BASE
121