📄 usb.lst
字号:
168 };
169
170 void Get_Descriptor(unsigned char DesType,unsigned char nLength) //得到描述符
171 {
172 1 if(DesType==0x01) //取设备描述符
173 1 WriteEp(0,18,Device_Descriptor);
174 1
175 1 if((DesType==0x02)&&(nLength==0x09)) //取端口描述符
176 1 WriteEp(0,9,Configuration_Descriptor_All);
177 1
178 1 if((DesType==0x02)&&(nLength==0xff)) //取端点描述符
179 1 {
C51 COMPILER V7.50 USB 02/08/2007 11:18:10 PAGE 4
180 2 WriteEp(0,32,Configuration_Descriptor_All);
181 2 WriteEp(0,2,&Device_Descriptor[4]);
182 2 }
183 1
184 1 if((DesType==0x02)&&(nLength==0x20))
185 1 WriteEp(0,32,Configuration_Descriptor_All); //取配置描述符
186 1 }
187
188 void Set_Configuration(unsigned char wValue) //设置配置
189 {
190 1 if(wValue == 0)
191 1 {
192 2 UEPNUM=0x00; UEPCONX=0x80;
193 2 UEPNUM=0x01; UEPCONX=0x86;
194 2 UEPNUM=0x02; UEPCONX=0x82;
195 2 USBCON&=(~CONFG);
196 2 WriteEp(0,0,0); //状态传送阶段之前完成指定操作
197 2 }
198 1 else if(wValue == 1)
199 1 {
200 2 UEPNUM=0x00; UEPCONX=0x80;
201 2 UEPNUM=0x01; UEPCONX=0x86;
202 2 UEPNUM=0x02; UEPCONX=0x82;
203 2 USBCON|=CONFG;
204 2 WriteEp(0,0,0); //状态传送阶段之前完成指定操作
205 2 }
206 1 }
207
208 void Ep0() //---端点0处理主函数
209 {
210 1 unsigned char data DT[32]={0,};
211 1 unsigned char data i;
212 1 i = ReadEp(0,DT);
213 1 if (((DT[0] & 0x60)==0) && i)
214 1 {
215 2 switch (DT[1])
216 2 {
217 3 case set_address :Set_Address(DT[2]); break; //设置地址
218 3 case get_descriptor :Get_Descriptor(DT[3],DT[6]); break; //取描述符
219 3 case set_configuration :Set_Configuration(DT[2]); break; //设置配置
220 3 default :; break;
221 3 }
222 2 }
223 1 else if(DT[0]==0xa1) //非标准USB请求
224 1 {
225 2 WriteEp(0,0,0);
226 2 }
227 1 }
228
229 /******************************************************************************/
230 /** 以下为利用Bulk_Only传输协议的函数部分 **/
231 /******************************************************************************/
232 unsigned char data bulk_CSW[]={0x55,0x53,0x42,0x53, // bytes 4 dCSWSignature
233 0x00,0x00,0x00,0x00, //bytes 4 dCSWTag
234 0x00,0x00,0x00,0x00, //bytes 4 dDataResiduce
235 0x00}; //bCSWStatus 00=good state.
236
237 typedef struct _STRUCT_CBW
238 {
239 unsigned char CBWCB[12]; //for UFI Command all have 12bit
240
241 } struct_CBW;
C51 COMPILER V7.50 USB 02/08/2007 11:18:10 PAGE 5
242
243 struct_CBW data bulk_CBW;
244
245 void WriteEpBulk(unsigned char EpNum,unsigned char nLength,unsigned char *Data)
246 {
247 1 unsigned char data i;
248 1 UEPNUM=EpNum; //---设置端点号
249 1 UEPSTAX|=DIR; //...设置为In模式
250 1 for(i=0;i<nLength;i++) UEPDATX=Data[i]; //---填缓冲区
251 1 UEPSTAX|=TXRDY; //---发送数据
252 1 }
253
254 void TransmitCSW() //向Host返回CSW
255 {
256 1 WriteEpBulk(1, sizeof(bulk_CSW), bulk_CSW);
257 1 while(!(UEPSTAX&TXCMP)) ;
258 1 UEPSTAX&=(~(TXCMP)); //清除TXCMP
259 1 UEPINT = 0;
260 1 }
261
262 void main_txdone() //数据发送完毕给出回复
263 {
264 1 UEPSTAX&=(~(TXCMP)); //清除TXCMP
265 1 TransmitCSW();
266 1 }
267
268 //////////////////////////////////有关输出端点的调用//////////////////////////////////////////////
269 #define Inquiry 0x12
270 #define Mode_Sense 0x1A
271 #define Read10 0x28
272 #define Read_Capacity 0x25
273 #define Read_Format_Capacities 0x23
274 #define Test_Unit_Ready 0x00
275 #define Verify 0x2F
276 #define Write10 0x2A
277 #define Medium_Removal 0x1E
278
279 #define SCSI_MSPGCD_TPP 0x1C
280 #define SCSI_MSPGCD_RETALL 0x3F
281
282 //SCSI-Inquiry命令的返回数据
283 code unsigned char B_InquiryData[] = {
284 0x00, //Direct Access Device
285 0x80, //RMB
286 0x00, //ISO/ECMA/ANSI
287 0x01, //Response Data Format
288 0x1f, //Additional Length
289 0x00, //Reserved
290 0x00, //Reserved
291 0x00, //Reserved
292 'K', 'T', '-', 'T', 'E', 'C', 'H', ' ', //Vendor Information
293 'M', 'P', '3', ' ', 'P', 'l', 'a', 'y', 'e', 'r', ' ', 'V', '1', '.', '0', '0',//Product Identifica
-tion
294 0, 0, 0, 0}; //Product Revision Level n.nn
295
296 //SCSI-Read_Format_capacities命令的返回数据
297 code unsigned char B_Read_Format_capacities[] = {0x00, 0x00, 0x00, 0x10, //capacity list header
298 0x00, 0x00, 0x07, 0xf5, 0x01, 0x00, 0x02, 0x00, //capacity descriptor
299 //Number of Blocks =2037,unformatted media,blocklength = 512Bytes
300 0x00, 0x00, 0x07, 0xfd, 0x00, 0x00, 0x02, 0x00 //Formattable Capacity Descriptors
301 };
302 //SCSI-Read_Capacity命令的返回数据
C51 COMPILER V7.50 USB 02/08/2007 11:18:10 PAGE 6
303 code unsigned char B_Read_Capacity[] = {
304 0x00, 0x00, 0xfe, 0xa0, //Last Logical Block Address for 32MB
305 0x00, 0x00, 0x02, 0x00 //block length in bytes
306 };
307 //SCSI-Mode_Sense命令的返回数据
308 code unsigned char B_Mode_Sense_ALL[] = {0x0b, 0x00, //Mode Data Length
309 0x00, 0x08, 0x00, 0x00,
310 0x7d, 0, 0, 0, 0x02, 0x00
311 };
312 //SCSI-Mode_Sense命令的返回数据
313 code unsigned char B_Mode_Sense_TPP[] = {0xf0, 0x00, //Mode Data Length
314 05, 00, 00, 00, 00, 0x0b, 00, 00, 00, 00, 0x24, 00, 00, 00, 00, 00
315 };
316 //SCSI-Mode_Sense命令的返回数据
317 code unsigned char B_Mode_Sense_ZERO[] = {0x00, 0x06, //Mode Data Length
318 0x00, //Medium Type Code
319 0, //write enabled
320 0, 0, 0, 0 //reserved
321 };
322
323
324 void SCSI_Mode_Sense()
325 {
326 1 if(bulk_CBW.CBWCB[2] == SCSI_MSPGCD_TPP) //Page Code=Timer and Potect Page
327 1 {WriteEpBulk(1, sizeof(B_Mode_Sense_TPP), B_Mode_Sense_TPP);}
328 1 else if(bulk_CBW.CBWCB[2] == SCSI_MSPGCD_RETALL) //Page Code=All
329 1 {WriteEpBulk(1, sizeof(B_Mode_Sense_ALL), B_Mode_Sense_ALL);}
330 1 else {WriteEpBulk(1, sizeof(B_Mode_Sense_ZERO), B_Mode_Sense_ZERO);}
331 1 }
332
333 void SCSI_Read_Format_Capacities()
334 {
335 1 if(bulk_CBW.CBWCB[7]==0 && bulk_CBW.CBWCB[8]==0)return;
336 1 WriteEpBulk(1, sizeof(B_Read_Format_capacities), B_Read_Format_capacities);
337 1 }
338
339 extern void ReadFlash();
340 extern void WriteFlash();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -