Subversion Repositories HomeAutomation

Rev

Details | Last modification | View Log | SVN | RSS feed

Rev Author Line No. Line
361 andfri 1
   1               		.file	"uart.c"
2
   2               		.arch atmega8
3
   3               	__SREG__ = 0x3f
4
   4               	__SP_H__ = 0x3e
5
   5               	__SP_L__ = 0x3d
6
   6               	__tmp_reg__ = 0
7
   7               	__zero_reg__ = 1
8
   8               		.global __do_copy_data
9
   9               		.global __do_clear_bss
10
  11               		.text
11
  12               	.Ltext0:
12
  84               	.global	__vector_11
13
  86               	__vector_11:
14
   1:../avr-lib/drivers/uart/uart.c **** /*************************************************************************
15
   2:../avr-lib/drivers/uart/uart.c **** Title:    Interrupt UART library with receive/transmit circular buffers
16
   3:../avr-lib/drivers/uart/uart.c **** Author:   Peter Fleury <pfleury@gmx.ch>   http://jump.to/fleury
17
   4:../avr-lib/drivers/uart/uart.c **** File:     $Id: uart.c,v 1.5.2.10 2005/11/15 19:49:12 peter Exp $
18
   5:../avr-lib/drivers/uart/uart.c **** Software: AVR-GCC 3.3 
19
   6:../avr-lib/drivers/uart/uart.c **** Hardware: any AVR with built-in UART, 
20
   7:../avr-lib/drivers/uart/uart.c ****           tested on AT90S8515 at 4 Mhz and ATmega at 1Mhz
21
   8:../avr-lib/drivers/uart/uart.c **** 
22
   9:../avr-lib/drivers/uart/uart.c **** DESCRIPTION:
23
  10:../avr-lib/drivers/uart/uart.c ****     An interrupt is generated when the UART has finished transmitting or
24
  11:../avr-lib/drivers/uart/uart.c ****     receiving a byte. The interrupt handling routines use circular buffers
25
  12:../avr-lib/drivers/uart/uart.c ****     for buffering received and transmitted data.
26
  13:../avr-lib/drivers/uart/uart.c ****     
27
  14:../avr-lib/drivers/uart/uart.c ****     The UART_RX_BUFFER_SIZE and UART_TX_BUFFER_SIZE variables define
28
  15:../avr-lib/drivers/uart/uart.c ****     the buffer size in bytes. Note that these variables must be a 
29
  16:../avr-lib/drivers/uart/uart.c ****     power of 2.
30
  17:../avr-lib/drivers/uart/uart.c ****     
31
  18:../avr-lib/drivers/uart/uart.c **** USAGE:
32
  19:../avr-lib/drivers/uart/uart.c ****     Refere to the header file uart.h for a description of the routines. 
33
  20:../avr-lib/drivers/uart/uart.c ****     See also example test_uart.c.
34
  21:../avr-lib/drivers/uart/uart.c **** 
35
  22:../avr-lib/drivers/uart/uart.c **** NOTES:
36
  23:../avr-lib/drivers/uart/uart.c ****     Based on Atmel Application Note AVR306
37
  24:../avr-lib/drivers/uart/uart.c ****                     
38
  25:../avr-lib/drivers/uart/uart.c **** *************************************************************************/
39
  26:../avr-lib/drivers/uart/uart.c **** #include <avr/io.h>
40
  27:../avr-lib/drivers/uart/uart.c **** #include <avr/interrupt.h>
41
  28:../avr-lib/drivers/uart/uart.c **** #include <avr/pgmspace.h>
42
  29:../avr-lib/drivers/uart/uart.c **** #include <drivers/uart/uart.h>
43
  30:../avr-lib/drivers/uart/uart.c **** 
44
  31:../avr-lib/drivers/uart/uart.c **** 
45
  32:../avr-lib/drivers/uart/uart.c **** /*
46
  33:../avr-lib/drivers/uart/uart.c ****  *  constants and macros
47
  34:../avr-lib/drivers/uart/uart.c ****  */
48
  35:../avr-lib/drivers/uart/uart.c **** 
49
  36:../avr-lib/drivers/uart/uart.c **** /* size of RX/TX buffers */
50
  37:../avr-lib/drivers/uart/uart.c **** #define UART_RX_BUFFER_MASK ( UART_RX_BUFFER_SIZE - 1)
51
  38:../avr-lib/drivers/uart/uart.c **** #define UART_TX_BUFFER_MASK ( UART_TX_BUFFER_SIZE - 1)
52
  39:../avr-lib/drivers/uart/uart.c **** 
53
  40:../avr-lib/drivers/uart/uart.c **** #if ( UART_RX_BUFFER_SIZE & UART_RX_BUFFER_MASK )
54
  41:../avr-lib/drivers/uart/uart.c **** #error RX buffer size is not a power of 2
55
  42:../avr-lib/drivers/uart/uart.c **** #endif
56
  43:../avr-lib/drivers/uart/uart.c **** #if ( UART_TX_BUFFER_SIZE & UART_TX_BUFFER_MASK )
57
  44:../avr-lib/drivers/uart/uart.c **** #error TX buffer size is not a power of 2
58
  45:../avr-lib/drivers/uart/uart.c **** #endif
59
  46:../avr-lib/drivers/uart/uart.c **** 
60
  47:../avr-lib/drivers/uart/uart.c **** #if defined(__AVR_AT90S2313__) \
61
  48:../avr-lib/drivers/uart/uart.c ****  || defined(__AVR_AT90S4414__) || defined(__AVR_AT90S4434__) \
62
  49:../avr-lib/drivers/uart/uart.c ****  || defined(__AVR_AT90S8515__) || defined(__AVR_AT90S8535__) \
63
  50:../avr-lib/drivers/uart/uart.c ****  || defined(__AVR_ATmega103__)
64
  51:../avr-lib/drivers/uart/uart.c ****  /* old AVR classic or ATmega103 with one UART */
65
  52:../avr-lib/drivers/uart/uart.c ****  #define AT90_UART
66
  53:../avr-lib/drivers/uart/uart.c ****  #define UART0_RECEIVE_INTERRUPT   SIG_UART_RECV
67
  54:../avr-lib/drivers/uart/uart.c ****  #define UART0_TRANSMIT_INTERRUPT  SIG_UART_DATA
68
  55:../avr-lib/drivers/uart/uart.c ****  #define UART0_STATUS   USR
69
  56:../avr-lib/drivers/uart/uart.c ****  #define UART0_CONTROL  UCR
70
  57:../avr-lib/drivers/uart/uart.c ****  #define UART0_DATA     UDR  
71
  58:../avr-lib/drivers/uart/uart.c ****  #define UART0_UDRIE    UDRIE
72
  59:../avr-lib/drivers/uart/uart.c **** #elif defined(__AVR_AT90S2333__) || defined(__AVR_AT90S4433__)
73
  60:../avr-lib/drivers/uart/uart.c ****  /* old AVR classic with one UART */
74
  61:../avr-lib/drivers/uart/uart.c ****  #define AT90_UART
75
  62:../avr-lib/drivers/uart/uart.c ****  #define UART0_RECEIVE_INTERRUPT   SIG_UART_RECV
76
  63:../avr-lib/drivers/uart/uart.c ****  #define UART0_TRANSMIT_INTERRUPT  SIG_UART_DATA
77
  64:../avr-lib/drivers/uart/uart.c ****  #define UART0_STATUS   UCSRA
78
  65:../avr-lib/drivers/uart/uart.c ****  #define UART0_CONTROL  UCSRB
79
  66:../avr-lib/drivers/uart/uart.c ****  #define UART0_DATA     UDR 
80
  67:../avr-lib/drivers/uart/uart.c ****  #define UART0_UDRIE    UDRIE
81
  68:../avr-lib/drivers/uart/uart.c **** #elif  defined(__AVR_ATmega8__)  || defined(__AVR_ATmega16__) || defined(__AVR_ATmega32__) \
82
  69:../avr-lib/drivers/uart/uart.c ****   || defined(__AVR_ATmega8515__) || defined(__AVR_ATmega8535__) \
83
  70:../avr-lib/drivers/uart/uart.c ****   || defined(__AVR_ATmega323__)
84
  71:../avr-lib/drivers/uart/uart.c ****   /* ATmega with one USART */
85
  72:../avr-lib/drivers/uart/uart.c ****  #define ATMEGA_USART
86
  73:../avr-lib/drivers/uart/uart.c ****  #define UART0_RECEIVE_INTERRUPT   SIG_UART_RECV
87
  74:../avr-lib/drivers/uart/uart.c ****  #define UART0_TRANSMIT_INTERRUPT  SIG_UART_DATA
88
  75:../avr-lib/drivers/uart/uart.c ****  #define UART0_STATUS   UCSRA
89
  76:../avr-lib/drivers/uart/uart.c ****  #define UART0_CONTROL  UCSRB
90
  77:../avr-lib/drivers/uart/uart.c ****  #define UART0_DATA     UDR
91
  78:../avr-lib/drivers/uart/uart.c ****  #define UART0_UDRIE    UDRIE
92
  79:../avr-lib/drivers/uart/uart.c **** #elif defined(__AVR_ATmega163__) 
93
  80:../avr-lib/drivers/uart/uart.c ****   /* ATmega163 with one UART */
94
  81:../avr-lib/drivers/uart/uart.c ****  #define ATMEGA_UART
95
  82:../avr-lib/drivers/uart/uart.c ****  #define UART0_RECEIVE_INTERRUPT   SIG_UART_RECV
96
  83:../avr-lib/drivers/uart/uart.c ****  #define UART0_TRANSMIT_INTERRUPT  SIG_UART_DATA
97
  84:../avr-lib/drivers/uart/uart.c ****  #define UART0_STATUS   UCSRA
98
  85:../avr-lib/drivers/uart/uart.c ****  #define UART0_CONTROL  UCSRB
99
  86:../avr-lib/drivers/uart/uart.c ****  #define UART0_DATA     UDR
100
  87:../avr-lib/drivers/uart/uart.c ****  #define UART0_UDRIE    UDRIE
101
  88:../avr-lib/drivers/uart/uart.c **** #elif defined(__AVR_ATmega162__)
102
  89:../avr-lib/drivers/uart/uart.c ****  /* ATmega with two USART */
103
  90:../avr-lib/drivers/uart/uart.c ****  #define ATMEGA_USART0
104
  91:../avr-lib/drivers/uart/uart.c ****  #define ATMEGA_USART1
105
  92:../avr-lib/drivers/uart/uart.c ****  #define UART0_RECEIVE_INTERRUPT   SIG_USART0_RECV
106
  93:../avr-lib/drivers/uart/uart.c ****  #define UART1_RECEIVE_INTERRUPT   SIG_USART1_RECV
107
  94:../avr-lib/drivers/uart/uart.c ****  #define UART0_TRANSMIT_INTERRUPT  SIG_USART0_DATA
108
  95:../avr-lib/drivers/uart/uart.c ****  #define UART1_TRANSMIT_INTERRUPT  SIG_USART1_DATA
109
  96:../avr-lib/drivers/uart/uart.c ****  #define UART0_STATUS   UCSR0A
110
  97:../avr-lib/drivers/uart/uart.c ****  #define UART0_CONTROL  UCSR0B
111
  98:../avr-lib/drivers/uart/uart.c ****  #define UART0_DATA     UDR0
112
  99:../avr-lib/drivers/uart/uart.c ****  #define UART0_UDRIE    UDRIE0
113
 100:../avr-lib/drivers/uart/uart.c ****  #define UART1_STATUS   UCSR1A
114
 101:../avr-lib/drivers/uart/uart.c ****  #define UART1_CONTROL  UCSR1B
115
 102:../avr-lib/drivers/uart/uart.c ****  #define UART1_DATA     UDR1
116
 103:../avr-lib/drivers/uart/uart.c ****  #define UART1_UDRIE    UDRIE1
117
 104:../avr-lib/drivers/uart/uart.c **** #elif defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__) 
118
 105:../avr-lib/drivers/uart/uart.c ****  /* ATmega with two USART */
119
 106:../avr-lib/drivers/uart/uart.c ****  #define ATMEGA_USART0
120
 107:../avr-lib/drivers/uart/uart.c ****  #define ATMEGA_USART1
121
 108:../avr-lib/drivers/uart/uart.c ****  #define UART0_RECEIVE_INTERRUPT   SIG_UART0_RECV
122
 109:../avr-lib/drivers/uart/uart.c ****  #define UART1_RECEIVE_INTERRUPT   SIG_UART1_RECV
123
 110:../avr-lib/drivers/uart/uart.c ****  #define UART0_TRANSMIT_INTERRUPT  SIG_UART0_DATA
124
 111:../avr-lib/drivers/uart/uart.c ****  #define UART1_TRANSMIT_INTERRUPT  SIG_UART1_DATA
125
 112:../avr-lib/drivers/uart/uart.c ****  #define UART0_STATUS   UCSR0A
126
 113:../avr-lib/drivers/uart/uart.c ****  #define UART0_CONTROL  UCSR0B
127
 114:../avr-lib/drivers/uart/uart.c ****  #define UART0_DATA     UDR0
128
 115:../avr-lib/drivers/uart/uart.c ****  #define UART0_UDRIE    UDRIE0
129
 116:../avr-lib/drivers/uart/uart.c ****  #define UART1_STATUS   UCSR1A
130
 117:../avr-lib/drivers/uart/uart.c ****  #define UART1_CONTROL  UCSR1B
131
 118:../avr-lib/drivers/uart/uart.c ****  #define UART1_DATA     UDR1
132
 119:../avr-lib/drivers/uart/uart.c ****  #define UART1_UDRIE    UDRIE1
133
 120:../avr-lib/drivers/uart/uart.c **** #elif defined(__AVR_ATmega161__)
134
 121:../avr-lib/drivers/uart/uart.c ****  /* ATmega with UART */
135
 122:../avr-lib/drivers/uart/uart.c ****  #error "AVR ATmega161 currently not supported by this libaray !"
136
 123:../avr-lib/drivers/uart/uart.c **** #elif defined(__AVR_ATmega169__) 
137
 124:../avr-lib/drivers/uart/uart.c ****  /* ATmega with one USART */
138
 125:../avr-lib/drivers/uart/uart.c ****  #define ATMEGA_USART
139
 126:../avr-lib/drivers/uart/uart.c ****  #define UART0_RECEIVE_INTERRUPT   SIG_USART_RECV
140
 127:../avr-lib/drivers/uart/uart.c ****  #define UART0_TRANSMIT_INTERRUPT  SIG_USART_DATA
141
 128:../avr-lib/drivers/uart/uart.c ****  #define UART0_STATUS   UCSRA
142
 129:../avr-lib/drivers/uart/uart.c ****  #define UART0_CONTROL  UCSRB
143
 130:../avr-lib/drivers/uart/uart.c ****  #define UART0_DATA     UDR
144
 131:../avr-lib/drivers/uart/uart.c ****  #define UART0_UDRIE    UDRIE
145
 132:../avr-lib/drivers/uart/uart.c **** #elif defined(__AVR_ATmega48__) ||defined(__AVR_ATmega88__) || defined(__AVR_ATmega168__)
146
 133:../avr-lib/drivers/uart/uart.c ****  #define ATMEGA_USART0
147
 134:../avr-lib/drivers/uart/uart.c ****  #define UART0_RECEIVE_INTERRUPT   SIG_USART_RECV
148
 135:../avr-lib/drivers/uart/uart.c ****  #define UART0_TRANSMIT_INTERRUPT  SIG_USART_DATA
149
 136:../avr-lib/drivers/uart/uart.c ****  #define UART0_STATUS   UCSR0A
150
 137:../avr-lib/drivers/uart/uart.c ****  #define UART0_CONTROL  UCSR0B
151
 138:../avr-lib/drivers/uart/uart.c ****  #define UART0_DATA     UDR0
152
 139:../avr-lib/drivers/uart/uart.c ****  #define UART0_UDRIE    UDRIE0
153
 140:../avr-lib/drivers/uart/uart.c **** #elif defined(__AVR_ATtiny2313__)
154
 141:../avr-lib/drivers/uart/uart.c ****  #define ATMEGA_USART
155
 142:../avr-lib/drivers/uart/uart.c ****  #define UART0_RECEIVE_INTERRUPT   SIG_USART0_RX 
156
 143:../avr-lib/drivers/uart/uart.c ****  #define UART0_TRANSMIT_INTERRUPT  SIG_USART0_UDRE
157
 144:../avr-lib/drivers/uart/uart.c ****  #define UART0_STATUS   UCSRA
158
 145:../avr-lib/drivers/uart/uart.c ****  #define UART0_CONTROL  UCSRB
159
 146:../avr-lib/drivers/uart/uart.c ****  #define UART0_DATA     UDR
160
 147:../avr-lib/drivers/uart/uart.c ****  #define UART0_UDRIE    UDRIE
161
 148:../avr-lib/drivers/uart/uart.c **** #else
162
 149:../avr-lib/drivers/uart/uart.c ****  #error "no UART definition for MCU available"
163
 150:../avr-lib/drivers/uart/uart.c **** #endif
164
 151:../avr-lib/drivers/uart/uart.c **** 
165
 152:../avr-lib/drivers/uart/uart.c **** 
166
 153:../avr-lib/drivers/uart/uart.c **** /*
167
 154:../avr-lib/drivers/uart/uart.c ****  *  module global variables
168
 155:../avr-lib/drivers/uart/uart.c ****  */
169
 156:../avr-lib/drivers/uart/uart.c **** static volatile unsigned char UART_TxBuf[UART_TX_BUFFER_SIZE];
170
 157:../avr-lib/drivers/uart/uart.c **** static volatile unsigned char UART_RxBuf[UART_RX_BUFFER_SIZE];
171
 158:../avr-lib/drivers/uart/uart.c **** static volatile unsigned char UART_TxHead;
172
 159:../avr-lib/drivers/uart/uart.c **** static volatile unsigned char UART_TxTail;
173
 160:../avr-lib/drivers/uart/uart.c **** static volatile unsigned char UART_RxHead;
174
 161:../avr-lib/drivers/uart/uart.c **** static volatile unsigned char UART_RxTail;
175
 162:../avr-lib/drivers/uart/uart.c **** static volatile unsigned char UART_LastRxError;
176
 163:../avr-lib/drivers/uart/uart.c **** 
177
 164:../avr-lib/drivers/uart/uart.c **** #if defined( ATMEGA_USART1 )
178
 165:../avr-lib/drivers/uart/uart.c **** static volatile unsigned char UART1_TxBuf[UART_TX_BUFFER_SIZE];
179
 166:../avr-lib/drivers/uart/uart.c **** static volatile unsigned char UART1_RxBuf[UART_RX_BUFFER_SIZE];
180
 167:../avr-lib/drivers/uart/uart.c **** static volatile unsigned char UART1_TxHead;
181
 168:../avr-lib/drivers/uart/uart.c **** static volatile unsigned char UART1_TxTail;
182
 169:../avr-lib/drivers/uart/uart.c **** static volatile unsigned char UART1_RxHead;
183
 170:../avr-lib/drivers/uart/uart.c **** static volatile unsigned char UART1_RxTail;
184
 171:../avr-lib/drivers/uart/uart.c **** static volatile unsigned char UART1_LastRxError;
185
 172:../avr-lib/drivers/uart/uart.c **** #endif
186
 173:../avr-lib/drivers/uart/uart.c **** 
187
 174:../avr-lib/drivers/uart/uart.c **** 
188
 175:../avr-lib/drivers/uart/uart.c **** 
189
 176:../avr-lib/drivers/uart/uart.c **** SIGNAL(UART0_RECEIVE_INTERRUPT)
190
 177:../avr-lib/drivers/uart/uart.c **** /*************************************************************************
191
 178:../avr-lib/drivers/uart/uart.c **** Function: UART Receive Complete interrupt
192
 179:../avr-lib/drivers/uart/uart.c **** Purpose:  called when the UART has received a character
193
 180:../avr-lib/drivers/uart/uart.c **** **************************************************************************/
194
 181:../avr-lib/drivers/uart/uart.c **** {
195
  88               	.LM0:
196
  89               	/* prologue: frame size=0 */
197
  90 0000 1F92      		push __zero_reg__
198
  91 0002 0F92      		push __tmp_reg__
199
  92 0004 0FB6      		in __tmp_reg__,__SREG__
200
  93 0006 0F92      		push __tmp_reg__
201
  94 0008 1124      		clr __zero_reg__
202
  95 000a 2F93      		push r18
203
  96 000c 8F93      		push r24
204
  97 000e 9F93      		push r25
205
  98 0010 EF93      		push r30
206
  99 0012 FF93      		push r31
207
 100               	/* prologue end (size=10) */
208
 182:../avr-lib/drivers/uart/uart.c ****     unsigned char tmphead;
209
 183:../avr-lib/drivers/uart/uart.c ****     unsigned char data;
210
 184:../avr-lib/drivers/uart/uart.c ****     unsigned char usr;
211
 185:../avr-lib/drivers/uart/uart.c ****     unsigned char lastRxError;
212
 186:../avr-lib/drivers/uart/uart.c ****  
213
 187:../avr-lib/drivers/uart/uart.c ****  
214
 188:../avr-lib/drivers/uart/uart.c ****     /* read UART status register and UART data register */ 
215
 189:../avr-lib/drivers/uart/uart.c ****     usr  = UART0_STATUS;
216
 102               	.LM1:
217
 103 0014 9BB1      		in r25,43-0x20
218
 190:../avr-lib/drivers/uart/uart.c ****     data = UART0_DATA;
219
 105               	.LM2:
220
 106 0016 2CB1      		in r18,44-0x20
221
 191:../avr-lib/drivers/uart/uart.c ****     
222
 192:../avr-lib/drivers/uart/uart.c ****     /* */
223
 193:../avr-lib/drivers/uart/uart.c **** #if defined( AT90_UART )
224
 194:../avr-lib/drivers/uart/uart.c ****     lastRxError = (usr & (_BV(FE)|_BV(DOR)) );
225
 195:../avr-lib/drivers/uart/uart.c **** #elif defined( ATMEGA_USART )
226
 196:../avr-lib/drivers/uart/uart.c ****     lastRxError = (usr & (_BV(FE)|_BV(DOR)) );
227
 197:../avr-lib/drivers/uart/uart.c **** #elif defined( ATMEGA_USART0 )
228
 198:../avr-lib/drivers/uart/uart.c ****     lastRxError = (usr & (_BV(FE0)|_BV(DOR0)) );
229
 199:../avr-lib/drivers/uart/uart.c **** #elif defined ( ATMEGA_UART )
230
 200:../avr-lib/drivers/uart/uart.c ****     lastRxError = (usr & (_BV(FE)|_BV(DOR)) );
231
 201:../avr-lib/drivers/uart/uart.c **** #endif
232
 202:../avr-lib/drivers/uart/uart.c ****         
233
 203:../avr-lib/drivers/uart/uart.c ****     /* calculate buffer index */ 
234
 204:../avr-lib/drivers/uart/uart.c ****     tmphead = ( UART_RxHead + 1) & UART_RX_BUFFER_MASK;
235
 108               	.LM3:
236
 109 0018 E091 0000 		lds r30,UART_RxHead
237
 110 001c EF5F      		subi r30,lo8(-(1))
238
 111 001e EF71      		andi r30,lo8(31)
239
 205:../avr-lib/drivers/uart/uart.c ****     
240
 206:../avr-lib/drivers/uart/uart.c ****     if ( tmphead == UART_RxTail ) {
241
 113               	.LM4:
242
 114 0020 8091 0000 		lds r24,UART_RxTail
243
 115 0024 E817      		cp r30,r24
244
 116 0026 11F4      		brne .L2
245
 118               	.LM5:
246
 119 0028 82E0      		ldi r24,lo8(2)
247
 120 002a 08C0      		rjmp .L4
248
 121               	.L2:
249
 123               	.LM6:
250
 124 002c 892F      		mov r24,r25
251
 125 002e 8871      		andi r24,lo8(24)
252
 207:../avr-lib/drivers/uart/uart.c ****         /* error: receive buffer overflow */
253
 208:../avr-lib/drivers/uart/uart.c ****         lastRxError = UART_BUFFER_OVERFLOW >> 8;
254
 209:../avr-lib/drivers/uart/uart.c ****     }else{
255
 210:../avr-lib/drivers/uart/uart.c ****         /* store new index */
256
 211:../avr-lib/drivers/uart/uart.c ****         UART_RxHead = tmphead;
257
 127               	.LM7:
258
 128 0030 E093 0000 		sts UART_RxHead,r30
259
 212:../avr-lib/drivers/uart/uart.c ****         /* store received data in buffer */
260
 213:../avr-lib/drivers/uart/uart.c ****         UART_RxBuf[tmphead] = data;
261
 130               	.LM8:
262
 131 0034 FF27      		clr r31
263
 132 0036 E050      		subi r30,lo8(-(UART_RxBuf))
264
 133 0038 F040      		sbci r31,hi8(-(UART_RxBuf))
265
 134 003a 2083      		st Z,r18
266
 135               	.L4:
267
 214:../avr-lib/drivers/uart/uart.c ****     }
268
 215:../avr-lib/drivers/uart/uart.c ****     UART_LastRxError = lastRxError;   
269
 137               	.LM9:
270
 138 003c 8093 0000 		sts UART_LastRxError,r24
271
 139               	/* epilogue: frame size=0 */
272
 140 0040 FF91      		pop r31
273
 141 0042 EF91      		pop r30
274
 142 0044 9F91      		pop r25
275
 143 0046 8F91      		pop r24
276
 144 0048 2F91      		pop r18
277
 145 004a 0F90      		pop __tmp_reg__
278
 146 004c 0FBE      		out __SREG__,__tmp_reg__
279
 147 004e 0F90      		pop __tmp_reg__
280
 148 0050 1F90      		pop __zero_reg__
281
 149 0052 1895      		reti
282
 150               	/* epilogue end (size=10) */
283
 151               	/* function __vector_11 size 42 (22) */
284
 159               	.Lscope0:
285
 161               	.global	__vector_12
286
 163               	__vector_12:
287
 216:../avr-lib/drivers/uart/uart.c **** }
288
 217:../avr-lib/drivers/uart/uart.c **** 
289
 218:../avr-lib/drivers/uart/uart.c **** 
290
 219:../avr-lib/drivers/uart/uart.c **** SIGNAL(UART0_TRANSMIT_INTERRUPT)
291
 220:../avr-lib/drivers/uart/uart.c **** /*************************************************************************
292
 221:../avr-lib/drivers/uart/uart.c **** Function: UART Data Register Empty interrupt
293
 222:../avr-lib/drivers/uart/uart.c **** Purpose:  called when the UART is ready to transmit the next byte
294
 223:../avr-lib/drivers/uart/uart.c **** **************************************************************************/
295
 224:../avr-lib/drivers/uart/uart.c **** {
296
 165               	.LM10:
297
 166               	/* prologue: frame size=0 */
298
 167 0054 1F92      		push __zero_reg__
299
 168 0056 0F92      		push __tmp_reg__
300
 169 0058 0FB6      		in __tmp_reg__,__SREG__
301
 170 005a 0F92      		push __tmp_reg__
302
 171 005c 1124      		clr __zero_reg__
303
 172 005e 8F93      		push r24
304
 173 0060 9F93      		push r25
305
 174 0062 EF93      		push r30
306
 175 0064 FF93      		push r31
307
 176               	/* prologue end (size=9) */
308
 225:../avr-lib/drivers/uart/uart.c ****     unsigned char tmptail;
309
 226:../avr-lib/drivers/uart/uart.c **** 
310
 227:../avr-lib/drivers/uart/uart.c ****     
311
 228:../avr-lib/drivers/uart/uart.c ****     if ( UART_TxHead != UART_TxTail) {
312
 178               	.LM11:
313
 179 0066 9091 0000 		lds r25,UART_TxHead
314
 180 006a 8091 0000 		lds r24,UART_TxTail
315
 181 006e 9817      		cp r25,r24
316
 182 0070 61F0      		breq .L7
317
 229:../avr-lib/drivers/uart/uart.c ****         /* calculate and store new buffer index */
318
 230:../avr-lib/drivers/uart/uart.c ****         tmptail = (UART_TxTail + 1) & UART_TX_BUFFER_MASK;
319
 184               	.LM12:
320
 185 0072 E091 0000 		lds r30,UART_TxTail
321
 186 0076 EF5F      		subi r30,lo8(-(1))
322
 187 0078 EF71      		andi r30,lo8(31)
323
 231:../avr-lib/drivers/uart/uart.c ****         UART_TxTail = tmptail;
324
 189               	.LM13:
325
 190 007a E093 0000 		sts UART_TxTail,r30
326
 232:../avr-lib/drivers/uart/uart.c ****         /* get one byte from buffer and write it to UART */
327
 233:../avr-lib/drivers/uart/uart.c ****         UART0_DATA = UART_TxBuf[tmptail];  /* start transmission */
328
 192               	.LM14:
329
 193 007e FF27      		clr r31
330
 194 0080 E050      		subi r30,lo8(-(UART_TxBuf))
331
 195 0082 F040      		sbci r31,hi8(-(UART_TxBuf))
332
 196 0084 8081      		ld r24,Z
333
 197 0086 8CB9      		out 44-0x20,r24
334
 198 0088 01C0      		rjmp .L10
335
 199               	.L7:
336
 234:../avr-lib/drivers/uart/uart.c ****     }else{
337
 235:../avr-lib/drivers/uart/uart.c ****         /* tx buffer empty, disable UDRE interrupt */
338
 236:../avr-lib/drivers/uart/uart.c ****         UART0_CONTROL &= ~_BV(UART0_UDRIE);
339
 201               	.LM15:
340
 202 008a 5598      		cbi 42-0x20,5
341
 203               	.L10:
342
 204               	/* epilogue: frame size=0 */
343
 205 008c FF91      		pop r31
344
 206 008e EF91      		pop r30
345
 207 0090 9F91      		pop r25
346
 208 0092 8F91      		pop r24
347
 209 0094 0F90      		pop __tmp_reg__
348
 210 0096 0FBE      		out __SREG__,__tmp_reg__
349
 211 0098 0F90      		pop __tmp_reg__
350
 212 009a 1F90      		pop __zero_reg__
351
 213 009c 1895      		reti
352
 214               	/* epilogue end (size=9) */
353
 215               	/* function __vector_12 size 37 (19) */
354
 220               	.Lscope1:
355
 223               	.global	uart_init
356
 225               	uart_init:
357
 237:../avr-lib/drivers/uart/uart.c ****     }
358
 238:../avr-lib/drivers/uart/uart.c **** }
359
 239:../avr-lib/drivers/uart/uart.c **** 
360
 240:../avr-lib/drivers/uart/uart.c **** 
361
 241:../avr-lib/drivers/uart/uart.c **** /*************************************************************************
362
 242:../avr-lib/drivers/uart/uart.c **** Function: uart_init()
363
 243:../avr-lib/drivers/uart/uart.c **** Purpose:  initialize UART and set baudrate
364
 244:../avr-lib/drivers/uart/uart.c **** Input:    baudrate using macro UART_BAUD_SELECT()
365
 245:../avr-lib/drivers/uart/uart.c **** Returns:  none
366
 246:../avr-lib/drivers/uart/uart.c **** **************************************************************************/
367
 247:../avr-lib/drivers/uart/uart.c **** void uart_init(unsigned int baudrate)
368
 248:../avr-lib/drivers/uart/uart.c **** {
369
 227               	.LM16:
370
 228               	/* prologue: frame size=0 */
371
 229               	/* prologue end (size=0) */
372
 230 009e 9C01      		movw r18,r24
373
 249:../avr-lib/drivers/uart/uart.c ****     UART_TxHead = 0;
374
 232               	.LM17:
375
 233 00a0 1092 0000 		sts UART_TxHead,__zero_reg__
376
 250:../avr-lib/drivers/uart/uart.c ****     UART_TxTail = 0;
377
 235               	.LM18:
378
 236 00a4 1092 0000 		sts UART_TxTail,__zero_reg__
379
 251:../avr-lib/drivers/uart/uart.c ****     UART_RxHead = 0;
380
 238               	.LM19:
381
 239 00a8 1092 0000 		sts UART_RxHead,__zero_reg__
382
 252:../avr-lib/drivers/uart/uart.c ****     UART_RxTail = 0;
383
 241               	.LM20:
384
 242 00ac 1092 0000 		sts UART_RxTail,__zero_reg__
385
 253:../avr-lib/drivers/uart/uart.c ****     
386
 254:../avr-lib/drivers/uart/uart.c **** #if defined( AT90_UART )
387
 255:../avr-lib/drivers/uart/uart.c ****     /* set baud rate */
388
 256:../avr-lib/drivers/uart/uart.c ****     UBRR = (unsigned char)baudrate; 
389
 257:../avr-lib/drivers/uart/uart.c **** 
390
 258:../avr-lib/drivers/uart/uart.c ****     /* enable UART receiver and transmmitter and receive complete interrupt */
391
 259:../avr-lib/drivers/uart/uart.c ****     UART0_CONTROL = _BV(RXCIE)|_BV(RXEN)|_BV(TXEN);
392
 260:../avr-lib/drivers/uart/uart.c **** 
393
 261:../avr-lib/drivers/uart/uart.c **** #elif defined (ATMEGA_USART)
394
 262:../avr-lib/drivers/uart/uart.c ****     /* Set baud rate */
395
 263:../avr-lib/drivers/uart/uart.c ****     if ( baudrate & 0x8000 )
396
 244               	.LM21:
397
 245 00b0 97FF      		sbrs r25,7
398
 246 00b2 03C0      		rjmp .L12
399
 264:../avr-lib/drivers/uart/uart.c ****     {
400
 265:../avr-lib/drivers/uart/uart.c ****     	 UART0_STATUS = (1<<U2X);  //Enable 2x speed 
401
 248               	.LM22:
402
 249 00b4 82E0      		ldi r24,lo8(2)
403
 250 00b6 8BB9      		out 43-0x20,r24
404
 266:../avr-lib/drivers/uart/uart.c ****     	 baudrate &= ~0x8000;
405
 252               	.LM23:
406
 253 00b8 3F77      		andi r19,hi8(32767)
407
 254               	.L12:
408
 267:../avr-lib/drivers/uart/uart.c ****     }
409
 268:../avr-lib/drivers/uart/uart.c ****     UBRRH = (unsigned char)(baudrate>>8);
410
 256               	.LM24:
411
 257 00ba 832F      		mov r24,r19
412
 258 00bc 9927      		clr r25
413
 259 00be 80BD      		out 64-0x20,r24
414
 269:../avr-lib/drivers/uart/uart.c ****     UBRRL = (unsigned char) baudrate;
415
 261               	.LM25:
416
 262 00c0 29B9      		out 41-0x20,r18
417
 270:../avr-lib/drivers/uart/uart.c ****    
418
 271:../avr-lib/drivers/uart/uart.c ****     /* Enable USART receiver and transmitter and receive complete interrupt */
419
 272:../avr-lib/drivers/uart/uart.c ****     UART0_CONTROL = _BV(RXCIE)|(1<<RXEN)|(1<<TXEN);
420
 264               	.LM26:
421
 265 00c2 88E9      		ldi r24,lo8(-104)
422
 266 00c4 8AB9      		out 42-0x20,r24
423
 273:../avr-lib/drivers/uart/uart.c ****     
424
 274:../avr-lib/drivers/uart/uart.c ****     /* Set frame format: asynchronous, 8data, no parity, 1stop bit */
425
 275:../avr-lib/drivers/uart/uart.c ****     #ifdef URSEL
426
 276:../avr-lib/drivers/uart/uart.c ****     UCSRC = (1<<URSEL)|(3<<UCSZ0);
427
 268               	.LM27:
428
 269 00c6 86E8      		ldi r24,lo8(-122)
429
 270 00c8 80BD      		out 64-0x20,r24
430
 271               	/* epilogue: frame size=0 */
431
 272 00ca 0895      		ret
432
 273               	/* epilogue end (size=1) */
433
 274               	/* function uart_init size 24 (23) */
434
 276               	.Lscope2:
435
 278               	.global	uart_getc
436
 280               	uart_getc:
437
 277:../avr-lib/drivers/uart/uart.c ****     #else
438
 278:../avr-lib/drivers/uart/uart.c ****     UCSRC = (3<<UCSZ0);
439
 279:../avr-lib/drivers/uart/uart.c ****     #endif 
440
 280:../avr-lib/drivers/uart/uart.c ****     
441
 281:../avr-lib/drivers/uart/uart.c **** #elif defined (ATMEGA_USART0 )
442
 282:../avr-lib/drivers/uart/uart.c ****     /* Set baud rate */
443
 283:../avr-lib/drivers/uart/uart.c ****     if ( baudrate & 0x8000 ) 
444
 284:../avr-lib/drivers/uart/uart.c ****     {
445
 285:../avr-lib/drivers/uart/uart.c ****    		UART0_STATUS = (1<<U2X0);  //Enable 2x speed 
446
 286:../avr-lib/drivers/uart/uart.c ****    		baudrate &= ~0x8000;
447
 287:../avr-lib/drivers/uart/uart.c ****    	}
448
 288:../avr-lib/drivers/uart/uart.c ****     UBRR0H = (unsigned char)(baudrate>>8);
449
 289:../avr-lib/drivers/uart/uart.c ****     UBRR0L = (unsigned char) baudrate;
450
 290:../avr-lib/drivers/uart/uart.c **** 
451
 291:../avr-lib/drivers/uart/uart.c ****     /* Enable USART receiver and transmitter and receive complete interrupt */
452
 292:../avr-lib/drivers/uart/uart.c ****     UART0_CONTROL = _BV(RXCIE0)|(1<<RXEN0)|(1<<TXEN0);
453
 293:../avr-lib/drivers/uart/uart.c ****     
454
 294:../avr-lib/drivers/uart/uart.c ****     /* Set frame format: asynchronous, 8data, no parity, 1stop bit */
455
 295:../avr-lib/drivers/uart/uart.c ****     #ifdef URSEL0
456
 296:../avr-lib/drivers/uart/uart.c ****     UCSR0C = (1<<URSEL0)|(3<<UCSZ00);
457
 297:../avr-lib/drivers/uart/uart.c ****     #else
458
 298:../avr-lib/drivers/uart/uart.c ****     UCSR0C = (3<<UCSZ00);
459
 299:../avr-lib/drivers/uart/uart.c ****     #endif 
460
 300:../avr-lib/drivers/uart/uart.c **** 
461
 301:../avr-lib/drivers/uart/uart.c **** #elif defined ( ATMEGA_UART )
462
 302:../avr-lib/drivers/uart/uart.c ****     /* set baud rate */
463
 303:../avr-lib/drivers/uart/uart.c ****     if ( baudrate & 0x8000 ) 
464
 304:../avr-lib/drivers/uart/uart.c ****     {
465
 305:../avr-lib/drivers/uart/uart.c ****     	UART0_STATUS = (1<<U2X);  //Enable 2x speed 
466
 306:../avr-lib/drivers/uart/uart.c ****     	baudrate &= ~0x8000;
467
 307:../avr-lib/drivers/uart/uart.c ****     }
468
 308:../avr-lib/drivers/uart/uart.c ****     UBRRHI = (unsigned char)(baudrate>>8);
469
 309:../avr-lib/drivers/uart/uart.c ****     UBRR   = (unsigned char) baudrate;
470
 310:../avr-lib/drivers/uart/uart.c **** 
471
 311:../avr-lib/drivers/uart/uart.c ****     /* Enable UART receiver and transmitter and receive complete interrupt */
472
 312:../avr-lib/drivers/uart/uart.c ****     UART0_CONTROL = _BV(RXCIE)|(1<<RXEN)|(1<<TXEN);
473
 313:../avr-lib/drivers/uart/uart.c **** 
474
 314:../avr-lib/drivers/uart/uart.c **** #endif
475
 315:../avr-lib/drivers/uart/uart.c **** 
476
 316:../avr-lib/drivers/uart/uart.c **** }/* uart_init */
477
 317:../avr-lib/drivers/uart/uart.c **** 
478
 318:../avr-lib/drivers/uart/uart.c **** 
479
 319:../avr-lib/drivers/uart/uart.c **** /*************************************************************************
480
 320:../avr-lib/drivers/uart/uart.c **** Function: uart_getc()
481
 321:../avr-lib/drivers/uart/uart.c **** Purpose:  return byte from ringbuffer  
482
 322:../avr-lib/drivers/uart/uart.c **** Returns:  lower byte:  received byte from ringbuffer
483
 323:../avr-lib/drivers/uart/uart.c ****           higher byte: last receive error
484
 324:../avr-lib/drivers/uart/uart.c **** **************************************************************************/
485
 325:../avr-lib/drivers/uart/uart.c **** unsigned int uart_getc(void)
486
 326:../avr-lib/drivers/uart/uart.c **** {    
487
 282               	.LM28:
488
 283               	/* prologue: frame size=0 */
489
 284               	/* prologue end (size=0) */
490
 327:../avr-lib/drivers/uart/uart.c ****     unsigned char tmptail;
491
 328:../avr-lib/drivers/uart/uart.c ****     unsigned char data;
492
 329:../avr-lib/drivers/uart/uart.c **** 
493
 330:../avr-lib/drivers/uart/uart.c **** 
494
 331:../avr-lib/drivers/uart/uart.c ****     if ( UART_RxHead == UART_RxTail ) {
495
 286               	.LM29:
496
 287 00cc 9091 0000 		lds r25,UART_RxHead
497
 288 00d0 8091 0000 		lds r24,UART_RxTail
498
 289 00d4 9817      		cp r25,r24
499
 290 00d6 19F4      		brne .L16
500
 292               	.LM30:
501
 293 00d8 80E0      		ldi r24,lo8(256)
502
 294 00da 91E0      		ldi r25,hi8(256)
503
 295 00dc 0895      		ret
504
 296               	.L16:
505
 332:../avr-lib/drivers/uart/uart.c ****         return UART_NO_DATA;   /* no data available */
506
 333:../avr-lib/drivers/uart/uart.c ****     }
507
 334:../avr-lib/drivers/uart/uart.c ****     
508
 335:../avr-lib/drivers/uart/uart.c ****     /* calculate /store buffer index */
509
 336:../avr-lib/drivers/uart/uart.c ****     tmptail = (UART_RxTail + 1) & UART_RX_BUFFER_MASK;
510
 298               	.LM31:
511
 299 00de E091 0000 		lds r30,UART_RxTail
512
 300 00e2 EF5F      		subi r30,lo8(-(1))
513
 301 00e4 EF71      		andi r30,lo8(31)
514
 337:../avr-lib/drivers/uart/uart.c ****     UART_RxTail = tmptail; 
515
 303               	.LM32:
516
 304 00e6 E093 0000 		sts UART_RxTail,r30
517
 338:../avr-lib/drivers/uart/uart.c ****     
518
 339:../avr-lib/drivers/uart/uart.c ****     /* get data from receive buffer */
519
 340:../avr-lib/drivers/uart/uart.c ****     data = UART_RxBuf[tmptail];
520
 306               	.LM33:
521
 307 00ea FF27      		clr r31
522
 308 00ec E050      		subi r30,lo8(-(UART_RxBuf))
523
 309 00ee F040      		sbci r31,hi8(-(UART_RxBuf))
524
 310 00f0 2081      		ld r18,Z
525
 341:../avr-lib/drivers/uart/uart.c ****     
526
 342:../avr-lib/drivers/uart/uart.c ****     return (UART_LastRxError << 8) + data;
527
 312               	.LM34:
528
 313 00f2 8091 0000 		lds r24,UART_LastRxError
529
 314 00f6 9927      		clr r25
530
 315 00f8 982F      		mov r25,r24
531
 316 00fa 8827      		clr r24
532
 317 00fc 820F      		add r24,r18
533
 318 00fe 911D      		adc r25,__zero_reg__
534
 343:../avr-lib/drivers/uart/uart.c **** 
535
 344:../avr-lib/drivers/uart/uart.c **** }/* uart_getc */
536
 320               	.LM35:
537
 321 0100 0895      		ret
538
 322               	/* epilogue: frame size=0 */
539
 323               	/* epilogue: noreturn */
540
 324               	/* epilogue end (size=0) */
541
 325               	/* function uart_getc size 27 (27) */
542
 331               	.Lscope3:
543
 334               	.global	uart_putc
544
 336               	uart_putc:
545
 345:../avr-lib/drivers/uart/uart.c **** 
546
 346:../avr-lib/drivers/uart/uart.c **** 
547
 347:../avr-lib/drivers/uart/uart.c **** /*************************************************************************
548
 348:../avr-lib/drivers/uart/uart.c **** Function: uart_putc()
549
 349:../avr-lib/drivers/uart/uart.c **** Purpose:  write byte to ringbuffer for transmitting via UART
550
 350:../avr-lib/drivers/uart/uart.c **** Input:    byte to be transmitted
551
 351:../avr-lib/drivers/uart/uart.c **** Returns:  none          
552
 352:../avr-lib/drivers/uart/uart.c **** **************************************************************************/
553
 353:../avr-lib/drivers/uart/uart.c **** void uart_putc(unsigned char data)
554
 354:../avr-lib/drivers/uart/uart.c **** {
555
 338               	.LM36:
556
 339               	/* prologue: frame size=0 */
557
 340               	/* prologue end (size=0) */
558
 341 0102 282F      		mov r18,r24
559
 355:../avr-lib/drivers/uart/uart.c ****     unsigned char tmphead;
560
 356:../avr-lib/drivers/uart/uart.c **** 
561
 357:../avr-lib/drivers/uart/uart.c ****     
562
 358:../avr-lib/drivers/uart/uart.c ****     tmphead  = (UART_TxHead + 1) & UART_TX_BUFFER_MASK;
563
 343               	.LM37:
564
 344 0104 9091 0000 		lds r25,UART_TxHead
565
 345 0108 9F5F      		subi r25,lo8(-(1))
566
 346 010a 9F71      		andi r25,lo8(31)
567
 347               	.L21:
568
 359:../avr-lib/drivers/uart/uart.c ****     
569
 360:../avr-lib/drivers/uart/uart.c ****     while ( tmphead == UART_TxTail ){
570
 349               	.LM38:
571
 350 010c 8091 0000 		lds r24,UART_TxTail
572
 351 0110 9817      		cp r25,r24
573
 352 0112 E1F3      		breq .L21
574
 361:../avr-lib/drivers/uart/uart.c ****         ;/* wait for free space in buffer */
575
 362:../avr-lib/drivers/uart/uart.c ****     }
576
 363:../avr-lib/drivers/uart/uart.c ****     
577
 364:../avr-lib/drivers/uart/uart.c ****     UART_TxBuf[tmphead] = data;
578
 354               	.LM39:
579
 355 0114 E92F      		mov r30,r25
580
 356 0116 FF27      		clr r31
581
 357 0118 E050      		subi r30,lo8(-(UART_TxBuf))
582
 358 011a F040      		sbci r31,hi8(-(UART_TxBuf))
583
 359 011c 2083      		st Z,r18
584
 365:../avr-lib/drivers/uart/uart.c ****     UART_TxHead = tmphead;
585
 361               	.LM40:
586
 362 011e 9093 0000 		sts UART_TxHead,r25
587
 366:../avr-lib/drivers/uart/uart.c **** 
588
 367:../avr-lib/drivers/uart/uart.c ****     /* enable UDRE interrupt */
589
 368:../avr-lib/drivers/uart/uart.c ****     UART0_CONTROL    |= _BV(UART0_UDRIE);
590
 364               	.LM41:
591
 365 0122 559A      		sbi 42-0x20,5
592
 366               	/* epilogue: frame size=0 */
593
 367 0124 0895      		ret
594
 368               	/* epilogue end (size=1) */
595
 369               	/* function uart_putc size 18 (17) */
596
 374               	.Lscope4:
597
 377               	.global	uart_puts
598
 379               	uart_puts:
599
 369:../avr-lib/drivers/uart/uart.c **** 
600
 370:../avr-lib/drivers/uart/uart.c **** }/* uart_putc */
601
 371:../avr-lib/drivers/uart/uart.c **** 
602
 372:../avr-lib/drivers/uart/uart.c **** 
603
 373:../avr-lib/drivers/uart/uart.c **** /*************************************************************************
604
 374:../avr-lib/drivers/uart/uart.c **** Function: uart_puts()
605
 375:../avr-lib/drivers/uart/uart.c **** Purpose:  transmit string to UART
606
 376:../avr-lib/drivers/uart/uart.c **** Input:    string to be transmitted
607
 377:../avr-lib/drivers/uart/uart.c **** Returns:  none          
608
 378:../avr-lib/drivers/uart/uart.c **** **************************************************************************/
609
 379:../avr-lib/drivers/uart/uart.c **** void uart_puts(const char *s )
610
 380:../avr-lib/drivers/uart/uart.c **** {
611
 381               	.LM42:
612
 382               	/* prologue: frame size=0 */
613
 383 0126 CF93      		push r28
614
 384 0128 DF93      		push r29
615
 385               	/* prologue end (size=2) */
616
 386 012a EC01      		movw r28,r24
617
 387 012c 02C0      		rjmp .L27
618
 388               	.L28:
619
 381:../avr-lib/drivers/uart/uart.c ****     while (*s) 
620
 382:../avr-lib/drivers/uart/uart.c ****       uart_putc(*s++);
621
 390               	.LM43:
622
 391 012e 2196      		adiw r28,1
623
 392 0130 E8DF      		rcall uart_putc
624
 393               	.L27:
625
 395               	.LM44:
626
 396 0132 8881      		ld r24,Y
627
 397 0134 8823      		tst r24
628
 398 0136 D9F7      		brne .L28
629
 399               	/* epilogue: frame size=0 */
630
 400 0138 DF91      		pop r29
631
 401 013a CF91      		pop r28
632
 402 013c 0895      		ret
633
 403               	/* epilogue end (size=3) */
634
 404               	/* function uart_puts size 12 (7) */
635
 406               	.Lscope5:
636
 409               	.global	uart_puts_p
637
 411               	uart_puts_p:
638
 383:../avr-lib/drivers/uart/uart.c **** 
639
 384:../avr-lib/drivers/uart/uart.c **** }/* uart_puts */
640
 385:../avr-lib/drivers/uart/uart.c **** 
641
 386:../avr-lib/drivers/uart/uart.c **** 
642
 387:../avr-lib/drivers/uart/uart.c **** /*************************************************************************
643
 388:../avr-lib/drivers/uart/uart.c **** Function: uart_puts_p()
644
 389:../avr-lib/drivers/uart/uart.c **** Purpose:  transmit string from program memory to UART
645
 390:../avr-lib/drivers/uart/uart.c **** Input:    program memory string to be transmitted
646
 391:../avr-lib/drivers/uart/uart.c **** Returns:  none
647
 392:../avr-lib/drivers/uart/uart.c **** **************************************************************************/
648
 393:../avr-lib/drivers/uart/uart.c **** void uart_puts_p(const char *progmem_s )
649
 394:../avr-lib/drivers/uart/uart.c **** {
650
 413               	.LM45:
651
 414               	/* prologue: frame size=0 */
652
 415 013e CF93      		push r28
653
 416 0140 DF93      		push r29
654
 417               	/* prologue end (size=2) */
655
 418 0142 EC01      		movw r28,r24
656
 419 0144 01C0      		rjmp .L32
657
 420               	.L33:
658
 395:../avr-lib/drivers/uart/uart.c ****     register char c;
659
 396:../avr-lib/drivers/uart/uart.c ****     
660
 397:../avr-lib/drivers/uart/uart.c ****     while ( (c = pgm_read_byte(progmem_s++)) ) 
661
 398:../avr-lib/drivers/uart/uart.c ****       uart_putc(c);
662
 422               	.LM46:
663
 423 0146 DDDF      		rcall uart_putc
664
 424               	.L32:
665
 425 0148 FE01      		movw r30,r28
666
 426               	.LBB2:
667
 428               	.LM47:
668
 429 014a 2196      		adiw r28,1
669
 430               	/* #APP */
670
 431 014c 8491      		lpm r24, Z
671
 432               		
672
 433               	/* #NOAPP */
673
 434               	.LBE2:
674
 435 014e 8823      		tst r24
675
 436 0150 D1F7      		brne .L33
676
 437               	/* epilogue: frame size=0 */
677
 438 0152 DF91      		pop r29
678
 439 0154 CF91      		pop r28
679
 440 0156 0895      		ret
680
 441               	/* epilogue end (size=3) */
681
 442               	/* function uart_puts_p size 16 (11) */
682
 448               	.Lscope6:
683
 449               		.lcomm UART_TxBuf,32
684
 450               		.lcomm UART_RxBuf,32
685
 451               		.lcomm UART_TxHead,1
686
 452               		.lcomm UART_TxTail,1
687
 453               		.lcomm UART_RxHead,1
688
 454               		.lcomm UART_RxTail,1
689
 455               		.lcomm UART_LastRxError,1
690
 464               	.Letext0:
691
 465               	/* File "../avr-lib/drivers/uart/uart.c": code  176 = 0x00b0 ( 126), prologues  23, epilogues  27 *
692
DEFINED SYMBOLS
693
                            *ABS*:00000000 uart.c
694
     /tmp/ccG6wxDo.s:3      *ABS*:0000003f __SREG__
695
     /tmp/ccG6wxDo.s:4      *ABS*:0000003e __SP_H__
696
     /tmp/ccG6wxDo.s:5      *ABS*:0000003d __SP_L__
697
     /tmp/ccG6wxDo.s:6      *ABS*:00000000 __tmp_reg__
698
     /tmp/ccG6wxDo.s:7      *ABS*:00000001 __zero_reg__
699
     /tmp/ccG6wxDo.s:86     .text:00000000 __vector_11
700
     /tmp/ccG6wxDo.s:452    .bss:00000042 UART_RxHead
701
     /tmp/ccG6wxDo.s:453    .bss:00000043 UART_RxTail
702
     /tmp/ccG6wxDo.s:449    .bss:00000020 UART_RxBuf
703
     /tmp/ccG6wxDo.s:454    .bss:00000044 UART_LastRxError
704
     /tmp/ccG6wxDo.s:163    .text:00000054 __vector_12
705
     /tmp/ccG6wxDo.s:450    .bss:00000040 UART_TxHead
706
     /tmp/ccG6wxDo.s:451    .bss:00000041 UART_TxTail
707
                             .bss:00000000 UART_TxBuf
708
     /tmp/ccG6wxDo.s:225    .text:0000009e uart_init
709
     /tmp/ccG6wxDo.s:280    .text:000000cc uart_getc
710
     /tmp/ccG6wxDo.s:336    .text:00000102 uart_putc
711
     /tmp/ccG6wxDo.s:379    .text:00000126 uart_puts
712
     /tmp/ccG6wxDo.s:411    .text:0000013e uart_puts_p
713
 
714
UNDEFINED SYMBOLS
715
__do_copy_data
716
__do_clear_bss