?? chap_9.lst
字號:
C51 COMPILER V6.12 CHAP_9 06/08/2007 20:53:11 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE CHAP_9
OBJECT MODULE PLACED IN .\Chap_9.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE .\Chap_9.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /****************************************Copyright (c)**************************************************
2 ** 廣州周立功單片機發展有限公司
3 ** 研 究 所
4 ** 產品一部
5 **
6 ** http://www.zlgmcu.com
7 ** 文 件 名: Chap_9.c
8 ** 最后修改日期: 2004年11月15日
9 ** 描 述: USB驅動程序軟件包: PDIUSBD12 設備端驅動程序 協議層
10 ** 版 本: V5.0
11 **********************************************************************************************************
-/
12
13 #include <reg52.h>
14 #include "D12Config.h"
15 #include "D12CI.h"
16 #include "Chap_9.h"
17 #include "Descriptor.h"
18 #include "Protozlg.h"
19
20 //定義控制傳輸結構變量
21 CONTROL_XFER ControlData;
22
23 //定義USB事件標志變量
24 EPPFLAGS bEPPflags;
25
26 //*************************************************************************
27 //USB標準設備請求入口地址指針表
28 //*************************************************************************
29 code void (*StandardDeviceRequest[])(void) =
30 {
31 get_status,
32 clear_feature,
33 reserved,
34 set_feature,
35 reserved,
36 set_address,
37 get_descriptor,
38 reserved,
39 get_configuration,
40 set_configuration,
41 get_interface,
42 set_interface,
43 reserved,
44 reserved,
45 reserved,
46 reserved
47 };
48
49 //*************************************************************************
50 // USB 協議層函數
51 //*************************************************************************
52
53 /*************************************
54 ** 函數名稱: void stall_ep0(void)
C51 COMPILER V6.12 CHAP_9 06/08/2007 20:53:11 PAGE 2
55 ** 功能描述: 使控制端點處于停止狀態
56 **************************************/
57 void stall_ep0(void)
58 {
59 1 D12_SetEndpointStatus(0, 1);
60 1 D12_SetEndpointStatus(1, 1);
61 1 }
62
63
64 /*************************************
65 ** 函數名稱: void reserved(void)
66 ** 功能描述: 保留子程序
67 **************************************/
68 void reserved(void)
69 {
70 1 stall_ep0(); //返回STALL
71 1 }
72
73
74 /**********************************************
75 ** 函數名稱: void init_unconfig(void)
76 ** 功能描述: 進入地址狀態,禁止0除外的所有端點
77 ***********************************************/
78 void init_unconfig(void)
79 {
80 1 D12_SetEndpointEnable(0); //禁止0除外的所有端點
81 1 }
82
83 /**********************************************
84 ** 函數名稱: void init_config(void)
85 ** 功能描述: 配置處理,允許端點收發
86 ***********************************************/
87 void init_config(void)
88 {
89 1 D12_SetEndpointEnable(1); //使能普通/同步端點使能
90 1 }
91
92
93 /*********************************************************
94 ** 函數名稱: void single_transmit(INT8U * buf, INT8U len)
95 ** 功能描述: 通過端點索引 1 發送數據(DATA 類型)
96 ** 輸 入: INT8U * buf: 發送數據指針
97 INT8U len: 發送數據長度
98 ** 輸 出: 無
99 **********************************************************/
100 void single_transmit(INT8U * buf, INT8U len)
101 {
102 1 if( len <= EP0_PACKET_SIZE) { //長度小于EP0最大信息包大小才允許發送
103 2 D12_WriteEndpoint(1, len, buf);
104 2 }
105 1 }
106
107 /*************************************************************
108 ** 函數名稱: void code_transmit(INT8U * pRomData, INT16U len)
109 ** 功能描述: 通過端點索引 1 發送數據(CODE類型)
110 ** 輸 入: INT8U *pRomData: 發送數據指針
111 INT16U len: 發送數據長度
112 ** 輸 出: 無
113 **************************************************************/
114 void code_transmit(INT8U *pRomData, INT16U len)
115 {
116 1 ControlData.wCount = 0; //傳輸字節數計數器清0
C51 COMPILER V6.12 CHAP_9 06/08/2007 20:53:11 PAGE 3
117 1 if(ControlData.wLength > len)
118 1 ControlData.wLength = len; //傳輸數據總字節數不得超過len
119 1
120 1 ControlData.pData = pRomData; //傳輸數據指針指向pRomData
121 1 if( ControlData.wLength >= EP0_PACKET_SIZE) { //傳輸數據總字節數大于端點0最大信息包大小
122 2 D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData); //發送端點0最大信息包大小個字節
123 2 ControlData.wCount += EP0_PACKET_SIZE; //統計已發送字節數
124 2
125 2 DISABLE();
126 2 bEPPflags.bits.control_state = USB_TRANSMIT; //標志數據發送狀態
127 2 ENABLE();
128 2 }
129 1 else {
130 2 D12_WriteEndpoint(1, ControlData.wLength, pRomData); //寫入傳輸數據總字節數
131 2 ControlData.wCount += ControlData.wLength; //統計已發送字節數
132 2 DISABLE();
133 2 bEPPflags.bits.control_state = USB_IDLE; //標志空閑狀態
134 2 ENABLE();
135 2 }
136 1 }
137
138 //*************************************************************************
139 // USB 標準設備請求服務程序
140 //*************************************************************************
141
142 /********************************************************************
143 ** 函數名稱: void get_status(void)
144 ** 功能描述: 主機要求獲取狀態,設備返回16位的狀態描述給主機
145 *********************************************************************/
146 void get_status(void)
147 {
148 1 INT8U endp, txdat[2], c;
149 1 INT8U bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
150 1 //取得設備請求類型
151 1 if (bRecipient == USB_RECIPIENT_DEVICE) { //對設備請求
152 2 if(bEPPflags.bits.remote_wakeup == 1)
153 2 txdat[0] = 3; //支持遠程喚醒、自供電
154 2 else
155 2 txdat[0] = 1; //不支持遠程喚醒、自供電
156 2 txdat[1]=0; //高8位為0
157 2 single_transmit(txdat, 2); //發送16位的狀態到主機
158 2
159 2 } else if (bRecipient == USB_RECIPIENT_INTERFACE) { //對接口請求
160 2 txdat[0]=0;
161 2 txdat[1]=0;
162 2 single_transmit(txdat, 2);
163 2 //發送16位的狀態到主機
164 2 } else if (bRecipient == USB_RECIPIENT_ENDPOINT) { //對端點請求
165 2 endp = (INT8U)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
166 2 if (ControlData.DeviceRequest.wIndex & (INT8U)USB_ENDPOINT_DIRECTION_MASK)
167 2 c = D12_SelectEndpoint(endp*2 + 1); //讀取輸入端點狀態
168 2 else
169 2 c = D12_SelectEndpoint(endp*2); //讀取輸出端點狀態
170 2 if(c & D12_STALL)
171 2 txdat[0] = 1; //端點禁止
172 2 else
173 2 txdat[0] = 0; //端點有效
174 2 txdat[1] = 0;
175 2 single_transmit(txdat, 2); //發送16位的狀態到主機
176 2
177 2 } else
178 1 stall_ep0(); //非標準請求,發STALL
C51 COMPILER V6.12 CHAP_9 06/08/2007 20:53:11 PAGE 4
179 1 }
180
181
182 /****************************************
183 ** 函數名稱: void clear_feature(void)
184 ** 功能描述: 清除特性
185 *****************************************/
186 void clear_feature(void)
187 {
188 1 INT8U endp; //讀取請求類型中的接收方
189 1 INT8U bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
190 1 //讀取請求類型
191 1 if (bRecipient == USB_RECIPIENT_DEVICE //對設備請求
192 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {
193 2 DISABLE(); //清除遠程喚醒特性
194 2 bEPPflags.bits.remote_wakeup = 0; //清0遠程喚醒標志
195 2 ENABLE();
196 2 single_transmit(0, 0); //返回一個空的數據表示執行完畢
197 2 }
198 1
199 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT //對端點請求
200 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {
201 2 //清除端點禁止特性,恢復其使用
202 2 endp = (INT8U)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
203 2 if (ControlData.DeviceRequest.wIndex & (INT8U)USB_ENDPOINT_DIRECTION_MASK)
204 2 D12_SetEndpointStatus(endp*2 + 1, 0); //清除控制輸入端點STALL特性
205 2 else
206 2 D12_SetEndpointStatus(endp*2, 0); //清除控制輸出端點STALL特性
207 2 single_transmit(0, 0); //返回一個空的數據表示執行完畢
208 2 } else
209 1 stall_ep0(); //沒有該請求,返回STALL
210 1 }
211
212
213 /****************************************
214 ** 函數名稱: void set_feature(void)
215 ** 功能描述: 設置特性
216 *****************************************/
217 void set_feature(void)
218 {
219 1 INT8U endp; //讀取請求類型中的接收方
220 1 INT8U bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
221 1 //讀取請求類型
222 1 if (bRecipient == USB_RECIPIENT_DEVICE //對設備請求
223 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {
224 2 //設置遠程喚醒特性
225 2 DISABLE();
226 2 bEPPflags.bits.remote_wakeup = 1; //置1遠程喚醒標志
227 2 ENABLE();
228 2 single_transmit(0, 0); //返回一個空的數據表示執行完畢
229 2 }
230 1
231 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT //對端點請求
232 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {
233 2 //禁止端點
234 2 endp = (INT8U)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
235 2 if (ControlData.DeviceRequest.wIndex & (INT8U)USB_ENDPOINT_DIRECTION_MASK)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -