📄 twain.lst
字号:
18 =1 */
19 =1
20 =1
21 =1 #ifndef __CHAP_9_H__
22 =1 #define __CHAP_9_H__
23 =1
24 =1 /*
25 =1 //*************************************************************************
26 =1 // USB Protocol Layer
27 =1 //*************************************************************************
28 =1 */
29 =1
30 =1 /*
31 =1 //*************************************************************************
C51 COMPILER V8.02 TWAIN 07/24/2007 14:12:03 PAGE 15
32 =1 // USB standard device requests
33 =1 //*************************************************************************
34 =1 */
35 =1 void get_status(void);
36 =1 void clear_feature(void);
37 =1 void set_feature(void);
38 =1 void set_address(void);
39 =1 void get_descriptor(void);
40 =1 void get_configuration(void);
41 =1 void set_configuration(void);
42 =1 void get_interface(void);
43 =1 void set_interface(void);
44 =1
45 =1 void reserved(void);
46 =1
47 =1 #endif
32
33 extern CONTROL_XFER ControlData;
34 extern IO_REQUEST idata ioRequest;
35 extern EPPFLAGS bEPPflags;
36
37 unsigned char idata TwainFileNumber = 0, idata TwainCurrentFile = 0;
38 unsigned long idata TwainFileSize;
39
40 void get_firmware_version()
41 {
42 1 unsigned char i;
43 1
44 1 #ifndef __C51__
i = 0x01; // firmware version number, return 0x01 for PC kit version 1
#else
47 1 i = 0x21; // firmware version number, return 0x11 for PC kit using 8052, 0x21 for USB-EPP
48 1 #endif
49 1 single_transmit((unsigned char *)&i, 1);
50 1 }
51
52 void get_twain_request()
53 {
54 1 if(ControlData.DeviceRequest.wValue == 0 &&
55 1 ControlData.DeviceRequest.wLength == 1) // get file number
56 1 single_transmit((unsigned char *)&TwainFileNumber, 1);
57 1 if(ControlData.DeviceRequest.wValue == 1 &&
58 1 ControlData.DeviceRequest.wLength == 1) // get current file
59 1 single_transmit((unsigned char *)&TwainCurrentFile, 1);
60 1 else if(ControlData.DeviceRequest.wValue == 2 &&
61 1 ControlData.DeviceRequest.wLength == 4) // get file size
62 1 single_transmit((unsigned char *)&TwainFileSize, 4);
63 1 else
64 1 stall_ep0();
65 1 }
66
67 void set_twain_request()
68 {
69 1 if(ControlData.DeviceRequest.wValue == 1 &&
70 1 ControlData.DeviceRequest.wLength == 1) {// set current file
71 2 TwainCurrentFile = ControlData.dataBuffer[0];
72 2 single_transmit(0, 0);
73 2 }
74 1 else if(ControlData.DeviceRequest.wValue == 2 &&
75 1 ControlData.DeviceRequest.wLength == 4) { // set file size
76 2 memcpy((unsigned char *)&TwainFileSize,
77 2 ControlData.dataBuffer,
C51 COMPILER V8.02 TWAIN 07/24/2007 14:12:03 PAGE 16
78 2 ControlData.DeviceRequest.wLength);
79 2 TwainFileNumber = 1;
80 2 single_transmit(0, 0);
81 2 }
82 1 else if(ControlData.DeviceRequest.wValue == 6 &&
83 1 ControlData.DeviceRequest.wLength == 1) { // clear all
84 2 TwainFileNumber = 0;
85 2 single_transmit(0, 0);
86 2 }
87 1 else
88 1 stall_ep0();
89 1 }
90
91 void setup_dma_request()
92 {
93 1 #ifndef __C51__
unsigned long offset;
#else
96 1 unsigned char offset;
97 1 #endif
98 1
99 1 memcpy((unsigned char *)&ioRequest + ControlData.DeviceRequest.wValue,
100 1 ControlData.dataBuffer,
101 1 ControlData.DeviceRequest.wLength);
102 1
103 1 ioRequest.uSize = SWAP(ioRequest.uSize);
104 1 ioRequest.uAddressL = SWAP(ioRequest.uAddressL);
105 1
106 1 if(ioRequest.uSize > DMA_BUFFER_SIZE) { // Unaccepted request
107 2 stall_ep0();
108 2 }
109 1 else {
110 2
111 2 if(bEPPflags.bits.dma_state == DMA_IDLE) {
112 3 DISABLE;
113 3 bEPPflags.bits.setup_dma = 1;
114 3 ENABLE;
115 3 }
116 2 else {
117 3 DISABLE;
118 3 bEPPflags.bits.dma_state = DMA_PENDING;
119 3 ENABLE;
120 3 }
121 2
122 2 } // else if accepted request
123 1 }
*** WARNING C280 IN LINE 96 OF TWAIN.C: 'offset': unreferenced local variable
124
125 void read_write_register(void)
126 {
127 1 unsigned char i;
128 1
129 1 if(ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK) {
130 2
131 2 if(bEPPflags.bits.verbose)
132 2 printf("Read Registers: Offset = 0x%x, Length = 0x%x, Index = 0x%x.\n",
133 2 ControlData.DeviceRequest.wValue,
134 2 ControlData.DeviceRequest.wLength,
135 2 ControlData.DeviceRequest.wIndex);
136 2
137 2 if(ControlData.DeviceRequest.wIndex == GET_FIRMWARE_VERSION &&
138 2 ControlData.DeviceRequest.wValue == 0 &&
C51 COMPILER V8.02 TWAIN 07/24/2007 14:12:03 PAGE 17
139 2 ControlData.DeviceRequest.wLength == 1)
140 2 get_firmware_version();
141 2 else if(ControlData.DeviceRequest.wIndex == GET_SET_TWAIN_REQUEST)
142 2 get_twain_request();
143 2 else
144 2 stall_ep0();
145 2
146 2 } // if read register
147 1 else{
148 2 if(bEPPflags.bits.verbose) {
149 3
150 3 printf("Write Registers: Offset = 0x%x, Length = 0x%x, Index = 0x%x.\n",
151 3 ControlData.DeviceRequest.wValue,
152 3 ControlData.DeviceRequest.wLength,
153 3 ControlData.DeviceRequest.wIndex);
154 3
155 3 printf("Data: ");
156 3 for(i = 0; i < ControlData.DeviceRequest.wLength; i ++)
157 3 #ifndef __C51__
printf("0x%x, ", *((ControlData.dataBuffer)+i));
#else
160 3 printf("0x%bx, ", *((ControlData.dataBuffer)+i));
161 3 #endif
162 3 printf("\n");
163 3 }
164 2
165 2 if(ControlData.DeviceRequest.wIndex == SETUP_DMA_REQUEST &&
166 2 ControlData.DeviceRequest.wValue == 0 &&
167 2 ControlData.DeviceRequest.wLength == 6)
168 2 setup_dma_request();
169 2 else if(ControlData.DeviceRequest.wIndex == GET_SET_TWAIN_REQUEST)
170 2 set_twain_request();
171 2 else
172 2 stall_ep0();
173 2 } // if write register
174 1 }
175
C51 COMPILER V8.02 TWAIN 07/24/2007 14:12:03 PAGE 18
ASSEMBLY LISTING OF GENERATED OBJECT CODE
; FUNCTION get_firmware_version (BEGIN)
; SOURCE LINE # 40
; SOURCE LINE # 41
; SOURCE LINE # 47
0000 900000 R MOV DPTR,#i
0003 7421 MOV A,#021H
0005 F0 MOVX @DPTR,A
; SOURCE LINE # 49
0006 7B01 MOV R3,#01H
0008 7A00 R MOV R2,#HIGH i
000A 7900 R MOV R1,#LOW i
000C 7D01 MOV R5,#01H
000E 020000 E LJMP _single_transmit
; FUNCTION get_firmware_version (END)
; FUNCTION get_twain_request (BEGIN)
; SOURCE LINE # 52
; SOURCE LINE # 53
; SOURCE LINE # 54
0000 900000 E MOV DPTR,#ControlData+02H
0003 E0 MOVX A,@DPTR
0004 7002 JNZ ?C0036
0006 A3 INC DPTR
0007 E0 MOVX A,@DPTR
0008 ?C0036:
0008 7016 JNZ ?C0002
000A 900000 E MOV DPTR,#ControlData+06H
000D E0 MOVX A,@DPTR
000E 7004 JNZ ?C0037
0010 A3 INC DPTR
0011 E0 MOVX A,@DPTR
0012 6401 XRL A,#01H
0014 ?C0037:
0014 700A JNZ ?C0002
; SOURCE LINE # 56
0016 FB MOV R3,A
0017 7A00 R MOV R2,#HIGH TwainFileNumber
0019 7900 R MOV R1,#LOW TwainFileNumber
001B 7D01 MOV R5,#01H
001D 120000 E LCALL _single_transmit
0020 ?C0002:
; SOURCE LINE # 57
0020 900000 E MOV DPTR,#ControlData+02H
0023 E0 MOVX A,@DPTR
0024 7004 JNZ ?C0038
0026 A3 INC DPTR
0027 E0 MOVX A,@DPTR
0028 6401 XRL A,#01H
002A ?C0038:
002A 7015 JNZ ?C0003
002C 900000 E MOV DPTR,#ControlData+06H
002F E0 MOVX A,@DPTR
0030 7004 JNZ ?C0039
0032 A3 INC DPTR
0033 E0 MOVX A,@DPTR
0034 6401 XRL A,#01H
0036 ?C0039:
0036 7009 JNZ ?C0003
; SOURCE LINE # 59
C51 COMPILER V8.02 TWAIN 07/24/2007 14:12:03 PAGE 19
0038 FB MOV R3,A
0039 7A00 R MOV R2,#HIGH TwainCurrentFile
003B 7900 R MOV R1,#LOW TwainCurrentFile
003D 7D01 MOV R5,#01H
003F 801F SJMP ?C0055
0041 ?C0003:
; SOURCE LINE # 60
0041 900000 E MOV DPTR,#ControlData+02H
0044 E0 MOVX A,@DPTR
0045 7004 JNZ ?C0040
0047 A3 INC DPTR
0048 E0 MOVX A,@DPTR
0049 6402 XRL A,#02H
004B ?C0040:
004B 7016 JNZ ?C0005
004D 900000 E MOV DPTR,#ControlData+06H
0050 E0 MOVX A,@DPTR
0051 7004 JNZ ?C0041
0053 A3 INC DPTR
0054 E0 MOVX A,@DPTR
0055 6404 XRL A,#04H
0057 ?C0041:
0057 700A JNZ ?C0005
; SOURCE LINE # 62
0059 FB MOV R3,A
005A 7A00 R MOV R2,#HIGH TwainFileSize
005C 7900 R MOV R1,#LOW TwainFileSize
005E 7D04 MOV R5,#04H
0060 ?C0055:
0060 020000 E LJMP _single_transmit
0063 ?C0005:
; SOURCE LINE # 64
0063 120000 E LCALL stall_ep0
; SOURCE LINE # 65
0066 ?C0007:
0066 22 RET
; FUNCTION get_twain_request (END)
; FUNCTION set_twain_request (BEGIN)
; SOURCE LINE # 67
; SOURCE LINE # 68
; SOURCE LINE # 69
0000 900000 E MOV DPTR,#ControlData+02H
0003 E0 MOVX A,@DPTR
0004 7004 JNZ ?C0042
0006 A3 INC DPTR
0007 E0 MOVX A,@DPTR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -