📄 d12hap.lst
字号:
C51 COMPILER V7.01 D12HAP 11/14/2003 09:44:51 PAGE 1
C51 COMPILER V7.01, COMPILATION OF MODULE D12HAP
OBJECT MODULE PLACED IN D12HAP.OBJ
COMPILER INVOKED BY: E:\Keil\C51\BIN\c51.exe D12HAP.C DB OE COMPACT ROM(LARGE)
stmt level source
1 //#pragma SYMBOLS
2
3 #include"stdio.h"
4 #include"X52.H"
5 #include"HAL.H"
6 #include"D12CI.H"
7 #include"MAIN.H"
8 #include"HAP9.H"
9 #include"USB100.H"
10 /******************************************************************
11 * this program mainly handle some standard USB device requests, *
12 * as well as specific vendor requests such as DMA and TWAIN *
13 ******************************************************************/
14 extern void single_transmit(unsigned char * buf, unsigned char len);
15 extern void code_transmit(unsigned char code * pRomData, unsigned short len);
16
17 extern void init_unconfig(void);
18 extern void init_config(void);
19 extern void stall_ep0(void);
20
21 extern BOOL bNoRAM;
22 extern CONTROL_XFER ControlData;
23 extern EPPFLAGS bEPPflags;
24
25
26 #define NUM_ENDPOINTS 4
27
28 #define CONFIG_DESCRIPTOR_LENGTH sizeof(USB_CONFIGURATION_DESCRIPTOR) + sizeof(USB_INTERFACE_DESCRIPTOR
-) + (NUM_ENDPOINTS * sizeof(USB_ENDPOINT_DESCRIPTOR))
29
30
31
32 code USB_DEVICE_DESCRIPTOR DeviceDescr =
33 {
34 sizeof(USB_DEVICE_DESCRIPTOR), //bLength =12H
35 USB_DEVICE_DESCRIPTOR_TYPE, //bDescriptorType =01H
36 SWAP(0x0100), //bcdUSB =1.10
37 USB_CLASS_CODE_TEST_CLASS_DEVICE, //bDeviceClass =0dch
38 0, //bDeviceSubClass
39 0, //bDeviceProtocol
40 EP0_PACKET_SIZE, //bMaxPacketSize0 =10H
41 SWAP(0x0471), //idvendor
42 SWAP(0x0666), //idproduct
43 SWAP(0x0100), //bcddevice
44 0, //iManufactory
45 0, //iProduct
46 0, //iSerialNumber
47 1 //bNumConfigurations
48 //25
49 };
50
51 code USB_CONFIGURATION_DESCRIPTOR ConfigDescr =
52 {
53 sizeof(USB_CONFIGURATION_DESCRIPTOR), //bLength =09H
54 USB_CONFIGURATION_DESCRIPTOR_TYPE, //bDescriptorType =02H
C51 COMPILER V7.01 D12HAP 11/14/2003 09:44:51 PAGE 2
55 SWAP(CONFIG_DESCRIPTOR_LENGTH), //wTotalLength =2EH
56 1, //bNumInterfaces
57 1, //bConfigurationValue
58 0, //iConfiguratuion
59 0x60, //bmAttributes总线供电|自供电|远程唤醒|保留
60 0x32 //MaxPower
61 //0x1
62 };
63
64 code USB_INTERFACE_DESCRIPTOR InterfaceDescr =
65 {
66 sizeof(USB_INTERFACE_DESCRIPTOR), //bLength =09h
67 USB_INTERFACE_DESCRIPTOR_TYPE, //bDescriptorType =04h
68 0, //bInterfaceNumber 接口编号,只有一个
69 0, //bAlternativeSetting
70 NUM_ENDPOINTS, //bNumEndpoints 除端点0的端点索引数目,=04H
71 USB_CLASS_CODE_TEST_CLASS_DEVICE, //bInterfaceClass =0dch
72 USB_SUBCLASS_CODE_TEST_CLASS_D12, //bInterfaceSubClass =0A0H
73 USB_PROTOCOL_CODE_TEST_CLASS_D12, //bInterfaceProtocol =0B0H
74 0 //iInterface
75 };
76
77 code USB_ENDPOINT_DESCRIPTOR EP1_TXDescr =
78 {
79 sizeof(USB_ENDPOINT_DESCRIPTOR), //bLength =09h
80 USB_ENDPOINT_DESCRIPTOR_TYPE, //bDescriptorType =05h
81 0x81, //bEndpointAddress 端点1IN
82 USB_ENDPOINT_TYPE_INTERRUPT, //bmAttributes 中断传输 =03H
83 SWAP(EP1_PACKET_SIZE), //wMaxPacketSize =10H
84 10 //bInterval =10ms
85 };
86
87 code USB_ENDPOINT_DESCRIPTOR EP1_RXDescr =
88 {
89 sizeof(USB_ENDPOINT_DESCRIPTOR),
90 USB_ENDPOINT_DESCRIPTOR_TYPE,
91 0x1, //bEndpointAddress
92 USB_ENDPOINT_TYPE_INTERRUPT, //bmAttribute
93 SWAP(EP1_PACKET_SIZE), //wMaxPacketSize
94 10 //bInterval
95 };
96
97 code USB_ENDPOINT_DESCRIPTOR EP2_TXDescr =
98 {
99 sizeof(USB_ENDPOINT_DESCRIPTOR),
100 USB_ENDPOINT_DESCRIPTOR_TYPE,
101 0x82,
102 USB_ENDPOINT_TYPE_BULK, //bmAttributes 批量传输 =02H
103 SWAP(EP2_PACKET_SIZE), //wMaxPacketSize =40H
104 10
105 };
106
107 code USB_ENDPOINT_DESCRIPTOR EP2_RXDescr =
108 {
109 sizeof(USB_ENDPOINT_DESCRIPTOR),
110 USB_ENDPOINT_DESCRIPTOR_TYPE,
111 0x2,
112 USB_ENDPOINT_TYPE_BULK,
113 SWAP(EP2_PACKET_SIZE),
114 10
115 };
116
C51 COMPILER V7.01 D12HAP 11/14/2003 09:44:51 PAGE 3
117 void get_status(void)
118 {
119 1 unsigned char endp, txdat[2];
120 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
121 1 unsigned char c;
122 1
123 1 if (bRecipient == USB_RECIPIENT_DEVICE)
124 1 {
125 2 if(bEPPflags.bits.remote_wakeup == 1)
126 2 {
127 3 txdat[0] = 3; //支持远程唤醒和自供电
128 3 }
129 2 else
130 2 {
131 3 txdat[0] = 1;//支持自供电
132 3 }
133 2 txdat[1]=0;
134 2 single_transmit(txdat, 2);
135 2 }
136 1 else if (bRecipient == USB_RECIPIENT_INTERFACE)
137 1 {
138 2 txdat[0]=0;
139 2 txdat[1]=0;
140 2 single_transmit(txdat, 2);
141 2 }
142 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT)
143 1
144 1 {
145 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
146 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
147 2 {
148 3 c = D12_SelectEndpoint(endp*2 + 1); /* Control-in */
149 3 }
150 2 else
151 2 {
152 3 c = D12_SelectEndpoint(endp*2); /* Control-out */
153 3 }
154 2 if(c & D12_STALL)
155 2 {
156 3 txdat[0] = 1;//表明选择的端点处于停止状态 端点静止
157 3 }
158 2 else
159 2 {
160 3 txdat[0] = 0;//端点有效
161 3 }
162 2 txdat[1] = 0;
163 2 single_transmit(txdat, 2);//发送数据
164 2 }
165 1 else
166 1 stall_ep0();//非标准请求,发stall
167 1 }
168
169 void set_address(void)
170 {
171 1 D12_SetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue &DEVICE_ADDRESS_MASK), 1);
172 1
173 1 single_transmit(0, 0);
174 1
175 1 }
176 void clear_feature(void)
177 {
178 1 unsigned char endp;
C51 COMPILER V7.01 D12HAP 11/14/2003 09:44:51 PAGE 4
179 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
180 1
181 1 if ((bRecipient==USB_RECIPIENT_DEVICE)&&(ControlData.DeviceRequest.wValue==USB_FEATURE_REMOTE_WAKEUP))
182 1 {
183 2 DISABLE;
184 2 bEPPflags.bits.remote_wakeup = 0;
185 2 ENABLE;
186 2 single_transmit(0,0);
187 2 }
188 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT&& ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_
-STALL)
189 1 {
190 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
191 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
192 2 // clear TX stall for IN on EPn.
193 2 {
194 3 D12_SetEndpointStatus(endp*2 + 1, 0);
195 3 }
196 2 else
197 2 // clear RX stall for OUT on EPn.
198 2 {
199 3 D12_SetEndpointStatus(endp*2, 0);
200 3 }
201 2 single_transmit(0, 0);
202 2 }
203 1 else
204 1
205 1 stall_ep0();
206 1
207 1 }
208 void set_feature(void)
209 {
210 1 unsigned char endp;
211 1 //读取请求类型中的接受方
212 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
213 1
214 1 if ((bRecipient == USB_RECIPIENT_DEVICE)&& (ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP
-))
215 1 {
216 2 DISABLE;
217 2 bEPPflags.bits.remote_wakeup = 1;
218 2 ENABLE;
219 2 single_transmit(0, 0);//发送响应
220 2 }
221 1 else if ((bRecipient == USB_RECIPIENT_ENDPOINT)&& (ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOI
-NT_STALL))
222 1 {
223 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -