📄 mainloop.lst
字号:
C51 COMPILER V7.06 MAINLOOP 02/17/2004 14:42:22 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE MAINLOOP
OBJECT MODULE PLACED IN Mainloop.OBJ
COMPILER INVOKED BY: C:\KEIL\C51\BIN\C51.EXE Mainloop.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*
2 //*************************************************************************
3 //
4 // P H I L I P S P R O P R I E T A R Y
5 //
6 // COPYRIGHT (c) 1999 BY PHILIPS SINGAPORE.
7 // -- ALL RIGHTS RESERVED --
8 //
9 // File Name: MainLoop.C
10 // Author: Hilbert Zhang ZhenYu
11 // Created: Nov. 19 99
12 // Modified:
13 // Revision: 0.0.
14 //
15 //*************************************************************************
16 // Implementation Notes:
17 //
18 // 4. Bulk-Only Transport FSM
19 // IDLE Stage -> CBW -> CBW Proc -> DATA OUT Stage -> CSW Proc -> CSW Stage -> IDLE
20 // IDLE Stage -> CBW -> CBW Proc -> DATA IN Stage -> CSW Proc -> CSW Stage -> IDLE
21 // STALL Stage -> IDLE -> ...
22 //
23 //
24 // 3. Default Control Pipe Finite State Machine
25 // SETUP Stage -> SETUP Proc -> DATA OUT Stage -> CONTROL OUT Handshake -> STATUS Stage -> IDLE
26 // SETUP Stage -> SETUP Proc -> CONTROL OUT Handshake -> STATUS Stage -> IDLE
27 // SETUP Stage -> SETUP Proc -> DATA IN Stage-> CONTROL IN Handshake ->STATUS Stage -> IDLE
28 // STALL -> SETUP Stage -> ...
29 //
30 // 2. Stack Overflow Avoidance.
31 // Setup TK overwritten allowance.
32 //
33 // 1. System Modeling
34 // A. D12
35 // B. 8051
36 // C. ATA controller emulation by 8051
37 //
38 // 0. 8051 Modeling
39 // A. Target 8051 , 128B RAM, 16KB ROM
40 // B. Choose 2 IRQL levels, Interrupt Priority 0 as IRQL_1, Mainloop as IRQL_0
41 // C. Bit Address Space, Byte Ram Addess Space, Code Address Space, IO port Space
42 //
43 //*************************************************************************
44 // Development Environment
45 //
46 // 1. Use VC++ IDE instead of DOS enviroment
47 // 0. Keil C Ver4
48 //
49 //*************************************************************************
50 */
51
52 #include <reg51.h> /* special function register declarations */
53
54 #define GLOBAL_EXT //定义全局
55
C51 COMPILER V7.06 MAINLOOP 02/17/2004 14:42:22 PAGE 2
56 #include "SysCnfg.h"
57 #include "BasicTyp.H"
58
59 #include "usb100.h"
60
61 #include "Common.h"
62 #include "Hal4Sys.h"
63 #include "Hal4d12.h"
64 #include "Hal4ata.h"
65
66 //#include "ATA.h"
67 #include "RBCCmd.h"
68 #include "RBC.h"
69
70 #include "mainloop.h"
71 #include "chap_9.h"
72 #include "TPBulk.h"
73
74 /*
75 //*************************************************************************
76 // Public data
77 //*************************************************************************
78 */
79 sfr AUXR = 0xDA;
80
81 // bit Flags
82 STRUC_EXT BITFLAGS BDATA_SEG bFlags;
83
84 // MCU Timer bit flags
85 BIT_EXT MCUBF_Timer = bFlags.value^0;
86 INT8_EXT Hal4Sys_ClockTicks = 0;
87
88 // D12 bit flags
89 BIT_EXT D12BF_SetupOverwritten = bFlags.value^1;
90 BIT_EXT D12BF_Configuration = bFlags.value^2;
91
92 //USB
93 // DefaultControlPipe Finite State Machine [One-Hot]
94 INT8_EXT BDATA_SEG DCPFSMstate;
95 BIT_EXT DCPFSM_SetupProc = DCPFSMstate^0;
96 BIT_EXT DCPFSM_DataIn = DCPFSMstate^1;
97 BIT_EXT DCPFSM_DataOut = DCPFSMstate^2;
98 BIT_EXT DCPFSM_COhandshake = DCPFSMstate^3;
99 BIT_EXT DCPFSM_CIhandshake = DCPFSMstate^4;
100 BIT_EXT DCPFSM_Stall = DCPFSMstate^7;
101 // DCP FSM
102 // SETUP Stage -> SETUP Proc -> DATA OUT Stage -> CONTROL OUT Handshake -> STATUS Stage -> IDLE
103 // SETUP Stage -> SETUP Proc -> CONTROL OUT Handshake -> STATUS Stage -> IDLE
104 // SETUP Stage -> SETUP Proc -> DATA IN Stage-> CONTROL IN Handshake ->STATUS Stage -> IDLE
105 //
106
107 // USB Device Request
108 STRUC_EXT DEVICE_REQUEST DATA_SEG DCPDeviceRequest;
109 INT8_EXT UsbReq_Recipient;
110 INT8_EXT UsbReq_Type;
111 INT8_EXT UsbReq_Request;
112 BIT_EXT REQBF_DCPRequest_dir = bFlags.value^3;
113 BIT_EXT REQBF_DCPRequest_EPdir = bFlags.value^4;
114 BIT_EXT REQBF_StallDCPRequest = bFlags.value^5;
115
116 INT16_EXT DCPXfer_wResidue;
117 INT8_EXT * DCPXfer_pdata;
C51 COMPILER V7.06 MAINLOOP 02/17/2004 14:42:22 PAGE 3
118
119 // Bulk-Only TP Finite State Machine [One-Hot] 端点状态
120 INT8_EXT BDATA_SEG BOTFSMstate;
121 BIT_EXT BOTFSM_IDLE = BOTFSMstate^0;
122 BIT_EXT BOTFSM_CBWProc = BOTFSMstate^1;
123 BIT_EXT BOTFSM_DataIn = BOTFSMstate^2;
124 BIT_EXT BOTFSM_DataOut = BOTFSMstate^3;
125 BIT_EXT BOTFSM_CSWProc = BOTFSMstate^4;
126 BIT_EXT BOTFSM_CSW = BOTFSMstate^5;
127 BIT_EXT BOTFSM_Stall = BOTFSMstate^7;
128 // BOT FSM
129 // IDLE Stage -> CBW -> CBW Proc -> DATA OUT Stage -> CSW Proc -> CSW Stage -> IDLE
130 // IDLE Stage -> CBW -> CBW Proc -> DATA IN Stage -> CSW Proc -> CSW Stage -> IDLE
131 // STALL Stage -> IDLE
132 //
133 INT16_EXT BOTXfer_wResidue; //数据沉余
134 INT8_EXT * BOTXfer_pdata;
135 STRUC_EXT TPBLK_STRUC DATA_SEG TPBulk_Block;
136 #define TPBulk_CBW TPBulk_Block.TPBulk_CommandBlock
137 #define RBC_CDB TPBulk_CBW.cdbRBC
138 #define RBC_LUN TPBulk_CBW.bCBW_LUN
139 #define Hal4ATA_Atapi RBC_CDB
140 #define TPBulk_CSW TPBulk_Block.TPBulk_CommandStatus
141 BIT_EXT BOTXfer_Abort = bFlags.value^8;
142 BIT_EXT BOTBF_StallAtBulkOut = bFlags.value^6;
143 BIT_EXT BOTBF_StallAtBulkIn = bFlags.value^7;
144
145 // Xfer_Space
146 INT8_EXT BDATA_SEG Xfer_Space;
147 BIT_EXT DCPXfer_atMCUCODE = Xfer_Space^0;
148 BIT_EXT DCPXfer_atMCURAM = Xfer_Space^1;
149 BIT_EXT DCPXfer_atEEROM = Xfer_Space^2;
150 BIT_EXT DCPXfer_atATA = Xfer_Space^3;
151 BIT_EXT BOTXfer_atRAM = Xfer_Space^4;
152 BIT_EXT BOTXfer_atATA = Xfer_Space^5;
153 BIT_EXT BOTXfer_atROM = Xfer_Space^6;
154
155
156 STRUC_EXT HW_ATA_DEVICES_EXTENSION Hal4ATA_DevExt;
157 #define ATADevExt_IDData Hal4ATA_DevExt.IdentifyData
158
159 BIT_EXT ATABF_IsAttached = bFlags.value^9;
160 BIT_EXT ATABF_IsSupportMultiSector = bFlags.value^10;
161 BIT_EXT ATABF_IDEXfer_dir = bFlags.value^11;
162 BIT_EXT ATABF_IsSkipSetParameters = bFlags.value^12;
163
164 INT8_EXT Hal4ATA_SectCntInBlk;
165 /*
166 //*************************************************************************
167 // Public temp var
168 //*************************************************************************
169 */
170
171 STRUC_EXT FLEXI_INT32 tempvars4UsbReq; //????????????????
172
173 INT8_EXT BDATA_SEG FlexByte;
174 BIT_EXT FlexByte_b0 = FlexByte^0;
175 BIT_EXT FlexByte_b1 = FlexByte^1;
176 BIT_EXT FlexByte_b2 = FlexByte^2;
177 BIT_EXT FlexByte_b3 = FlexByte^3;
178 BIT_EXT FlexByte_b4 = FlexByte^4;
179 BIT_EXT FlexByte_b5 = FlexByte^5;
C51 COMPILER V7.06 MAINLOOP 02/17/2004 14:42:22 PAGE 4
180 BIT_EXT FlexByte_b6 = FlexByte^6;
181 BIT_EXT FlexByte_b7 = FlexByte^7;
182
183 //INT8_EXT TempByte;
184
185
186 /*
187 //*************************************************************************
188 // USB protocol function pointer arrays协议函数指针
189 //*************************************************************************
190 */
191
192 code void (*StandardDeviceRequest[MAX_STD_REQUEST])(void) =
193 {
194 Chap9_GetStatus,
195 Chap9_ClearFeature,
196 MLsup_StallEP0,
197 Chap9_SetFeature,
198 MLsup_StallEP0,
199 Chap9_SetAddress,
200 Chap9_GetDescriptor,
201 MLsup_StallEP0,
202 Chap9_GetConfiguration,
203 Chap9_SetConfiguration,
204 Chap9_GetInterface,
205 Chap9_SetInterface,
206 };
207
208 code void (*ClassDeviceRequest[MAX_CLASS_REQUEST])(void) =
209 {
210 TPBulk_ResetATA,
211 TPBulk_GetMaxLUN
212 };
213
214 /*
215 code void (*VendorDeviceRequest[MAX_VENDOR_REQUEST])(void) =
216 {
217 MLsup_StallEP0
218 };
219 */
220
221 /*
222 //*************************************************************************
223 // Functions
224 //*************************************************************************
225 */
226
227 void main(void)
228 {
229 1 AUXR = 0x01; //使用P89C51RD2,使用内RAM和,ALE输出
230 1 RaiseIRQL(); //关中断
231 1 Hal4Sys_InitMCU(); //初始化端口
232 1 Hal4Sys_InitTimer0(); //初始化定时器0
233 1 D12SUSPD = 0; //
234 1 Hal4ATA_FindIDEDevice(); //查找IDE设备
235 1
236 1 Hal4Sys_InitD12(); //初始化D12
237 1 // Connect to USB Host
238 1 MLsup_ReconnectUSB();
239 1
240 1 // Init FSM
241 1 DCPFSMstate = USBFSM4DCP_IDLE;
C51 COMPILER V7.06 MAINLOOP 02/17/2004 14:42:22 PAGE 5
242 1 BOTFSMstate = USBFSM4BOT_IDLE;// USBFSM4BOT_IDLE=0x01
243 1
244 1
245 1 LowerIRQL(); //LowerIRQL() == EA=1 , (no IRQ when EA=0!)
246 1 // USB Control Pipe
247 1
248 1 /* Main program loop */
249 1 while(TRUE)
250 1 {
251 2 // Enable Interrupt for Interrupt Type Event Stimulie
252 2 LowerIRQL(); //LowerIRQL() == EA=1 , (no IRQ when EA=0!)
253 2 // USB Control Pipe
254 2 if (DCPFSM_SetupProc) // DCPFSM_SetupProc=DCPFSMstate^0
255 2 {
256 3 RaiseIRQL(); //关中断
257 3 MLsup_USBSetupTokenHandler();
258 3 LowerIRQL(); //开中断
259 3 } // if SetupProc
260 2
261 2 // USB Bulk Pipe
262 2 RaiseIRQL();
263 2 {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -