31
31
32
32
#if defined(QEMU_SOC_STM32 )
33
33
34
+ #define UART_SR_RXNE (1 << 5)
35
+ #define UART_CR1_UE (1 << 13)
36
+ #define UART_CR1_TE (1 << 3)
37
+ #define UART_CR1_RE (1 << 2)
38
+
34
39
typedef struct _UART_t {
35
40
volatile uint32_t SR ;
36
41
volatile uint32_t DR ;
42
+ volatile uint32_t BRR ;
43
+ volatile uint32_t CR1 ;
37
44
} UART_t ;
38
45
39
46
#define UART0 ((UART_t *)(0x40011000))
40
47
41
48
void uart_init (void ) {
49
+ UART0 -> CR1 = UART_CR1_UE | UART_CR1_TE | UART_CR1_RE ;
50
+ }
51
+
52
+ int uart_rx_chr (void ) {
53
+ if (!(UART0 -> SR & UART_SR_RXNE )) {
54
+ return UART_RX_NO_CHAR ;
55
+ }
56
+ return UART0 -> DR ;
42
57
}
43
58
44
59
void uart_tx_strn (const char * buf , size_t len ) {
@@ -50,21 +65,34 @@ void uart_tx_strn(const char *buf, size_t len) {
50
65
#elif defined(QEMU_SOC_NRF51 )
51
66
52
67
typedef struct _UART_t {
53
- volatile uint32_t r0 [2 ];
68
+ volatile uint32_t STARTRX ; // 0x000
69
+ volatile uint32_t STOPRX ; // 0x004
54
70
volatile uint32_t STARTTX ; // 0x008
55
- volatile uint32_t r1 [(0x500 - 0x008 ) / 4 - 1 ];
71
+ volatile uint32_t r0 [(0x108 - 0x008 ) / 4 - 1 ];
72
+ volatile uint32_t RXDRDY ; // 0x108
73
+ volatile uint32_t r1 [(0x500 - 0x108 ) / 4 - 1 ];
56
74
volatile uint32_t ENABLE ; // 0x500
57
- volatile uint32_t r2 [(0x51c - 0x500 ) / 4 - 1 ];
75
+ volatile uint32_t r2 [(0x518 - 0x500 ) / 4 - 1 ];
76
+ volatile uint32_t RXD ; // 0x518
58
77
volatile uint32_t TXD ; // 0x51c
59
78
} UART_t ;
60
79
61
80
#define UART0 ((UART_t *)(0x40002000))
62
81
63
82
void uart_init (void ) {
64
83
UART0 -> ENABLE = 4 ;
84
+ UART0 -> STARTRX = 1 ;
65
85
UART0 -> STARTTX = 1 ;
66
86
}
67
87
88
+ int uart_rx_chr (void ) {
89
+ if (!UART0 -> RXDRDY ) {
90
+ return UART_RX_NO_CHAR ;
91
+ }
92
+ UART0 -> RXDRDY = 0 ;
93
+ return UART0 -> RXD ;
94
+ }
95
+
68
96
void uart_tx_strn (const char * buf , size_t len ) {
69
97
for (size_t i = 0 ; i < len ; ++ i ) {
70
98
UART0 -> TXD = buf [i ];
@@ -74,6 +102,7 @@ void uart_tx_strn(const char *buf, size_t len) {
74
102
#elif defined(QEMU_SOC_MPS2 )
75
103
76
104
#define UART_STATE_TXFULL (1 << 0)
105
+ #define UART_STATE_RXFULL (1 << 1)
77
106
78
107
#define UART_CTRL_TX_EN (1 << 0)
79
108
#define UART_CTRL_RX_EN (1 << 1)
@@ -90,7 +119,14 @@ typedef struct _UART_t {
90
119
91
120
void uart_init (void ) {
92
121
UART0 -> BAUDDIV = 16 ;
93
- UART0 -> CTRL = UART_CTRL_TX_EN ;
122
+ UART0 -> CTRL = UART_CTRL_TX_EN | UART_CTRL_RX_EN ;
123
+ }
124
+
125
+ int uart_rx_chr (void ) {
126
+ if (!(UART0 -> STATE & UART_STATE_RXFULL )) {
127
+ return UART_RX_NO_CHAR ;
128
+ }
129
+ return UART0 -> DATA ;
94
130
}
95
131
96
132
void uart_tx_strn (const char * buf , size_t len ) {
@@ -104,7 +140,9 @@ void uart_tx_strn(const char *buf, size_t len) {
104
140
#elif defined(QEMU_SOC_IMX6 )
105
141
106
142
#define UART_UCR1_UARTEN (1 << 0)
143
+ #define UART_UCR2_RXEN (1 << 1)
107
144
#define UART_UCR2_TXEN (1 << 2)
145
+ #define UART_UTS1_RXEMPTY (1 << 5)
108
146
109
147
typedef struct _UART_t {
110
148
volatile uint32_t URXD ; // 0x00
@@ -113,13 +151,22 @@ typedef struct _UART_t {
113
151
volatile uint32_t r1 [15 ];
114
152
volatile uint32_t UCR1 ; // 0x80
115
153
volatile uint32_t UCR2 ; // 0x84
154
+ volatile uint32_t r2 [11 ];
155
+ volatile uint32_t UTS1 ; // 0xb4
116
156
} UART_t ;
117
157
118
158
#define UART1 ((UART_t *)(0x02020000))
119
159
120
160
void uart_init (void ) {
121
161
UART1 -> UCR1 = UART_UCR1_UARTEN ;
122
- UART1 -> UCR2 = UART_UCR2_TXEN ;
162
+ UART1 -> UCR2 = UART_UCR2_TXEN | UART_UCR2_RXEN ;
163
+ }
164
+
165
+ int uart_rx_chr (void ) {
166
+ if (UART1 -> UTS1 & UART_UTS1_RXEMPTY ) {
167
+ return UART_RX_NO_CHAR ;
168
+ }
169
+ return UART1 -> URXD & 0xff ;
123
170
}
124
171
125
172
void uart_tx_strn (const char * buf , size_t len ) {
0 commit comments