📄 kchap9.lst
字号:
67 0,
68 NUM_ENDPOINTS,
69 USB_CLASS_CODE_TEST_CLASS_DEVICE,
70 USB_SUBCLASS_CODE_TEST_CLASS_D12,
71 USB_PROTOCOL_CODE_TEST_CLASS_D12,
72 0
73 };
74
75 code USB_ENDPOINT_DESCRIPTOR EP1_TXDescr =
76 {
77 sizeof(USB_ENDPOINT_DESCRIPTOR),
78 USB_ENDPOINT_DESCRIPTOR_TYPE,
79 0x81,
80 USB_ENDPOINT_TYPE_INTERRUPT,
81 SWAP(EP1_PACKET_SIZE),
82 10
83 };
84
85 code USB_ENDPOINT_DESCRIPTOR EP1_RXDescr =
86 {
87 sizeof(USB_ENDPOINT_DESCRIPTOR),
88 USB_ENDPOINT_DESCRIPTOR_TYPE,
89 0x1,
90 USB_ENDPOINT_TYPE_INTERRUPT,
91 SWAP(EP1_PACKET_SIZE),
92 10
93 };
94
95 code USB_ENDPOINT_DESCRIPTOR EP2_TXDescr =
96 {
97 sizeof(USB_ENDPOINT_DESCRIPTOR),
98 USB_ENDPOINT_DESCRIPTOR_TYPE,
99 0x82,
100 USB_ENDPOINT_TYPE_BULK,
101 SWAP(EP2_PACKET_SIZE),
102 10
103 };
104
105 code USB_ENDPOINT_DESCRIPTOR EP2_RXDescr =
106 {
107 sizeof(USB_ENDPOINT_DESCRIPTOR),
108 USB_ENDPOINT_DESCRIPTOR_TYPE,
109 0x2,
110 USB_ENDPOINT_TYPE_BULK,
111 SWAP(EP2_PACKET_SIZE),
112 10
113 };
114
115 /*
116 //*************************************************************************
117 // USB Protocol Layer
118 //*************************************************************************
119 */
120
121 void reserved(void)
122 {
123 1 stall_ep0();
124 1 }
125
126 /*
127 //*************************************************************************
128 // USB standard device requests
C51 COMPILER V6.20c KCHAP9 10/31/2002 21:55:45 PAGE 16
129 //*************************************************************************
130 */
131
132 void get_status(void)
133 {
134 1 unsigned char endp, txdat[2];
135 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
136 1 unsigned char c;
137 1
138 1 if (bRecipient == USB_RECIPIENT_DEVICE) {
139 2 if(bEPPflags.bits.remote_wakeup == 1)
140 2 txdat[0] = 3;
141 2 else
142 2 txdat[0] = 1;
143 2 txdat[1]=0;
144 2 single_transmit(txdat, 2);
145 2 } else if (bRecipient == USB_RECIPIENT_INTERFACE) {
146 2 txdat[0]=0;
147 2 txdat[1]=0;
148 2 single_transmit(txdat, 2);
149 2 } else if (bRecipient == USB_RECIPIENT_ENDPOINT) {
150 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
151 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
152 2 c = D12_SelectEndpoint(endp*2 + 1); /* Control-in */
153 2
154 2
155 2 else
156 2 c = D12_SelectEndpoint(endp*2); /* Control-out */
157 2 if(c & D12_STALL)
158 2 txdat[0] = 1;
159 2 else
160 2 txdat[0] = 0;
161 2 txdat[1] = 0;
162 2 single_transmit(txdat, 2);
163 2 } else
164 1 stall_ep0();
165 1 }
166
167 void clear_feature(void)
168 {
169 1 unsigned char endp;
170 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
171 1
172 1 if (bRecipient == USB_RECIPIENT_DEVICE
173 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {
174 2 DISABLE;
175 2 bEPPflags.bits.remote_wakeup = 0;
176 2 ENABLE;
177 2 single_transmit(0, 0);
178 2 }
179 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT
180 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {
181 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
182 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
183 2 // clear TX stall for IN on EPn.
184 2 D12_SetEndpointStatus(endp*2 + 1, 0);
185 2 else
186 2 // clear RX stall for OUT on EPn.
187 2 D12_SetEndpointStatus(endp*2, 0);
188 2 single_transmit(0, 0);
189 2 } else
190 1 stall_ep0();
C51 COMPILER V6.20c KCHAP9 10/31/2002 21:55:45 PAGE 17
191 1 }
192
193 void set_feature(void)
194 {
195 1 unsigned char endp;
196 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
197 1
198 1 if (bRecipient == USB_RECIPIENT_DEVICE
199 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {
200 2 DISABLE;
201 2 bEPPflags.bits.remote_wakeup = 1;
202 2 ENABLE;
203 2 single_transmit(0, 0);
204 2 }
205 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT
206 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {
207 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
208 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
209 2 // clear TX stall for IN on EPn.
210 2 D12_SetEndpointStatus(endp*2 + 1, 1);
211 2 else
212 2 // clear RX stall for OUT on EPn.
213 2 D12_SetEndpointStatus(endp*2, 1);
214 2 single_transmit(0, 0);
215 2 } else
216 1 stall_ep0();
217 1 }
218
219 void set_address(void)
220 {
221 1 D12_SetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue &
222 1 DEVICE_ADDRESS_MASK), 1);
223 1 single_transmit(0, 0);
224 1 }
225
226 void get_descriptor(void)
227 {
228 1 unsigned char bDescriptor = MSB(ControlData.DeviceRequest.wValue);
229 1
230 1 if (bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE) {
231 2 code_transmit((unsigned char code *)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR));
232 2 }
233 1 else if (bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE) {
234 2 code_transmit((unsigned char code *)&ConfigDescr, CONFIG_DESCRIPTOR_LENGTH);
235 2 }
236 1 else
237 1 stall_ep0();
238 1 }
239
240 void get_configuration(void)
241 {
242 1 unsigned char c = bEPPflags.bits.configuration;
243 1
244 1 single_transmit(&c, 1);
245 1 }
246
247 void set_configuration(void)
248 {
249 1 if (ControlData.DeviceRequest.wValue == 0) {
250 2 //* put device in unconfigured state
251 2 single_transmit(0, 0);
252 2 DISABLE;
C51 COMPILER V6.20c KCHAP9 10/31/2002 21:55:45 PAGE 18
253 2 bEPPflags.bits.configuration = 0;
254 2 ENABLE;
255 2 init_unconfig();
256 2 } else if (ControlData.DeviceRequest.wValue == 1) {
257 2 // Configure device
258 2 single_transmit(0, 0);
259 2
260 2 init_unconfig();
261 2 init_config();
262 2
263 2 DISABLE;
264 2 bEPPflags.bits.configuration = 1;
265 2 ENABLE;
266 2 } else
267 1 stall_ep0();
268 1 }
269
270 void get_interface(void)
271 {
272 1 unsigned char txdat = 0; // Only/Current interface = 0
273 1 single_transmit(&txdat, 1);
274 1 }
275
276 void set_interface(void)
277 {
278 1 if (ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0)
279 1 single_transmit(0, 0);
280 1 else
281 1 stall_ep0();
282 1 }
C51 COMPILER V6.20c KCHAP9 10/31/2002 21:55:45 PAGE 19
ASSEMBLY LISTING OF GENERATED OBJECT CODE
; FUNCTION reserved (BEGIN)
; SOURCE LINE # 121
; SOURCE LINE # 122
; SOURCE LINE # 123
0000 020000 E LJMP stall_ep0
; FUNCTION reserved (END)
; FUNCTION get_status (BEGIN)
; SOURCE LINE # 132
; SOURCE LINE # 133
; SOURCE LINE # 135
0000 E500 E MOV A,ControlData
0002 541F ANL A,#01FH
;---- Variable 'bRecipient' assigned to Register 'R4' ----
0004 FC MOV R4,A
; SOURCE LINE # 138
0005 7013 JNZ ?C0002
; SOURCE LINE # 139
0007 AF00 E MOV R7,bEPPflags
0009 EF MOV A,R7
000A C4 SWAP A
000B 540F ANL A,#0FH
000D 30E005 JNB ACC.0,?C0003
; SOURCE LINE # 140
0010 750003 R MOV txdat,#03H
0013 8038 SJMP ?C0046
0015 ?C0003:
; SOURCE LINE # 142
0015 750001 R MOV txdat,#01H
0018 ?C0004:
; SOURCE LINE # 143
; SOURCE LINE # 144
; SOURCE LINE # 145
0018 8033 SJMP ?C0046
001A ?C0002:
001A BC0105 CJNE R4,#01H,?C0006
; SOURCE LINE # 146
001D E4 CLR A
001E F500 R MOV txdat,A
; SOURCE LINE # 147
; SOURCE LINE # 148
; SOURCE LINE # 149
0020 802C SJMP ?C0047
0022 ?C0006:
0022 EC MOV A,R4
0023 6402 XRL A,#02H
0025 7033 JNZ ?C0008
; SOURCE LINE # 150
0027 E500 E MOV A,ControlData+05H
0029 5403 ANL A,#03H
;---- Variable 'endp' assigned to Register 'R5' ----
002B FD MOV R5,A
; SOURCE LINE # 151
002C E500 E MOV A,ControlData+05H
002E 30E706 JNB ACC.7,?C0009
; SOURCE LINE # 152
0031 ED MOV A,R5
0032 25E0 ADD A,ACC
0034 04 INC A
C51 COMPILER V6.20c KCHAP9 10/31/2002 21:55:45 PAGE 20
0035 8003 SJMP ?C0045
0037 ?C0009:
; SOURCE LINE # 156
0037 ED MOV A,R5
0038 25E0 ADD A,ACC
003A ?C0045:
003A FF MOV R7,A
003B 120000 E LCALL _D12_SelectEndpoint
003E 8F00 R MOV c,R7
0040 ?C0010:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -