📄 usb.lss
字号:
return c;
}
7e8: 89 2f mov r24, r25
7ea: 99 27 eor r25, r25
7ec: 08 95 ret
000007ee <D12_ReadLastTransactionStatus>:
/************************************************************
** 函数名称: D12_ReadEndpointStatus()
** 功能描述: 读取端点状态
** 输 入: INT8U bEndp: 端点索引号,取值0 ~ 5
** 输 出: 端点状态
************************************************************/
#if D12_ReadEndpointStatus_EN
INT8U D12_ReadEndpointStatus(INT8U bEndp)
{
INT8U c;
if(bEPPflags.bits.in_isr == 0)
DISABLE();
outportb(D12_COMMAND, 0x80 + bEndp); //读取端点状态命令
c = inportb(D12_DATA); //读取端点状态
if(bEPPflags.bits.in_isr == 0)
ENABLE();
return c;
}
#endif
/************************************************************
** 函数名称: D12_ReadLastTransactionStatus()
** 功能描述: 读取最后处理状态寄存器
** 输 入: INT8U bEndp: 端点索引号,取值0 ~ 5
** 输 出: 端点最后处理的状态
************************************************************/
INT8U D12_ReadLastTransactionStatus(INT8U bEndp)
{
outportb(D12_COMMAND, 0x40 + bEndp); //输出读取最后处理状态寄存器命令
7ee: 80 5c subi r24, 0xC0 ; 192
7f0: 68 2f mov r22, r24
7f2: 83 e0 ldi r24, 0x03 ; 3
7f4: 9f ef ldi r25, 0xFF ; 255
7f6: 0e 94 84 05 call 0xb08 <outportb>
return inportb(D12_DATA); //读取状态
7fa: 82 e0 ldi r24, 0x02 ; 2
7fc: 9f ef ldi r25, 0xFF ; 255
7fe: 0e 94 9e 05 call 0xb3c <inportb>
}
802: 99 27 eor r25, r25
804: 08 95 ret
00000806 <D12_SetEndpointStatus>:
/************************************************************
** 函数名称: D12_SetEndpointStatus()
** 功能描述: 设置端点状态
** 输 入: INT8U bEndp: 端点索引号,取值0 ~ 5
INT8U bStalled: 状态值
** 输 出: 端点状态
************************************************************/
void D12_SetEndpointStatus(INT8U bEndp,INT8U bStalled)
{
806: cf 93 push r28
808: 98 2f mov r25, r24
80a: c6 2f mov r28, r22
if(bEPPflags.bits.in_isr == 0)
80c: 80 91 60 01 lds r24, 0x0160
810: 85 fd sbrc r24, 5
812: 01 c0 rjmp .+2 ; 0x816 <D12_SetEndpointStatus+0x10>
DISABLE();
814: f8 94 cli
outportb(D12_COMMAND, 0x40 + bEndp); //发送设置端点状态命令
816: 90 5c subi r25, 0xC0 ; 192
818: 69 2f mov r22, r25
81a: 83 e0 ldi r24, 0x03 ; 3
81c: 9f ef ldi r25, 0xFF ; 255
81e: 0e 94 84 05 call 0xb08 <outportb>
outportb(D12_DATA, bStalled); //设置端点状态
822: 6c 2f mov r22, r28
824: 82 e0 ldi r24, 0x02 ; 2
826: 9f ef ldi r25, 0xFF ; 255
828: 0e 94 84 05 call 0xb08 <outportb>
if(bEPPflags.bits.in_isr == 0)
82c: 80 91 60 01 lds r24, 0x0160
830: 85 fd sbrc r24, 5
832: 01 c0 rjmp .+2 ; 0x836 <D12_SetEndpointStatus+0x30>
ENABLE();
834: 78 94 sei
836: cf 91 pop r28
838: 08 95 ret
0000083a <D12_ReadEndpoint>:
}
/************************************************************
** 函数名称: D12_SendResume()
** 功能描述: 传输恢复
** 输 入: 无
** 输 出: 无
************************************************************/
#if D12_SendResume_EN
void D12_SendResume(void)
{
outportb(D12_COMMAND, 0xF6); //设置发送恢复
}
#endif
/************************************************************
** 函数名称: D12_ReadCurrentFrameNumber()
** 功能描述: 读取当前帧号
** 输 入: 无
** 输 出: 当前帧号
************************************************************/
#if D12_ReadCurrentFrameNumber_EN
INT16U D12_ReadCurrentFrameNumber(void)
{
INT16U i,j;
if(bEPPflags.bits.in_isr == 0)
DISABLE();
outportb(D12_COMMAND, 0xF5); //发送读取当前帧数目命令
i= inportb(D12_DATA); //读取帧数目的低8位
j = inportb(D12_DATA); //读取帧数目的高8位
i += (j<<8);
if(bEPPflags.bits.in_isr == 0)
ENABLE();
return i; //返目当前帧数目
}
#endif
/************************************************************
** 函数名称: D12_ReadEndpoint()
** 功能描述: 读取端点数据
** 输 入: INT8U endp: 端点索引号,取值 0 ~ 5
INT8U len: 要读取的数据长度
INT8U * buf: 接收数据指针
** 输 出: 实际读得的字节数
************************************************************/
INT8U D12_ReadEndpoint(INT8U endp,INT8U len,INT8U * buf)
{
83a: 0f 93 push r16
83c: 1f 93 push r17
83e: cf 93 push r28
840: df 93 push r29
842: 98 2f mov r25, r24
844: 06 2f mov r16, r22
846: ea 01 movw r28, r20
INT8U i, j;
if(bEPPflags.bits.in_isr == 0)
848: 80 91 60 01 lds r24, 0x0160
84c: 85 fd sbrc r24, 5
84e: 01 c0 rjmp .+2 ; 0x852 <D12_ReadEndpoint+0x18>
DISABLE();
850: f8 94 cli
outportb(D12_COMMAND, endp); //发送选择端点命令
852: 69 2f mov r22, r25
854: 83 e0 ldi r24, 0x03 ; 3
856: 9f ef ldi r25, 0xFF ; 255
858: 0e 94 84 05 call 0xb08 <outportb>
if((inportb(D12_DATA) & D12_FULLEMPTY) == 0) { //如果缓冲区为空
85c: 82 e0 ldi r24, 0x02 ; 2
85e: 9f ef ldi r25, 0xFF ; 255
860: 0e 94 9e 05 call 0xb3c <inportb>
864: 80 fd sbrc r24, 0
866: 08 c0 rjmp .+16 ; 0x878 <D12_ReadEndpoint+0x3e>
if(bEPPflags.bits.in_isr == 0)
868: 80 91 60 01 lds r24, 0x0160
86c: 85 fd sbrc r24, 5
86e: 01 c0 rjmp .+2 ; 0x872 <D12_ReadEndpoint+0x38>
ENABLE();
870: 78 94 sei
return 0; //则返回读到0字节
872: 80 e0 ldi r24, 0x00 ; 0
874: 90 e0 ldi r25, 0x00 ; 0
876: 27 c0 rjmp .+78 ; 0x8c6 <D12_ReadEndpoint+0x8c>
}
outportb(D12_COMMAND, 0xF0); //发送读缓冲区命令
878: 60 ef ldi r22, 0xF0 ; 240
87a: 83 e0 ldi r24, 0x03 ; 3
87c: 9f ef ldi r25, 0xFF ; 255
87e: 0e 94 84 05 call 0xb08 <outportb>
j = inportb(D12_DATA); //读取保留字节
882: 82 e0 ldi r24, 0x02 ; 2
884: 9f ef ldi r25, 0xFF ; 255
886: 0e 94 9e 05 call 0xb3c <inportb>
j = inportb(D12_DATA); //读取数据字节的数目/长度
88a: 82 e0 ldi r24, 0x02 ; 2
88c: 9f ef ldi r25, 0xFF ; 255
88e: 0e 94 9e 05 call 0xb3c <inportb>
892: 18 2f mov r17, r24
if(j > len) //如果大于要求读的字节数目
894: 08 17 cp r16, r24
896: 08 f4 brcc .+2 ; 0x89a <D12_ReadEndpoint+0x60>
j = len; //则只读取要求的字节长度
898: 10 2f mov r17, r16
for(i=0; i<j; i++)
89a: 00 e0 ldi r16, 0x00 ; 0
89c: 01 17 cp r16, r17
89e: 38 f4 brcc .+14 ; 0x8ae <D12_ReadEndpoint+0x74>
*(buf+i) = inportb(D12_DATA); //读取要求的字节数目/长度
8a0: 82 e0 ldi r24, 0x02 ; 2
8a2: 9f ef ldi r25, 0xFF ; 255
8a4: 0e 94 9e 05 call 0xb3c <inportb>
8a8: 89 93 st Y+, r24
8aa: 0f 5f subi r16, 0xFF ; 255
8ac: f7 cf rjmp .-18 ; 0x89c <D12_ReadEndpoint+0x62>
outportb(D12_COMMAND, 0xF2); //清缓冲区,新的信息包才可以重新被接受
8ae: 62 ef ldi r22, 0xF2 ; 242
8b0: 83 e0 ldi r24, 0x03 ; 3
8b2: 9f ef ldi r25, 0xFF ; 255
8b4: 0e 94 84 05 call 0xb08 <outportb>
if(bEPPflags.bits.in_isr == 0)
8b8: 80 91 60 01 lds r24, 0x0160
8bc: 85 fd sbrc r24, 5
8be: 01 c0 rjmp .+2 ; 0x8c2 <D12_ReadEndpoint+0x88>
ENABLE();
8c0: 78 94 sei
return j; //返回读到的字节数
8c2: 81 2f mov r24, r17
8c4: 99 27 eor r25, r25
8c6: df 91 pop r29
8c8: cf 91 pop r28
8ca: 1f 91 pop r17
8cc: 0f 91 pop r16
8ce: 08 95 ret
000008d0 <D12_WriteEndpoint>:
}
/************************************************************
** 函数名称: D12_WriteEndpoint()
** 功能描述: 把数据写入端点
** 输 入: INT8U endp: 端点索引号,取值 0 ~ 5
INT8U len: 要写入的数据长度
INT8U * buf: 发送数据指针
** 输 出: 实际写入的字节数
************************************************************/
INT8U D12_WriteEndpoint(INT8U endp, INT8U len,INT8U * buf)
{
8d0: 0f 93 push r16
8d2: 1f 93 push r17
8d4: cf 93 push r28
8d6: df 93 push r29
8d8: 98 2f mov r25, r24
8da: 06 2f mov r16, r22
8dc: ea 01 movw r28, r20
INT8U i;
if(bEPPflags.bits.in_isr == 0)
8de: 80 91 60 01 lds r24, 0x0160
8e2: 85 fd sbrc r24, 5
8e4: 01 c0 rjmp .+2 ; 0x8e8 <D12_WriteEndpoint+0x18>
DISABLE();
8e6: f8 94 cli
outportb(D12_COMMAND, endp); //发送选择端点命令
8e8: 69 2f mov r22, r25
8ea: 83 e0 ldi r24, 0x03 ; 3
8ec: 9f ef ldi r25, 0xFF ; 255
8ee: 0e 94 84 05 call 0xb08 <outportb>
i = inportb(D12_DATA); //可选地读取一个字节
8f2: 82 e0 ldi r24, 0x02 ; 2
8f4: 9f ef ldi r25, 0xFF ; 255
8f6: 0e 94 9e 05 call 0xb3c <inportb>
outportb(D12_COMMAND, 0xF0); //发送写缓冲区命令
8fa: 60 ef ldi r22, 0xF0 ; 240
8fc: 83 e0 ldi r24, 0x03 ; 3
8fe: 9f ef ldi r25, 0xFF ; 255
900: 0e 94 84 05 call 0xb08 <outportb>
outportb(D12_DATA, 0); //写入一个保留字节
904: 60 e0 ldi r22, 0x00 ; 0
906: 82 e0 ldi r24, 0x02 ; 2
908: 9f ef ldi r25, 0xFF ; 255
90a: 0e 94 84 05 call 0xb08 <outportb>
outportb(D12_DATA, len); //写入即将写入的字节数目
90e: 60 2f mov r22, r16
910: 82 e0 ldi r24, 0x02 ; 2
912: 9f ef ldi r25, 0xFF ; 255
914: 0e 94 84 05 call 0xb08 <outportb>
for(i=0; i<len; i++)
918: 10 e0 ldi r17, 0x00 ; 0
91a: 10 17 cp r17, r16
91c: 38 f4 brcc .+14 ; 0x92c <D12_WriteEndpoint+0x5c>
{outportb(D12_DATA, *(buf+i)); //写入指定的字节
91e: 69 91 ld r22, Y+
920: 82 e0 ldi r24, 0x02 ; 2
922: 9f ef ldi r25, 0xFF ; 255
924: 0e 94 84 05 call 0xb08 <outportb>
928: 1f 5f subi r17, 0xFF ; 255
92a: f7 cf rjmp .-18 ; 0x91a <D12_WriteEndpoint+0x4a>
}
outportb(D12_COMMAND, 0xFA); //使缓冲区有效
92c: 6a ef ldi r22, 0xFA ; 250
92e: 83 e0 ldi r24, 0x03 ; 3
930: 9f ef ldi r25, 0xFF ; 255
932: 0e 94 84 05 call 0xb08 <outportb>
if(bEPPflags.bits.in_isr == 0)
936: 80 91 60 01 lds r24, 0x0160
93a: 85 fd sbrc r24, 5
93c: 01 c0 rjmp .+2 ; 0x940 <D12_WriteEndpoint+0x70>
ENABLE();
93e: 78 94 sei
return len; //返回写入的字节数
}
940: 80 2f mov r24, r16
942: 99 27 eor r25, r25
944: df 91 pop r29
946: cf 91 pop r28
948: 1f 91 pop r17
94a: 0f 91 pop r16
94c: 08 95 ret
0000094e <D12_AcknowledgeEndpoint>:
/************************************************************
** 函数名称: D12_AcknowledgeEndpoint()
** 功能描述: 应答Setup
** 输 入: INT8U endp: 端点索引号,取值 0 ~ 5
** 输 出: 无
************************************************************/
void D12_AcknowledgeEndpoint(INT8U endp)
{
94e: 1f 93 push r17
950: 18 2f mov r17, r24
outportb(D12_COMMAND, endp); //选择端点
952: 68 2f mov r22, r24
954: 83 e0 ldi r24, 0x03 ; 3
956: 9f ef ldi r25, 0xFF ; 255
958: 0e 94 84 05 call 0xb08 <outportb>
outportb(D12_COMMAND, 0xF1); //应答Setup指令
95c: 61 ef ldi r22, 0xF1 ; 241
95e: 83 e0 ldi r24, 0x03 ; 3
960: 9f ef ldi r25, 0xFF ; 255
962: 0e 94 84 05
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -