📄 usbd12.s
字号:
xcall _OutB
.dbline 451
; Delayus(5);
ldi R16,5
ldi R17,0
xcall _Delayus
.dbline 452
; status=InB( );
xcall _InB
mov R20,R16
.dbline 453
; return status; //读取状态
.dbline -2
L96:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r status 20 c
.dbsym r endp 20 c
.dbend
.dbfunc e Set_EPsta _Set_EPsta fV
; stall -> R20
; endp -> R22
.even
_Set_EPsta::
xcall push_gset2
mov R20,R18
mov R22,R16
.dbline -1
.dbline 463
; }
; /*******************************************
; 函数名称: Set_EPsta
; 功 能: 设置端点状态
; 参 数: endp--端点索引号,取值0 ~ 5
; stall--设置状态值
; 返回值 : 无
; /********************************************/
; void Set_EPsta(uchar endp,uchar stall)
; {
.dbline 464
; if(USB_FLAG.in_isr == 0)
lds R2,_USB_FLAG+4
tst R2
brne L98
.dbline 465
; UEN_GINT();
bclr 7
L98:
.dbline 467
mov R18,R22
subi R18,192 ; addi 64
ldi R16,1
xcall _OutB
.dbline 468
ldi R16,1
ldi R17,0
xcall _Delayus
.dbline 469
mov R18,R20
ldi R16,1
xcall _OutB
.dbline 471
lds R2,_USB_FLAG+4
tst R2
brne L101
.dbline 472
bset 7
L101:
.dbline -2
.dbline 473
;
; OutB(CMD,0x40+endp); //发送设置端点状态命令
; Delayus(1);
; OutB(CMD,stall); //设置端点状态
;
; if(USB_FLAG.in_isr == 0)
; EN_GINT();
; }
L97:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r stall 20 c
.dbsym r endp 22 c
.dbend
.dbfunc e Set_Sresume _Set_Sresume fV
.even
_Set_Sresume::
.dbline -1
.dbline 481
; /*******************************************
; 函数名称: Set_Sresume
; 功 能: 设置发送恢复
; 参 数: 无
; 返回值 : 无
; /********************************************/
; void Set_Sresume(void)
; {
.dbline 482
; OutB(CMD,0xF6); //设置发送恢复
ldi R18,246
ldi R16,1
.dbline -2
.dbline 483
; }
L104:
.dbline 0 ; func end
xjmp _OutB
.dbend
.dbfunc e Read_EP _Read_EP fc
; num -> R20
; i -> R22
; buf -> R10,R11
; len -> R22
; endp -> R20
.even
_Read_EP::
xcall push_gset3
mov R22,R18
mov R20,R16
ldd R10,y+6
ldd R11,y+7
.dbline -1
.dbline 493
; /*******************************************
; 函数名称: Read_EP
; 功 能: 读取端点数据
; 参 数: endp--端点索引号,取值 0 ~ 5
; len--要读取的数据长度
; buf--接收数据指针
; 返回值 : num--实际读到的字节数
; /********************************************/
; uchar Read_EP(uchar endp,uchar len,uchar * buf)
; {
.dbline 496
; uchar i,num;
;
; if(USB_FLAG.in_isr == 0)
lds R2,_USB_FLAG+4
tst R2
brne L106
.dbline 497
; UEN_GINT();
bclr 7
L106:
.dbline 499
;
; OutB(CMD,endp); //发送选择端点命令
mov R18,R20
ldi R16,1
xcall _OutB
.dbline 500
; Delayus(1);
ldi R16,1
ldi R17,0
xcall _Delayus
.dbline 501
; if((InB( )&FULLEMPTY)==0)
xcall _InB
sbrc R16,0
rjmp L109
.dbline 502
; { //如果缓冲区为空----------------------------------------
.dbline 503
; if(USB_FLAG.in_isr == 0)
lds R2,_USB_FLAG+4
tst R2
brne L111
.dbline 504
; EN_GINT();
bset 7
L111:
.dbline 505
; return 0; //则返回读到0字节
clr R16
xjmp L105
L109:
.dbline 508
; }
;
; OutB(CMD,0xF0); //发送读缓冲区命令
ldi R18,240
ldi R16,1
xcall _OutB
.dbline 509
; Delayus(1);
ldi R16,1
ldi R17,0
xcall _Delayus
.dbline 510
; num=InB( ); //读取保留字节
xcall _InB
.dbline 511
; num=InB( ); //读取数据字节的数目/长度
xcall _InB
mov R20,R16
.dbline 513
;
; if(num>len) //如果大于要求读的字节数目
cp R22,R16
brsh L114
.dbline 514
; {
.dbline 515
; num=len; //则只读取要求的字节长度
mov R20,R22
.dbline 516
; }
L114:
.dbline 517
; for(i=0; i<num; i++)
clr R22
xjmp L119
L116:
.dbline 518
xcall _InB
mov R30,R22
clr R31
add R30,R10
adc R31,R11
std z+0,R16
L117:
.dbline 517
inc R22
L119:
.dbline 517
cp R22,R20
brlo L116
.dbline 520
; *(buf+i)=InB( ); //读取要求的字节数目/长度
;
; OutB(CMD,0xF2); //清缓冲区,新的信息包才可以重新被接受
ldi R18,242
ldi R16,1
xcall _OutB
.dbline 522
;
; if(USB_FLAG.in_isr == 0)
lds R2,_USB_FLAG+4
tst R2
brne L120
.dbline 523
; EN_GINT();
bset 7
L120:
.dbline 525
;
; return num; //返回读到的字节数
mov R16,R20
.dbline -2
L105:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r num 20 c
.dbsym r i 22 c
.dbsym r buf 10 pc
.dbsym r len 22 c
.dbsym r endp 20 c
.dbend
.dbfunc e Write_EP _Write_EP fc
; i -> R20
; buf -> R22,R23
; len -> R10
; endp -> R20
.even
_Write_EP::
xcall push_gset3
mov R10,R18
mov R20,R16
ldd R22,y+6
ldd R23,y+7
.dbline -1
.dbline 536
; }
; /*******************************************
; 函数名称: Write_EP
; 功 能: 将数据写入端点
; 参 数: endp--端点索引号,取值 0 ~ 5
; len--要写入的数据长度
; buf--发送数据指针
; 返回值 : num--实际写入的字节数
; /********************************************/
; uchar Write_EP(uchar endp,uchar len,uchar * buf)
; {
.dbline 539
; uchar i;
;
; if(USB_FLAG.in_isr == 0)
lds R2,_USB_FLAG+4
tst R2
brne L124
.dbline 540
; UEN_GINT();
bclr 7
L124:
.dbline 542
;
; OutB(CMD,endp); //发送选择端点命令
mov R18,R20
ldi R16,1
xcall _OutB
.dbline 543
; Delayus(1);
ldi R16,1
ldi R17,0
xcall _Delayus
.dbline 544
; i=InB( ); //可选地读取一个字节
xcall _InB
.dbline 546
;
; OutB(CMD,0xF0); //发送写缓冲区命令
ldi R18,240
ldi R16,1
xcall _OutB
.dbline 547
; Delayus(1);
ldi R16,1
ldi R17,0
xcall _Delayus
.dbline 548
; OutB(DAT,0); //写入一个保留字节
clr R18
clr R16
xcall _OutB
.dbline 549
; Delayus(1);
ldi R16,1
ldi R17,0
xcall _Delayus
.dbline 550
; OutB(DAT,len); //写入即将写入的字节数目
mov R18,R10
clr R16
xcall _OutB
.dbline 551
; Delayus(1);
ldi R16,1
ldi R17,0
xcall _Delayus
.dbline 553
;
; for(i=0; i<len; i++)
clr R20
xjmp L130
L127:
.dbline 554
.dbline 555
mov R30,R20
clr R31
add R30,R22
adc R31,R23
ldd R18,z+0
clr R16
xcall _OutB
.dbline 556
L128:
.dbline 553
inc R20
L130:
.dbline 553
cp R20,R10
brlo L127
.dbline 557
; {
; OutB(DAT,*(buf+i)); //写入指定的字节
; }
; Delayus(1);
ldi R16,1
ldi R17,0
xcall _Delayus
.dbline 558
; OutB(CMD,0xFA); //使缓冲区有效
ldi R18,250
ldi R16,1
xcall _OutB
.dbline 560
;
; if(USB_FLAG.in_isr == 0)
lds R2,_USB_FLAG+4
tst R2
brne L131
.dbline 561
; EN_GINT();
bset 7
L131:
.dbline 563
;
; return len; //返回写入的字节数
mov R16,R10
.dbline -2
L123:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r buf 22 pc
.dbsym r len 10 c
.dbsym r endp 20 c
.dbend
.dbfunc e Ack_EP _Ack_EP fV
; endp -> R20
.even
_Ack_EP::
xcall push_gset1
mov R20,R16
.dbline -1
.dbline 572
.dbline 573
mov R18,R20
ldi R16,1
xcall _OutB
.dbline 574
ldi R16,1
ldi R17,0
xcall _Delayus
.dbline 575
ldi R18,241
ldi R16,1
xcall _OutB
.dbline 576
ldi R16,1
ldi R17,0
xcall _Delayus
.dbline 577
tst R20
brne L135
.dbline 578
.dbline 579
ldi R18,242
ldi R16,1
xcall _OutB
.dbline 580
L135:
.dbline -2
.dbline 581
; }
; /*******************************************
; 函数名称: Ack_EP
; 功 能: 应答Setup
; 参 数: endp--端点索引号,取值 0 ~ 5
; 返回值 : 无
; /********************************************/
; void Ack_EP(uchar endp)
; {
; OutB(CMD,endp); //选择端点
; Delayus(1);
; OutB(CMD,0xF1); //应答Setup指令
; Delayus(1);
; if(endp==0)
; {
; OutB(CMD,0xF2); //清空该端点缓冲区
; }
; }
L134:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r endp 20 c
.dbend
.dbfunc e Clear_buf _Clear_buf fV
; endp -> R20
.even
_Clear_buf::
xcall push_gset1
mov R20,R16
.dbline -1
.dbline 589
.dbline 590
mov R18,R20
ldi R16,1
xcall _OutB
.dbline 591
ldi R16,1
ldi R17,0
xcall _Delayus
.dbline 592
ldi R18,242
ldi R16,1
xcall _OutB
.dbline 594
cpi R20,4
brlo L138
.dbline 595
.dbline 596
mov R18,R20
ldi R16,1
xcall _OutB
.dbline 597
ldi R16,1
ldi R17,0
xcall _Delayus
.dbline 598
ldi R18,242
ldi R16,1
xcall _OutB
.dbline 599
L138:
.dbline -2
.dbline 600
; /*******************************************
; 函数名称: Clear_buf
; 功 能: 清指定端点的缓冲区(包括双缓冲区)
; 参 数: endp--端点索引号,取值 0 ~ 5
; 返回值 : 无
; /********************************************/
; void Clear_buf(uchar endp)
; {
; OutB(CMD,endp); //选择端点
; Delayus(1);
; OutB(CMD,0xF2); //清空第1个缓冲区
;
; if (endp>=4)
; {
; OutB(CMD,endp); //选择端点
; Delayus(1);
; OutB(CMD,0xF2); //清空第2个缓冲区
; }
; }
L137:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r endp 20 c
.dbend
.dbfunc e Stall_ep0 _Stall_ep0 fV
.even
_Stall_ep0::
.dbline -1
.dbline 608
; /*******************************************
; 函数名称: Stall_ep0
; 功 能: 使控制端点处于停止状态
; 参 数: 无
; 返回值 : 无
; /********************************************/
; void Stall_ep0(void)
; {
.dbline 609
; Set_EPsta(0,1);
ldi R18,1
clr R16
xcall _Set_EPsta
.dbline 610
; Set_EPsta(1,1);
ldi R18,1
ldi R16,1
.dbline -2
.dbline 611
; }
L140:
.dbline 0 ; func end
xjmp _Set_EPsta
.dbend
.dbfunc e S_trans _S_trans fV
; len -> R20
; buf -> R22,R23
.even
_S_trans::
xcall push_gset2
mov R20,R18
movw R22,R16
sbiw R28,2
.dbline -1
.dbline 620
.dbline 621
ldi R24,16
cp R24,R20
brlo L142
.dbline 622
.dbline 623
std y+0,R22
std y+1,R23
mov R18,R20
ldi R16,1
xcall _Write_EP
.dbline 624
L142:
.dbline -2
.dbline 625
; /*******************************************
; 函数名称: S_trans
; 功 能: 通过端点索引 1 发送数据(DATA 类型)
; 参 数: buf--发送数据指针
; len--发送数据长度
; 返回值 : 无
; /********************************************/
; void S_trans(uchar * buf, uchar len)
; {
; if(len<=EP0_PACKET_SIZE)
; { //长度小于EP0最大信息包大小才允许发送
; Write_EP(1,len,buf);
; }
; }
L141:
adiw R28,2
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r len 20 c
.dbsym r buf 22 pc
.dbend
.dbfunc e Code_trans _Code_trans fV
; len -> R22,R23
; pRomData -> R20,R21
.even
_Code_trans::
xcall push_gset2
movw R22,R18
movw R20,R16
sbiw R28,2
.dbline -1
.dbline 634
; /*******************************************
; 函数名称: Code_trans
; 功 能: 通过端点索引 1 发送数据(CODE类型)
; 参 数: buf--发送数据指针
; len--发送数据长度
; 返回值 : 无
; /********************************************/
; void Code_trans(uchar *pRomData, uint len)
; {
.dbline 635
; ControlData.wCount = 0; //传输字节数计数器清0
clr R2
clr R3
sts _ControlData+10+1,R3
sts _ControlData+10,R2
.dbline 636
; if(ControlData.wLength > len)
lds R2,_ControlData+8
lds R3,_ControlData+8+1
cp R22,R2
cpc R23,R3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -