1 .file "serialio.c" 2 .arch atmega128 3 __SREG__ = 0x3f 4 __SP_H__ = 0x3e 5 __SP_L__ = 0x3d 6 __tmp_reg__ = 0 7 __zero_reg__ = 1 8 .global __do_copy_data 9 .global __do_clear_bss 12 .text 13 .Ltext0: 68 .global InitSerialIO 70 InitSerialIO: 1:serialio.c **** // serialio.c 2:serialio.c **** // 3:serialio.c **** // Interrupt-based Serial I/O library for AvrX 4:serialio.c **** // 5:serialio.c **** // History: 2002.04.30 - Stephane Gauthier (stephane.gauthier@alcatel.com) - Genesis. 6:serialio.c **** // 2002.05.03 - Stephane Gauthier - Corrected minor bug with interrupts enables. 7:serialio.c **** // 2002.05.29 - Stephane Gauthier - Added mutex to PutChar to prevent clashes with multiple tasks 8:serialio.c **** // 2002.09.17 - Stephane Gauthier - Adapted all code to AVRGCC 3.2's assignment mode. 9:serialio.c **** // 10:serialio.c **** // TODO: Add circular transmit buffer! 11:serialio.c **** // 12:serialio.c **** #include "avrx.h" 13:serialio.c **** #include "hardware.h" 14:serialio.c **** 15:serialio.c **** #define UCSR0B_INIT ( (BV(TXEN)) | (BV(RXEN)) | (BV(RXCIE)) ) // Enable TX and RX modules. Enable 16:serialio.c **** 17:serialio.c **** // Globals (file scope??) 18:serialio.c **** AVRX_MUTEX(RxReady); // AvrX Semaphore for signalling TX routine 19:serialio.c **** AVRX_MUTEX(TxReady); // AvrX Semaphore for signalling RX routine 20:serialio.c **** AVRX_MUTEX(SerialTransmitMutex); // To allow sharing of the PutChar routine. 21:serialio.c **** unsigned char RxByte; // Receive buffer. 22:serialio.c **** 23:serialio.c **** // Function Name: InitSerialIO() 24:serialio.c **** // 25:serialio.c **** // Description: Initialize Serial I/O hardware. 26:serialio.c **** // 27:serialio.c **** // 28:serialio.c **** void InitSerialIO( unsigned int baud ) 29:serialio.c **** { 72 .LM1: 73 /* prologue: frame size=0 */ 74 0000 0F93 push r16 75 0002 1F93 push r17 76 /* prologue end (size=2) */ 77 0004 8C01 movw r16,r24 30:serialio.c **** /* Prime Serial TX mutex */ 31:serialio.c **** AvrXSetSemaphore(&SerialTransmitMutex); 79 .LM2: 80 0006 80E0 ldi r24,lo8(SerialTransmitMutex) 81 0008 90E0 ldi r25,hi8(SerialTransmitMutex) 82 000a 0E94 0000 call AvrXSetSemaphore 32:serialio.c **** 33:serialio.c **** /* Set baud rate */ 34:serialio.c **** UBRR0H = (baud >>8); 84 .LM3: 85 000e 812F mov r24,r17 86 0010 9927 clr r25 87 0012 8093 9000 sts 144,r24 35:serialio.c **** UBRR0L = baud; 89 .LM4: 90 0016 09B9 out 41-0x20,r16 36:serialio.c **** 37:serialio.c **** /* Enable receiver, transmitter and interrupts on RX and buffer empty */ 38:serialio.c **** UCSR0B = UCSR0B_INIT; 92 .LM5: 93 0018 88E9 ldi r24,lo8(-104) 94 001a 8AB9 out 42-0x20,r24 39:serialio.c **** 40:serialio.c **** /* Set frame format: 8data, no parity, 1 stop bit */ 41:serialio.c **** UCSR0C = (BV(UCSZ0) | BV(UCSZ1)); 96 .LM6: 97 001c 86E0 ldi r24,lo8(6) 98 001e 8093 9500 sts 149,r24 42:serialio.c **** } 100 .LM7: 101 /* epilogue: frame size=0 */ 102 0022 1F91 pop r17 103 0024 0F91 pop r16 104 0026 0895 ret 105 /* epilogue end (size=3) */ 106 /* function InitSerialIO size 20 (15) */ 108 .Lscope0: 112 .global PutChar 114 PutChar: 43:serialio.c **** 44:serialio.c **** // Function Name: PutChar() 45:serialio.c **** // 46:serialio.c **** // Description: Send character to serial port 47:serialio.c **** // 48:serialio.c **** // 49:serialio.c **** int PutChar(unsigned char data) 50:serialio.c **** { 116 .LM8: 117 /* prologue: frame size=0 */ 118 0028 CF93 push r28 119 /* prologue end (size=1) */ 120 002a C82F mov r28,r24 51:serialio.c **** AvrXWaitSemaphore(&SerialTransmitMutex); 122 .LM9: 123 002c 80E0 ldi r24,lo8(SerialTransmitMutex) 124 002e 90E0 ldi r25,hi8(SerialTransmitMutex) 125 0030 0E94 0000 call AvrXWaitSemaphore 52:serialio.c **** 53:serialio.c **** if ( bit_is_clear(UCSR0A, UDRE)) // If buffer is already empty just proceed. 127 .LM10: 128 0034 5D99 sbic 43-0x20,5 129 0036 05C0 rjmp .L3 54:serialio.c **** { 55:serialio.c **** // Enable interrupt 56:serialio.c **** sbi(UCSR0B, UDRIE); 131 .LM11: 132 0038 559A sbi 42-0x20,5 57:serialio.c **** 58:serialio.c **** // Wait for signal 59:serialio.c **** AvrXWaitSemaphore(&TxReady); 134 .LM12: 135 003a 80E0 ldi r24,lo8(TxReady) 136 003c 90E0 ldi r25,hi8(TxReady) 137 003e 0E94 0000 call AvrXWaitSemaphore 138 .L3: 60:serialio.c **** } 61:serialio.c **** 62:serialio.c **** /* Put data into buffer, sends the data */ 63:serialio.c **** UDR0 = data; 140 .LM13: 141 0042 CCB9 out 44-0x20,r28 64:serialio.c **** 65:serialio.c **** AvrXSetSemaphore(&SerialTransmitMutex); 143 .LM14: 144 0044 80E0 ldi r24,lo8(SerialTransmitMutex) 145 0046 90E0 ldi r25,hi8(SerialTransmitMutex) 146 0048 0E94 0000 call AvrXSetSemaphore 66:serialio.c **** 67:serialio.c **** return(0); 68:serialio.c **** } 148 .LM15: 149 004c 80E0 ldi r24,lo8(0) 150 004e 90E0 ldi r25,hi8(0) 151 /* epilogue: frame size=0 */ 152 0050 CF91 pop r28 153 0052 0895 ret 154 /* epilogue end (size=2) */ 155 /* function PutChar size 22 (19) */ 157 .Lscope1: 160 .global GetChar 162 GetChar: 69:serialio.c **** 70:serialio.c **** // Function Name: GetChar() 71:serialio.c **** // 72:serialio.c **** // Description: Get a character from serial port 73:serialio.c **** // 74:serialio.c **** // 75:serialio.c **** unsigned char GetChar(void) 76:serialio.c **** { 164 .LM16: 165 /* prologue: frame size=0 */ 166 /* prologue end (size=0) */ 77:serialio.c **** // Wait for receive interrupt to signal us 78:serialio.c **** AvrXWaitSemaphore(&RxReady); 168 .LM17: 169 0054 80E0 ldi r24,lo8(RxReady) 170 0056 90E0 ldi r25,hi8(RxReady) 171 0058 0E94 0000 call AvrXWaitSemaphore 79:serialio.c **** 80:serialio.c **** return(RxByte); 173 .LM18: 174 005c 8091 0000 lds r24,RxByte 175 0060 9927 clr r25 81:serialio.c **** } 177 .LM19: 178 /* epilogue: frame size=0 */ 179 0062 0895 ret 180 /* epilogue end (size=1) */ 181 /* function GetChar size 8 (7) */ 183 .Lscope2: 186 .global __vector_19 188 __vector_19: 82:serialio.c **** 83:serialio.c **** // 84:serialio.c **** // UART0 Transmit Buffer Empty ISR 85:serialio.c **** // 86:serialio.c **** AVRX_SIGINT(SIG_UART0_DATA) 87:serialio.c **** { 190 .LM20: 191 /* prologue: frame size=0 */ 192 /* prologue: naked */ 193 /* prologue end (size=0) */ 88:serialio.c **** // disable interrupts. 89:serialio.c **** cbi(UCSR0B, UDRIE); 195 .LM21: 196 0064 5598 cbi 42-0x20,5 90:serialio.c **** 91:serialio.c **** // Switch to kernel stack 92:serialio.c **** IntProlog(); 198 .LM22: 199 0066 0E94 0000 call IntProlog 93:serialio.c **** 94:serialio.c **** // Signal we are ready for more. 95:serialio.c **** AvrXIntSetSemaphore(&TxReady); 201 .LM23: 202 006a 80E0 ldi r24,lo8(TxReady) 203 006c 90E0 ldi r25,hi8(TxReady) 204 006e 0E94 0000 call AvrXIntSetSemaphore 96:serialio.c **** 97:serialio.c **** // Go back to RTOS 98:serialio.c **** Epilog(); 206 .LM24: 207 0072 0E94 0000 call Epilog 99:serialio.c **** } 209 .LM25: 210 /* epilogue: frame size=0 */ 211 /* epilogue: naked */ 212 /* epilogue end (size=0) */ 213 /* function __vector_19 size 9 (9) */ 215 .Lscope3: 218 .global __vector_18 220 __vector_18: 100:serialio.c **** 101:serialio.c **** // 102:serialio.c **** // UART0 Receive ISR 103:serialio.c **** // 104:serialio.c **** AVRX_SIGINT(SIG_UART0_RECV) 105:serialio.c **** { 222 .LM26: 223 /* prologue: frame size=0 */ 224 /* prologue: naked */ 225 /* prologue end (size=0) */ 106:serialio.c **** // disable interrupt 107:serialio.c **** cbi(UCSR0B, RXCIE); 227 .LM27: 228 0076 5798 cbi 42-0x20,7 108:serialio.c **** 109:serialio.c **** // Switch to kernel stack 110:serialio.c **** IntProlog(); 230 .LM28: 231 0078 0E94 0000 call IntProlog 111:serialio.c **** 112:serialio.c **** // Get it. 113:serialio.c **** RxByte = UDR0; 233 .LM29: 234 007c 8CB1 in r24,44-0x20 235 007e 8093 0000 sts RxByte,r24 114:serialio.c **** 115:serialio.c **** // Signal routine that character is ready. 116:serialio.c **** AvrXIntSetSemaphore(&RxReady); 237 .LM30: 238 0082 80E0 ldi r24,lo8(RxReady) 239 0084 90E0 ldi r25,hi8(RxReady) 240 0086 0E94 0000 call AvrXIntSetSemaphore 117:serialio.c **** 118:serialio.c **** // Re-enable interrupts 119:serialio.c **** sbi( UCSR0B, RXCIE ); 242 .LM31: 243 008a 579A sbi 42-0x20,7 120:serialio.c **** 121:serialio.c **** // Go back to RTOS 122:serialio.c **** Epilog(); 245 .LM32: 246 008c 0E94 0000 call Epilog 123:serialio.c **** } 248 .LM33: 249 /* epilogue: frame size=0 */ 250 /* epilogue: naked */ 251 /* epilogue end (size=0) */ 252 /* function __vector_18 size 13 (13) */ 254 .Lscope4: 256 .comm RxReady,2,1 257 .comm TxReady,2,1 258 .comm SerialTransmitMutex,2,1 259 .comm RxByte,1,1 264 .text 266 Letext: 267 /* File "serialio.c": code 72 = 0x0048 ( 63), prologues 3, epilogues 6 */ DEFINED SYMBOLS *ABS*:00000000 serialio.c *ABS*:0000003f __SREG__ *ABS*:0000003e __SP_H__ *ABS*:0000003d __SP_L__ *ABS*:00000000 __tmp_reg__ *ABS*:00000001 __zero_reg__ C:\DOCUME~1\palm3\LOCALS~1\Temp/cc6Vaaaa.s:70 .text:00000000 InitSerialIO *COM*:00000002 SerialTransmitMutex C:\DOCUME~1\palm3\LOCALS~1\Temp/cc6Vaaaa.s:114 .text:00000028 PutChar *COM*:00000002 TxReady C:\DOCUME~1\palm3\LOCALS~1\Temp/cc6Vaaaa.s:162 .text:00000054 GetChar *COM*:00000002 RxReady *COM*:00000001 RxByte C:\DOCUME~1\palm3\LOCALS~1\Temp/cc6Vaaaa.s:188 .text:00000064 __vector_19 C:\DOCUME~1\palm3\LOCALS~1\Temp/cc6Vaaaa.s:220 .text:00000076 __vector_18 C:\DOCUME~1\palm3\LOCALS~1\Temp/cc6Vaaaa.s:266 .text:00000090 Letext *ABS*:00000000 *ABS* UNDEFINED SYMBOLS __do_copy_data __do_clear_bss AvrXSetSemaphore AvrXWaitSemaphore IntProlog AvrXIntSetSemaphore Epilog