📄 main.lss
字号:
main.elf: file format elf32-avr
Sections:
Idx Name Size VMA LMA File off Algn
0 .data 00000076 00800100 00000e42 00000ed6 2**0
CONTENTS, ALLOC, LOAD, DATA
1 .text 00000e42 00000000 00000000 00000094 2**1
CONTENTS, ALLOC, LOAD, READONLY, CODE
2 .bss 0000004b 00800176 00800176 00000f4c 2**0
ALLOC
3 .stab 00000408 00000000 00000000 00000f4c 2**2
CONTENTS, READONLY, DEBUGGING
4 .stabstr 00000084 00000000 00000000 00001354 2**0
CONTENTS, READONLY, DEBUGGING
5 .debug_aranges 00000020 00000000 00000000 000013d8 2**0
CONTENTS, READONLY, DEBUGGING
6 .debug_pubnames 000001f6 00000000 00000000 000013f8 2**0
CONTENTS, READONLY, DEBUGGING
7 .debug_info 00000c75 00000000 00000000 000015ee 2**0
CONTENTS, READONLY, DEBUGGING
8 .debug_abbrev 000002c5 00000000 00000000 00002263 2**0
CONTENTS, READONLY, DEBUGGING
9 .debug_line 000007d7 00000000 00000000 00002528 2**0
CONTENTS, READONLY, DEBUGGING
10 .debug_frame 00000180 00000000 00000000 00002cff 2**0
CONTENTS, READONLY, DEBUGGING
11 .debug_str 000002cc 00000000 00000000 00002e7f 2**0
CONTENTS, READONLY, DEBUGGING
12 .debug_loc 000004d0 00000000 00000000 0000314b 2**0
CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:
00000000 <__vectors>:
0: 0c 94 46 00 jmp 0x8c ; 0x8c <__ctors_end>
4: 0c 94 63 00 jmp 0xc6 ; 0xc6 <__bad_interrupt>
8: 0c 94 63 00 jmp 0xc6 ; 0xc6 <__bad_interrupt>
c: 0c 94 63 00 jmp 0xc6 ; 0xc6 <__bad_interrupt>
10: 0c 94 63 00 jmp 0xc6 ; 0xc6 <__bad_interrupt>
14: 0c 94 63 00 jmp 0xc6 ; 0xc6 <__bad_interrupt>
18: 0c 94 63 00 jmp 0xc6 ; 0xc6 <__bad_interrupt>
1c: 0c 94 63 00 jmp 0xc6 ; 0xc6 <__bad_interrupt>
20: 0c 94 63 00 jmp 0xc6 ; 0xc6 <__bad_interrupt>
24: 0c 94 63 00 jmp 0xc6 ; 0xc6 <__bad_interrupt>
28: 0c 94 63 00 jmp 0xc6 ; 0xc6 <__bad_interrupt>
2c: 0c 94 63 00 jmp 0xc6 ; 0xc6 <__bad_interrupt>
30: 0c 94 63 00 jmp 0xc6 ; 0xc6 <__bad_interrupt>
34: 0c 94 63 00 jmp 0xc6 ; 0xc6 <__bad_interrupt>
38: 0c 94 63 00 jmp 0xc6 ; 0xc6 <__bad_interrupt>
3c: 0c 94 63 00 jmp 0xc6 ; 0xc6 <__bad_interrupt>
40: 0c 94 63 00 jmp 0xc6 ; 0xc6 <__bad_interrupt>
44: 0c 94 63 00 jmp 0xc6 ; 0xc6 <__bad_interrupt>
48: 0c 94 63 00 jmp 0xc6 ; 0xc6 <__bad_interrupt>
4c: 0c 94 63 00 jmp 0xc6 ; 0xc6 <__bad_interrupt>
50: 0c 94 63 00 jmp 0xc6 ; 0xc6 <__bad_interrupt>
54: 0c 94 63 00 jmp 0xc6 ; 0xc6 <__bad_interrupt>
58: 0c 94 63 00 jmp 0xc6 ; 0xc6 <__bad_interrupt>
5c: 0c 94 63 00 jmp 0xc6 ; 0xc6 <__bad_interrupt>
60: 0c 94 63 00 jmp 0xc6 ; 0xc6 <__bad_interrupt>
64: 0c 94 63 00 jmp 0xc6 ; 0xc6 <__bad_interrupt>
68: 0c 94 63 00 jmp 0xc6 ; 0xc6 <__bad_interrupt>
6c: 0c 94 63 00 jmp 0xc6 ; 0xc6 <__bad_interrupt>
70: 0c 94 63 00 jmp 0xc6 ; 0xc6 <__bad_interrupt>
74: 0c 94 63 00 jmp 0xc6 ; 0xc6 <__bad_interrupt>
78: 0c 94 63 00 jmp 0xc6 ; 0xc6 <__bad_interrupt>
7c: 0c 94 63 00 jmp 0xc6 ; 0xc6 <__bad_interrupt>
80: 0c 94 63 00 jmp 0xc6 ; 0xc6 <__bad_interrupt>
84: 0c 94 63 00 jmp 0xc6 ; 0xc6 <__bad_interrupt>
88: 0c 94 63 00 jmp 0xc6 ; 0xc6 <__bad_interrupt>
0000008c <__ctors_end>:
8c: 11 24 eor r1, r1
8e: 1f be out 0x3f, r1 ; 63
90: cf ef ldi r28, 0xFF ; 255
92: d0 e1 ldi r29, 0x10 ; 16
94: de bf out 0x3e, r29 ; 62
96: cd bf out 0x3d, r28 ; 61
00000098 <__do_copy_data>:
98: 11 e0 ldi r17, 0x01 ; 1
9a: a0 e0 ldi r26, 0x00 ; 0
9c: b1 e0 ldi r27, 0x01 ; 1
9e: e2 e4 ldi r30, 0x42 ; 66
a0: fe e0 ldi r31, 0x0E ; 14
a2: 00 e0 ldi r16, 0x00 ; 0
a4: 0b bf out 0x3b, r16 ; 59
a6: 02 c0 rjmp .+4 ; 0xac <__do_copy_data+0x14>
a8: 07 90 elpm r0, Z+
aa: 0d 92 st X+, r0
ac: a6 37 cpi r26, 0x76 ; 118
ae: b1 07 cpc r27, r17
b0: d9 f7 brne .-10 ; 0xa8 <__do_copy_data+0x10>
000000b2 <__do_clear_bss>:
b2: 11 e0 ldi r17, 0x01 ; 1
b4: a6 e7 ldi r26, 0x76 ; 118
b6: b1 e0 ldi r27, 0x01 ; 1
b8: 01 c0 rjmp .+2 ; 0xbc <.do_clear_bss_start>
000000ba <.do_clear_bss_loop>:
ba: 1d 92 st X+, r1
000000bc <.do_clear_bss_start>:
bc: a1 3c cpi r26, 0xC1 ; 193
be: b1 07 cpc r27, r17
c0: e1 f7 brne .-8 ; 0xba <.do_clear_bss_loop>
c2: 0c 94 27 03 jmp 0x64e ; 0x64e <main>
000000c6 <__bad_interrupt>:
c6: 0c 94 00 00 jmp 0 ; 0x0 <__vectors>
000000ca <xWriteCH375Cmd>:
}
*/
// 基本操作
void xWriteCH375Cmd( unsigned char cmd ) { // 向CH375的命令端口写入命令,周期不小于4uS,如果单片机较快则延时
ca: 93 e0 ldi r25, 0x03 ; 3
cc: 29 2f mov r18, r25
ce: 2a 95 dec r18
d0: f1 f7 brne .-4 ; 0xce <xWriteCH375Cmd+0x4>
delay1us( );
delay1us( ); // 至少延时1uS
*(volatile unsigned char *)CH375_CMD_PORT_ADDR = cmd; //通过并口直接读写CH375而非普通I/O模拟
d2: 29 2f mov r18, r25
d4: 2a 95 dec r18
d6: f1 f7 brne .-4 ; 0xd4 <xWriteCH375Cmd+0xa>
d8: 80 93 21 80 sts 0x8021, r24
*/
void
_delay_loop_1(uint8_t __count)
{
__asm__ volatile (
dc: 89 2f mov r24, r25
de: 8a 95 dec r24
e0: f1 f7 brne .-4 ; 0xde <xWriteCH375Cmd+0x14>
e2: 9a 95 dec r25
e4: f1 f7 brne .-4 ; 0xe2 <xWriteCH375Cmd+0x18>
e6: 08 95 ret
000000e8 <xWriteCH375Data>:
/* PORTB |= 0x08; // 输出A0=1
PORTA = mCmd; // 向CH375的并口输出数据
DDRA = 0xFF; // 并口D0-D7输出
PORTB &= 0xF9; // 输出有效写控制信号, 写CH375芯片的命令端口, A0=1; CS=0; WR=0; RD=1;
DDRA = 0xFF; // 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS
PORTB |= 0x07; // 输出无效的控制信号, 完成操作CH375芯片, A0=1; CS=1; WR=1; RD=1;
DDRA = 0x00; // 禁止数据输出
PORTB &= 0xF7; // 输出A0=0; 可选操作
*/
delay1us( );
delay1us( ); // 至少延时2uS
}
void xWriteCH375Data( unsigned char dat ) { // 向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时
e8: 93 e0 ldi r25, 0x03 ; 3
ea: 29 2f mov r18, r25
ec: 2a 95 dec r18
ee: f1 f7 brne .-4 ; 0xec <xWriteCH375Data+0x4>
delay1us( );
delay1us( ); // 至少延时1uS
*(volatile unsigned char *)CH375_DAT_PORT_ADDR = dat; //通过并口直接读写CH375而非普通I/O模拟
f0: 29 2f mov r18, r25
f2: 2a 95 dec r18
f4: f1 f7 brne .-4 ; 0xf2 <xWriteCH375Data+0xa>
f6: 80 93 20 80 sts 0x8020, r24
*/
void
_delay_loop_1(uint8_t __count)
{
__asm__ volatile (
fa: 89 2f mov r24, r25
fc: 8a 95 dec r24
fe: f1 f7 brne .-4 ; 0xfc <xWriteCH375Data+0x14>
/*
PORTA = mData; // 向CH375的并口输出数据
DDRA = 0xFF; // 并口D0-D7输出
PORTB &= 0xF1; // 输出有效写控制信号, 写CH375芯片的数据端口, A0=0; CS=0; WR=0; RD=1;
DDRA = 0xFF; // 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS
PORTB |= 0x07; // 输出无效的控制信号, 完成操作CH375芯片, A0=0; CS=1; WR=1; RD=1;
DDRA = 0x00; // 禁止数据输出
*/
delay1us( );
delay1us( ); // 至少延时1.2uS
}
unsigned char xReadCH375Data(void) { // 从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时
unsigned char mData;
mData = *(volatile unsigned char *)CH375_DAT_PORT_ADDR; //通过并口直接读写CH375而非普通I/O模拟
100: 9a 95 dec r25
102: f1 f7 brne .-4 ; 0x100 <xWriteCH375Data+0x18>
*/
void
_delay_loop_1(uint8_t __count)
{
__asm__ volatile (
104: 08 95 ret
00000106 <xReadCH375Data>:
106: 80 91 20 80 lds r24, 0x8020
*/
void
_delay_loop_1(uint8_t __count)
{
__asm__ volatile (
10a: 93 e0 ldi r25, 0x03 ; 3
10c: 29 2f mov r18, r25
10e: 2a 95 dec r18
110: f1 f7 brne .-4 ; 0x10e <xReadCH375Data+0x8>
delay1us( );
delay1us( ); // 至少延时1.2uS
delay1us( );
/*
DDRA = 0x00; // 数据输入
PORTB &= 0xF2; // 输出有效读控制信号, 读CH375芯片的数据端口, A0=0; CS=0; WR=1; RD=0;
DDRA = 0x00; // 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS
mData = PINA; // 从CH375的并口PA输入数据
PORTB |= 0x07; // 输出无效的控制信号, 完成操作CH375芯片, A0=0; CS=1; WR=1; RD=1;
*/
return( mData );
}
112: 29 2f mov r18, r25
114: 2a 95 dec r18
116: f1 f7 brne .-4 ; 0x114 <xReadCH375Data+0xe>
118: 9a 95 dec r25
11a: f1 f7 brne .-4 ; 0x118 <xReadCH375Data+0x12>
11c: 99 27 eor r25, r25
11e: 08 95 ret
00000120 <wait_interrupt>:
unsigned char wait_interrupt(void) { // 主机端等待操作完成, 返回操作状态
120: 0f 93 push r16
122: 1f 93 push r17
124: cf 93 push r28
126: df 93 push r29
unsigned short i;
// while( CH375_INT_WIRE ); // 查询等待CH375操作完成中断(INT#低电平)
for ( i = 0; CH375_INT_WIRE != 0; i ++ ) { // 如果CH375的中断引脚输出高电平则等待,通过计数防止超时
128: 80 9b sbis 0x10, 0 ; 16
12a: 13 c0 rjmp .+38 ; 0x152 <wait_interrupt+0x32>
12c: c0 e0 ldi r28, 0x00 ; 0
12e: d0 e0 ldi r29, 0x00 ; 0
130: 0c ec ldi r16, 0xCC ; 204
132: 1a e0 ldi r17, 0x0A ; 10
134: 03 c0 rjmp .+6 ; 0x13c <wait_interrupt+0x1c>
136: 80 9b sbis 0x10, 0 ; 16
138: 0c c0 rjmp .+24 ; 0x152 <wait_interrupt+0x32>
13a: 21 96 adiw r28, 0x01 ; 1
*/
void
_delay_loop_2(uint16_t __count)
{
__asm__ volatile (
13c: c8 01 movw r24, r16
13e: 01 97 sbiw r24, 0x01 ; 1
140: f1 f7 brne .-4 ; 0x13e <wait_interrupt+0x1e>
mDelaymS( 1 );
//if ( i == 0xF000 ) xWriteCH375Cmd( CMD_ABORT_NAK ); // 如果超时达61mS以上则强行终止NAK重试,中断返回USB_INT_RET_NAK
if ( i == 0x40 ) xWriteCH375Cmd( CMD_ABORT_NAK ); // 如果超时达64mS以上则强行终止NAK重试,中断返回USB_INT_RET_NAK
142: c0 34 cpi r28, 0x40 ; 64
144: d1 05 cpc r29, r1
146: b9 f7 brne .-18 ; 0x136 <wait_interrupt+0x16>
148: 87 e1 ldi r24, 0x17 ; 23
14a: 0e 94 65 00 call 0xca ; 0xca <xWriteCH375Cmd>
14e: 80 99 sbic 0x10, 0 ; 16
150: f4 cf rjmp .-24 ; 0x13a <wait_interrupt+0x1a>
}
xWriteCH375Cmd( CMD_GET_STATUS ); // 产生操作完成中断, 获取中断状态
152: 82 e2 ldi r24, 0x22 ; 34
154: 0e 94 65 00 call 0xca ; 0xca <xWriteCH375Cmd>
return( xReadCH375Data() );
158: 0e 94 83 00 call 0x106 ; 0x106 <xReadCH375Data>
}
15c: 99 27 eor r25, r25
15e: df 91 pop r29
160: cf 91 pop r28
162: 1f 91 pop r17
164: 0f 91 pop r16
166: 08 95 ret
00000168 <toggle_recv>:
#define TRUE 1
#define FALSE 0
unsigned char set_usb_mode( unsigned char mode ) { // 设置CH375的工作模式
xWriteCH375Cmd( CMD_SET_USB_MODE );
xWriteCH375Data( mode );
mDelaymS(2);
while ( xReadCH375Data()!=CMD_RET_SUCCESS )
{
printf("set usb mode error!\n\r");
mDelaymS(200);
}
printf("set usb mode %d ok\n\r",mode);
return( TRUE ); // 成功
//return( FALSE ); // CH375出错,例如芯片型号错或者处于串口方式或者不支持
}
// 数据同步
/* USB的数据同步通过切换DATA0和DATA1实现: 在设备端, USB打印机可以自动切换;
在主机端, 必须由SET_ENDP6和SET_ENDP7命令控制CH375切换DATA0与DATA1.
主机端的程序处理方法是为设备端的各个端点分别提供一个全局变量,
初始值均为DATA0, 每执行一次成功事务后取反, 每执行一次失败事务后将其复位为DATA1 */
void toggle_recv( BOOL1 tog ) { // 主机接收同步控制:0=DATA0,1=DATA1
168: 1f 93 push r17
16a: 18 2f mov r17, r24
xWriteCH375Cmd( CMD_SET_ENDP6 );
16c: 8c e1 ldi r24, 0x1C ; 28
16e: 0e 94 65 00 call 0xca ; 0xca <xWriteCH375Cmd>
xWriteCH375Data( tog ? 0xC0 : 0x80 );
172: 11 23 and r17, r17
174: 11 f0 breq .+4 ; 0x17a <toggle_recv+0x12>
176: 80 ec ldi r24, 0xC0 ; 192
178: 01 c0 rjmp .+2 ; 0x17c <toggle_recv+0x14>
17a: 80 e8 ldi r24, 0x80 ; 128
17c: 0e 94 74 00 call 0xe8 ; 0xe8 <xWriteCH375Data>
*/
void
_delay_loop_1(uint8_t __count)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -