📄 usb.lss
字号:
USB.elf: file format elf32-avr
Sections:
Idx Name Size VMA LMA File off Algn
0 .data 00000060 00800100 00000bd0 00000c64 2**0
CONTENTS, ALLOC, LOAD, DATA
1 .text 00000bd0 00000000 00000000 00000094 2**0
CONTENTS, ALLOC, LOAD, READONLY, CODE
2 .bss 00000068 00800160 00800160 00000cc4 2**0
ALLOC
3 .noinit 00000000 008001c8 008001c8 00000cc4 2**0
CONTENTS
4 .eeprom 00000000 00810000 00810000 00000cc4 2**0
CONTENTS
5 .stab 0000036c 00000000 00000000 00000cc4 2**2
CONTENTS, READONLY, DEBUGGING
6 .stabstr 00000084 00000000 00000000 00001030 2**0
CONTENTS, READONLY, DEBUGGING
7 .debug_aranges 00000064 00000000 00000000 000010b4 2**0
CONTENTS, READONLY, DEBUGGING
8 .debug_pubnames 00000448 00000000 00000000 00001118 2**0
CONTENTS, READONLY, DEBUGGING
9 .debug_info 000017de 00000000 00000000 00001560 2**0
CONTENTS, READONLY, DEBUGGING
10 .debug_abbrev 00000603 00000000 00000000 00002d3e 2**0
CONTENTS, READONLY, DEBUGGING
11 .debug_line 00000d90 00000000 00000000 00003341 2**0
CONTENTS, READONLY, DEBUGGING
12 .debug_str 000007f5 00000000 00000000 000040d1 2**0
CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:
00000000 <__vectors>:
0: 0c 94 34 00 jmp 0x68 <__ctors_end>
4: 0c 94 4f 00 jmp 0x9e <__bad_interrupt>
8: 0c 94 4f 00 jmp 0x9e <__bad_interrupt>
c: 0c 94 4f 00 jmp 0x9e <__bad_interrupt>
10: 0c 94 4f 00 jmp 0x9e <__bad_interrupt>
14: 0c 94 4f 00 jmp 0x9e <__bad_interrupt>
18: 0c 94 4f 00 jmp 0x9e <__bad_interrupt>
1c: 0c 94 4f 00 jmp 0x9e <__bad_interrupt>
20: 0c 94 4f 00 jmp 0x9e <__bad_interrupt>
24: 0c 94 4f 00 jmp 0x9e <__bad_interrupt>
28: 0c 94 4f 00 jmp 0x9e <__bad_interrupt>
2c: 0c 94 4f 00 jmp 0x9e <__bad_interrupt>
30: 0c 94 4f 00 jmp 0x9e <__bad_interrupt>
34: 0c 94 4f 00 jmp 0x9e <__bad_interrupt>
38: 0c 94 4f 00 jmp 0x9e <__bad_interrupt>
3c: 0c 94 4f 00 jmp 0x9e <__bad_interrupt>
40: 0c 94 4f 00 jmp 0x9e <__bad_interrupt>
44: 0c 94 4f 00 jmp 0x9e <__bad_interrupt>
48: 0c 94 4f 00 jmp 0x9e <__bad_interrupt>
4c: 0c 94 4f 00 jmp 0x9e <__bad_interrupt>
50: 0c 94 4f 00 jmp 0x9e <__bad_interrupt>
54: 0c 94 4f 00 jmp 0x9e <__bad_interrupt>
58: 0c 94 4f 00 jmp 0x9e <__bad_interrupt>
5c: 0c 94 4f 00 jmp 0x9e <__bad_interrupt>
60: 0c 94 4f 00 jmp 0x9e <__bad_interrupt>
64: 0c 94 4f 00 jmp 0x9e <__bad_interrupt>
00000068 <__ctors_end>:
68: 11 24 eor r1, r1
6a: 1f be out 0x3f, r1 ; 63
6c: cf ef ldi r28, 0xFF ; 255
6e: d4 e0 ldi r29, 0x04 ; 4
70: de bf out 0x3e, r29 ; 62
72: cd bf out 0x3d, r28 ; 61
00000074 <__do_copy_data>:
74: 11 e0 ldi r17, 0x01 ; 1
76: a0 e0 ldi r26, 0x00 ; 0
78: b1 e0 ldi r27, 0x01 ; 1
7a: e0 ed ldi r30, 0xD0 ; 208
7c: fb e0 ldi r31, 0x0B ; 11
7e: 02 c0 rjmp .+4 ; 0x84 <.do_copy_data_start>
00000080 <.do_copy_data_loop>:
80: 05 90 lpm r0, Z+
82: 0d 92 st X+, r0
00000084 <.do_copy_data_start>:
84: a0 36 cpi r26, 0x60 ; 96
86: b1 07 cpc r27, r17
88: d9 f7 brne .-10 ; 0x80 <.do_copy_data_loop>
0000008a <__do_clear_bss>:
8a: 11 e0 ldi r17, 0x01 ; 1
8c: a0 e6 ldi r26, 0x60 ; 96
8e: b1 e0 ldi r27, 0x01 ; 1
90: 01 c0 rjmp .+2 ; 0x94 <.do_clear_bss_start>
00000092 <.do_clear_bss_loop>:
92: 1d 92 st X+, r1
00000094 <.do_clear_bss_start>:
94: a8 3c cpi r26, 0xC8 ; 200
96: b1 07 cpc r27, r17
98: e1 f7 brne .-8 ; 0x92 <.do_clear_bss_loop>
9a: 0c 94 ad 05 jmp 0xb5a <main>
0000009e <__bad_interrupt>:
9e: 0c 94 00 00 jmp 0x0 <__vectors>
000000a2 <stall_ep0>:
** 功能描述: 使控制端点处于停止状态
**************************************/
void stall_ep0(void)
{
D12_SetEndpointStatus(0, 1);
a2: 61 e0 ldi r22, 0x01 ; 1
a4: 80 e0 ldi r24, 0x00 ; 0
a6: 0e 94 03 04 call 0x806 <D12_SetEndpointStatus>
D12_SetEndpointStatus(1, 1);
aa: 61 e0 ldi r22, 0x01 ; 1
ac: 86 2f mov r24, r22
ae: 0e 94 03 04 call 0x806 <D12_SetEndpointStatus>
b2: 08 95 ret
000000b4 <reserved>:
}
/*************************************
** 函数名称: void reserved(void)
** 功能描述: 保留子程序
**************************************/
void reserved(void)
{
stall_ep0(); //返回STALL
b4: 0e 94 51 00 call 0xa2 <stall_ep0>
b8: 08 95 ret
000000ba <init_unconfig>:
}
/**********************************************
** 函数名称: void init_unconfig(void)
** 功能描述: 进入地址状态,禁止0除外的所有端点
***********************************************/
void init_unconfig(void)
{
D12_SetEndpointEnable(0); //禁止0除外的所有端点
ba: 80 e0 ldi r24, 0x00 ; 0
bc: 0e 94 76 03 call 0x6ec <D12_SetEndpointEnable>
c0: 08 95 ret
000000c2 <init_config>:
}
/**********************************************
** 函数名称: void init_config(void)
** 功能描述: 配置处理,允许端点收发
***********************************************/
void init_config(void)
{
D12_SetEndpointEnable(1); //使能普通/同步端点使能
c2: 81 e0 ldi r24, 0x01 ; 1
c4: 0e 94 76 03 call 0x6ec <D12_SetEndpointEnable>
c8: 08 95 ret
000000ca <single_transmit>:
}
/*********************************************************
** 函数名称: void single_transmit(INT8U * buf, INT8U len)
** 功能描述: 通过端点索引 1 发送数据(DATA 类型)
** 输 入: INT8U * buf: 发送数据指针
INT8U len: 发送数据长度
** 输 出: 无
**********************************************************/
void single_transmit(INT8U * buf, INT8U len)
{
ca: ac 01 movw r20, r24
if( len <= EP0_PACKET_SIZE) { //长度小于EP0最大信息包大小才允许发送
cc: 61 31 cpi r22, 0x11 ; 17
ce: 18 f4 brcc .+6 ; 0xd6 <single_transmit+0xc>
D12_WriteEndpoint(1, len, buf);
d0: 81 e0 ldi r24, 0x01 ; 1
d2: 0e 94 68 04 call 0x8d0 <D12_WriteEndpoint>
d6: 08 95 ret
000000d8 <code_transmit>:
}
}
/*************************************************************
** 函数名称: void code_transmit(INT8U * pRomData, INT16U len)
** 功能描述: 通过端点索引 1 发送数据(CODE类型)
** 输 入: INT8U *pRomData: 发送数据指针
INT16U len: 发送数据长度
** 输 出: 无
**************************************************************/
void code_transmit(INT8U *pRomData, INT16U len)
{
d8: ac 01 movw r20, r24
ControlData.wCount = 0; //传输字节数计数器清0
da: 10 92 6d 01 sts 0x016D, r1
de: 10 92 6c 01 sts 0x016C, r1
if(ControlData.wLength > len)
e2: 80 91 6a 01 lds r24, 0x016A
e6: 90 91 6b 01 lds r25, 0x016B
ea: 68 17 cp r22, r24
ec: 79 07 cpc r23, r25
ee: 20 f4 brcc .+8 ; 0xf8 <code_transmit+0x20>
ControlData.wLength = len; //传输数据总字节数不得超过len
f0: 70 93 6b 01 sts 0x016B, r23
f4: 60 93 6a 01 sts 0x016A, r22
ControlData.pData = pRomData; //传输数据指针指向pRomData
f8: 50 93 6f 01 sts 0x016F, r21
fc: 40 93 6e 01 sts 0x016E, r20
if( ControlData.wLength >= EP0_PACKET_SIZE) { //传输数据总字节数大于端点0最大信息包大小
100: 80 91 6a 01 lds r24, 0x016A
104: 90 91 6b 01 lds r25, 0x016B
108: 40 97 sbiw r24, 0x10 ; 16
10a: b0 f0 brcs .+44 ; 0x138 <code_transmit+0x60>
D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData); //发送端点0最大信息包大小个字节
10c: 60 e1 ldi r22, 0x10 ; 16
10e: 81 e0 ldi r24, 0x01 ; 1
110: 0e 94 68 04 call 0x8d0 <D12_WriteEndpoint>
ControlData.wCount += EP0_PACKET_SIZE; //统计已发送字节数
114: 80 91 6c 01 lds r24, 0x016C
118: 90 91 6d 01 lds r25, 0x016D
11c: 40 96 adiw r24, 0x10 ; 16
11e: 90 93 6d 01 sts 0x016D, r25
122: 80 93 6c 01 sts 0x016C, r24
DISABLE();
126: f8 94 cli
bEPPflags.bits.control_state = USB_TRANSMIT; //标志数据发送状态
128: 80 91 60 01 lds r24, 0x0160
12c: 8f 73 andi r24, 0x3F ; 63
12e: 80 64 ori r24, 0x40 ; 64
130: 80 93 60 01 sts 0x0160, r24
ENABLE();
134: 78 94 sei
136: 08 95 ret
}
else {
D12_WriteEndpoint(1, ControlData.wLength, pRomData); //写入传输数据总字节数
138: 60 91 6a 01 lds r22, 0x016A
13c: 81 e0 ldi r24, 0x01 ; 1
13e: 0e 94 68 04 call 0x8d0 <D12_WriteEndpoint>
ControlData.wCount += ControlData.wLength; //统计已发送字节数
142: 80 91 6c 01 lds r24, 0x016C
146: 90 91 6d 01 lds r25, 0x016D
14a: 20 91 6a 01 lds r18, 0x016A
14e: 30 91 6b 01 lds r19, 0x016B
152: 82 0f add r24, r18
154: 93 1f adc r25, r19
156: 90 93 6d 01 sts 0x016D, r25
15a: 80 93 6c 01 sts 0x016C, r24
DISABLE();
15e: f8 94 cli
bEPPflags.bits.control_state = USB_IDLE; //标志空闲状态
160: 80 91 60 01 lds r24, 0x0160
164: 8f 73 andi r24, 0x3F ; 63
166: 80 93 60 01 sts 0x0160, r24
ENABLE();
16a: 78 94 sei
16c: 08 95 ret
0000016e <get_status>:
}
}
//*************************************************************************
// USB 标准设备请求服务程序
//*************************************************************************
/********************************************************************
** 函数名称: void get_status(void)
** 功能描述: 主机要求获取状态,设备返回16位的状态描述给主机
*********************************************************************/
void get_status(void)
{
16e: cf 93 push r28
170: df 93 push r29
172: cd b7 in r28, 0x3d ; 61
174: de b7 in r29, 0x3e ; 62
176: 22 97 sbiw r28, 0x02 ; 2
178: 0f b6 in r0, 0x3f ; 63
17a: f8 94 cli
17c: de bf out 0x3e, r29 ; 62
17e: 0f be out 0x3f, r0 ; 63
180: cd bf out 0x3d, r28 ; 61
INT8U endp, txdat[2], c;
INT8U bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
182: 80 91 62 01 lds r24, 0x0162
186: 8f 71 andi r24, 0x1F ; 31
//取得设备请求类型
if (bRecipient == USB_RECIPIENT_DEVICE) { //对设备请求
188: 49 f4 brne .+18 ; 0x19c <get_status+0x2e>
if(bEPPflags.bits.remote_wakeup == 1)
18a: 80 91 60 01 lds r24, 0x0160
18e: 84 ff sbrs r24, 4
190: 02 c0 rjmp .+4 ; 0x196 <get_status+0x28>
txdat[0] = 3; //支持远程唤醒、自供电
192: 83 e0 ldi r24, 0x03 ; 3
194: 01 c0 rjmp .+2 ; 0x198 <get_status+0x2a>
else
txdat[0] = 1; //不支持远程唤醒、自供电
196: 81 e0 ldi r24, 0x01 ; 1
198: 89 83 std Y+1, r24 ; 0x01
19a: 18 c0 rjmp .+48 ; 0x1cc <get_status+0x5e>
txdat[1]=0; //高8位为0
single_transmit(txdat, 2); //发送16位的状态到主机
} else if (bRecipient == USB_RECIPIENT_INTERFACE) { //对接口请求
19c: 81 30 cpi r24, 0x01 ; 1
19e: a9 f0 breq .+42 ; 0x1ca <get_status+0x5c>
txdat[0]=0;
txdat[1]=0;
single_transmit(txdat, 2);
//发送16位的状态到主机
} else if (bRecipient == USB_RECIPIENT_ENDPOINT) { //对端点请求
1a0: 82 30 cpi r24, 0x02 ; 2
1a2: e1 f4 brne .+56 ; 0x1dc <get_status+0x6e>
endp = (INT8U)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
1a4: 90 91 66 01 lds r25, 0x0166
1a8: 89 2f mov r24, r25
1aa: 83 70 andi r24, 0x03 ; 3
1ac: 28 2f mov r18, r24
1ae: 33 27 eor r19, r19
if (ControlData.DeviceRequest.wIndex & (INT8U)USB_ENDPOINT_DIRECTION_MASK)
1b0: 97 ff sbrs r25, 7
1b2: 05 c0 rjmp .+10 ; 0x1be <get_status+0x50>
c = D12_SelectEndpoint(endp*2 + 1); //读取输入端点状态
1b4: 22 0f add r18, r18
1b6: 33 1f adc r19, r19
1b8: 82 2f mov r24, r18
1ba: 8f 5f subi r24, 0xFF ; 255
1bc: 02 c0 rjmp .+4 ; 0x1c2 <get_status+0x54>
else
c = D12_SelectEndpoint(endp*2); //读取输出端点状态
1be: 82 2f mov r24, r18
1c0: 88 0f add r24, r24
1c2: 0e 94 e0 03 call 0x7c0 <D12_SelectEndpoint>
if(c & D12_STALL)
1c6: 81 fd sbrc r24, 1
1c8: e6 cf rjmp .-52 ; 0x196 <get_status+0x28>
txdat[0] = 1; //端点禁止
else
txdat[0] = 0; //端点有效
1ca: 19 82 std Y+1, r1 ; 0x01
txdat[1] = 0;
1cc: fe 01 movw r30, r28
1ce: 31 96 adiw r30, 0x01 ; 1
1d0: 11 82 std Z+1, r1 ; 0x01
single_transmit(txdat, 2); //发送16位的状态到主机
1d2: 62 e0 ldi r22, 0x02 ; 2
1d4: cf 01 movw r24, r30
1d6: 0e 94 65 00 call 0xca <single_transmit>
1da: 02 c0 rjmp .+4 ; 0x1e0 <get_status+0x72>
} else
stall_ep0(); //非标准请求,发STALL
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -