5 #include <l4/arm_drivers_c/uart.h>
8 /* ------------------------------------------------------------- */
21 MODE_8N1 = PAR_NONE | DAT_8 | STOP_1,
22 MODE_7E1 = PAR_EVEN | DAT_7 | STOP_1,
24 // these two values are to leave either mode
25 // or baud rate unchanged on a call to change_mode
69 inline static l4_addr_t _utcr0( l4_addr_t a )
72 inline static l4_addr_t _utcr1( l4_addr_t a )
75 inline static l4_addr_t _utcr2( l4_addr_t a )
78 inline static l4_addr_t _utcr3( l4_addr_t a )
81 inline static l4_addr_t _utcr4( l4_addr_t a )
84 inline static l4_addr_t _utdr( l4_addr_t a )
87 inline static l4_addr_t _utsr0( l4_addr_t a )
90 inline static l4_addr_t _utsr1( l4_addr_t a )
95 unsigned utcr0_get(void)
96 { return *((volatile unsigned*)(_utcr0(address))); }
99 unsigned utcr1_get(void)
100 { return *((volatile unsigned*)(_utcr1(address))); }
103 unsigned utcr2_get(void)
104 { return *((volatile unsigned*)(_utcr2(address))); }
107 unsigned utcr3_get(void)
108 { return *((volatile unsigned*)(_utcr3(address))); }
111 unsigned utcr4_get(void)
112 { return *((volatile unsigned*)(_utcr4(address))); }
115 unsigned utdr_get(void)
116 { return *((volatile unsigned*)(_utdr(address))); }
119 unsigned utsr0_get(void)
120 { return *((volatile unsigned*)(_utsr0(address))); }
123 unsigned utsr1_get(void)
124 { return *((volatile unsigned*)(_utsr1(address))); }
128 void utcr0_set(unsigned v)
129 { *((volatile unsigned*)(_utcr0(address)))= v; }
132 void utcr1_set(unsigned v)
133 { *((volatile unsigned*)(_utcr1(address)))= v; }
136 void utcr2_set(unsigned v)
137 { *((volatile unsigned*)(_utcr2(address)))= v; }
140 void utcr3_set(unsigned v)
141 { *((volatile unsigned*)(_utcr3(address)))= v; }
144 void utcr4_set(unsigned v)
145 { *((volatile unsigned*)(_utcr4(address)))= v; }
148 void utdr_set(unsigned v)
149 { *((volatile unsigned*)(_utdr(address)))= v; }
152 void utsr0_set(unsigned v)
153 { *((volatile unsigned*)(_utsr0(address)))= v; }
156 void utsr1_set(unsigned v)
157 { *((volatile unsigned*)(_utsr1(address)))= v; }
162 return !(utsr1_get() & UTSR1_TBY);
168 address = (unsigned)-1;
172 int uart_startup(l4_addr_t _address, unsigned irq)
176 utsr0_set((unsigned)-1); //clear pending status bits
177 utcr3_set(UTCR3_RXE | UTCR3_TXE); //enable transmitter and receiver
181 void uart_shutdown(void)
186 int uart_change_mode(TransferMode m, BaudRate baud)
188 unsigned old_utcr3, quot;
190 if(baud == (BaudRate)-1)
192 if(baud != BAUD_NC && (baud>115200 || baud<96))
194 if(m == (TransferMode)-1)
197 st = proc_cli_save();
198 old_utcr3 = utcr3_get();
199 utcr3_set(old_utcr3 & ~(UTCR3_RIE|UTCR3_TIE));
200 proc_sti_restore(st);
202 while(utsr1_get() & UTSR1_TBY);
207 /* set parity, data size, and stop bits */
209 utcr0_set(m & 0x0ff);
214 quot = (UARTCLK / (16*baud)) -1;
215 utcr1_set((quot & 0xf00) >> 8);
216 utcr2_set(quot & 0x0ff);
219 utsr0_set((unsigned)-1);
221 utcr3_set(old_utcr3);
225 int uart_write( const char *s, unsigned count )
231 st = proc_cli_save();
232 old_utcr3 = utcr3_get();
233 utcr3_set( (old_utcr3 & ~(UTCR3_RIE|UTCR3_TIE)) | UTCR3_TXE );
236 for(i =0; i<count; i++)
238 while(!(utsr1_get() & UTSR1_TNF)) ;
242 while(!(utsr1_get() & UTSR1_TNF)) ;
247 /* wait till everything is transmitted */
248 while(utsr1_get() & UTSR1_TBY) ;
250 utcr3_set(old_utcr3);
251 proc_sti_restore(st);
255 int uart_getchar(int blocking)
257 unsigned old_utcr3, ch;
259 old_utcr3 = utcr3_get();
260 utcr3_set( old_utcr3 & ~(UTCR3_RIE|UTCR3_TIE) );
261 while(!(utsr1_get() & UTSR1_RNE))
266 utcr3_set(old_utcr3);
270 int uart_char_avail(void)
272 if((utsr1_get() & UTSR1_RNE))
280 l4_addr_t uart_base(void)
286 int uart_get_mode(enum uart_mode_type type)
292 DAT_5 = (unsigned)-1,
293 DAT_6 = (unsigned)-1,
299 MODE_8N1 = PAR_NONE | DAT_8 | STOP_1,
300 MODE_7E1 = PAR_EVEN | DAT_7 | STOP_1,
302 // these two values are to leave either mode
303 // or baud rate unchanged on a call to change_mode
310 case UART_MODE_TYPE_8N1:
312 case UART_MODE_TYPE_NONE: