Rev 410 | Blame | Compare with Previous | Last modification | View Log | Download
GAS LISTING /tmp/ccfEG7oP.s page 1
1 .file "I2CInterface.c"
2 __SREG__ = 0x3f
3 __SP_H__ = 0x3e
4 __SP_L__ = 0x3d
5 __tmp_reg__ = 0
6 __zero_reg__ = 1
7 .global __do_copy_data
8 .global __do_clear_bss
9 .stabs "/home/kaklik/projects/programy/C/avr/AVRcam/",100,0,2,.Ltext0
10 .stabs "I2CInterface.c",100,0,2,.Ltext0
11 .text
12 .Ltext0:
13 .stabs "gcc2_compiled.",60,0,0,0
14 .stabs "int:t(0,1)=r(0,1);-32768;32767;",128,0,0,0
15 .stabs "char:t(0,2)=@s8;r(0,2);0;255;",128,0,0,0
16 .stabs "long int:t(0,3)=@s32;r(0,3);020000000000;017777777777;",128,0,0,0
17 .stabs "unsigned int:t(0,4)=r(0,4);0;0177777;",128,0,0,0
18 .stabs "long unsigned int:t(0,5)=@s32;r(0,5);0;037777777777;",128,0,0,0
19 .stabs "long long int:t(0,6)=@s64;r(0,6);01000000000000000000000;0777777777777777777777;",128,0,0,
20 .stabs "long long unsigned int:t(0,7)=@s64;r(0,7);0;01777777777777777777777;",128,0,0,0
21 .stabs "short int:t(0,8)=r(0,8);-32768;32767;",128,0,0,0
22 .stabs "short unsigned int:t(0,9)=r(0,9);0;0177777;",128,0,0,0
23 .stabs "signed char:t(0,10)=@s8;r(0,10);-128;127;",128,0,0,0
24 .stabs "unsigned char:t(0,11)=@s8;r(0,11);0;255;",128,0,0,0
25 .stabs "float:t(0,12)=r(0,1);4;0;",128,0,0,0
26 .stabs "double:t(0,13)=r(0,1);4;0;",128,0,0,0
27 .stabs "long double:t(0,14)=r(0,1);4;0;",128,0,0,0
28 .stabs "void:t(0,15)=(0,15)",128,0,0,0
29 .stabs "/usr/lib/gcc/avr/4.2.1/../../../../avr/include/avr/io.h",130,0,0,0
30 .stabs "/usr/lib/gcc/avr/4.2.1/../../../../avr/include/avr/sfr_defs.h",130,0,0,0
31 .stabs "/usr/lib/gcc/avr/4.2.1/../../../../avr/include/inttypes.h",130,0,0,0
32 .stabs "/usr/lib/gcc/avr/4.2.1/../../../../avr/include/stdint.h",130,0,0,0
33 .stabs "int8_t:t(4,1)=(0,10)",128,0,116,0
34 .stabs "uint8_t:t(4,2)=(0,11)",128,0,117,0
35 .stabs "int16_t:t(4,3)=(0,1)",128,0,118,0
36 .stabs "uint16_t:t(4,4)=(0,4)",128,0,119,0
37 .stabs "int32_t:t(4,5)=(0,3)",128,0,120,0
38 .stabs "uint32_t:t(4,6)=(0,5)",128,0,121,0
39 .stabs "int64_t:t(4,7)=(0,6)",128,0,122,0
40 .stabs "uint64_t:t(4,8)=(0,7)",128,0,123,0
41 .stabs "intptr_t:t(4,9)=(4,3)",128,0,135,0
42 .stabs "uintptr_t:t(4,10)=(4,4)",128,0,140,0
43 .stabs "int_least8_t:t(4,11)=(4,1)",128,0,152,0
44 .stabs "uint_least8_t:t(4,12)=(4,2)",128,0,157,0
45 .stabs "int_least16_t:t(4,13)=(4,3)",128,0,162,0
46 .stabs "uint_least16_t:t(4,14)=(4,4)",128,0,167,0
47 .stabs "int_least32_t:t(4,15)=(4,5)",128,0,172,0
48 .stabs "uint_least32_t:t(4,16)=(4,6)",128,0,177,0
49 .stabs "int_least64_t:t(4,17)=(4,7)",128,0,182,0
50 .stabs "uint_least64_t:t(4,18)=(4,8)",128,0,187,0
51 .stabs "int_fast8_t:t(4,19)=(4,1)",128,0,200,0
52 .stabs "uint_fast8_t:t(4,20)=(4,2)",128,0,205,0
53 .stabs "int_fast16_t:t(4,21)=(4,3)",128,0,210,0
54 .stabs "uint_fast16_t:t(4,22)=(4,4)",128,0,215,0
55 .stabs "int_fast32_t:t(4,23)=(4,5)",128,0,220,0
56 .stabs "uint_fast32_t:t(4,24)=(4,6)",128,0,225,0
57 .stabs "int_fast64_t:t(4,25)=(4,7)",128,0,230,0
GAS LISTING /tmp/ccfEG7oP.s page 2
58 .stabs "uint_fast64_t:t(4,26)=(4,8)",128,0,235,0
59 .stabs "intmax_t:t(4,27)=(4,7)",128,0,249,0
60 .stabs "uintmax_t:t(4,28)=(4,8)",128,0,254,0
61 .stabn 162,0,0,0
62 .stabs "int_farptr_t:t(3,1)=(4,5)",128,0,76,0
63 .stabs "uint_farptr_t:t(3,2)=(4,6)",128,0,80,0
64 .stabn 162,0,0,0
65 .stabn 162,0,0,0
66 .stabn 162,0,0,0
67 .stabs "CamConfig.h",130,0,0,0
68 .stabs "I2CInterface.h",130,0,0,0
69 .stabs "CommonDefs.h",130,0,0,0
70 .stabs "bool_t:t(7,1)=(0,11)",128,0,56,0
71 .stabn 162,0,0,0
72 .stabs "i2cCmd_t:t(6,1)=(6,2)=s2configReg:(0,11),0,8;data:(0,11),8,8;;",128,0,53,0
73 .stabn 162,0,0,0
74 .stabn 162,0,0,0
75 .stabs "I2CInt_init:F(0,15)",36,0,85,I2CInt_init
76 .global I2CInt_init
77 .type I2CInt_init, @function
78 I2CInt_init:
79 .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
35:I2CInterface.c **** needed registers in the OV6620 camera. This interface
GAS LISTING /tmp/ccfEG7oP.s page 3
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 **** {
80 .stabn 68,0,85,.LM0-.LFBB1
81 .LM0:
82 .LFBB1:
83 /* prologue: frame size=0 */
84 /* prologue end (size=0) */
86:I2CInterface.c **** TWSR = 0;
85 .stabn 68,0,86,.LM1-.LFBB1
GAS LISTING /tmp/ccfEG7oP.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-.LFBB1
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 .Lscope1:
98 .stabs "",36,0,0,.Lscope1-.LFBB1
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-.LFBB2
109 .LM3:
110 .LFBB2:
111 /* prologue: frame size=0 */
112 /* prologue end (size=0) */
113 0008 982F mov r25,r24
114 .L5:
109:I2CInterface.c **** while(status & (1<<BUSY)); /* Bus is busy wait (or exit with error code) */
115 .stabn 68,0,109,.LM4-.LFBB2
116 .LM4:
117 000a 8091 0000 lds r24,status
118 000e 8823 tst r24
119 0010 04F0 brlt .L5
GAS LISTING /tmp/ccfEG7oP.s page 5
120 .L9:
110:I2CInterface.c **** while(TWCR & (1<<TWSTO));
121 .stabn 68,0,110,.LM5-.LFBB2
122 .LM5:
123 0012 06B6 in __tmp_reg__,86-0x20
124 0014 04FC sbrc __tmp_reg__,4
125 0016 00C0 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;
126 .stabn 68,0,113,.LM6-.LFBB2
127 .LM6:
128 0018 9093 0000 sts twi_address,r25
114:I2CInterface.c **** twi_data = data;
129 .stabn 68,0,114,.LM7-.LFBB2
130 .LM7:
131 001c 7093 0000 sts (twi_data)+1,r23
132 0020 6093 0000 sts twi_data,r22
115:I2CInterface.c **** twi_bytes = bytes;
133 .stabn 68,0,115,.LM8-.LFBB2
134 .LM8:
135 0024 4093 0000 sts twi_bytes,r20
116:I2CInterface.c **** twi_ddr = TW_WRITE;
136 .stabn 68,0,116,.LM9-.LFBB2
137 .LM9:
138 0028 1092 0000 sts twi_ddr,__zero_reg__
117:I2CInterface.c ****
118:I2CInterface.c **** retry_cnt = 0;
139 .stabn 68,0,118,.LM10-.LFBB2
140 .LM10:
141 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);
142 .stabn 68,0,122,.LM11-.LFBB2
143 .LM11:
144 0030 85EA ldi r24,lo8(-91)
145 0032 86BF out 86-0x20,r24
123:I2CInterface.c ****
124:I2CInterface.c **** status |= (1<<BUSY);
146 .stabn 68,0,124,.LM12-.LFBB2
147 .LM12:
148 0034 8091 0000 lds r24,status
149 0038 8068 ori r24,lo8(-128)
150 003a 8093 0000 sts status,r24
151 /* epilogue: frame size=0 */
152 003e 0895 ret
153 /* epilogue end (size=1) */
154 /* function I2CInt_writeData size 28 (27) */
155 .size I2CInt_writeData, .-I2CInt_writeData
156 .Lscope2:
157 .stabs "",36,0,0,.Lscope2-.LFBB2
158 .stabd 78,0,0
159 .stabs "I2CInt_readData:F(0,15)",36,0,138,I2CInt_readData
160 .stabs "address:P(0,11)",64,0,137,25
161 .stabs "data:P(0,16)",64,0,137,22
GAS LISTING /tmp/ccfEG7oP.s page 6
162 .stabs "bytes:P(0,11)",64,0,137,20
163 .global I2CInt_readData
164 .type I2CInt_readData, @function
165 I2CInt_readData:
166 .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 **** {
167 .stabn 68,0,138,.LM13-.LFBB3
168 .LM13:
169 .LFBB3:
170 /* prologue: frame size=0 */
171 /* prologue end (size=0) */
172 0040 982F mov r25,r24
173 .L15:
139:I2CInterface.c **** /* Bus is busy wait (or exit with error code) */
140:I2CInterface.c **** while(status & (1<<BUSY));
174 .stabn 68,0,140,.LM14-.LFBB3
175 .LM14:
176 0042 8091 0000 lds r24,status
177 0046 8823 tst r24
178 0048 04F0 brlt .L15
141:I2CInterface.c ****
142:I2CInterface.c **** twi_address = address;
179 .stabn 68,0,142,.LM15-.LFBB3
180 .LM15:
181 004a 9093 0000 sts twi_address,r25
143:I2CInterface.c **** twi_data = data;
182 .stabn 68,0,143,.LM16-.LFBB3
183 .LM16:
184 004e 7093 0000 sts (twi_data)+1,r23
185 0052 6093 0000 sts twi_data,r22
144:I2CInterface.c **** twi_bytes = bytes;
186 .stabn 68,0,144,.LM17-.LFBB3
187 .LM17:
188 0056 4093 0000 sts twi_bytes,r20
145:I2CInterface.c **** twi_ddr = TW_READ;
189 .stabn 68,0,145,.LM18-.LFBB3
190 .LM18:
191 005a 81E0 ldi r24,lo8(1)
192 005c 8093 0000 sts twi_ddr,r24
146:I2CInterface.c ****
147:I2CInterface.c **** retry_cnt = 0;
193 .stabn 68,0,147,.LM19-.LFBB3
194 .LM19:
195 0060 1092 0000 sts retry_cnt,__zero_reg__
GAS LISTING /tmp/ccfEG7oP.s page 7
148:I2CInterface.c ****
149:I2CInterface.c **** /* Generate start condition, the remainder of the transfer is interrupt driven and
150:I2CInterface.c **** will be performed in the background */
151:I2CInterface.c **** TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN)|(1<<TWIE);
196 .stabn 68,0,151,.LM20-.LFBB3
197 .LM20:
198 0064 85EA ldi r24,lo8(-91)
199 0066 86BF out 86-0x20,r24
152:I2CInterface.c ****
153:I2CInterface.c **** status |= (1<<BUSY);
200 .stabn 68,0,153,.LM21-.LFBB3
201 .LM21:
202 0068 8091 0000 lds r24,status
203 006c 8068 ori r24,lo8(-128)
204 006e 8093 0000 sts status,r24
205 /* epilogue: frame size=0 */
206 0072 0895 ret
207 /* epilogue end (size=1) */
208 /* function I2CInt_readData size 26 (25) */
209 .size I2CInt_readData, .-I2CInt_readData
210 .Lscope3:
211 .stabs "",36,0,0,.Lscope3-.LFBB3
212 .stabd 78,0,0
213 .stabs "I2CInt_isI2cBusy:F(7,1)",36,0,166,I2CInt_isI2cBusy
214 .global I2CInt_isI2cBusy
215 .type I2CInt_isI2cBusy, @function
216 I2CInt_isI2cBusy:
217 .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 **** {
218 .stabn 68,0,166,.LM22-.LFBB4
219 .LM22:
220 .LFBB4:
221 /* prologue: frame size=0 */
222 /* prologue end (size=0) */
167:I2CInterface.c **** bool_t retVal = FALSE;
168:I2CInterface.c **** if ( (status & (1<<BUSY)) != 0)
223 .stabn 68,0,168,.LM23-.LFBB4
224 .LM23:
225 0074 8091 0000 lds r24,status
226 0078 881F rol r24
227 007a 8827 clr r24
228 007c 881F rol r24
169:I2CInterface.c **** {
170:I2CInterface.c **** retVal = TRUE;
171:I2CInterface.c **** }
GAS LISTING /tmp/ccfEG7oP.s page 8
172:I2CInterface.c ****
173:I2CInterface.c **** return(retVal);
174:I2CInterface.c **** }
229 .stabn 68,0,174,.LM24-.LFBB4
230 .LM24:
231 007e 9927 clr r25
232 /* epilogue: frame size=0 */
233 0080 0895 ret
234 /* epilogue end (size=1) */
235 /* function I2CInt_isI2cBusy size 7 (6) */
236 .size I2CInt_isI2cBusy, .-I2CInt_isI2cBusy
237 .Lscope4:
238 .stabs "",36,0,0,.Lscope4-.LFBB4
239 .stabd 78,0,0
240 .stabs "__vector_17:F(0,15)",36,0,185,__vector_17
241 .global __vector_17
242 .type __vector_17, @function
243 __vector_17:
244 .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 **** {
245 .stabn 68,0,185,.LM25-.LFBB5
246 .LM25:
247 .LFBB5:
248 /* prologue: frame size=0 */
249 0082 1F92 push __zero_reg__
250 0084 0F92 push __tmp_reg__
251 0086 0FB6 in __tmp_reg__,__SREG__
252 0088 0F92 push __tmp_reg__
253 008a 1124 clr __zero_reg__
254 008c 8F93 push r24
255 008e 9F93 push r25
256 0090 AF93 push r26
257 0092 BF93 push r27
258 0094 EF93 push r30
259 0096 FF93 push r31
260 /* prologue end (size=11) */
186:I2CInterface.c **** unsigned char TWI_status = TWSR & TW_STATUS_MASK; /* grab just the status bits */
261 .stabn 68,0,186,.LM26-.LFBB5
262 .LM26:
263 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)
264 .stabn 68,0,190,.LM27-.LFBB5
265 .LM27:
266 009a 9927 clr r25
GAS LISTING /tmp/ccfEG7oP.s page 9
267 009c AA27 clr r26
268 009e BB27 clr r27
269 00a0 887F andi r24,lo8(248)
270 00a2 9070 andi r25,hi8(248)
271 00a4 A070 andi r26,hlo8(248)
272 00a6 B070 andi r27,hhi8(248)
273 00a8 FC01 movw r30,r24
274 00aa 3897 sbiw r30,8
275 00ac E135 cpi r30,81
276 00ae F105 cpc r31,__zero_reg__
277 00b0 00F0 brlo .+2
278 00b2 00C0 rjmp .L42
279 .stabn 68,0,190,.LM28-.LFBB5
280 .LM28:
281 00b4 E050 subi r30,lo8(-(pm(.L33)))
282 00b6 F040 sbci r31,hi8(-(pm(.L33)))
283 00b8 0994 ijmp
284 .data
285 .section .progmem.gcc_sw_table, "ax", @progbits
286 .p2align 1
287 .L33:
288 .data
289 .section .progmem.gcc_sw_table, "ax", @progbits
290 .p2align 1
291 0000 00C0 rjmp .L25
292 0002 00C0 rjmp .L42
293 0004 00C0 rjmp .L42
294 0006 00C0 rjmp .L42
295 0008 00C0 rjmp .L42
296 000a 00C0 rjmp .L42
297 000c 00C0 rjmp .L42
298 000e 00C0 rjmp .L42
299 0010 00C0 rjmp .L25
300 0012 00C0 rjmp .L42
301 0014 00C0 rjmp .L42
302 0016 00C0 rjmp .L42
303 0018 00C0 rjmp .L42
304 001a 00C0 rjmp .L42
305 001c 00C0 rjmp .L42
306 001e 00C0 rjmp .L42
307 0020 00C0 rjmp .L26
308 0022 00C0 rjmp .L42
309 0024 00C0 rjmp .L42
310 0026 00C0 rjmp .L42
311 0028 00C0 rjmp .L42
312 002a 00C0 rjmp .L42
313 002c 00C0 rjmp .L42
314 002e 00C0 rjmp .L42
315 0030 00C0 rjmp .L27
316 0032 00C0 rjmp .L42
317 0034 00C0 rjmp .L42
318 0036 00C0 rjmp .L42
319 0038 00C0 rjmp .L42
320 003a 00C0 rjmp .L42
321 003c 00C0 rjmp .L42
322 003e 00C0 rjmp .L42
323 0040 00C0 rjmp .L28
GAS LISTING /tmp/ccfEG7oP.s page 10
324 0042 00C0 rjmp .L42
325 0044 00C0 rjmp .L42
326 0046 00C0 rjmp .L42
327 0048 00C0 rjmp .L42
328 004a 00C0 rjmp .L42
329 004c 00C0 rjmp .L42
330 004e 00C0 rjmp .L42
331 0050 00C0 rjmp .L29
332 0052 00C0 rjmp .L42
333 0054 00C0 rjmp .L42
334 0056 00C0 rjmp .L42
335 0058 00C0 rjmp .L42
336 005a 00C0 rjmp .L42
337 005c 00C0 rjmp .L42
338 005e 00C0 rjmp .L42
339 0060 00C0 rjmp .L42
340 0062 00C0 rjmp .L42
341 0064 00C0 rjmp .L42
342 0066 00C0 rjmp .L42
343 0068 00C0 rjmp .L42
344 006a 00C0 rjmp .L42
345 006c 00C0 rjmp .L42
346 006e 00C0 rjmp .L42
347 0070 00C0 rjmp .L30
348 0072 00C0 rjmp .L42
349 0074 00C0 rjmp .L42
350 0076 00C0 rjmp .L42
351 0078 00C0 rjmp .L42
352 007a 00C0 rjmp .L42
353 007c 00C0 rjmp .L42
354 007e 00C0 rjmp .L42
355 0080 00C0 rjmp .L27
356 0082 00C0 rjmp .L42
357 0084 00C0 rjmp .L42
358 0086 00C0 rjmp .L42
359 0088 00C0 rjmp .L42
360 008a 00C0 rjmp .L42
361 008c 00C0 rjmp .L42
362 008e 00C0 rjmp .L42
363 0090 00C0 rjmp .L31
364 0092 00C0 rjmp .L42
365 0094 00C0 rjmp .L42
366 0096 00C0 rjmp .L42
367 0098 00C0 rjmp .L42
368 009a 00C0 rjmp .L42
369 009c 00C0 rjmp .L42
370 009e 00C0 rjmp .L42
371 00a0 00C0 rjmp .L32
372 .text
373 .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)
374 .stabn 68,0,194,.LM29-.LFBB5
375 .LM29:
376 00ba 8091 0000 lds r24,retry_cnt
GAS LISTING /tmp/ccfEG7oP.s page 11
377 00be 8330 cpi r24,lo8(3)
378 00c0 00F0 brlo .L34
195:I2CInterface.c **** {
196:I2CInterface.c **** /* generate stop condition if we've reached our retry limit */
197:I2CInterface.c **** TWCR |= (1<<TWINT)|(1<<TWSTO);
379 .stabn 68,0,197,.LM30-.LFBB5
380 .LM30:
381 00c2 86B7 in r24,86-0x20
382 00c4 8069 ori r24,lo8(-112)
383 00c6 86BF out 86-0x20,r24
198:I2CInterface.c **** status &= ~(1<<BUSY);
384 .stabn 68,0,198,.LM31-.LFBB5
385 .LM31:
386 00c8 8091 0000 lds r24,status
387 00cc 8F77 andi r24,lo8(127)
388 00ce 8093 0000 sts status,r24
389 00d2 00C0 rjmp .L42
390 .L34:
199:I2CInterface.c **** return;
200:I2CInterface.c **** }
201:I2CInterface.c **** /* indicate read or write */
202:I2CInterface.c **** TWDR = (twi_address<<1) + twi_ddr;
391 .stabn 68,0,202,.LM32-.LFBB5
392 .LM32:
393 00d4 8091 0000 lds r24,twi_address
394 00d8 9091 0000 lds r25,twi_ddr
395 00dc 880F lsl r24
396 00de 890F add r24,r25
397 00e0 83B9 out 35-0x20,r24
203:I2CInterface.c **** /* TWSTA must be cleared...also clears TWINT */
204:I2CInterface.c **** TWCR &= ~(1<<TWSTA);
398 .stabn 68,0,204,.LM33-.LFBB5
399 .LM33:
400 00e2 86B7 in r24,86-0x20
401 00e4 8F7D andi r24,lo8(-33)
402 00e6 86BF out 86-0x20,r24
403 00e8 00C0 rjmp .L42
404 .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;
405 .stabn 68,0,208,.LM34-.LFBB5
406 .LM34:
407 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;
408 .stabn 68,0,210,.LM35-.LFBB5
409 .LM35:
410 00ee E091 0000 lds r30,twi_data
411 00f2 F091 0000 lds r31,(twi_data)+1
412 00f6 8191 ld r24,Z+
413 00f8 83B9 out 35-0x20,r24
211:I2CInterface.c **** twi_data++;
414 .stabn 68,0,211,.LM36-.LFBB5
415 .LM36:
416 00fa F093 0000 sts (twi_data)+1,r31
GAS LISTING /tmp/ccfEG7oP.s page 12
417 00fe E093 0000 sts twi_data,r30
212:I2CInterface.c ****
213:I2CInterface.c **** /* clear the int to continue */
214:I2CInterface.c **** TWCR |= (1<<TWINT);
418 .stabn 68,0,214,.LM37-.LFBB5
419 .LM37:
420 0102 86B7 in r24,86-0x20
421 0104 8068 ori r24,lo8(-128)
422 0106 86BF out 86-0x20,r24
423 0108 00C0 rjmp .L42
424 .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++;
425 .stabn 68,0,219,.LM38-.LFBB5
426 .LM38:
427 010a 8091 0000 lds r24,retry_cnt
428 010e 8F5F subi r24,lo8(-(1))
429 0110 8093 0000 sts retry_cnt,r24
220:I2CInterface.c ****
221:I2CInterface.c **** /* retry...*/
222:I2CInterface.c **** TWCR |= (1<<TWINT)|(1<<TWSTA)|(1<<TWSTO);
430 .stabn 68,0,222,.LM39-.LFBB5
431 .LM39:
432 0114 86B7 in r24,86-0x20
433 0116 806B ori r24,lo8(-80)
434 0118 86BF out 86-0x20,r24
435 011a 00C0 rjmp .L42
436 .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)
437 .stabn 68,0,226,.LM40-.LFBB5
438 .LM40:
439 011c 8091 0000 lds r24,twi_bytes
440 0120 8150 subi r24,lo8(-(-1))
441 0122 8093 0000 sts twi_bytes,r24
442 0126 8091 0000 lds r24,twi_bytes
443 012a 8823 tst r24
444 012c 01F0 breq .L36
227:I2CInterface.c **** {
228:I2CInterface.c **** /* more data to send, so send it */
229:I2CInterface.c **** TWDR = *twi_data;
445 .stabn 68,0,229,.LM41-.LFBB5
446 .LM41:
447 012e E091 0000 lds r30,twi_data
448 0132 F091 0000 lds r31,(twi_data)+1
449 0136 8191 ld r24,Z+
450 0138 83B9 out 35-0x20,r24
230:I2CInterface.c **** twi_data++;
451 .stabn 68,0,230,.LM42-.LFBB5
452 .LM42:
453 013a F093 0000 sts (twi_data)+1,r31
454 013e E093 0000 sts twi_data,r30
GAS LISTING /tmp/ccfEG7oP.s page 13
231:I2CInterface.c **** TWCR |= (1<<TWINT);
455 .stabn 68,0,231,.LM43-.LFBB5
456 .LM43:
457 0142 86B7 in r24,86-0x20
458 0144 8068 ori r24,lo8(-128)
459 0146 86BF out 86-0x20,r24
460 0148 00C0 rjmp .L42
461 .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);
462 .stabn 68,0,236,.LM44-.LFBB5
463 .LM44:
464 014a 86B7 in r24,86-0x20
465 014c 8069 ori r24,lo8(-112)
466 014e 86BF out 86-0x20,r24
237:I2CInterface.c **** status &= ~(1<<BUSY);
467 .stabn 68,0,237,.LM45-.LFBB5
468 .LM45:
469 0150 8091 0000 lds r24,status
470 0154 8F77 andi r24,lo8(127)
471 0156 8093 0000 sts status,r24
472 015a 00C0 rjmp .L42
473 .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);
474 .stabn 68,0,243,.LM46-.LFBB5
475 .LM46:
476 015c 86B7 in r24,86-0x20
477 015e 8069 ori r24,lo8(-112)
478 0160 86BF out 86-0x20,r24
244:I2CInterface.c **** status &= ~(1<<BUSY);
479 .stabn 68,0,244,.LM47-.LFBB5
480 .LM47:
481 0162 8091 0000 lds r24,status
482 0166 8F77 andi r24,lo8(127)
483 0168 8093 0000 sts status,r24
484 016c 00C0 rjmp .L42
485 .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)
486 .stabn 68,0,248,.LM48-.LFBB5
487 .LM48:
488 016e 8091 0000 lds r24,twi_bytes
489 0172 8150 subi r24,lo8(-(-1))
490 0174 8093 0000 sts twi_bytes,r24
491 0178 8091 0000 lds r24,twi_bytes
492 017c 8823 tst r24
493 017e 01F0 breq .L38
GAS LISTING /tmp/ccfEG7oP.s page 14
249:I2CInterface.c **** {
250:I2CInterface.c **** /* if there is more than one byte to read, acknowledge */
251:I2CInterface.c **** TWCR |= (1<<TWEA)|(1<<TWINT);
494 .stabn 68,0,251,.LM49-.LFBB5
495 .LM49:
496 0180 86B7 in r24,86-0x20
497 0182 806C ori r24,lo8(-64)
498 0184 86BF out 86-0x20,r24
499 0186 00C0 rjmp .L42
500 .L38:
252:I2CInterface.c **** }
253:I2CInterface.c **** else
254:I2CInterface.c **** {
255:I2CInterface.c **** /* no acknowledge */
256:I2CInterface.c **** TWCR |= (1<<TWINT);
501 .stabn 68,0,256,.LM50-.LFBB5
502 .LM50:
503 0188 86B7 in r24,86-0x20
504 018a 8068 ori r24,lo8(-128)
505 018c 86BF out 86-0x20,r24
506 018e 00C0 rjmp .L42
507 .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;
508 .stabn 68,0,263,.LM51-.LFBB5
509 .LM51:
510 0190 E091 0000 lds r30,twi_data
511 0194 F091 0000 lds r31,(twi_data)+1
512 0198 83B1 in r24,35-0x20
513 019a 8193 st Z+,r24
264:I2CInterface.c **** twi_data++;
514 .stabn 68,0,264,.LM52-.LFBB5
515 .LM52:
516 019c F093 0000 sts (twi_data)+1,r31
517 01a0 E093 0000 sts twi_data,r30
265:I2CInterface.c **** if(--twi_bytes > 0)
518 .stabn 68,0,265,.LM53-.LFBB5
519 .LM53:
520 01a4 8091 0000 lds r24,twi_bytes
521 01a8 8150 subi r24,lo8(-(-1))
522 01aa 8093 0000 sts twi_bytes,r24
523 01ae 8091 0000 lds r24,twi_bytes
524 01b2 8823 tst r24
525 01b4 01F0 breq .L40
266:I2CInterface.c **** {
267:I2CInterface.c **** /* get the next data byte and ack */
268:I2CInterface.c **** TWCR |= (1<<TWEA)|(1<<TWINT);
526 .stabn 68,0,268,.LM54-.LFBB5
527 .LM54:
528 01b6 86B7 in r24,86-0x20
529 01b8 806C ori r24,lo8(-64)
530 01ba 86BF out 86-0x20,r24
GAS LISTING /tmp/ccfEG7oP.s page 15
531 01bc 00C0 rjmp .L42
532 .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);
533 .stabn 68,0,273,.LM55-.LFBB5
534 .LM55:
535 01be 86B7 in r24,86-0x20
536 01c0 8F7B andi r24,lo8(-65)
537 01c2 86BF out 86-0x20,r24
538 01c4 00C0 rjmp .L42
539 .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;
540 .stabn 68,0,279,.LM56-.LFBB5
541 .LM56:
542 01c6 E091 0000 lds r30,twi_data
543 01ca F091 0000 lds r31,(twi_data)+1
544 01ce 83B1 in r24,35-0x20
545 01d0 8083 st Z,r24
280:I2CInterface.c **** TWCR |= (1<<TWSTO)|(1<<TWINT);
546 .stabn 68,0,280,.LM57-.LFBB5
547 .LM57:
548 01d2 86B7 in r24,86-0x20
549 01d4 8069 ori r24,lo8(-112)
550 01d6 86BF out 86-0x20,r24
281:I2CInterface.c **** status &= ~(1<<BUSY);
551 .stabn 68,0,281,.LM58-.LFBB5
552 .LM58:
553 01d8 8091 0000 lds r24,status
554 01dc 8F77 andi r24,lo8(127)
555 01de 8093 0000 sts status,r24
556 .L42:
557 /* epilogue: frame size=0 */
558 01e2 FF91 pop r31
559 01e4 EF91 pop r30
560 01e6 BF91 pop r27
561 01e8 AF91 pop r26
562 01ea 9F91 pop r25
563 01ec 8F91 pop r24
564 01ee 0F90 pop __tmp_reg__
565 01f0 0FBE out __SREG__,__tmp_reg__
566 01f2 0F90 pop __tmp_reg__
567 01f4 1F90 pop __zero_reg__
568 01f6 1895 reti
569 /* epilogue end (size=11) */
570 /* function __vector_17 size 268 (246) */
571 .size __vector_17, .-__vector_17
572 .Lscope5:
573 .stabs "",36,0,0,.Lscope5-.LFBB5
574 .stabd 78,0,0
GAS LISTING /tmp/ccfEG7oP.s page 16
575 .lcomm twi_address,1
576 .lcomm twi_data,2
577 .lcomm twi_ddr,1
578 .lcomm twi_bytes,1
579 .lcomm status,1
580 .lcomm retry_cnt,1
581 .stabs "twi_address:S(0,17)=B(0,11)",40,0,59,twi_address
582 .stabs "twi_data:S(0,18)=*(0,17)",40,0,60,twi_data
583 .stabs "twi_ddr:S(0,17)",40,0,61,twi_ddr
584 .stabs "twi_bytes:S(0,17)",40,0,62,twi_bytes
585 .stabs "status:S(0,17)",40,0,63,status
586 .stabs "retry_cnt:S(0,17)",40,0,64,retry_cnt
587 .stabs "",100,0,0,.Letext0
588 .Letext0:
589 /* File "I2CInterface.c": code 333 = 0x014d ( 307), prologues 11, epilogues 15 */
GAS LISTING /tmp/ccfEG7oP.s page 17
DEFINED SYMBOLS
*ABS*:00000000 I2CInterface.c
/tmp/ccfEG7oP.s:2 *ABS*:0000003f __SREG__
/tmp/ccfEG7oP.s:3 *ABS*:0000003e __SP_H__
/tmp/ccfEG7oP.s:4 *ABS*:0000003d __SP_L__
/tmp/ccfEG7oP.s:5 *ABS*:00000000 __tmp_reg__
/tmp/ccfEG7oP.s:6 *ABS*:00000001 __zero_reg__
/tmp/ccfEG7oP.s:78 .text:00000000 I2CInt_init
/tmp/ccfEG7oP.s:106 .text:00000008 I2CInt_writeData
/tmp/ccfEG7oP.s:578 .bss:00000005 status
.bss:00000000 twi_address
/tmp/ccfEG7oP.s:575 .bss:00000001 twi_data
/tmp/ccfEG7oP.s:577 .bss:00000004 twi_bytes
/tmp/ccfEG7oP.s:576 .bss:00000003 twi_ddr
/tmp/ccfEG7oP.s:579 .bss:00000006 retry_cnt
/tmp/ccfEG7oP.s:165 .text:00000040 I2CInt_readData
/tmp/ccfEG7oP.s:216 .text:00000074 I2CInt_isI2cBusy
/tmp/ccfEG7oP.s:243 .text:00000082 __vector_17
UNDEFINED SYMBOLS
__do_copy_data
__do_clear_bss