📄 chap_9.lst
字号:
C51 COMPILER V7.06 CHAP_9 09/15/2008 18:19:55 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE CHAP_9
OBJECT MODULE PLACED IN Chap_9.OBJ
COMPILER INVOKED BY: E:\Program Files\C51\BIN\C51.EXE Chap_9.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 //协议层
2
3 #include <reg52.h>
4 #include "D12Config.h"
5 #include "D12CI.h"
6 #include "Chap_9.h"
7 #include "Descriptor.h"
8
9 CONTROL_XFER ControlData;
10 EPPFLAGS bEPPflags;
11
12 //USB标准设备请求入口地址指针表
13 code void (*StandardDeviceRequest[])(void) =
14 {
15 get_status,
16 clear_feature,
17 reserved,
18 set_feature,
19 reserved,
20 set_address,
21 get_descriptor,
22 reserved,
23 get_configuration,
24 set_configuration,
25 get_interface,
26 set_interface,
27 reserved,
28 reserved,
29 reserved,
30 reserved
31 };
32
33 // USB 协议层函数
34
35 void stall_ep0(void)
36 {
37 1 D12_SetEndpointStatus(0, 1);
38 1 D12_SetEndpointStatus(1, 1);
39 1 }
40
41 void reserved(void)
42 {
43 1 stall_ep0(); //返回STALL
44 1 }
45
46
47 void init_unconfig(void)
48 {
49 1 D12_SetEndpointEnable(0); //禁止0除外的所有端点
50 1 }
51
52
53 void init_config(void)
54 {
55 1 D12_SetEndpointEnable(1);
C51 COMPILER V7.06 CHAP_9 09/15/2008 18:19:55 PAGE 2
56 1 }
57
58
59 void single_transmit(INT8U * buf, INT8U len)
60 {
61 1 if( len <= EP0_PACKET_SIZE)
62 1 D12_WriteEndpoint(1, len, buf);
63 1 }
64
65
66 void code_transmit(INT8U *pRomData, INT16U len)
67 {
68 1 ControlData.wCount = 0;
69 1 if(ControlData.wLength > len)
70 1 ControlData.wLength = len;
71 1
72 1 ControlData.pData = pRomData;
73 1 if( ControlData.wLength >= EP0_PACKET_SIZE)
74 1 {
75 2 D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData);
76 2 ControlData.wCount += EP0_PACKET_SIZE;
77 2
78 2 DISABLE();
79 2 bEPPflags.bits.control_state = USB_TRANSMIT;
80 2 ENABLE();
81 2 }
82 1 else
83 1 {
84 2 D12_WriteEndpoint(1, ControlData.wLength, pRomData);
85 2 ControlData.wCount += ControlData.wLength;
86 2 DISABLE();
87 2 bEPPflags.bits.control_state = USB_IDLE;
88 2 ENABLE();
89 2 }
90 1 }
91
92
93 // USB 标准设备请求服务程序
94
95 void get_status(void)
96 {
97 1 INT8U endp, txdat[2], c;
98 1 INT8U bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
99 1
100 1 if (bRecipient == USB_RECIPIENT_DEVICE)
101 1 {
102 2 if(bEPPflags.bits.remote_wakeup == 1)
103 2 txdat[0] = 3; //支持远程唤醒、自供电
104 2 else
105 2 txdat[0] = 1;
106 2 txdat[1]=0;
107 2 single_transmit(txdat, 2); //发送16位的状态到主机
108 2
109 2 }
110 1 else if (bRecipient == USB_RECIPIENT_INTERFACE)
111 1 {
112 2 txdat[0]=0;
113 2 txdat[1]=0;
114 2 single_transmit(txdat, 2);
115 2
116 2 }
117 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT)
C51 COMPILER V7.06 CHAP_9 09/15/2008 18:19:55 PAGE 3
118 1 {
119 2 endp = (INT8U)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
120 2 if (ControlData.DeviceRequest.wIndex & (INT8U)USB_ENDPOINT_DIRECTION_MASK)
121 2 c = D12_SelectEndpoint(endp*2 + 1); //读取输入端点状态
122 2 else
123 2 c = D12_SelectEndpoint(endp*2); //读取输出端点状态
124 2 if(c & D12_STALL)
125 2 txdat[0] = 1; //端点禁止
126 2 else
127 2 txdat[0] = 0; //端点有效
128 2 txdat[1] = 0;
129 2 single_transmit(txdat, 2);
130 2
131 2 }
132 1 else
133 1 stall_ep0(); //非标准请求,发STALL
134 1 }
135
136
137 void clear_feature(void)
138 {
139 1 INT8U endp;
140 1 INT8U bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
141 1
142 1 if (bRecipient == USB_RECIPIENT_DEVICE&&ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP)
143 1 {
144 2 DISABLE(); //清除远程唤醒特性
145 2 bEPPflags.bits.remote_wakeup = 0; //清0远程唤醒标志
146 2 ENABLE();
147 2 single_transmit(0, 0); //返回一个空的数据表示执行完毕
148 2 }
149 1
150 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT&& ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_
-STALL)
151 1 { //清除端点禁止特性,恢复其使用
152 2 endp = (INT8U)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
153 2 if (ControlData.DeviceRequest.wIndex & (INT8U)USB_ENDPOINT_DIRECTION_MASK)
154 2 D12_SetEndpointStatus(endp*2 + 1, 0); //清除控制输入端点STALL特性
155 2 else
156 2 D12_SetEndpointStatus(endp*2, 0); //清除控制输出端点STALL特性
157 2 single_transmit(0, 0);
158 2 }
159 1 else
160 1 stall_ep0(); //没有该请求,返回STALL
161 1 }
162
163
164 void set_feature(void)
165 {
166 1 INT8U endp;
167 1 INT8U bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;//读取请求类型中的接收方
168 1
169 1 if (bRecipient == USB_RECIPIENT_DEVICE && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP)
170 1 {//设置远程唤醒特性
171 2 DISABLE();
172 2 bEPPflags.bits.remote_wakeup = 1; //置1远程唤醒标志
173 2 ENABLE();
174 2 single_transmit(0, 0);
175 2 }
176 1
177 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT
-_STALL)
C51 COMPILER V7.06 CHAP_9 09/15/2008 18:19:55 PAGE 4
178 1 {//禁止端点
179 2 endp = (INT8U)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
180 2 if (ControlData.DeviceRequest.wIndex & (INT8U)USB_ENDPOINT_DIRECTION_MASK)
181 2 D12_SetEndpointStatus(endp*2 + 1, 1); //设置输入端点禁止
182 2 else
183 2 D12_SetEndpointStatus(endp*2, 1); //设置输出端点禁止
184 2 single_transmit(0, 0);
185 2 }
186 1 else
187 1 stall_ep0();
188 1 }
189
190
191 void set_address(void)
192 {
193 1 D12_SetAddressEnable((INT8U)(ControlData.DeviceRequest.wValue &
194 1 DEVICE_ADDRESS_MASK), 1);
195 1 single_transmit(0, 0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -