📄 usb.lss
字号:
616: 24 c0 rjmp .+72 ; 0x660 <ep0_txdone+0xbc>
}
else if( i != 0) { //发送所有未发送的字节
618: 20 97 sbiw r28, 0x00 ; 0
61a: d1 f0 breq .+52 ; 0x650 <ep0_txdone+0xac>
D12_WriteEndpoint(1, i, ControlData.pData + ControlData.wCount);
61c: 80 91 6e 01 lds r24, 0x016E
620: 90 91 6f 01 lds r25, 0x016F
624: 20 91 6c 01 lds r18, 0x016C
628: 30 91 6d 01 lds r19, 0x016D
62c: 82 0f add r24, r18
62e: 93 1f adc r25, r19
630: ac 01 movw r20, r24
632: 6c 2f mov r22, r28
634: 81 e0 ldi r24, 0x01 ; 1
636: 0e 94 68 04 call 0x8d0 <D12_WriteEndpoint>
ControlData.wCount += i;
63a: 80 91 6c 01 lds r24, 0x016C
63e: 90 91 6d 01 lds r25, 0x016D
642: 8c 0f add r24, r28
644: 9d 1f adc r25, r29
646: 90 93 6d 01 sts 0x016D, r25
64a: 80 93 6c 01 sts 0x016C, r24
64e: 05 c0 rjmp .+10 ; 0x65a <ep0_txdone+0xb6>
bEPPflags.bits.control_state = USB_IDLE; //置状态为等待状态
}
else if (i == 0){
D12_WriteEndpoint(1, 0, 0); //发送完毕,发0个字节
650: ae 01 movw r20, r28
652: 60 e0 ldi r22, 0x00 ; 0
654: 81 e0 ldi r24, 0x01 ; 1
656: 0e 94 68 04 call 0x8d0 <D12_WriteEndpoint>
bEPPflags.bits.control_state = USB_IDLE;
65a: 80 91 60 01 lds r24, 0x0160
65e: 8f 73 andi r24, 0x3F ; 63
660: 80 93 60 01 sts 0x0160, r24
664: df 91 pop r29
666: cf 91 pop r28
668: 08 95 ret
0000066a <D12_ReadChipID>:
** 输 入: 无
** 输 出: 芯片的ID号
************************************************************/
INT16U D12_ReadChipID(void)
{
66a: cf 93 push r28
66c: df 93 push r29
INT16U i,j;
if(bEPPflags.bits.in_isr == 0)
66e: 80 91 60 01 lds r24, 0x0160
672: 85 fd sbrc r24, 5
674: 01 c0 rjmp .+2 ; 0x678 <D12_ReadChipID+0xe>
DISABLE();
676: f8 94 cli
outportb(D12_COMMAND, 0xFD); //发送读PDIUSBD12芯片ID号命令
678: 6d ef ldi r22, 0xFD ; 253
67a: 83 e0 ldi r24, 0x03 ; 3
67c: 9f ef ldi r25, 0xFF ; 255
67e: 0e 94 84 05 call 0xb08 <outportb>
i=inportb(D12_DATA); //读取ID号低字节
682: 82 e0 ldi r24, 0x02 ; 2
684: 9f ef ldi r25, 0xFF ; 255
686: 0e 94 9e 05 call 0xb3c <inportb>
68a: c8 2f mov r28, r24
68c: dd 27 eor r29, r29
j=inportb(D12_DATA); //读取ID号高位字节
68e: 82 e0 ldi r24, 0x02 ; 2
690: 9f ef ldi r25, 0xFF ; 255
692: 0e 94 9e 05 call 0xb3c <inportb>
696: 99 27 eor r25, r25
i += (j<<8); //组成16位的PDIUSBD12芯片ID号
698: 98 2f mov r25, r24
69a: 88 27 eor r24, r24
69c: c8 0f add r28, r24
69e: d9 1f adc r29, r25
if(bEPPflags.bits.in_isr == 0)
6a0: 80 91 60 01 lds r24, 0x0160
6a4: 85 fd sbrc r24, 5
6a6: 01 c0 rjmp .+2 ; 0x6aa <D12_ReadChipID+0x40>
ENABLE();
6a8: 78 94 sei
return i;
}
6aa: ce 01 movw r24, r28
6ac: df 91 pop r29
6ae: cf 91 pop r28
6b0: 08 95 ret
000006b2 <D12_SetAddressEnable>:
/************************************************************
** 函数名称: D12_SetAddressEnable()
** 功能描述: 设置地址/使能
** 输 入: INT8U bAddress: 地址
INT8U bEnable : 0 --- 禁止
1 --- 使能
** 输 出: 无
************************************************************/
void D12_SetAddressEnable(INT8U bAddress, INT8U bEnable)
{
6b2: 1f 93 push r17
6b4: cf 93 push r28
6b6: c8 2f mov r28, r24
6b8: 16 2f mov r17, r22
if(bEPPflags.bits.in_isr == 0)
6ba: 80 91 60 01 lds r24, 0x0160
6be: 85 fd sbrc r24, 5
6c0: 01 c0 rjmp .+2 ; 0x6c4 <D12_SetAddressEnable+0x12>
DISABLE();
6c2: f8 94 cli
outportb(D12_COMMAND, 0xD0); //输出设置地址/使能指令
6c4: 60 ed ldi r22, 0xD0 ; 208
6c6: 83 e0 ldi r24, 0x03 ; 3
6c8: 9f ef ldi r25, 0xFF ; 255
6ca: 0e 94 84 05 call 0xb08 <outportb>
if(bEnable)
6ce: 11 11 cpse r17, r1
bAddress |= 0x80; //bit7置1,使能
6d0: c0 68 ori r28, 0x80 ; 128
outportb(D12_DATA, bAddress); //输出设置值
6d2: 6c 2f mov r22, r28
6d4: 82 e0 ldi r24, 0x02 ; 2
6d6: 9f ef ldi r25, 0xFF ; 255
6d8: 0e 94 84 05 call 0xb08 <outportb>
if(bEPPflags.bits.in_isr == 0)
6dc: 80 91 60 01 lds r24, 0x0160
6e0: 85 fd sbrc r24, 5
6e2: 01 c0 rjmp .+2 ; 0x6e6 <D12_SetAddressEnable+0x34>
ENABLE();
6e4: 78 94 sei
6e6: cf 91 pop r28
6e8: 1f 91 pop r17
6ea: 08 95 ret
000006ec <D12_SetEndpointEnable>:
}
/************************************************************
** 函数名称: D12_SetEndpointEnable()
** 功能描述: 设置端点使能
** 输 入: INT8U bEnable : 0 --- 禁止
1 --- 允许
** 输 出: 无
************************************************************/
void D12_SetEndpointEnable(INT8U bEnable)
{
6ec: cf 93 push r28
6ee: c8 2f mov r28, r24
if(bEPPflags.bits.in_isr == 0)
6f0: 80 91 60 01 lds r24, 0x0160
6f4: 85 fd sbrc r24, 5
6f6: 01 c0 rjmp .+2 ; 0x6fa <D12_SetEndpointEnable+0xe>
DISABLE();
6f8: f8 94 cli
outportb(D12_COMMAND, 0xD8); //输出设置端点使能指令
6fa: 68 ed ldi r22, 0xD8 ; 216
6fc: 83 e0 ldi r24, 0x03 ; 3
6fe: 9f ef ldi r25, 0xFF ; 255
700: 0e 94 84 05 call 0xb08 <outportb>
if(bEnable)
704: cc 23 and r28, r28
706: 11 f0 breq .+4 ; 0x70c <D12_SetEndpointEnable+0x20>
outportb(D12_DATA, 1); //设置端点允许
708: 61 e0 ldi r22, 0x01 ; 1
70a: 01 c0 rjmp .+2 ; 0x70e <D12_SetEndpointEnable+0x22>
else
outportb(D12_DATA, 0); //设置端点禁止
70c: 6c 2f mov r22, r28
70e: 82 e0 ldi r24, 0x02 ; 2
710: 9f ef ldi r25, 0xFF ; 255
712: 0e 94 84 05 call 0xb08 <outportb>
if(bEPPflags.bits.in_isr == 0)
716: 80 91 60 01 lds r24, 0x0160
71a: 85 fd sbrc r24, 5
71c: 01 c0 rjmp .+2 ; 0x720 <D12_SetEndpointEnable+0x34>
ENABLE();
71e: 78 94 sei
720: cf 91 pop r28
722: 08 95 ret
00000724 <D12_SetMode>:
}
/************************************************************
** 函数名称: void D12_SetMode()
** 功能描述: 模式设置
** 输 入: INT8U bConfig: 配置字节信息
INT8U bClkDiv: 分频系数
** 输 出: 无
************************************************************/
void D12_SetMode(INT8U bConfig,INT8U bClkDiv)
{
724: 1f 93 push r17
726: cf 93 push r28
728: c8 2f mov r28, r24
72a: 16 2f mov r17, r22
if(bEPPflags.bits.in_isr == 0)
72c: 80 91 60 01 lds r24, 0x0160
730: 85 fd sbrc r24, 5
732: 01 c0 rjmp .+2 ; 0x736 <D12_SetMode+0x12>
DISABLE();
734: f8 94 cli
outportb(D12_COMMAND, 0xF3); //输出设置模式指令
736: 63 ef ldi r22, 0xF3 ; 243
738: 83 e0 ldi r24, 0x03 ; 3
73a: 9f ef ldi r25, 0xFF ; 255
73c: 0e 94 84 05 call 0xb08 <outportb>
outportb(D12_DATA, bConfig); //输出配置字节信息
740: 6c 2f mov r22, r28
742: 82 e0 ldi r24, 0x02 ; 2
744: 9f ef ldi r25, 0xFF ; 255
746: 0e 94 84 05 call 0xb08 <outportb>
outportb(D12_DATA, bClkDiv); //输出时钟分频因数字节
74a: 61 2f mov r22, r17
74c: 82 e0 ldi r24, 0x02 ; 2
74e: 9f ef ldi r25, 0xFF ; 255
750: 0e 94 84 05 call 0xb08 <outportb>
if(bEPPflags.bits.in_isr == 0)
754: 80 91 60 01 lds r24, 0x0160
758: 85 fd sbrc r24, 5
75a: 01 c0 rjmp .+2 ; 0x75e <D12_SetMode+0x3a>
ENABLE();
75c: 78 94 sei
75e: cf 91 pop r28
760: 1f 91 pop r17
762: 08 95 ret
00000764 <D12_SetDMA>:
}
/************************************************************
** 函数名称: void D12_SetDMA()
** 功能描述: 设置DMA工作方式设置
** 输 入: INT8U bMode: 设置值
** 输 出: 无
************************************************************/
void D12_SetDMA(INT8U bMode)
{
764: cf 93 push r28
766: c8 2f mov r28, r24
if(bEPPflags.bits.in_isr == 0)
768: 80 91 60 01 lds r24, 0x0160
76c: 85 fd sbrc r24, 5
76e: 01 c0 rjmp .+2 ; 0x772 <D12_SetDMA+0xe>
DISABLE();
770: f8 94 cli
outportb(D12_COMMAND, 0xFB); //设置DMA工作方命令
772: 6b ef ldi r22, 0xFB ; 251
774: 83 e0 ldi r24, 0x03 ; 3
776: 9f ef ldi r25, 0xFF ; 255
778: 0e 94 84 05 call 0xb08 <outportb>
outportb(D12_DATA, bMode); //输出设置值
77c: 6c 2f mov r22, r28
77e: 82 e0 ldi r24, 0x02 ; 2
780: 9f ef ldi r25, 0xFF ; 255
782: 0e 94 84 05 call 0xb08 <outportb>
if(bEPPflags.bits.in_isr == 0)
786: 80 91 60 01 lds r24, 0x0160
78a: 85 fd sbrc r24, 5
78c: 01 c0 rjmp .+2 ; 0x790 <D12_SetDMA+0x2c>
ENABLE();
78e: 78 94 sei
790: cf 91 pop r28
792: 08 95 ret
00000794 <D12_ReadInterruptRegister>:
}
/************************************************************
** 函数名称: D12_ReadInterruptRegister()
** 功能描述: 读取中断寄存器值
** 输 入: 无
** 输 出: 中断寄存器值
************************************************************/
INT16U D12_ReadInterruptRegister(void)
{
794: 1f 93 push r17
INT8U b1;
INT16U j;
outportb(D12_COMMAND, 0xF4); //读取中断寄存器命令
796: 64 ef ldi r22, 0xF4 ; 244
798: 83 e0 ldi r24, 0x03 ; 3
79a: 9f ef ldi r25, 0xFF ; 255
79c: 0e 94 84 05 call 0xb08 <outportb>
b1 = inportb(D12_DATA); //读取低8位字节
7a0: 82 e0 ldi r24, 0x02 ; 2
7a2: 9f ef ldi r25, 0xFF ; 255
7a4: 0e 94 9e 05 call 0xb3c <inportb>
7a8: 18 2f mov r17, r24
j = inportb(D12_DATA); //读取高8位字节
7aa: 82 e0 ldi r24, 0x02 ; 2
7ac: 9f ef ldi r25, 0xFF ; 255
7ae: 0e 94 9e 05 call 0xb3c <inportb>
7b2: 99 27 eor r25, r25
j <<= 8;
7b4: 98 2f mov r25, r24
7b6: 88 27 eor r24, r24
j += b1; //组合为16位
return j;
}
7b8: 81 0f add r24, r17
7ba: 91 1d adc r25, r1
7bc: 1f 91 pop r17
7be: 08 95 ret
000007c0 <D12_SelectEndpoint>:
/************************************************************
** 函数名称: D12_SelectEndpoint()
** 功能描述: 端点选择,将内部指针初始化到选择的缓冲区起始位置
** 输 入: INT8U bEndp: 端点索引号,取值0 ~ 5
** 输 出: 读出的字节
************************************************************/
INT8U D12_SelectEndpoint(INT8U bEndp)
{
7c0: 68 2f mov r22, r24
INT8U c;
if(bEPPflags.bits.in_isr == 0)
7c2: 80 91 60 01 lds r24, 0x0160
7c6: 85 fd sbrc r24, 5
7c8: 01 c0 rjmp .+2 ; 0x7cc <D12_SelectEndpoint+0xc>
DISABLE();
7ca: f8 94 cli
outportb(D12_COMMAND, bEndp); //端点选择
7cc: 83 e0 ldi r24, 0x03 ; 3
7ce: 9f ef ldi r25, 0xFF ; 255
7d0: 0e 94 84 05 call 0xb08 <outportb>
c = inportb(D12_DATA); //读出一个字节
7d4: 82 e0 ldi r24, 0x02 ; 2
7d6: 9f ef ldi r25, 0xFF ; 255
7d8: 0e 94 9e 05 call 0xb3c <inportb>
7dc: 98 2f mov r25, r24
if(bEPPflags.bits.in_isr == 0)
7de: 80 91 60 01 lds r24, 0x0160
7e2: 85 fd sbrc r24, 5
7e4: 01 c0 rjmp .+2 ; 0x7e8 <D12_SelectEndpoint+0x28>
ENABLE();
7e6: 78 94 sei
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -