📄 usbd12.s
字号:
brsh L146
.dbline 637
; ControlData.wLength = len; //传输数据总字节数不得超过len
sts _ControlData+8+1,R23
sts _ControlData+8,R22
L146:
.dbline 639
;
; ControlData.pData = pRomData; //传输数据指针指向pRomData
sts _ControlData+12+1,R21
sts _ControlData+12,R20
.dbline 640
; if( ControlData.wLength >= EP0_PACKET_SIZE)
lds R24,_ControlData+8
lds R25,_ControlData+8+1
cpi R24,16
ldi R30,0
cpc R25,R30
brlo L151
.dbline 641
; { //传输数据总字节数大于端点0最大信息包大小
.dbline 642
; Write_EP(1, EP0_PACKET_SIZE, ControlData.pData); //发送端点0最大信息包大小个字节
movw R2,R20
std y+0,R2
std y+1,R3
ldi R18,16
ldi R16,1
xcall _Write_EP
.dbline 643
; ControlData.wCount += EP0_PACKET_SIZE; //统计已发送字节数
lds R24,_ControlData+10
lds R25,_ControlData+10+1
adiw R24,16
sts _ControlData+10+1,R25
sts _ControlData+10,R24
.dbline 645
;
; UEN_GINT();
bclr 7
.dbline 646
; USB_FLAG.control_state = USB_TRANSMIT; //标志数据发送状态
ldi R24,1
sts _USB_FLAG+5,R24
.dbline 647
; EN_GINT();
bset 7
.dbline 648
; }
xjmp L152
L151:
.dbline 650
.dbline 651
std y+0,R20
std y+1,R21
lds R18,_ControlData+8
ldi R16,1
xcall _Write_EP
.dbline 652
lds R2,_ControlData+8
lds R3,_ControlData+8+1
lds R4,_ControlData+10
lds R5,_ControlData+10+1
add R4,R2
adc R5,R3
sts _ControlData+10+1,R5
sts _ControlData+10,R4
.dbline 653
bclr 7
.dbline 654
clr R2
sts _USB_FLAG+5,R2
.dbline 655
bset 7
.dbline 656
L152:
.dbline -2
.dbline 657
; else
; {
; Write_EP(1, ControlData.wLength, pRomData); //写入传输数据总字节数
; ControlData.wCount += ControlData.wLength; //统计已发送字节数
; UEN_GINT();
; USB_FLAG.control_state = USB_IDLE; //标志空闲状态
; EN_GINT();
; }
; }
L144:
adiw R28,2
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r len 22 i
.dbsym r pRomData 20 pc
.dbend
.dbfunc e USB_INT1 _USB_INT1 fV
; b -> <dead>
; a -> <dead>
; int_sta -> R20,R21
.even
_USB_INT1::
xcall push_lset
xcall push_gset1
.dbline -1
.dbline 665
; /*******************************************
; 函数名称: USB_INT1
; 功 能: D12中断服务函数
; 参 数: 无
; 返回值 : 无
; /********************************************/
; void USB_INT1(void)
; {
.dbline 668
; uint int_sta;
; uchar a,b;
; UEN_GINT(); //进入D12中断服务程序时关中断
bclr 7
.dbline 670
;
; USB_FLAG.in_isr = 1;//-----------------------------
ldi R24,1
sts _USB_FLAG+4,R24
.dbline 671
; int_sta=Read_IntR(); //读取PDIUSBD12中断寄存器值
xcall _Read_IntR
movw R20,R16
.dbline 676
; //a=int_sta;
; //b=int_sta>>8;
; //Uart_sendB(a);
; //Uart_sendB(b);
; if(int_sta!=0)
cpi R16,0
cpc R16,R17
breq L163
X1:
.dbline 677
; {
.dbline 678
; if(int_sta&INT_BUSRESET)
sbrs R20,6
rjmp L165
.dbline 679
; USB_FLAG.bus_reset=1; //USB总线复位标志
ldi R24,1
sts _USB_FLAG,R24
L165:
.dbline 680
; if(int_sta&INT_ENDP0IN)
sbrs R20,1
rjmp L167
.dbline 681
; Ep0_txdone(); //控制端点发送数据处理
xcall _Ep0_txdone
L167:
.dbline 682
; if(int_sta&INT_ENDP0OUT)
sbrs R20,0
rjmp L169
.dbline 683
; Ep0_rxdone(); //控制端点接收数据处理
xcall _Ep0_rxdone
L169:
.dbline 684
; if(int_sta&INT_ENDP1IN)
sbrs R20,3
rjmp L171
.dbline 685
; Ep1_txdone(); //端点 1发送数据处理
xcall _Ep1_txdone
L171:
.dbline 686
; if(int_sta&INT_ENDP1OUT)
sbrs R20,2
rjmp L173
.dbline 687
; Ep1_rxdone(); //端点 1接收数据处理
xcall _Ep1_rxdone
L173:
.dbline 688
; if(int_sta&INT_ENDP2IN)
sbrs R20,5
rjmp L175
.dbline 689
; Ep2_txdone(); //端点 2发送数据处理
xcall _Ep2_txdone
L175:
.dbline 690
; if(int_sta&INT_ENDP2OUT)
sbrs R20,4
rjmp L177
.dbline 691
; Ep2_rxdone(); //端点 2接收数据处理
xcall _Ep2_rxdone
L177:
.dbline 692
; }
L163:
.dbline 693
; USB_FLAG.in_isr = 0;
clr R2
sts _USB_FLAG+4,R2
.dbline 695
;
; EN_GINT(); //退出D12中断服务程序时开中断
bset 7
.dbline -2
.dbline 696
; }
L161:
xcall pop_gset1
xcall pop_lset
.dbline 0 ; func end
reti
.dbsym l b 1 c
.dbsym l a 1 c
.dbsym r int_sta 20 i
.dbend
.dbfunc e Ep0_rxdone _Ep0_rxdone fV
; i -> R20
; ep_last -> R20
.even
_Ep0_rxdone::
xcall push_gset1
sbiw R28,2
.dbline -1
.dbline 704
; /*******************************************
; 函数名称: Ep0_rxdone
; 功 能: 通过端点索引 0 接收数据
; 参 数: 无
; 返回值 : 无
; /********************************************/
; void Ep0_rxdone(void)
; {
.dbline 706
; uchar ep_last,i;
; ep_last=Read_LttransSta(0); //清除中断寄存器状态,取得最后处理状态
clr R16
xcall _Read_LttransSta
mov R20,R16
.dbline 707
; if (ep_last&SETUPPACKET)
sbrs R16,5
rjmp L181
.dbline 708
; { //如果收到了建立包(Setup包)
.dbline 709
; ControlData.wLength=0; //传输字节总数清0
clr R2
clr R3
sts _ControlData+8+1,R3
sts _ControlData+8,R2
.dbline 710
; ControlData.wCount=0; //传输字节计数器清0
sts _ControlData+10+1,R3
sts _ControlData+10,R2
.dbline 711
; if(Read_EP(0,sizeof(ControlData.DeviceRequest),(uchar * )(&(ControlData.DeviceRequest)))!= sizeof(DEVICE_REQUEST))//从端点0读8个字节失败
ldi R24,<_ControlData
ldi R25,>_ControlData
std y+0,R24
std y+1,R25
ldi R18,8
clr R16
xcall _Read_EP
cpi R16,8
breq L185
.dbline 712
; {
.dbline 713
; Set_EPsta(0,1); //停止控制端点0
ldi R18,1
clr R16
xcall _Set_EPsta
.dbline 714
; Set_EPsta(1,1); //停止控制端点1
ldi R18,1
ldi R16,1
xcall _Set_EPsta
.dbline 715
; USB_FLAG.control_state = USB_IDLE; //设置为等待状态
clr R2
sts _USB_FLAG+5,R2
.dbline 716
; return;
xjmp L180
L185:
.dbline 719
; }
; /******** 接收建立包成功 **********///-------------------------
; Ack_EP(0); //对控制端点0进行建立包应答
clr R16
xcall _Ack_EP
.dbline 720
; Ack_EP(1); //对控制端点1进行建立包应答
ldi R16,1
xcall _Ack_EP
.dbline 721
; ControlData.wLength=ControlData.DeviceRequest.wLength; //取出要传输数据的总字节数
lds R2,_ControlData+6
lds R3,_ControlData+6+1
sts _ControlData+8+1,R3
sts _ControlData+8,R2
.dbline 722
; ControlData.wCount = 0;//------------------------------
clr R2
clr R3
sts _ControlData+10+1,R3
sts _ControlData+10,R2
.dbline 724
;
; if(ControlData.DeviceRequest.bmRequestType&(uchar)USB_ENDPOINT_DIRECTION_MASK)
lds R2,_ControlData
sbrs R2,7
rjmp L191
.dbline 725
; {
.dbline 727
; //如果控制传输是控制读取
; USB_FLAG.setup_packet=1; //通知control_handler()处理Setup包
ldi R24,1
sts _USB_FLAG+2,R24
.dbline 728
; USB_FLAG.control_state=USB_TRANSMIT; //设置为发送状态
sts _USB_FLAG+5,R24
.dbline 729
; }
xjmp L182
L191:
.dbline 731
; else
; { //控制传输是控制写入
.dbline 732
; if(ControlData.DeviceRequest.wLength==0)
lds R2,_ControlData+6
lds R3,_ControlData+6+1
tst R2
brne L195
tst R3
brne L195
X2:
.dbline 733
; {
.dbline 734
; USB_FLAG.setup_packet=1; //通知control_handler()处理Setup包
ldi R24,1
sts _USB_FLAG+2,R24
.dbline 735
; USB_FLAG.control_state=USB_IDLE; //设置为等待状态
clr R2
sts _USB_FLAG+5,R2
.dbline 736
; }
xjmp L182
L195:
.dbline 738
; else
; {
.dbline 739
; if(ControlData.DeviceRequest.wLength>MAX_CTLDAT_SIZE)
ldi R24,8
ldi R25,0
lds R2,_ControlData+6
lds R3,_ControlData+6+1
cp R24,R2
cpc R25,R3
brsh L200
.dbline 740
; {
.dbline 742
; //数据长度出错
; USB_FLAG.control_state=USB_IDLE; //设置为等待状态
clr R2
sts _USB_FLAG+5,R2
.dbline 743
; Set_EPsta(0,1); //停止控制端点0
ldi R18,1
clr R16
xcall _Set_EPsta
.dbline 744
; Set_EPsta(1,1); //停止控制端点1
ldi R18,1
ldi R16,1
xcall _Set_EPsta
.dbline 745
; }
xjmp L182
L200:
.dbline 747
; else
; {
.dbline 748
; USB_FLAG.control_state=USB_RECEIVE; //设置为接收状态
ldi R24,2
sts _USB_FLAG+5,R24
.dbline 749
; }
.dbline 750
; }// set command with data
.dbline 751
; }// else set command
.dbline 752
; }// if setup packet
xjmp L182
L181:
.dbline 755
;
; /***** 下面为控制写入的数据阶段 ***************/
; else if(USB_FLAG.control_state==USB_RECEIVE)
lds R24,_USB_FLAG+5
cpi R24,2
brne L205
.dbline 756
; { //如果为接收状态
.dbline 757
; i=Read_EP(0,EP0_PACKET_SIZE,ControlData.dataBuffer+ControlData.wCount); //从端点0接收数据
ldi R24,<_ControlData+14
ldi R25,>_ControlData+14
lds R2,_ControlData+10
lds R3,_ControlData+10+1
add R2,R24
adc R3,R25
std y+0,R2
std y+1,R3
ldi R18,16
clr R16
xcall _Read_EP
mov R20,R16
.dbline 758
; ControlData.wCount+=i; //统计已接收的字节数
mov R2,R20
clr R3
lds R4,_ControlData+10
lds R5,_ControlData+10+1
add R4,R2
adc R5,R3
sts _ControlData+10+1,R5
sts _ControlData+10,R4
.dbline 759
; if(i!=EP0_PACKET_SIZE||ControlData.wCount>=ControlData.wLength)
cpi R16,16
brne L215
lds R2,_ControlData+8
lds R3,_ControlData+8+1
cp R4,R2
cpc R5,R3
brlo L206
L215:
.dbline 760
; { //数据接收完毕
.dbline 761
; USB_FLAG.setup_packet=1; //通知control_handler()处理Setup包
ldi R24,1
sts _USB_FLAG+2,R24
.dbline 762
; USB_FLAG.control_state=USB_IDLE; //设置为等待状态
clr R2
sts _USB_FLAG+5,R2
.dbline 763
; }
.dbline 764
; }
xjmp L206
L205:
.dbline 766
; else
; {
.dbline 767
; USB_FLAG.control_state = USB_IDLE; //设置等待状态
clr R2
sts _USB_FLAG+5,R2
.dbline 768
; }
L206:
L182:
.dbline -2
.dbline 769
; }
L180:
adiw R28,2
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r ep_last 20 c
.dbend
.dbfunc e Ep0_txdone _Ep0_txdone fV
; i -> R20,R21
.even
_Ep0_txdone::
xcall push_gset1
sbiw R28,2
.dbline -1
.dbline 777
; /*******************************************
; 函数名称: Ep0_txdone
; 功 能: 通过端点索引 0 发送数据
; 参 数: 无
; 返回值 : 无
; /********************************************/
; void Ep0_txdone(void)
; {
.dbline 778
; uint i=ControlData.wLength-ControlData.wCount; //计算未发送的字节数
lds R2,_ControlData+10
lds R3,_ControlData+10+1
lds R20,_ControlData+8
lds R21,_ControlData+8+1
sub R20,R2
sbc R21,R3
.dbline 780
;
; Read_LttransSta(1); //清除中断寄存器标志位
ldi R16,1
xcall _Read_LttransSta
.dbline 782
;
; if (USB_FLAG.control_state!=USB_TRANSMIT)
lds R24,_USB_FLAG+5
cpi R24,1
breq L222
.dbline 783
; { //非发送状态
.dbline 784
; return; //返回
xjmp L219
L222:
.dbline 786
; }
; if(i>=EP0_PACKET_SIZE)
cpi R20,16
ldi R30,0
cpc R21,R30
brlo L225
.dbline 787
; { //未发送字节数大于16,发送16个字节
.dbline 788
; Write_EP(1,EP0_PACKET_SIZE,ControlData.pData+ControlData.wCount);
lds R2,_ControlData+12
lds R3,_ControlData+12+1
lds R4,_ControlData+10
lds R5,_ControlData+10+1
add R4,R2
adc R5,R3
std y+0,R4
std y+1,R5
ldi R18,16
ldi R16,1
xcall _Write_EP
.dbline 789
; ControlData.wCount+= EP0_PACKET_SIZE;
lds R24,_ControlData+10
lds R25,_ControlData+10+1
adiw R24,16
sts _ControlData+10+1,R25
sts _ControlData+10,R24
.dbline 790
; USB_FLAG.control_state=USB_TRANSMIT;
ldi R24,1
sts _USB_FLAG+5,R24
.dbline 791
; }
xjmp L226
L225:
.dbline 792
; else if(i!=0)
cpi R20,0
cpc R20,R21
breq L231
X3:
.dbline 793
; { //发送所有未发送的字节
.dbline 794
; Write_EP(1,i,ControlData.pData+ControlData.wCount);
lds R2,_ControlData+12
lds R3,_ControlData+12+1
lds R4,_ControlData+10
lds R5,_ControlData+10+1
add R4,R2
adc R5,R3
std y+0,R4
std y+1,R5
mov R18,R20
ldi R16,1
xcall _Write_EP
.dbline 795
; ControlData.wCount+=i;
lds R2,_ControlData+10
lds R3,_ControlData+10+1
add R2,R20
adc R3,R21
sts _ControlData+10+1,R3
sts _ControlData+10,R2
.dbline 796
; USB_FLAG.control_state=USB_IDLE; //置状态为等待状态
clr R2
sts _USB_FLAG+5,R2
.dbline 797
; }
xjmp L232
L231:
.dbline 798
; else if (i == 0)
cpi R20,0
cpc R20,R21
brne L237
X4:
.dbline 799
; {
.dbline 800
; Write_EP(1, 0, 0); //发送完毕,发0个字节
clr R2
clr R3
std y+0,R2
std y+1,R3
clr R18
ldi R16,1
xcall _Write_EP
.dbline 801
; USB_FLAG.control_state = USB_IDLE;
clr R2
sts _USB_FLAG+5,R2
.dbline 802
; }
L237:
L232:
L226:
.dbline -2
.dbline 803
; }
L219:
adiw R28,2
xcall pop_gset1
.dbline 0 ; fu
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -