📄 bulkcmd.lst
字号:
C51 COMPILER V7.02b BULKCMD 02/27/2008 12:54:50 PAGE 1
C51 COMPILER V7.02b, COMPILATION OF MODULE BULKCMD
OBJECT MODULE PLACED IN .\Output\BulkCmd.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE BulkCmd.c LARGE OPTIMIZE(SIZE) BROWSE DEBUG OBJECTEXTEND PRINT(.\Output\Bul
-kCmd.lst) OBJECT(.\Output\BulkCmd.obj)
stmt level source
1 /*
2 **********************************************************************************************
3 * Project: FS7805 SD CARD READER
4 * File: main.c
5 * Contents:
6 * The main function is SD and MMC card reader.
7 *
8 * $Date: 12/15/06 Derek V1.0
9 *
10 * Coments: This is the SD/MMC card reader firmware.
11 * When read sector,the 512 pingpong FIFO mechanism
12 * is used to improve performance.But when write sector,
13 * only single FIFO is used.
14 *
15 * Copyright (c) 2006 Fameg, Inc. All rights reserved
16 *
17 *
18 ***********************************************************************************************
19 */
20 #include "include\Include.h"
21
22 /*************************************************
23 Global Variables
24 *************************************************/
25 xdata PCMD_BLOCK_WRAPPER BlockWrapper;
26 BYTE CmdStatus = COMMAND_PASSED;
27 BYTE BulkState = CBW_GET_COMPLETED;
28 bool ScsiCmdSTALLed = false;
29 BYTE ScsiLun;
30 xdata UINT32 SectorStart = 0;
31 xdata UINT16 SectorCount = 0;
32 xdata UINT32 WrapperTag = 0;
33 xdata UINT32 UsbDmaTotalLength = 0;
34 bit FirstWrite = false;
35
36 extern bit BusResetFlag ;
37
38 /*************************************************
39 Local Variables
40 *************************************************/
41 static bit BulkCmdRunning = false;
42 /*************************************************
43 For pingpong FIFO control
44 *************************************************/
45 volatile BYTE SW_IN_FIFO_Toggle = 0;
46 volatile INT16U FIFO_ADDRESS_IN;
47 volatile BYTE SW_OUT_FIFO_Toggle = 0;
48 volatile INT16U FIFO_ADDRESS_OUT;
49
50 /*
51 *********************************************************************************************************
52 * BulkFreeBuffer()
53 *
54 * Description: Clear FIFO_FULL bit that get data,set FIFO_TOG and
C51 COMPILER V7.02b BULKCMD 02/27/2008 12:54:50 PAGE 2
55 * and SW_OUT_FIFO_Toggle value for next OUT transaction.
56 *
57 * Arguments : none
58 *
59 * Returns : none
60 *********************************************************************************************************
61 */
62 void BulkFreeBuffer(void)
63 {
64 1 if(FIFO_ADDRESS_OUT == DMA_FIFOA0)//if data in DMA_FIFOA0
65 1 {
66 2 EPAFIFOCS = (EPAFIFOCS | bmFIFO_TOG_WE) | (bmFIFO_TOG);//set FIFO_TOG
67 2 EPAFIFOCS = (EPAFIFOCS | bmFIFO0_FULL_WE) & (~bmFIFO0_FULL);//clear FIFO0_FULL bit
68 2 SW_OUT_FIFO_Toggle = 1;//set SW_OUT_FIFO_Toggle value
69 2 }
70 1 else // FULL_1 = 1
71 1 {
72 2 EPAFIFOCS = (EPAFIFOCS | bmFIFO_TOG_WE) & (~bmFIFO_TOG);//
73 2 EPAFIFOCS = (EPAFIFOCS | bmFIFO1_FULL_WE) & (~bmFIFO1_FULL);
74 2 SW_OUT_FIFO_Toggle = 0;
75 2 }
76 1
77 1 BulkSetDmaOut();
78 1 }
79 //----------------------------------------------------------------------------
80 // Wait OUT Packet.
81 //----------------------------------------------------------------------------
82 void BulkWaitOutDataReady() //
83 {
84 1 while (1)
85 1 {
86 2 while ((EPINT & bmEPAINT) == 0);
87 2 // Clear OUT IRQ.
88 2 EPINT&=~bmEPAINT;
89 2 if (!BulkOutTogErr())
90 2 break;
91 2 }
92 1 }
93
94 //----------------------------------------------------------------------------
95 void BulkReportHandle()
96 {
97 1 if (BulkCmdRunning)
98 1 {
99 2 BulkPrepareCSW(CmdStatus);
100 2 }
101 1 }
102
103 #pragma OPTIMIZE(4)
104 /*
105 *********************************************************************************************************
106 * BulkSetDmaIn()
107 *
108 * Description: Send data to host.
109 *
110 * Arguments : DmaLen,IN packet length.
111 *
112 * Returns : none
113 *********************************************************************************************************
114 */
115 void BulkSetDmaIn(UINT16 DmaLen)
116 {
C51 COMPILER V7.02b BULKCMD 02/27/2008 12:54:50 PAGE 3
117 1 if (FIFO_ADDRESS_IN == DMA_FIFOB0)//If DMA_FIFOB0 is selected.
118 1 {
119 2 EPBFIFOCS = (EPBFIFOCS | bmFIFO0_FULL_WE) | bmFIFO0_FULL;//2007.01.09
120 2 EPBCNT0L = DmaLen & 0xFF; // Write count low byte
121 2 EPBCNTH = (DmaLen >> 8) | bmCNT0HWEN; // Write count high byte
122 2 SW_IN_FIFO_Toggle = 1;
123 2 }
124 1 else
125 1 {
126 2 EPBFIFOCS = (EPBFIFOCS | bmFIFO1_FULL_WE) | bmFIFO1_FULL;//2007.01.09
127 2 EPBCNT1L = DmaLen & 0xFF; // Write count low byte
128 2 EPBCNTH = ((DmaLen >> 8) << 4) | bmCNT1HWEN; // Write count high byte
129 2 SW_IN_FIFO_Toggle = 0;
130 2 }
131 1
132 1 EPBCS = EPBCS | bmEP_RXTXEN; // Enable RXTX
133 1
134 1 }
135 //------------------------------------
136 //
137 //------------------------------------
138 void SelectInFifo(void)
139 {
140 1 if ((!(EPBFIFOCS & bmFIFO0_FULL)) && (!(EPBFIFOCS & bmFIFO1_FULL)))
141 1 {
142 2 if (SW_IN_FIFO_Toggle==0)//根据软件toggle位来判断从哪个FIFO 取数据。
143 2 {
144 3 FIFO_ADDRESS_IN= DMA_FIFOB0;
145 3 }
146 2 else
147 2 {
148 3 FIFO_ADDRESS_IN= DMA_FIFOB1;
149 3 }
150 2 }
151 1 else if (!(EPBFIFOCS & bmFIFO0_FULL))
152 1 {
153 2 FIFO_ADDRESS_IN= DMA_FIFOB0;
154 2 }
155 1 else if (!(EPBFIFOCS & bmFIFO1_FULL))
156 1 {
157 2 FIFO_ADDRESS_IN= DMA_FIFOB1;
158 2 }
159 1 }
160 //----------------------------------------------------------------------------
161 // Description: Select one of PINGPONG FIFOS for IN transaction.
162 //
163 //----------------------------------------------------------------------------
164 void SetBulkInFull (void)
165 {
166 1 while ((EPBFIFOCS & bmFIFO0_FULL) && (EPBFIFOCS & bmFIFO1_FULL));
167 1 SelectInFifo();//
168 1 }
169
170 //----------------------------------------------------------------------------
171 // Description: 专门处理读扇区,对bus reset做了特别处理.
172 //
173 //----------------------------------------------------------------------------
174 void SetBulkInFullForReadSector(void)
175 {
176 1 while ((EPBFIFOCS&bmFIFO0_FULL)&&(EPBFIFOCS & bmFIFO1_FULL)&&((STINT&bmUSBRSTINT)==0));
177 1 //等待至少一个FIFO_FULL为0,或者BUS RESET的发生~!2007.01.22
178 1 if(STINT&bmUSBRSTINT) {
C51 COMPILER V7.02b BULKCMD 02/27/2008 12:54:50 PAGE 4
179 2 BusResetDeal();
180 2 BusResetFlagCnt = 1;
181 2 return;
182 2 }
183 1 SelectInFifo();//
184 1 }
185 //----------------------------------------------------------------------------
186 // Description: Check which one of PINGPONG FIFOS the OUT packet is in.
187 //
188 //----------------------------------------------------------------------------
189 void SelectOutFifo(void)
190 {
191 1 if ((EPAFIFOCS & bmFIFO0_FULL) && (EPAFIFOCS & bmFIFO1_FULL))
192 1 { // FULL_0 = 1 and FULL_1 = 1
193 2 if (SW_OUT_FIFO_Toggle == 0)//如果两个FULL位都是1,根据软件toggle位判断.
194 2 {
195 3 FIFO_ADDRESS_OUT = DMA_FIFOA0;
196 3 }
197 2 else
198 2 {
199 3 FIFO_ADDRESS_OUT = DMA_FIFOA1;
200 3 }
201 2 }
202 1 else if (EPAFIFOCS & bmFIFO0_FULL) // FULL_0 = 1
203 1 {
204 2 FIFO_ADDRESS_OUT = DMA_FIFOA0;
205 2 }
206 1 else if (EPAFIFOCS & bmFIFO1_FULL) // FULL_1 = 1
207 1 {
208 2 FIFO_ADDRESS_OUT = DMA_FIFOA1;
209 2 }
210 1
211 1 }
212 #pragma OPTIMIZE(4)
213 //----------------------------------------------------------------------------
214 // Prepare CSW
215 //----------------------------------------------------------------------------
216 void BulkPrepareCSW(BYTE Status)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -