Rev 174 | Rev 409 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download
GAS LISTING /tmp/ccZHfAgR.s page 1
1 .file "I2CInterface.c"
2 .arch atmega8
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
10 .stabs "/home/kaklik/projects/programy/Atmel_C/AVRcam/",100,0,2,.Ltext0
11 .stabs "I2CInterface.c",100,0,2,.Ltext0
12 .text
13 .Ltext0:
14 .stabs "gcc2_compiled.",60,0,0,0
15 .stabs "int:t(0,1)=r(0,1);-32768;32767;",128,0,0,0
16 .stabs "char:t(0,2)=@s8;r(0,2);0;255;",128,0,0,0
17 .stabs "long int:t(0,3)=@s32;r(0,3);020000000000;017777777777;",128,0,0,0
18 .stabs "unsigned int:t(0,4)=r(0,4);0;0177777;",128,0,0,0
19 .stabs "long unsigned int:t(0,5)=@s32;r(0,5);0;037777777777;",128,0,0,0
20 .stabs "long long int:t(0,6)=@s64;r(0,6);01000000000000000000000;0777777777777777777777;",128,0,0,
21 .stabs "long long unsigned int:t(0,7)=@s64;r(0,7);0;01777777777777777777777;",128,0,0,0
22 .stabs "short int:t(0,8)=r(0,8);-32768;32767;",128,0,0,0
23 .stabs "short unsigned int:t(0,9)=r(0,9);0;0177777;",128,0,0,0
24 .stabs "signed char:t(0,10)=@s8;r(0,10);-128;127;",128,0,0,0
25 .stabs "unsigned char:t(0,11)=@s8;r(0,11);0;255;",128,0,0,0
26 .stabs "float:t(0,12)=r(0,1);4;0;",128,0,0,0
27 .stabs "double:t(0,13)=r(0,1);4;0;",128,0,0,0
28 .stabs "long double:t(0,14)=r(0,1);4;0;",128,0,0,0
29 .stabs "void:t(0,15)=(0,15)",128,0,0,0
30 .stabs "/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/io.h",130,0,0,0
31 .stabs "/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/sfr_defs.h",130,0,0,0
32 .stabs "/usr/lib/gcc/avr/4.1.0/../../../../avr/include/inttypes.h",130,0,0,0
33 .stabs "/usr/lib/gcc/avr/4.1.0/../../../../avr/include/stdint.h",130,0,0,0
34 .stabs "int8_t:t(4,1)=(0,10)",128,0,116,0
35 .stabs "uint8_t:t(4,2)=(0,11)",128,0,117,0
36 .stabs "int16_t:t(4,3)=(0,1)",128,0,118,0
37 .stabs "uint16_t:t(4,4)=(0,4)",128,0,119,0
38 .stabs "int32_t:t(4,5)=(0,3)",128,0,120,0
39 .stabs "uint32_t:t(4,6)=(0,5)",128,0,121,0
40 .stabs "int64_t:t(4,7)=(0,6)",128,0,122,0
41 .stabs "uint64_t:t(4,8)=(0,7)",128,0,123,0
42 .stabs "intptr_t:t(4,9)=(4,3)",128,0,135,0
43 .stabs "uintptr_t:t(4,10)=(4,4)",128,0,140,0
44 .stabs "int_least8_t:t(4,11)=(4,1)",128,0,152,0
45 .stabs "uint_least8_t:t(4,12)=(4,2)",128,0,157,0
46 .stabs "int_least16_t:t(4,13)=(4,3)",128,0,162,0
47 .stabs "uint_least16_t:t(4,14)=(4,4)",128,0,167,0
48 .stabs "int_least32_t:t(4,15)=(4,5)",128,0,172,0
49 .stabs "uint_least32_t:t(4,16)=(4,6)",128,0,177,0
50 .stabs "int_least64_t:t(4,17)=(4,7)",128,0,182,0
51 .stabs "uint_least64_t:t(4,18)=(4,8)",128,0,187,0
52 .stabs "int_fast8_t:t(4,19)=(4,1)",128,0,200,0
53 .stabs "uint_fast8_t:t(4,20)=(4,2)",128,0,205,0
54 .stabs "int_fast16_t:t(4,21)=(4,3)",128,0,210,0
55 .stabs "uint_fast16_t:t(4,22)=(4,4)",128,0,215,0
56 .stabs "int_fast32_t:t(4,23)=(4,5)",128,0,220,0
57 .stabs "uint_fast32_t:t(4,24)=(4,6)",128,0,225,0
GAS LISTING /tmp/ccZHfAgR.s page 2
58 .stabs "int_fast64_t:t(4,25)=(4,7)",128,0,230,0
59 .stabs "uint_fast64_t:t(4,26)=(4,8)",128,0,235,0
60 .stabs "intmax_t:t(4,27)=(4,7)",128,0,249,0
61 .stabs "uintmax_t:t(4,28)=(4,8)",128,0,254,0
62 .stabn 162,0,0,0
63 .stabs "int_farptr_t:t(3,1)=(4,5)",128,0,76,0
64 .stabs "uint_farptr_t:t(3,2)=(4,6)",128,0,80,0
65 .stabn 162,0,0,0
66 .stabn 162,0,0,0
67 .stabn 162,0,0,0
68 .stabs "CamConfig.h",130,0,0,0
69 .stabs "I2CInterface.h",130,0,0,0
70 .stabs "CommonDefs.h",130,0,0,0
71 .stabs "bool_t:t(7,1)=(0,11)",128,0,56,0
72 .stabn 162,0,0,0
73 .stabs "i2cCmd_t:t(6,1)=(6,2)=s2configReg:(0,11),0,8;data:(0,11),8,8;;",128,0,53,0
74 .stabn 162,0,0,0
75 .stabn 162,0,0,0
76 .stabs "I2CInt_init:F(0,15)",36,0,85,I2CInt_init
77 .global I2CInt_init
78 .type I2CInt_init, @function
79 I2CInt_init:
80 .stabd 46,0,0
1:I2CInterface.c **** /*
2:I2CInterface.c **** Copyright (C) 2004 John Orlando
3:I2CInterface.c ****
4:I2CInterface.c **** AVRcam: a small real-time image processing engine.
5:I2CInterface.c ****
6:I2CInterface.c **** This program is free software; you can redistribute it and/or
7:I2CInterface.c **** modify it under the terms of the GNU General Public
8:I2CInterface.c **** License as published by the Free Software Foundation; either
9:I2CInterface.c **** version 2 of the License, or (at your option) any later version.
10:I2CInterface.c ****
11:I2CInterface.c **** This program is distributed in the hope that it will be useful,
12:I2CInterface.c **** but WITHOUT ANY WARRANTY; without even the implied warranty of
13:I2CInterface.c **** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14:I2CInterface.c **** General Public License for more details.
15:I2CInterface.c ****
16:I2CInterface.c **** You should have received a copy of the GNU General Public
17:I2CInterface.c **** License along with this program; if not, write to the Free Software
18:I2CInterface.c **** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19:I2CInterface.c ****
20:I2CInterface.c **** For more information on the AVRcam, please contact:
21:I2CInterface.c ****
22:I2CInterface.c **** john@jrobot.net
23:I2CInterface.c ****
24:I2CInterface.c **** or go to www.jrobot.net for more details regarding the system.
25:I2CInterface.c **** */
26:I2CInterface.c **** /***********************************************************
27:I2CInterface.c **** Module Name: I2CInterface.c
28:I2CInterface.c **** Module Date: 4/10/2004
29:I2CInterface.c **** Module Auth: John Orlando
30:I2CInterface.c ****
31:I2CInterface.c **** Description: This module is responsible for providing a
32:I2CInterface.c **** low-level interface to the I2C hardware resident on the
33:I2CInterface.c **** mega8 processor (also known as the Two-Wire Interface,
34:I2CInterface.c **** or TWI). The interface is needed to configure the
GAS LISTING /tmp/ccZHfAgR.s page 3
35:I2CInterface.c **** needed registers in the OV6620 camera. This interface
36:I2CInterface.c **** is interrupt-driven based on the events that should
37:I2CInterface.c **** occur upon successful writing of an I2C register.
38:I2CInterface.c ****
39:I2CInterface.c **** Revision History:
40:I2CInterface.c **** Date Rel Ver. Notes
41:I2CInterface.c **** 4/10/2004 0.1 Module created
42:I2CInterface.c **** 6/30/2004 1.0 Initial release for Circuit Cellar
43:I2CInterface.c **** contest.
44:I2CInterface.c ****
45:I2CInterface.c **** ***********************************************************/
46:I2CInterface.c ****
47:I2CInterface.c **** /* Includes */
48:I2CInterface.c **** #include <avr/io.h>
49:I2CInterface.c **** #include <util/twi.h>
50:I2CInterface.c **** #include <avr/interrupt.h>
51:I2CInterface.c **** #include "CamConfig.h"
52:I2CInterface.c **** #include "CommonDefs.h"
53:I2CInterface.c ****
54:I2CInterface.c **** /* Local Variables */
55:I2CInterface.c ****
56:I2CInterface.c **** /* These variables are used as storage space for the current
57:I2CInterface.c **** I2C command being sent over the interface. They need to
58:I2CInterface.c **** be volatile since they are dealt with an the TWI ISR */
59:I2CInterface.c **** volatile static unsigned char twi_address;
60:I2CInterface.c **** volatile static unsigned char *twi_data;
61:I2CInterface.c **** volatile static unsigned char twi_ddr;
62:I2CInterface.c **** volatile static unsigned char twi_bytes;
63:I2CInterface.c **** volatile static unsigned char status;
64:I2CInterface.c **** volatile static unsigned char retry_cnt;
65:I2CInterface.c ****
66:I2CInterface.c **** /* Local Structures and Typedefs */
67:I2CInterface.c ****
68:I2CInterface.c **** /* Extern Variables */
69:I2CInterface.c ****
70:I2CInterface.c **** /* Definitions */
71:I2CInterface.c **** /* Bit definitions for the tw_status register */
72:I2CInterface.c **** #define MAX_TWI_RETRIES 2
73:I2CInterface.c **** #define BUSY 7
74:I2CInterface.c ****
75:I2CInterface.c **** /***********************************************************
76:I2CInterface.c **** Function Name: I2CInt_init
77:I2CInterface.c **** Function Description: This function is responsible
78:I2CInterface.c **** for setting up the registers needed for the TWI
79:I2CInterface.c **** interface
80:I2CInterface.c ****
81:I2CInterface.c **** Inputs: none
82:I2CInterface.c **** Outputs: none
83:I2CInterface.c **** ***********************************************************/
84:I2CInterface.c **** void I2CInt_init(void)
85:I2CInterface.c **** {
81 .stabn 68,0,85,.LM0-I2CInt_init
82 .LM0:
83 /* prologue: frame size=0 */
84 /* prologue end (size=0) */
86:I2CInterface.c **** TWSR = 0;
85 .stabn 68,0,86,.LM1-I2CInt_init
GAS LISTING /tmp/ccZHfAgR.s page 4
86 .LM1:
87 0000 11B8 out 33-0x20,__zero_reg__
87:I2CInterface.c ****
88:I2CInterface.c **** /* init the speed of the I2C interface, running at
89:I2CInterface.c **** 100 Kbps */
90:I2CInterface.c **** TWBR = (FOSC / I2C_SPEED - 16)/2;
88 .stabn 68,0,90,.LM2-I2CInt_init
89 .LM2:
90 0002 88E4 ldi r24,lo8(72)
91 0004 80B9 out 32-0x20,r24
92 /* epilogue: frame size=0 */
93 0006 0895 ret
94 /* epilogue end (size=1) */
95 /* function I2CInt_init size 4 (3) */
96 .size I2CInt_init, .-I2CInt_init
97 .Lscope0:
98 .stabs "",36,0,0,.Lscope0-I2CInt_init
99 .stabd 78,0,0
100 .stabs "I2CInt_writeData:F(0,15)",36,0,108,I2CInt_writeData
101 .stabs "address:P(0,11)",64,0,107,25
102 .stabs "data:P(0,16)=*(0,11)",64,0,107,22
103 .stabs "bytes:P(0,11)",64,0,107,20
104 .global I2CInt_writeData
105 .type I2CInt_writeData, @function
106 I2CInt_writeData:
107 .stabd 46,0,0
91:I2CInterface.c **** }
92:I2CInterface.c ****
93:I2CInterface.c **** /***********************************************************
94:I2CInterface.c **** Function Name: I2CInt_writeData
95:I2CInterface.c **** Function Description: This function is responsible for
96:I2CInterface.c **** initiating the process of writing a sequence of bytes
97:I2CInterface.c **** an I2C slave address. This function will try to write
98:I2CInterface.c **** the data three times before giving up.
99:I2CInterface.c **** Inputs: address: the address of the I2C slave device
100:I2CInterface.c **** data: a pointer to the data to be written
101:I2CInterface.c **** to the slave...for camera interfacing,
102:I2CInterface.c **** the data follows a <register #><data>
103:I2CInterface.c **** format
104:I2CInterface.c **** bytes: the number of bytes to write
105:I2CInterface.c **** Outputs: none
106:I2CInterface.c **** ***********************************************************/
107:I2CInterface.c **** void I2CInt_writeData(unsigned char address, unsigned char *data, unsigned char bytes)
108:I2CInterface.c **** {
108 .stabn 68,0,108,.LM3-I2CInt_writeData
109 .LM3:
110 /* prologue: frame size=0 */
111 /* prologue end (size=0) */
112 0008 982F mov r25,r24
113 .L5:
109:I2CInterface.c **** while(status & (1<<BUSY)); /* Bus is busy wait (or exit with error code) */
114 .stabn 68,0,109,.LM4-I2CInt_writeData
115 .LM4:
116 000a 8091 0000 lds r24,status
117 000e 8823 tst r24
118 0010 E4F3 brlt .L5
119 .L9:
GAS LISTING /tmp/ccZHfAgR.s page 5
110:I2CInterface.c **** while(TWCR & (1<<TWSTO));
120 .stabn 68,0,110,.LM5-I2CInt_writeData
121 .LM5:
122 0012 06B6 in __tmp_reg__,86-0x20
123 0014 04FC sbrc __tmp_reg__,4
124 0016 FDCF rjmp .L9
111:I2CInterface.c ****
112:I2CInterface.c **** /* copy the needed data and state info to our local I2C command structure */
113:I2CInterface.c **** twi_address = address;
125 .stabn 68,0,113,.LM6-I2CInt_writeData
126 .LM6:
127 0018 9093 0000 sts twi_address,r25
114:I2CInterface.c **** twi_data = data;
128 .stabn 68,0,114,.LM7-I2CInt_writeData
129 .LM7:
130 001c 7093 0000 sts (twi_data)+1,r23
131 0020 6093 0000 sts twi_data,r22
115:I2CInterface.c **** twi_bytes = bytes;
132 .stabn 68,0,115,.LM8-I2CInt_writeData
133 .LM8:
134 0024 4093 0000 sts twi_bytes,r20
116:I2CInterface.c **** twi_ddr = TW_WRITE;
135 .stabn 68,0,116,.LM9-I2CInt_writeData
136 .LM9:
137 0028 1092 0000 sts twi_ddr,__zero_reg__
117:I2CInterface.c ****
118:I2CInterface.c **** retry_cnt = 0;
138 .stabn 68,0,118,.LM10-I2CInt_writeData
139 .LM10:
140 002c 1092 0000 sts retry_cnt,__zero_reg__
119:I2CInterface.c ****
120:I2CInterface.c **** /* Generate start condition, the remainder of the transfer is interrupt driven and
121:I2CInterface.c **** will be performed in the background */
122:I2CInterface.c **** TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN)|(1<<TWIE);
141 .stabn 68,0,122,.LM11-I2CInt_writeData
142 .LM11:
143 0030 85EA ldi r24,lo8(-91)
144 0032 86BF out 86-0x20,r24
123:I2CInterface.c ****
124:I2CInterface.c **** status |= (1<<BUSY);
145 .stabn 68,0,124,.LM12-I2CInt_writeData
146 .LM12:
147 0034 8091 0000 lds r24,status
148 0038 8068 ori r24,lo8(-128)
149 003a 8093 0000 sts status,r24
150 /* epilogue: frame size=0 */
151 003e 0895 ret
152 /* epilogue end (size=1) */
153 /* function I2CInt_writeData size 28 (27) */
154 .size I2CInt_writeData, .-I2CInt_writeData
155 .Lscope1:
156 .stabs "",36,0,0,.Lscope1-I2CInt_writeData
157 .stabd 78,0,0
158 .stabs "I2CInt_readData:F(0,15)",36,0,138,I2CInt_readData
159 .stabs "address:P(0,11)",64,0,137,25
160 .stabs "data:P(0,16)",64,0,137,22
161 .stabs "bytes:P(0,11)",64,0,137,20
GAS LISTING /tmp/ccZHfAgR.s page 6
162 .global I2CInt_readData
163 .type I2CInt_readData, @function
164 I2CInt_readData:
165 .stabd 46,0,0
125:I2CInterface.c **** }
126:I2CInterface.c ****
127:I2CInterface.c **** /***********************************************************
128:I2CInterface.c **** Function Name: I2CInt_readData
129:I2CInterface.c **** Function Description: This funcion is responsible for
130:I2CInterface.c **** reading the specified number of bytes from a slave
131:I2CInterface.c **** device.
132:I2CInterface.c **** Inputs: address: the slave address to read from
133:I2CInterface.c **** data: a pointer to where the data will be stored
134:I2CInterface.c **** bytes: the number of bytes to read
135:I2CInterface.c **** Outputs: none
136:I2CInterface.c **** ***********************************************************/
137:I2CInterface.c **** void I2CInt_readData(unsigned char address, unsigned char *data, unsigned char bytes)
138:I2CInterface.c **** {
166 .stabn 68,0,138,.LM13-I2CInt_readData
167 .LM13:
168 /* prologue: frame size=0 */
169 /* prologue end (size=0) */
170 0040 982F mov r25,r24
171 .L15:
139:I2CInterface.c **** /* Bus is busy wait (or exit with error code) */
140:I2CInterface.c **** while(status & (1<<BUSY));
172 .stabn 68,0,140,.LM14-I2CInt_readData
173 .LM14:
174 0042 8091 0000 lds r24,status
175 0046 8823 tst r24
176 0048 E4F3 brlt .L15
141:I2CInterface.c ****
142:I2CInterface.c **** twi_address = address;
177 .stabn 68,0,142,.LM15-I2CInt_readData
178 .LM15:
179 004a 9093 0000 sts twi_address,r25
143:I2CInterface.c **** twi_data = data;
180 .stabn 68,0,143,.LM16-I2CInt_readData
181 .LM16:
182 004e 7093 0000 sts (twi_data)+1,r23
183 0052 6093 0000 sts twi_data,r22
144:I2CInterface.c **** twi_bytes = bytes;
184 .stabn 68,0,144,.LM17-I2CInt_readData
185 .LM17:
186 0056 4093 0000 sts twi_bytes,r20
145:I2CInterface.c **** twi_ddr = TW_READ;
187 .stabn 68,0,145,.LM18-I2CInt_readData
188 .LM18:
189 005a 81E0 ldi r24,lo8(1)
190 005c 8093 0000 sts twi_ddr,r24
146:I2CInterface.c ****
147:I2CInterface.c **** retry_cnt = 0;
191 .stabn 68,0,147,.LM19-I2CInt_readData
192 .LM19:
193 0060 1092 0000 sts retry_cnt,__zero_reg__
148:I2CInterface.c ****
149:I2CInterface.c **** /* Generate start condition, the remainder of the transfer is interrupt driven and
GAS LISTING /tmp/ccZHfAgR.s page 7
150:I2CInterface.c **** will be performed in the background */
151:I2CInterface.c **** TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN)|(1<<TWIE);
194 .stabn 68,0,151,.LM20-I2CInt_readData
195 .LM20:
196 0064 85EA ldi r24,lo8(-91)
197 0066 86BF out 86-0x20,r24
152:I2CInterface.c ****
153:I2CInterface.c **** status |= (1<<BUSY);
198 .stabn 68,0,153,.LM21-I2CInt_readData
199 .LM21:
200 0068 8091 0000 lds r24,status
201 006c 8068 ori r24,lo8(-128)
202 006e 8093 0000 sts status,r24
203 /* epilogue: frame size=0 */
204 0072 0895 ret
205 /* epilogue end (size=1) */
206 /* function I2CInt_readData size 26 (25) */
207 .size I2CInt_readData, .-I2CInt_readData
208 .Lscope2:
209 .stabs "",36,0,0,.Lscope2-I2CInt_readData
210 .stabd 78,0,0
211 .stabs "I2CInt_isI2cBusy:F(7,1)",36,0,166,I2CInt_isI2cBusy
212 .global I2CInt_isI2cBusy
213 .type I2CInt_isI2cBusy, @function
214 I2CInt_isI2cBusy:
215 .stabd 46,0,0
154:I2CInterface.c **** }
155:I2CInterface.c ****
156:I2CInterface.c **** /***********************************************************
157:I2CInterface.c **** Function Name: I2CInt_isI2cBusy
158:I2CInterface.c **** Function Description: This funcion is responsible for
159:I2CInterface.c **** indicating if the I2C bus is currently busy to external
160:I2CInterface.c **** modules.
161:I2CInterface.c **** device.
162:I2CInterface.c **** Inputs: none
163:I2CInterface.c **** Outputs: bool_t - indicating if bus is busy
164:I2CInterface.c **** ***********************************************************/
165:I2CInterface.c **** bool_t I2CInt_isI2cBusy(void)
166:I2CInterface.c **** {
216 .stabn 68,0,166,.LM22-I2CInt_isI2cBusy
217 .LM22:
218 /* prologue: frame size=0 */
219 /* prologue end (size=0) */
167:I2CInterface.c **** bool_t retVal = FALSE;
168:I2CInterface.c **** if ( (status & (1<<BUSY)) != 0)
220 .stabn 68,0,168,.LM23-I2CInt_isI2cBusy
221 .LM23:
222 0074 8091 0000 lds r24,status
223 0078 881F rol r24
224 007a 8827 clr r24
225 007c 881F rol r24
169:I2CInterface.c **** {
170:I2CInterface.c **** retVal = TRUE;
171:I2CInterface.c **** }
172:I2CInterface.c ****
173:I2CInterface.c **** return(retVal);
174:I2CInterface.c **** }
GAS LISTING /tmp/ccZHfAgR.s page 8
226 .stabn 68,0,174,.LM24-I2CInt_isI2cBusy
227 .LM24:
228 007e 9927 clr r25
229 /* epilogue: frame size=0 */
230 0080 0895 ret
231 /* epilogue end (size=1) */
232 /* function I2CInt_isI2cBusy size 7 (6) */
233 .size I2CInt_isI2cBusy, .-I2CInt_isI2cBusy
234 .Lscope3:
235 .stabs "",36,0,0,.Lscope3-I2CInt_isI2cBusy
236 .stabd 78,0,0
237 .stabs "__vector_17:F(0,15)",36,0,185,__vector_17
238 .global __vector_17
239 .type __vector_17, @function
240 __vector_17:
241 .stabd 46,0,0
175:I2CInterface.c ****
176:I2CInterface.c **** /***********************************************************
177:I2CInterface.c **** Function Name: <interrupt handler for I2C>
178:I2CInterface.c **** Function Description: This function is responsible for
179:I2CInterface.c **** implementing the control logic needed to perform a
180:I2CInterface.c **** read or write operation with an I2C slave.
181:I2CInterface.c **** Inputs: none
182:I2CInterface.c **** Outputs: none
183:I2CInterface.c **** ***********************************************************/
184:I2CInterface.c **** SIGNAL(SIG_2WIRE_SERIAL)
185:I2CInterface.c **** {
242 .stabn 68,0,185,.LM25-__vector_17
243 .LM25:
244 /* prologue: frame size=0 */
245 0082 1F92 push __zero_reg__
246 0084 0F92 push __tmp_reg__
247 0086 0FB6 in __tmp_reg__,__SREG__
248 0088 0F92 push __tmp_reg__
249 008a 1124 clr __zero_reg__
250 008c 8F93 push r24
251 008e 9F93 push r25
252 0090 AF93 push r26
253 0092 BF93 push r27
254 0094 EF93 push r30
255 0096 FF93 push r31
256 /* prologue end (size=11) */
186:I2CInterface.c **** unsigned char TWI_status = TWSR & TW_STATUS_MASK; /* grab just the status bits */
257 .stabn 68,0,186,.LM26-__vector_17
258 .LM26:
259 0098 81B1 in r24,33-0x20
187:I2CInterface.c ****
188:I2CInterface.c **** /* the entire I2C handler is state-based...determine
189:I2CInterface.c **** what needs to be done based on TWI_status */
190:I2CInterface.c **** switch(TWI_status)
260 .stabn 68,0,190,.LM27-__vector_17
261 .LM27:
262 009a 9927 clr r25
263 009c AA27 clr r26
264 009e BB27 clr r27
265 00a0 887F andi r24,lo8(248)
266 00a2 9070 andi r25,hi8(248)
GAS LISTING /tmp/ccZHfAgR.s page 9
267 00a4 A070 andi r26,hlo8(248)
268 00a6 B070 andi r27,hhi8(248)
269 00a8 FC01 movw r30,r24
270 00aa 3897 sbiw r30,8
271 00ac E135 cpi r30,81
272 00ae F105 cpc r31,__zero_reg__
273 00b0 08F0 brlo .+2
274 00b2 9AC0 rjmp .L42
275 .stabn 68,0,190,.LM28-__vector_17
276 .LM28:
277 00b4 E050 subi r30,lo8(-(pm(.L33)))
278 00b6 F040 sbci r31,hi8(-(pm(.L33)))
279 00b8 0994 ijmp
280 .data
281 .section .progmem.gcc_sw_table, "ax", @progbits
282 .p2align 1
283 .L33:
284 .data
285 .section .progmem.gcc_sw_table, "ax", @progbits
286 .p2align 1
287 0000 00C0 rjmp .L25
288 0002 00C0 rjmp .L42
289 0004 00C0 rjmp .L42
290 0006 00C0 rjmp .L42
291 0008 00C0 rjmp .L42
292 000a 00C0 rjmp .L42
293 000c 00C0 rjmp .L42
294 000e 00C0 rjmp .L42
295 0010 00C0 rjmp .L25
296 0012 00C0 rjmp .L42
297 0014 00C0 rjmp .L42
298 0016 00C0 rjmp .L42
299 0018 00C0 rjmp .L42
300 001a 00C0 rjmp .L42
301 001c 00C0 rjmp .L42
302 001e 00C0 rjmp .L42
303 0020 00C0 rjmp .L26
304 0022 00C0 rjmp .L42
305 0024 00C0 rjmp .L42
306 0026 00C0 rjmp .L42
307 0028 00C0 rjmp .L42
308 002a 00C0 rjmp .L42
309 002c 00C0 rjmp .L42
310 002e 00C0 rjmp .L42
311 0030 00C0 rjmp .L27
312 0032 00C0 rjmp .L42
313 0034 00C0 rjmp .L42
314 0036 00C0 rjmp .L42
315 0038 00C0 rjmp .L42
316 003a 00C0 rjmp .L42
317 003c 00C0 rjmp .L42
318 003e 00C0 rjmp .L42
319 0040 00C0 rjmp .L28
320 0042 00C0 rjmp .L42
321 0044 00C0 rjmp .L42
322 0046 00C0 rjmp .L42
323 0048 00C0 rjmp .L42
GAS LISTING /tmp/ccZHfAgR.s page 10
324 004a 00C0 rjmp .L42
325 004c 00C0 rjmp .L42
326 004e 00C0 rjmp .L42
327 0050 00C0 rjmp .L29
328 0052 00C0 rjmp .L42
329 0054 00C0 rjmp .L42
330 0056 00C0 rjmp .L42
331 0058 00C0 rjmp .L42
332 005a 00C0 rjmp .L42
333 005c 00C0 rjmp .L42
334 005e 00C0 rjmp .L42
335 0060 00C0 rjmp .L42
336 0062 00C0 rjmp .L42
337 0064 00C0 rjmp .L42
338 0066 00C0 rjmp .L42
339 0068 00C0 rjmp .L42
340 006a 00C0 rjmp .L42
341 006c 00C0 rjmp .L42
342 006e 00C0 rjmp .L42
343 0070 00C0 rjmp .L30
344 0072 00C0 rjmp .L42
345 0074 00C0 rjmp .L42
346 0076 00C0 rjmp .L42
347 0078 00C0 rjmp .L42
348 007a 00C0 rjmp .L42
349 007c 00C0 rjmp .L42
350 007e 00C0 rjmp .L42
351 0080 00C0 rjmp .L27
352 0082 00C0 rjmp .L42
353 0084 00C0 rjmp .L42
354 0086 00C0 rjmp .L42
355 0088 00C0 rjmp .L42
356 008a 00C0 rjmp .L42
357 008c 00C0 rjmp .L42
358 008e 00C0 rjmp .L42
359 0090 00C0 rjmp .L31
360 0092 00C0 rjmp .L42
361 0094 00C0 rjmp .L42
362 0096 00C0 rjmp .L42
363 0098 00C0 rjmp .L42
364 009a 00C0 rjmp .L42
365 009c 00C0 rjmp .L42
366 009e 00C0 rjmp .L42
367 00a0 00C0 rjmp .L32
368 .text
369 .L25:
191:I2CInterface.c **** {
192:I2CInterface.c **** case TW_START: /* Start condition */
193:I2CInterface.c **** case TW_REP_START: /* Repeated start condition */
194:I2CInterface.c **** if(retry_cnt > MAX_TWI_RETRIES)
370 .stabn 68,0,194,.LM29-__vector_17
371 .LM29:
372 00ba 8091 0000 lds r24,retry_cnt
373 00be 8330 cpi r24,lo8(3)
374 00c0 48F0 brlo .L34
195:I2CInterface.c **** {
196:I2CInterface.c **** /* generate stop condition if we've reached our retry limit */
GAS LISTING /tmp/ccZHfAgR.s page 11
197:I2CInterface.c **** TWCR |= (1<<TWINT)|(1<<TWSTO);
375 .stabn 68,0,197,.LM30-__vector_17
376 .LM30:
377 00c2 86B7 in r24,86-0x20
378 00c4 8069 ori r24,lo8(-112)
379 00c6 86BF out 86-0x20,r24
198:I2CInterface.c **** status &= ~(1<<BUSY);
380 .stabn 68,0,198,.LM31-__vector_17
381 .LM31:
382 00c8 8091 0000 lds r24,status
383 00cc 8F77 andi r24,lo8(127)
384 00ce 8093 0000 sts status,r24
385 00d2 8AC0 rjmp .L42
386 .L34:
199:I2CInterface.c **** return;
200:I2CInterface.c **** }
201:I2CInterface.c **** /* indicate read or write */
202:I2CInterface.c **** TWDR = (twi_address<<1) + twi_ddr;
387 .stabn 68,0,202,.LM32-__vector_17
388 .LM32:
389 00d4 8091 0000 lds r24,twi_address
390 00d8 9091 0000 lds r25,twi_ddr
391 00dc 880F lsl r24
392 00de 890F add r24,r25
393 00e0 83B9 out 35-0x20,r24
203:I2CInterface.c **** /* TWSTA must be cleared...also clears TWINT */
204:I2CInterface.c **** TWCR &= ~(1<<TWSTA);
394 .stabn 68,0,204,.LM33-__vector_17
395 .LM33:
396 00e2 86B7 in r24,86-0x20
397 00e4 8F7D andi r24,lo8(-33)
398 00e6 86BF out 86-0x20,r24
399 00e8 7FC0 rjmp .L42
400 .L26:
205:I2CInterface.c **** break;
206:I2CInterface.c ****
207:I2CInterface.c **** case TW_MT_SLA_ACK: /* Slave acknowledged address, */
208:I2CInterface.c **** retry_cnt = 0;
401 .stabn 68,0,208,.LM34-__vector_17
402 .LM34:
403 00ea 1092 0000 sts retry_cnt,__zero_reg__
209:I2CInterface.c **** /* tx the data, and increment the data pointer */
210:I2CInterface.c **** TWDR = *twi_data;
404 .stabn 68,0,210,.LM35-__vector_17
405 .LM35:
406 00ee E091 0000 lds r30,twi_data
407 00f2 F091 0000 lds r31,(twi_data)+1
408 00f6 8081 ld r24,Z
409 00f8 83B9 out 35-0x20,r24
211:I2CInterface.c **** twi_data++;
410 .stabn 68,0,211,.LM36-__vector_17
411 .LM36:
412 00fa 3196 adiw r30,1
413 00fc F093 0000 sts (twi_data)+1,r31
414 0100 E093 0000 sts twi_data,r30
212:I2CInterface.c ****
213:I2CInterface.c **** /* clear the int to continue */
GAS LISTING /tmp/ccZHfAgR.s page 12
214:I2CInterface.c **** TWCR |= (1<<TWINT);
415 .stabn 68,0,214,.LM37-__vector_17
416 .LM37:
417 0104 86B7 in r24,86-0x20
418 0106 8068 ori r24,lo8(-128)
419 0108 86BF out 86-0x20,r24
420 010a 6EC0 rjmp .L42
421 .L27:
215:I2CInterface.c **** break;
216:I2CInterface.c ****
217:I2CInterface.c **** case TW_MT_SLA_NACK: /* Slave didn't acknowledge address, */
218:I2CInterface.c **** case TW_MR_SLA_NACK:
219:I2CInterface.c **** retry_cnt++;
422 .stabn 68,0,219,.LM38-__vector_17
423 .LM38:
424 010c 8091 0000 lds r24,retry_cnt
425 0110 8F5F subi r24,lo8(-(1))
426 0112 8093 0000 sts retry_cnt,r24
220:I2CInterface.c ****
221:I2CInterface.c **** /* retry...*/
222:I2CInterface.c **** TWCR |= (1<<TWINT)|(1<<TWSTA)|(1<<TWSTO);
427 .stabn 68,0,222,.LM39-__vector_17
428 .LM39:
429 0116 86B7 in r24,86-0x20
430 0118 806B ori r24,lo8(-80)
431 011a 86BF out 86-0x20,r24
432 011c 65C0 rjmp .L42
433 .L28:
223:I2CInterface.c **** break;
224:I2CInterface.c ****
225:I2CInterface.c **** case TW_MT_DATA_ACK: /* Slave Acknowledged data, */
226:I2CInterface.c **** if(--twi_bytes > 0)
434 .stabn 68,0,226,.LM40-__vector_17
435 .LM40:
436 011e 8091 0000 lds r24,twi_bytes
437 0122 8150 subi r24,lo8(-(-1))
438 0124 8093 0000 sts twi_bytes,r24
439 0128 8091 0000 lds r24,twi_bytes
440 012c 8823 tst r24
441 012e 79F0 breq .L36
227:I2CInterface.c **** {
228:I2CInterface.c **** /* more data to send, so send it */
229:I2CInterface.c **** TWDR = *twi_data;
442 .stabn 68,0,229,.LM41-__vector_17
443 .LM41:
444 0130 E091 0000 lds r30,twi_data
445 0134 F091 0000 lds r31,(twi_data)+1
446 0138 8081 ld r24,Z
447 013a 83B9 out 35-0x20,r24
230:I2CInterface.c **** twi_data++;
448 .stabn 68,0,230,.LM42-__vector_17
449 .LM42:
450 013c 3196 adiw r30,1
451 013e F093 0000 sts (twi_data)+1,r31
452 0142 E093 0000 sts twi_data,r30
231:I2CInterface.c **** TWCR |= (1<<TWINT);
453 .stabn 68,0,231,.LM43-__vector_17
GAS LISTING /tmp/ccZHfAgR.s page 13
454 .LM43:
455 0146 86B7 in r24,86-0x20
456 0148 8068 ori r24,lo8(-128)
457 014a 86BF out 86-0x20,r24
458 014c 4DC0 rjmp .L42
459 .L36:
232:I2CInterface.c **** }
233:I2CInterface.c **** else
234:I2CInterface.c **** {
235:I2CInterface.c **** /* generate the stop condition if needed */
236:I2CInterface.c **** TWCR |= (1<<TWSTO)|(1<<TWINT);
460 .stabn 68,0,236,.LM44-__vector_17
461 .LM44:
462 014e 86B7 in r24,86-0x20
463 0150 8069 ori r24,lo8(-112)
464 0152 86BF out 86-0x20,r24
237:I2CInterface.c **** status &= ~(1<<BUSY);
465 .stabn 68,0,237,.LM45-__vector_17
466 .LM45:
467 0154 8091 0000 lds r24,status
468 0158 8F77 andi r24,lo8(127)
469 015a 8093 0000 sts status,r24
470 015e 44C0 rjmp .L42
471 .L29:
238:I2CInterface.c **** }
239:I2CInterface.c **** break;
240:I2CInterface.c ****
241:I2CInterface.c **** case TW_MT_DATA_NACK: /* Slave didn't acknowledge data */
242:I2CInterface.c **** /* send the stop condition */
243:I2CInterface.c **** TWCR |= (1<<TWINT)|(1<<TWSTO);
472 .stabn 68,0,243,.LM46-__vector_17
473 .LM46:
474 0160 86B7 in r24,86-0x20
475 0162 8069 ori r24,lo8(-112)
476 0164 86BF out 86-0x20,r24
244:I2CInterface.c **** status &= ~(1<<BUSY);
477 .stabn 68,0,244,.LM47-__vector_17
478 .LM47:
479 0166 8091 0000 lds r24,status
480 016a 8F77 andi r24,lo8(127)
481 016c 8093 0000 sts status,r24
482 0170 3BC0 rjmp .L42
483 .L30:
245:I2CInterface.c **** break;
246:I2CInterface.c ****
247:I2CInterface.c **** case TW_MR_SLA_ACK: /* Slave acknowledged address */
248:I2CInterface.c **** if(--twi_bytes > 0)
484 .stabn 68,0,248,.LM48-__vector_17
485 .LM48:
486 0172 8091 0000 lds r24,twi_bytes
487 0176 8150 subi r24,lo8(-(-1))
488 0178 8093 0000 sts twi_bytes,r24
489 017c 8091 0000 lds r24,twi_bytes
490 0180 8823 tst r24
491 0182 21F0 breq .L38
249:I2CInterface.c **** {
250:I2CInterface.c **** /* if there is more than one byte to read, acknowledge */
GAS LISTING /tmp/ccZHfAgR.s page 14
251:I2CInterface.c **** TWCR |= (1<<TWEA)|(1<<TWINT);
492 .stabn 68,0,251,.LM49-__vector_17
493 .LM49:
494 0184 86B7 in r24,86-0x20
495 0186 806C ori r24,lo8(-64)
496 0188 86BF out 86-0x20,r24
497 018a 2EC0 rjmp .L42
498 .L38:
252:I2CInterface.c **** }
253:I2CInterface.c **** else
254:I2CInterface.c **** {
255:I2CInterface.c **** /* no acknowledge */
256:I2CInterface.c **** TWCR |= (1<<TWINT);
499 .stabn 68,0,256,.LM50-__vector_17
500 .LM50:
501 018c 86B7 in r24,86-0x20
502 018e 8068 ori r24,lo8(-128)
503 0190 86BF out 86-0x20,r24
504 0192 2AC0 rjmp .L42
505 .L31:
257:I2CInterface.c **** }
258:I2CInterface.c **** break;
259:I2CInterface.c ****
260:I2CInterface.c **** case TW_MR_DATA_ACK: /* Master acknowledged data */
261:I2CInterface.c ****
262:I2CInterface.c **** /* grab the received data */
263:I2CInterface.c **** *twi_data = TWDR;
506 .stabn 68,0,263,.LM51-__vector_17
507 .LM51:
508 0194 E091 0000 lds r30,twi_data
509 0198 F091 0000 lds r31,(twi_data)+1
510 019c 83B1 in r24,35-0x20
511 019e 8083 st Z,r24
264:I2CInterface.c **** twi_data++;
512 .stabn 68,0,264,.LM52-__vector_17
513 .LM52:
514 01a0 3196 adiw r30,1
515 01a2 F093 0000 sts (twi_data)+1,r31
516 01a6 E093 0000 sts twi_data,r30
265:I2CInterface.c **** if(--twi_bytes > 0)
517 .stabn 68,0,265,.LM53-__vector_17
518 .LM53:
519 01aa 8091 0000 lds r24,twi_bytes
520 01ae 8150 subi r24,lo8(-(-1))
521 01b0 8093 0000 sts twi_bytes,r24
522 01b4 8091 0000 lds r24,twi_bytes
523 01b8 8823 tst r24
524 01ba 21F0 breq .L40
266:I2CInterface.c **** {
267:I2CInterface.c **** /* get the next data byte and ack */
268:I2CInterface.c **** TWCR |= (1<<TWEA)|(1<<TWINT);
525 .stabn 68,0,268,.LM54-__vector_17
526 .LM54:
527 01bc 86B7 in r24,86-0x20
528 01be 806C ori r24,lo8(-64)
529 01c0 86BF out 86-0x20,r24
530 01c2 12C0 rjmp .L42
GAS LISTING /tmp/ccZHfAgR.s page 15
531 .L40:
269:I2CInterface.c **** }
270:I2CInterface.c **** else
271:I2CInterface.c **** {
272:I2CInterface.c **** /* clear out the enable acknowledge bit */
273:I2CInterface.c **** TWCR &= ~(1<<TWEA);
532 .stabn 68,0,273,.LM55-__vector_17
533 .LM55:
534 01c4 86B7 in r24,86-0x20
535 01c6 8F7B andi r24,lo8(-65)
536 01c8 86BF out 86-0x20,r24
537 01ca 0EC0 rjmp .L42
538 .L32:
274:I2CInterface.c **** }
275:I2CInterface.c **** break;
276:I2CInterface.c ****
277:I2CInterface.c **** case TW_MR_DATA_NACK: /* Master didn't acknowledge data -> end of read process */
278:I2CInterface.c **** /* read data, and generate the stop condition */
279:I2CInterface.c **** *twi_data = TWDR;
539 .stabn 68,0,279,.LM56-__vector_17
540 .LM56:
541 01cc E091 0000 lds r30,twi_data
542 01d0 F091 0000 lds r31,(twi_data)+1
543 01d4 83B1 in r24,35-0x20
544 01d6 8083 st Z,r24
280:I2CInterface.c **** TWCR |= (1<<TWSTO)|(1<<TWINT);
545 .stabn 68,0,280,.LM57-__vector_17
546 .LM57:
547 01d8 86B7 in r24,86-0x20
548 01da 8069 ori r24,lo8(-112)
549 01dc 86BF out 86-0x20,r24
281:I2CInterface.c **** status &= ~(1<<BUSY);
550 .stabn 68,0,281,.LM58-__vector_17
551 .LM58:
552 01de 8091 0000 lds r24,status
553 01e2 8F77 andi r24,lo8(127)
554 01e4 8093 0000 sts status,r24
555 .L42:
556 /* epilogue: frame size=0 */
557 01e8 FF91 pop r31
558 01ea EF91 pop r30
559 01ec BF91 pop r27
560 01ee AF91 pop r26
561 01f0 9F91 pop r25
562 01f2 8F91 pop r24
563 01f4 0F90 pop __tmp_reg__
564 01f6 0FBE out __SREG__,__tmp_reg__
565 01f8 0F90 pop __tmp_reg__
566 01fa 1F90 pop __zero_reg__
567 01fc 1895 reti
568 /* epilogue end (size=11) */
569 /* function __vector_17 size 271 (249) */
570 .size __vector_17, .-__vector_17
571 .Lscope4:
572 .stabs "",36,0,0,.Lscope4-__vector_17
573 .stabd 78,0,0
574 .lcomm twi_address,1
GAS LISTING /tmp/ccZHfAgR.s page 16
575 .lcomm twi_data,2
576 .lcomm twi_ddr,1
577 .lcomm twi_bytes,1
578 .lcomm status,1
579 .lcomm retry_cnt,1
580 .stabs "twi_address:S(0,17)=B(0,11)",40,0,59,twi_address
581 .stabs "twi_data:S(0,18)=*(0,17)",40,0,60,twi_data
582 .stabs "twi_ddr:S(0,17)",40,0,61,twi_ddr
583 .stabs "twi_bytes:S(0,17)",40,0,62,twi_bytes
584 .stabs "status:S(0,17)",40,0,63,status
585 .stabs "retry_cnt:S(0,17)",40,0,64,retry_cnt
586 .stabs "",100,0,0,.Letext0
587 .Letext0:
588 /* File "I2CInterface.c": code 336 = 0x0150 ( 310), prologues 11, epilogues 15 */
GAS LISTING /tmp/ccZHfAgR.s page 17
DEFINED SYMBOLS
*ABS*:00000000 I2CInterface.c
/tmp/ccZHfAgR.s:3 *ABS*:0000003f __SREG__
/tmp/ccZHfAgR.s:4 *ABS*:0000003e __SP_H__
/tmp/ccZHfAgR.s:5 *ABS*:0000003d __SP_L__
/tmp/ccZHfAgR.s:6 *ABS*:00000000 __tmp_reg__
/tmp/ccZHfAgR.s:7 *ABS*:00000001 __zero_reg__
/tmp/ccZHfAgR.s:79 .text:00000000 I2CInt_init
/tmp/ccZHfAgR.s:106 .text:00000008 I2CInt_writeData
/tmp/ccZHfAgR.s:577 .bss:00000005 status
.bss:00000000 twi_address
/tmp/ccZHfAgR.s:574 .bss:00000001 twi_data
/tmp/ccZHfAgR.s:576 .bss:00000004 twi_bytes
/tmp/ccZHfAgR.s:575 .bss:00000003 twi_ddr
/tmp/ccZHfAgR.s:578 .bss:00000006 retry_cnt
/tmp/ccZHfAgR.s:164 .text:00000040 I2CInt_readData
/tmp/ccZHfAgR.s:214 .text:00000074 I2CInt_isI2cBusy
/tmp/ccZHfAgR.s:240 .text:00000082 __vector_17
UNDEFINED SYMBOLS
__do_copy_data
__do_clear_bss