📄 d12isr.s
字号:
.module D12ISR.c
.area text(rom, con, rel)
.dbfile G:\source\D12ISR.c
.dbfunc s D12_ISR _D12_ISR fI
; j -> R22
; i -> R20
.even
_D12_ISR::
rcall push_gset2
.dbline -1
.dbline 51
; /*++
;
; Module Name:
;
; D12ISR.c
;
; Abstract:
;
; Header file related to D12 module
;
; Environment:
;
; ICCAVR 6.29
;
; Revision History:
;
; 04/23/2004 chenchi created
;
; --*/
; /******************************************************************/
; #include "io8515v.h"
; #include "d12.h"
; /************************************************************
; **工程名称:U盘固件程序开发
; **编译器类型及版本:ICCAVR 6.26C
; **日期:2004.4.30
; **创建人:陈驰
; **所属单位:湖南大学计算机与通信学院
;
; **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0
; **时钟频率:8MHZ
;
; **函数功能:中断服务处理
; **函数输入参数及说明:无
;
; **函数返回值:无
; **在本函数以外定义的变量:D12_COMMAND,D12_DATA
; **调用的函数说明:
; Setup_control():枚举控制函数
; USB_submit():控制端点提交函数
; Bulk_Out_Pack(j):处理PC发送的批量传输包
; Bulk_In_Packet():回应批量传输包
; void bus_reset(void):总线重置
; void dma_eot(void):Dma 操作结束
;
; **修改人:陈驰
; **修改日期:2004.4.30
; **修改说明:创建
; *************************************************************/
; void D12_ISR(void)
; {
.dbline 53
; unsigned char i,j;
; D12_COMMAND = 0xf4;// 读中断寄存器
ldi R24,244
sts 31745,R24
.dbline 54
; cwait1;
nop
.dbline 54
nop
.dbline 55
; i=D12_DATA;//读取数据赋值给局部变量i
lds R20,31744
.dbline 56
; csram;
sts 0xfc01,R22
.dbline 56
.dbline 57
; if(i & 0x01)//处理控制输出端点
sbrs R20,0
rjmp L3
.dbline 58
; {
.dbline 59
; D12_COMMAND = 0x40;//读最后状态
ldi R24,64
sts 31745,R24
.dbline 60
; cwait1;
nop
.dbline 60
nop
.dbline 61
; i= D12_DATA;//从端点缓冲区读取数据
lds R20,31744
.dbline 62
; csram;
sts 0xfc01,R22
.dbline 62
.dbline 63
; if (i & 0x20) //收到SETUP包
sbrs R20,5
rjmp L4
.dbline 64
; {
.dbline 65
; Setup_control();//枚举控制函数
rcall _Setup_control
.dbline 66
; }
.dbline 67
rjmp L4
L3:
.dbline 67
; }else if(i & 0x02)//处理控制输入端点
sbrs R20,1
rjmp L7
.dbline 68
; {
.dbline 69
; D12_COMMAND = 0x41;//读最后状态
ldi R24,65
sts 31745,R24
.dbline 70
; cwait1;
nop
.dbline 70
nop
.dbline 71
; i = D12_DATA;//从端点缓冲区读取数据
lds R20,31744
.dbline 72
; csram;
sts 0xfc01,R22
.dbline 72
.dbline 73
; USB_submit();//控制端点提交函数
rcall _USB_submit
.dbline 74
rjmp L8
L7:
.dbline 74
; }else if(i & 0x04)//处理端点1输出
sbrs R20,2
rjmp L9
.dbline 75
; {
.dbline 77
rjmp L10
L9:
.dbline 77
;
; }else if(i & 0x08)//处理端点1输入
sbrs R20,3
rjmp L11
.dbline 78
; {
.dbline 80
rjmp L12
L11:
.dbline 80
;
; }else if(i & 0x10)//处理批量输出端点
sbrs R20,4
rjmp L13
.dbline 81
; {
.dbline 82
; D12_COMMAND = 0x44;//读最后状态
ldi R24,68
sts 31745,R24
.dbline 83
; cwait;
nop
.dbline 84
; i = D12_DATA;
lds R20,31744
.dbline 85
; csram;
sts 0xfc01,R22
.dbline 85
.dbline 86
; D12_COMMAND = 0x04;//选择端点(指针指向0位置)
ldi R24,4
sts 31745,R24
.dbline 87
; cwait;
nop
.dbline 88
; D12_COMMAND = 0xf0;//读缓冲区
ldi R24,240
sts 31745,R24
.dbline 96
; /****************************
; 缓冲区数据结构:
; 字节1:保留,可为任意值
; 字节2:数据字节的数目/长度
; 字节3:数据字节1
; 字节4:数据字节2
; *****************************/
; cwait1;
nop
.dbline 96
nop
.dbline 97
; j=D12_DATA;//字节1
lds R22,31744
.dbline 98
; cwait1;
nop
.dbline 98
nop
.dbline 99
; j=D12_DATA;//字节2
lds R22,31744
.dbline 100
; csram;
sts 0xfc01,R22
.dbline 100
.dbline 101
; Bulk_Out_Packet(j);//处理PC发送的批量传输包
mov R16,R22
clr R17
rcall _Bulk_Out_Packet
.dbline 102
rjmp L14
L13:
.dbline 102
; }else if(i & 0x20)//处理批量输入端点
sbrs R20,5
rjmp L15
.dbline 103
; {
.dbline 104
; D12_COMMAND = 0x45;//读 in 最后状态
ldi R24,69
sts 31745,R24
.dbline 105
; cwait1;
nop
.dbline 105
nop
.dbline 106
; i = D12_DATA;
lds R20,31744
.dbline 107
; cwait1;
nop
.dbline 107
nop
.dbline 108
; csram;
sts 0xfc01,R22
.dbline 108
.dbline 109
; Bulk_In_Packet();//回应批量传输包
rcall _Bulk_In_Packet
.dbline 110
rjmp L16
L15:
.dbline 110
; }else if(i & 0x80)//D12_INT_SUSPENDCHANGE D12挂起
sbrs R20,7
rjmp L17
.dbline 111
; {
.dbline 113
rjmp L18
L17:
.dbline 113
;
; }else if(i & 0x40)//D12_INT_BUSRESET总线复位
sbrs R20,6
rjmp L19
.dbline 114
; {
.dbline 115
; bus_reset();//总线重置
rcall _bus_reset
.dbline 116
; }else
rjmp L20
L19:
.dbline 117
; {
.dbline 118
; i=D12_DATA; //D12_INT_EOT DMA操作已结束
lds R20,31744
.dbline 119
; if(i & 0x01)
sbrs R20,0
rjmp L21
.dbline 120
; {
.dbline 121
; dma_eot();//Dma 操作结束
rcall _dma_eot
.dbline 122
; }
L21:
.dbline 123
; }
L20:
L18:
L16:
L14:
L12:
L10:
L8:
L4:
.dbline -2
.dbline 124
; }
L2:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r j 22 c
.dbsym r i 20 c
.dbfunc s bus_reset _bus_reset fI
.even
_bus_reset::
.dbline -1
.dbline 127
;
; void bus_reset(void)//总线重置函数
; {
.dbline -2
.dbline 128
; }
L23:
.dbline 0 ; func end
ret
.dbfunc s dma_eot _dma_eot fI
.even
_dma_eot::
.dbline -1
.dbline 131
;
; void dma_eot(void)//Dma 操作结束函数
; {
.dbline -2
.dbline 132
; }
L24:
.dbline 0 ; func end
ret
.dbfunc s USB_submit _USB_submit fI
; j -> R16
; k -> R18
; i -> R20
.even
_USB_submit::
rcall push_gset1
.dbline -1
.dbline 155
; /************************************************************
; **工程名称:U盘固件程序开发
; **编译器类型及版本:ICCAVR 6.26C
; **日期:2004.4.30
; **创建人:陈驰
; **所属单位:湖南大学计算机与通信学院
;
; **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0
; **时钟频率:8MHZ
;
; **函数功能:控制端点传输提交
; **函数输入参数及说明:无
;
; **函数返回值:无
; **在本函数以外定义的变量:传输结构体
; **调用的函数说明:无
;
; **修改人:陈驰
; **修改日期:2004.4.30
; **修改说明:创建
; *************************************************************/
; void USB_submit(void)
; {
.dbline 163
; unsigned char i,j,k;
; /*********说明******************
; D12芯片数据手册上说明控制端点
; 缓冲区大小为16BYTES,使用时试用
; 64BYTES可以完成传输,这里故用64
; 来处理
; *******************************/
; if(64 > XmtBuff.wrLength)
lds R3,_XmtBuff+64+1
lds R2,_XmtBuff+64
ldi R24,64
ldi R25,0
cp R2,R24
cpc R3,R25
brsh L26
.dbline 164
; {
.dbline 165
; j = XmtBuff.wrLength;
mov R16,R2
mov R17,R3
.dbline 166
; }else
rjmp L27
L26:
.dbline 167
; {
.dbline 168
; j = 64;
ldi R16,64
.dbline 169
; }
L27:
.dbline 170
; D12_COMMAND = 0x01;//选择端点(指针指向0位置)
ldi R24,1
sts 31745,R24
.dbline 171
; cwait;
nop
.dbline 172
; D12_COMMAND = 0xf0;//写缓冲区
ldi R24,240
sts 31745,R24
.dbline 173
; cwait;
nop
.dbline 181
; /****************************
; 缓冲区数据结构:
; 字节1:保留,可为任意值
; 字节2:数据字节的数目/长度
; 字节3:数据字节1
; 字节4:数据字节2
; *****************************/
; D12_DATA = 0x00;//写字节1
clr R2
sts 31744,R2
.dbline 182
; cwait;
nop
.dbline 183
; D12_DATA = j;//写字节2
sts 31744,R16
.dbline 184
; csram;
sts 0xfc01,R22
.dbline 184
.dbline 185
; for(i=0;i<j;i++)
clr R20
rjmp L33
L30:
.dbline 186
.dbline 187
lds R3,_XmtBuff+66+1
lds R2,_XmtBuff+66
mov R4,R20
clr R5
add R4,R2
adc R5,R3
mov R30,R4
mov R31,R5
lpm
mov R18,R0
.dbline 188
sts 31744,R18
.dbline 189
sts 0xfc01,R22
.dbline 189
.dbline 190
L31:
.dbline 185
inc R20
L33:
.dbline 185
cp R20,R16
brlo L30
.dbline 191
; {
; k = *(XmtBuff.pp+i);
; D12_DATA = k;//写数据字节
; csram;
; }
; XmtBuff.pp += j;
lds R3,_XmtBuff+66+1
lds R2,_XmtBuff+66
mov R4,R16
clr R5
add R4,R2
adc R5,R3
sts _XmtBuff+66+1,R5
sts _XmtBuff+66,R4
.dbline 192
; XmtBuff.wrLength -= j;
mov R2,R16
clr R3
lds R5,_XmtBuff+64+1
lds R4,_XmtBuff+64
sub R4,R2
sbc R5,R3
sts _XmtBuff+64+1,R5
sts _XmtBuff+64,R4
.dbline 193
; D12_COMMAND = 0xfa;//设置缓冲区有效(满标志)
ldi R24,250
sts 31745,R24
.dbline 194
; csram;
sts 0xfc01,R22
.dbline 194
.dbline -2
.dbline 195
; }
L25:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r j 16 c
.dbsym r k 18 c
.dbsym r i 20 c
.dbfunc s BULK_submit _BULK_submit fI
; j -> R16
; k -> R18
; i -> R20
.even
_BULK_submit::
rcall push_gset1
.dbline -1
.dbline 218
; /************************************************************
; **工程名称:U盘固件程序开发
; **编译器类型及版本:ICCAVR 6.26C
; **日期:2004.4.30
; **创建人:陈驰
; **所属单位:湖南大学计算机与通信学院
;
; **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0
; **时钟频率:8MHZ
;
; **函数功能:BULK端点传输提交
; **函数输入参数及说明:无
;
; **函数返回值:无
; **在本函数以外定义的变量:传输结构体
; **调用的函数说明:
;
; **修改人:陈驰
; **修改日期:2004.4.30
; **修改说明:创建
; *************************************************************/
; void BULK_submit(void)
; {
.dbline 220
; unsigned char i,j,k;
; if(64 > XmtBuff.wrLength)
lds R3,_XmtBuff+64+1
lds R2,_XmtBuff+64
ldi R24,64
ldi R25,0
cp R2,R24
cpc R3,R25
brsh L38
.dbline 221
; {
.dbline 222
; j = XmtBuff.wrLength;
mov R16,R2
mov R17,R3
.dbline 223
; }else
rjmp L39
L38:
.dbline 224
; {
.dbline 225
; j = 64;
ldi R16,64
.dbline 226
; }
L39:
.dbline 227
; D12_COMMAND = 0x05;// 选择端点(指针指向0位置)
ldi R24,5
sts 31745,R24
.dbline 228
; cwait;
nop
.dbline 229
; D12_COMMAND = 0xf0;// 写缓冲区
ldi R24,240
sts 31745,R24
.dbline 230
; cwait;
nop
.dbline 238
; /****************************
; 缓冲区数据结构:
; 字节1:保留,可为任意值
; 字节2:数据字节的数目/长度
; 字节3:数据字节1
; 字节4:数据字节2
; *****************************/
; D12_DATA = 0x00;//写字节1
clr R2
sts 31744,R2
.dbline 239
; cwait;
nop
.dbline 240
; D12_DATA = j;//写字节2
sts 31744,R16
.dbline 241
; csram;
sts 0xfc01,R22
.dbline 241
.dbline 247
; /*****************************
; 判断输出
; XmtBuff.p_p = 0:输出一般数据
; XmtBuff.p_p = 1:输出CONST数据
; ******************************/
; if(XmtBuff.p_p)
lds R2,_XmtBuff+70
tst R2
breq L42
.dbline 248
; {
.dbline 249
; for(i=0;i<j ;i++)
clr R20
rjmp L48
L45:
.dbline 250
.dbline 251
lds R3,_XmtBuff+66+1
lds R2,_XmtBuff+66
mov R4,R20
clr R5
add R4,R2
adc R5,R3
mov R30,R4
mov R31,R5
lpm
mov R18,R0
.dbline 252
sts 31744,R18
.dbline 253
sts 0xfc01,R22
.dbline 253
.dbline 254
L46:
.dbline 249
inc R20
L48:
.dbline 249
cp R20,R16
brlo L45
.dbline 255
; {
; k = *(XmtBuff.pp+i);
; D12_DATA = k;//写数据字节
; csram;
; }
; XmtBuff.pp += j;
lds R3,_XmtBuff+66+1
lds R2,_XmtBuff+66
mov R4,R16
clr R5
add R4,R2
adc R5,R3
sts _XmtBuff+66+1,R5
sts _XmtBuff+66,R4
.dbline 256
; }else
rjmp L43
L42:
.dbline 257
; {
.dbline 258
; for(i=0;i<j;i++)
clr R20
rjmp L54
L51:
.dbline 259
.dbline 260
lds R3,_XmtBuff+68+1
lds R2,_XmtBuff+68
mov R30,R20
clr R31
add R30,R2
adc R31,R3
ldd R18,z+0
.dbline 261
sts 31744,R18
.dbline 262
sts 0xfc01,R22
.dbline 262
.dbline 263
L52:
.dbline 258
inc R20
L54:
.dbline 258
cp R20,R16
brlo L51
.dbline 264
; {
; k = *(XmtBuff.p+i);
; D12_DATA = k;//写数据字节
; csram;
; }
; XmtBuff.p += j;
lds R3,_XmtBuff+68+1
lds R2,_XmtBuff+68
mov R4,R16
clr R5
add R4,R2
adc R5,R3
sts _XmtBuff+68+1,R5
sts _XmtBuff+68,R4
.dbline 265
; }
L43:
.dbline 266
; XmtBuff.wrLength -= j;
mov R2,R16
clr R3
lds R5,_XmtBuff+64+1
lds R4,_XmtBuff+64
sub R4,R2
sbc R5,R3
sts _XmtBuff+64+1,R5
sts _XmtBuff+64,R4
.dbline 267
; D12_COMMAND = 0xfa;// 设置 IN 缓冲区有效(满标志)
ldi R24,250
sts 31745,R24
.dbline 268
; csram;
sts 0xfc01,R22
.dbline 268
.dbline -2
.dbline 269
; }
L37:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r j 16 c
.dbsym r k 18 c
.dbsym r i 20 c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -