📄 scsicmd.lst
字号:
C51 COMPILER V7.02b SCSICMD 02/27/2008 12:56:18 PAGE 1
C51 COMPILER V7.02b, COMPILATION OF MODULE SCSICMD
OBJECT MODULE PLACED IN .\Output\ScsiCmd.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ScsiCmd.c LARGE OPTIMIZE(SIZE) BROWSE DEBUG OBJECTEXTEND PRINT(.\Output\Scs
-iCmd.lst) OBJECT(.\Output\ScsiCmd.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 BYTE SenseKey;
26 xdata BYTE AddSenseCode;
27 xdata BYTE AddSenseCodeQ;
28 xdata bool ScsiMediaChange[MAX_DEVICE_NUM];
*** WARNING C231 IN LINE 28 OF SCSICMD.C: 'ScsiMediaChange': redefinition
29 /*************************************************
30 Local Variables
31 *************************************************/
32 static xdata BYTE ScsiWriteProtect[MAX_DEVICE_NUM];
33 static xdata bool ScsiWriteProtectChange[MAX_DEVICE_NUM];
34 //static xdata UINT32 CapacityInfo[2];
35 static xdata BYTE ScsiLoadStatus[MAX_DEVICE_NUM];
36
37 /*BYTE RequestSenseData[REQUEST_SENSE_DATA_LEN] =
38 { 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A,
39 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
40 0x00, 0x00
41 };*/
42
43 code BYTE ModeParamHeader6[MODE_PARAM_HEADER_LEN] =
44 { 0x00, 0x00, 0x00, 0x00 };
45
46 // Mode Page #1 Read-Write Error Recovery
47 code BYTE ModePage_1[] =
48 { 0x01, 0x0A, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00,
49 0x03, 0x00, 0x00, 0x00
50 };
51 // Mode Page #5
52 /*code BYTE ModePage_5[] =
53 { 0x05, 0x1e, 0x13, 0x88, 0x08, 0x20, 0x02, 0x00, 0x01, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00,
C51 COMPILER V7.02b SCSICMD 02/27/2008 12:56:18 PAGE 2
54 0x00, 0x00, 0x00, 0x00, 0x05, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x68,
55 0x00, 0x00, };
56 // Mode Page #1B
57 code BYTE ModePage_1B[] =
58 { 0x1B, 0x0A, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
59 // Mode Page #1C
60 code BYTE ModePage_1C[] =
61 { 0x1C, 0x06, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00 };
62 */
63 xdata MODE_PAGE_TABLE ModePageArray[] =
64 {
65 { ModePage_1, sizeof(ModePage_1) },
66 // Reduce XDATA Size so don't return more mode pages.
67 // { ModePage_5, sizeof(ModePage_5) },
68 // { ModePage_1B, sizeof(ModePage_1B) },
69 // { ModePage_1C, sizeof(ModePage_1C) },
70 { NULL, 0 }
71 };
72
73 //----------------------------------------------------------------------------
74 // Detect the write protect on the storage media.(Shared)
75 //----------------------------------------------------------------------------
76 bool ScsiDetectWriteProtect(BYTE Lun)
77 {
78 1 if (ScsiWriteProtect[Lun])
79 1 {
80 2 SenseKey = DATA_PROTECT;
81 2 AddSenseCode = HW_WRITE_PROTECT;
82 2 return true;
83 2 }
84 1 return false;
85 1 }
86
87 //----------------------------------------------------------------------------
88 // Set Command Error.(INVALID_FIELD_IN_CDB)
89 //----------------------------------------------------------------------------
90 void ScsiInvalidFieldError(BYTE Lun) // To be replaced
91 {
92 1 Lun=Lun;
93 1 CmdStatus = PHASE_ERROR;
94 1 SenseKey = ILLEGAL_REQUEST;
95 1 AddSenseCode = INVALID_FIELD_IN_CDB;
96 1 AddSenseCodeQ = 0x00;
97 1 }
98
99 void SetSenseErrOpCode()
100 {
101 1 CmdStatus = PHASE_ERROR;
102 1 SenseKey = 0x05; // INVALID COMMAND OPERATION CODE
103 1 AddSenseCode = 0x20;
104 1 AddSenseCodeQ = 0x00;
105 1 }
106
107 void SetSenseErrCmdField()
108 {
109 1 CmdStatus = PHASE_ERROR;
110 1 SenseKey = 0x05; // INVALID FIELD IN COMMAND PACKET
111 1 AddSenseCode = 0x24;
112 1 AddSenseCodeQ = 0x00;
113 1 }
114
115 /*void SetSenseErrCmdPara()
C51 COMPILER V7.02b SCSICMD 02/27/2008 12:56:18 PAGE 3
116 {
117 CmdStatus = PHASE_ERROR;
118 SenseKey = 0x05; // PARAMETER VALUE INVALID
119 AddSenseCode = 0x26;
120 AddSenseCodeQ = 0x02;
121 }*/
122
123 void ScsiModifySenseWord(BYTE Lun, BYTE Status)
124 {
125 1 Lun=Lun;
126 1 switch (Status)
127 1 {
128 2 case STATUS_SUCCESS: // NO SENSE
129 2 SenseKey = 0x00;
130 2 AddSenseCode = 0x00;
131 2 AddSenseCodeQ = 0x00;
132 2 break;
133 2
134 2 case STATUS_NO_MEDIA: // MEDIUM NOT PRESENT
135 2 SenseKey = 0x02;
136 2 AddSenseCode = 0x3A;
137 2 AddSenseCodeQ = 0x00;
138 2 break;
139 2
140 2 case STATUS_MEDIA_CHANGE: // NOT READY TO READY TRANSITION
141 2 SenseKey = 0x06; // - MEDIA CHANGED
142 2 AddSenseCode = 0x28;
143 2 AddSenseCodeQ = 0x00;
144 2 break;
145 2
146 2 default: // UNKNOWN ERROR
147 2 SenseKey = 0x02;
148 2 AddSenseCode = 0xFF;
149 2 AddSenseCodeQ = 0xFF;
150 2 break;
151 2 }
152 1 }
153
154 void SetSenseDataWr(BYTE Status)
155 {
156 1 switch (Status)
157 1 {
158 2 case STATUS_SUCCESS: // NO SENSE
159 2 SenseKey = 0x00;
160 2 AddSenseCode = 0x00;
161 2 AddSenseCodeQ = 0x00;
162 2 break;
163 2
164 2 case STATUS_NO_MEDIA: // MEDIUM NOT PRESENT
165 2 SenseKey = 0x02;
166 2 AddSenseCode = 0x3A;
167 2 AddSenseCodeQ = 0x00;
168 2 break;
169 2
170 2 case STATUS_MEDIA_CHANGE: // NOT READY TO READY TRANSITION
171 2 SenseKey = 0x06; // - MEDIA CHANGED
172 2 AddSenseCode = 0x28;
173 2 AddSenseCodeQ = 0x00;
174 2 break;
175 2
176 2 case STATUS_WRITE_PROTECT:// WRITE PROTECTED MEDIA
177 2 SenseKey = 0x07;
C51 COMPILER V7.02b SCSICMD 02/27/2008 12:56:18 PAGE 4
178 2 AddSenseCode = 0x27;
179 2 AddSenseCodeQ = 0x00;
180 2 break;
181 2
182 2 case STATUS_FLASH_ERROR: // WRITE FAULT
183 2 case STATUS_NO_BLOCK: // WRITE FAULT
184 2 SenseKey = 0x03; //
185 2 AddSenseCode = 0x03;
186 2 AddSenseCodeQ = 0x00;
187 2 break;
188 2
189 2 default: // UNKNOWN ERROR
190 2 SenseKey = 0x02;
191 2 AddSenseCode = 0xFF;
192 2 AddSenseCodeQ = 0xFF;
193 2 break;
194 2 }
195 1 }
196
197 void SetSenseDataRd(BYTE Status)
198 {
199 1 switch (Status)
200 1 {
201 2 case STATUS_SUCCESS: // NO SENSE
202 2 SenseKey = 0x00;
203 2 AddSenseCode = 0x00;
204 2 AddSenseCodeQ = 0x00;
205 2 break;
206 2
207 2 case STATUS_NO_MEDIA: // MEDIUM NOT PRESENT
208 2 SenseKey = 0x02;
209 2 AddSenseCode = 0x3A;
210 2 AddSenseCodeQ = 0x00;
211 2 break;
212 2
213 2 case STATUS_MEDIA_CHANGE: // NOT READY TO READY TRANSITION
214 2 SenseKey = 0x06; // - MEDIUM CHANGED
215 2 AddSenseCode = 0x28;
216 2 AddSenseCodeQ = 0x00;
217 2 break;
218 2
219 2 case STATUS_FLASH_ERROR: // UNRECOVERED READ ERROR
220 2 case STATUS_ECC_2ERROR: // UNRECOVERED READ ERROR
221 2 SenseKey = 0x03;
222 2 AddSenseCode = 0x11;
223 2 AddSenseCodeQ = 0x00;
224 2 break;
225 2
226 2 default: // UNKNOWN ERROR
227 2 SenseKey = 0x02;
228 2 AddSenseCode = 0xFF;
229 2 AddSenseCodeQ = 0xFF;
230 2 break;
231 2 }
232 1 }
233
234 //----------------------------------------------------------------------------
235 // Get the LUN capcity
236 // Description: Write those capacity informations to the global variable
237 // CapacityInfo[].
238 //----------------------------------------------------------------------------
239 void ScsiGetLunCapacity()
C51 COMPILER V7.02b SCSICMD 02/27/2008 12:56:18 PAGE 5
240 {
241 1 BYTE Status;
242 1
243 1 Status = QueryDevice();
244 1 *(UINT32 xdata *)(FIFO_ADDRESS_IN + 0) = DeviceInfo.TotalBlocks;
245 1 *(UINT32 xdata *)(FIFO_ADDRESS_IN + 4) = (UINT32)DeviceInfo.BlockSize;
246 1
247 1 }
248
249 //----------------------------------------------------------------------------
250 // Check Vaild Logic Unit Number
251 // Description: If not valid, change Sense Parameters.
252 //----------------------------------------------------------------------------
253 void ScsiLunValidCheck()
254 {
255 1 BYTE Status;
256 1
257 1 if(ScsiLun > LastDevice)
258 1 {
259 2 CmdStatus = PHASE_ERROR;
260 2 return;
261 2 }
262 1
263 1 Status = QueryDevice();
264 1
265 1 if(ScsiWriteProtect[ScsiLun] != DeviceInfo.WriteProtect)
266 1 {
267 2 ScsiWriteProtectChange[ScsiLun] = true;
268 2 ScsiWriteProtect[ScsiLun] = DeviceInfo.WriteProtect;
269 2 }
270 1
271 1 if((Status == STATUS_SUCCESS) ||
272 1 (Status == STATUS_MEDIA_CHANGE))
273 1 {
274 2 if((ScsiLoadStatus[ScsiLun] & SCSI_LAST_QUERY_MASK) == 0)
275 2 ScsiLoadStatus[ScsiLun] |= SCSI_LOAD_STATUS_MASK;
276 2
277 2 ScsiLoadStatus[ScsiLun] |= SCSI_LAST_QUERY_MASK;
278 2 }
279 1 else
280 1 ScsiLoadStatus[ScsiLun] &= ~SCSI_LAST_QUERY_MASK;
281 1
282 1 if(Status == STATUS_SUCCESS)
283 1 return;
284 1
285 1 ScsiModifySenseWord(ScsiLun, Status);
286 1 CmdStatus = COMMAND_FAILED;
287 1 }
288
289 //----------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -