?? usb.c
字號(hào):
/******************************************************************
本程序只供學(xué)習(xí)使用,未經(jīng)作者許可,不得用于其它任何用途
我的郵箱:computer-lov@tom.com
歡迎訪問(wèn)我的blog: http://computer00.21ic.org
USB.C file
Created by Computer-lov
Date: 2004.9.21
Edit date:2006.3.2
Version V1.1
Copyright(C) Computer-lov 2004-2014
All rigths reserved
*******************************************************************/
#include<Atmel/AT89x52.H>
#include<USB.H>
#include<PDIUSBD12.H>
#include<MASS_STORAGE.H>
//#include<serial.h>
#define USB_COMMAND_ADD 1
#define USB_DATA_ADD 0
#define USB_DATA P0
#define USB_A0 P3_5
#define USB_WR P3_6
#define USB_RD P3_7
#define USB_INT P3_2
#define ENDPOINT_NUMBER 2
#define MAX_CONTROL_DATA_SIZE 16
#define MAX_LUN 0
#define MAX_BULK_DATA_SIZE 64
CONTROL_DATA_BUFF Control_Data;
unsigned char idata buffer[64];
CBW cbw;
CSW csw;
union
{
unsigned char Register;
struct
{
unsigned char Command :1;
unsigned char Data :1;
}Status;
}SCSI;
unsigned char *pData;
code unsigned char DISK_INF[36]= //磁盤信息
{
0x00,
0x00,
0x02,
0x02,
0x1F,
0x00,0x00,0x00,
0xB5,0xE7,0XC4,0xD4,0xC8,0xA6,0xC8,0xA6,
0xD7,0xD4,0xBC,0xBA,0xD7,0xF6,0xB5,0xC4,0xBC,0xD9,0x55,0xC5,0xCC,0x00,0x00,0x00,
0x31,0x2E,0x30,0x31
};
code unsigned char DISK_CAPACITY[8]= //磁盤容量
{
0x00,0x01,0xff,0x00,
0x00,0x00,0x02,0x00
};
code unsigned char SENSE[0x12]= //模式探測(cè)返回?cái)?shù)據(jù)
{
0x70, 0x00, 0x05, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00
};
code unsigned char DBR[512]= //DOS引導(dǎo)記錄
{
0xeb, 0x3e, 0x90, //跳轉(zhuǎn)指令
0x4d, 0x53, 0x44, 0x4f, 0x53, 0x35, 0x2e, 0x30, //文件系統(tǒng)版本信息
0x00, 0x02, //扇區(qū)字節(jié)數(shù)
0x20, //每簇扇區(qū)數(shù)
0x01, 0x00, //保留扇區(qū)數(shù)
0x02, //該分區(qū)的FAT副本數(shù)
0xF0, 0x01, //根目錄項(xiàng)數(shù)
0x00, 0x00, //小扇區(qū)數(shù)
0xf8, //媒體描述符
0x10, 0x00, //每FAT扇區(qū)數(shù)
0x20, 0x00, //每道扇區(qū)數(shù)
0x40, 0x00, //磁頭數(shù)
0x00, 0x00, 0x00, 0x00, //隱藏扇區(qū)數(shù)
0x40, 0xff, 0x01, 0x00, //大扇區(qū)數(shù)
0x80, //磁盤驅(qū)動(dòng)器參數(shù),80表示硬盤
0x00, //保留
0x29, //擴(kuò)展引導(dǎo)標(biāo)記,0x29表示后三個(gè)區(qū)可用
0x88, 0x09, 0x71, 0x20, //標(biāo)卷序列號(hào)
0xBC, 0xD9, 0x55, 0xC5, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //磁盤標(biāo)卷
0x46, 0x41, 0x54, 0x31, 0x36, 0x20, 0x20, 0x20, //文件系統(tǒng)類型信息
0xf1, 0x7d,
0xfa, 0x33, 0xc9, 0x8e, 0xd1, 0xbc, 0xfc, 0x7b, 0x16, 0x07, 0xbd, 0x78, 0x00, 0xc5, 0x76, 0x00,
0x1e, 0x56, 0x16, 0x55, 0xbf, 0x22, 0x05, 0x89, 0x7e, 0x00, 0x89, 0x4e, 0x02, 0xb1, 0x0b, 0xfc,
0xf3, 0xa4, 0x06, 0x1f, 0xbd, 0x00, 0x7c, 0xc6, 0x45, 0xfe, 0x0f, 0x8b, 0x46, 0x18, 0x88, 0x45,
0xf9, 0xfb, 0x38, 0x66, 0x24, 0x7c, 0x04, 0xcd, 0x13, 0x72, 0x3c, 0x8a, 0x46, 0x10, 0x98, 0xf7,
0x66, 0x16, 0x03, 0x46, 0x1c, 0x13, 0x56, 0x1e, 0x03, 0x46, 0x0e, 0x13, 0xd1, 0x50, 0x52, 0x89,
0x46, 0xfc, 0x89, 0x56, 0xfe, 0xb8, 0x20, 0x00, 0x8b, 0x76, 0x11, 0xf7, 0xe6, 0x8b, 0x5e, 0x0b,
0x03, 0xc3, 0x48, 0xf7, 0xf3, 0x01, 0x46, 0xfc, 0x11, 0x4e, 0xfe, 0x5a, 0x58, 0xbb, 0x00, 0x07,
0x8b, 0xfb, 0xb1, 0x01, 0xe8, 0x94, 0x00, 0x72, 0x47, 0x38, 0x2d, 0x74, 0x19, 0xb1, 0x0b, 0x56,
0x8b, 0x76, 0x3e, 0xf3, 0xa6, 0x5e, 0x74, 0x4a, 0x4e, 0x74, 0x0b, 0x03, 0xf9, 0x83, 0xc7, 0x15,
0x3b, 0xfb, 0x72, 0xe5, 0xeb, 0xd7, 0x2b, 0xc9, 0xb8, 0xd8, 0x7d, 0x87, 0x46, 0x3e, 0x3c, 0xd8,
0x75, 0x99, 0xbe, 0x80, 0x7d, 0xac, 0x98, 0x03, 0xf0, 0xac, 0x84, 0xc0, 0x74, 0x17, 0x3c, 0xff,
0x74, 0x09, 0xb4, 0x0e, 0xbb, 0x07, 0x00, 0xcd, 0x10, 0xeb, 0xee, 0xbe, 0x83, 0x7d, 0xeb, 0xe5,
0xbe, 0x81, 0x7d, 0xeb, 0xe0, 0x33, 0xc0, 0xcd, 0x16, 0x5e, 0x1f, 0x8f, 0x04, 0x8f, 0x44, 0x02,
0xcd, 0x19, 0xbe, 0x82, 0x7d, 0x8b, 0x7d, 0x0f, 0x83, 0xff, 0x02, 0x72, 0xc8, 0x8b, 0xc7, 0x48,
0x48, 0x8a, 0x4e, 0x0d, 0xf7, 0xe1, 0x03, 0x46, 0xfc, 0x13, 0x56, 0xfe, 0xbb, 0x00, 0x07, 0x53,
0xb1, 0x04, 0xe8, 0x16, 0x00, 0x5b, 0x72, 0xc8, 0x81, 0x3f, 0x4d, 0x5a, 0x75, 0xa7, 0x81, 0xbf,
0x00, 0x02, 0x42, 0x4a, 0x75, 0x9f, 0xea, 0x00, 0x02, 0x70, 0x00, 0x50, 0x52, 0x51, 0x91, 0x92,
0x33, 0xd2, 0xf7, 0x76, 0x18, 0x91, 0xf7, 0x76, 0x18, 0x42, 0x87, 0xca, 0xf7, 0x76, 0x1a, 0x8a,
0xf2, 0x8a, 0x56, 0x24, 0x8a, 0xe8, 0xd0, 0xcc, 0xd0, 0xcc, 0x0a, 0xcc, 0xb8, 0x01, 0x02, 0xcd,
0x13, 0x59, 0x5a, 0x58, 0x72, 0x09, 0x40, 0x75, 0x01, 0x42, 0x03, 0x5e, 0x0b, 0xe2, 0xcc, 0xc3,
0x03, 0x18, 0x01, 0x27, 0x0d, 0x0a, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x73, 0x79,
0x73, 0x74, 0x65, 0x6d, 0x20, 0x64, 0x69, 0x73, 0x6b, 0xff, 0x0d, 0x0a, 0x44, 0x69, 0x73, 0x6b,
0x20, 0x49, 0x2f, 0x4f, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0xff, 0x0d, 0x0a, 0x52, 0x65, 0x70,
0x6c, 0x61, 0x63, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x69, 0x73, 0x6b, 0x2c, 0x20, 0x61,
0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x70, 0x72, 0x65, 0x73, 0x73, 0x20, 0x61, 0x6e,
0x79, 0x20, 0x6b, 0x65, 0x79, 0x0d, 0x0a, 0x00, 0x49, 0x4f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x53, 0x59, 0x53, 0x4d, 0x53, 0x44, 0x4f, 0x53, 0x20, 0x20, 0x20, 0x53, 0x59, 0x53, 0x80, 0x01,
0x00, 0x57, 0x49, 0x4e, 0x42, 0x4f, 0x4f, 0x54, 0x20, 0x53, 0x59, 0x53, 0x00, 0x00, 0x55, 0xaa,
};
code unsigned char FAT[64]= //模擬的文件分配表
{
0xF8, 0xFF, 0xFF, 0xFF, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
code unsigned char ZERO[64]= //填充0
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
code unsigned char ROOT_DIR[64]= //根目錄
{
0xC2, 0xC3, 0xD3, 0xCE, 0xB5, 0xBC, 0xB2, 0xA5, 0xBB, 0xFA, 0x20, //磁盤標(biāo)卷
0x08, //文件屬性,表示磁盤標(biāo)卷
0x00, //保留
0x00, //創(chuàng)建時(shí)間毫秒時(shí)間戳
0x00, 0x40, //文件創(chuàng)建時(shí)間
0x41, 0x31, //文件創(chuàng)建日期
0x42, 0x31, //最后訪問(wèn)日期
0x00, 0x00, //起始簇號(hào)高位字節(jié),F(xiàn)AT12/16必須為0
0x00, 0x40, //最后寫時(shí)間
0x42, 0x31, //最后寫日期
0x00, 0x00, //起始簇低位字節(jié)
0x00, 0x00, 0x00, 0x00, //文件長(zhǎng)度
'T', 'E', 'S', 'T', ' ', ' ', ' ', ' ', 'T', 'X', 'T', //文件名
0x01, //文件屬性,表示磁盤標(biāo)卷
0x00, //保留
0x00, //創(chuàng)建時(shí)間毫秒時(shí)間戳
0x00, 0x40, //文件創(chuàng)建時(shí)間
0x41, 0x31, //文件創(chuàng)建日期
0x42, 0x31, //最后訪問(wèn)日期
0x00, 0x00, //起始簇號(hào)高位字節(jié),F(xiàn)AT12/16必須為0
0x00, 0x40, //最后寫時(shí)間
0x42, 0x31, //最后寫日期
0x02, 0x00, //起始簇低位字節(jié)
0xe9, 0x00, 0x00, 0x00, //文件長(zhǎng)度
};
code unsigned char FILE_DATA[233]=
{"這是一個(gè)測(cè)試程序,用來(lái)測(cè)試文件系統(tǒng)是否工作正常。如果你能看到這些文字,那么說(shuō)明你的電腦已經(jīng)中了最無(wú)恥的108病毒了,請(qǐng)馬上把所有文件刪除,并格式化硬盤后,將硬盤壓碎,以免你也被感染!如果你在30秒內(nèi)還未開始刪除文件,你的電腦將會(huì)永久報(bào)廢!"};
unsigned int SWAP(unsigned int temp) //高低字節(jié)交換
{
unsigned int i;
i=temp;
i<<=8;
temp>>=8;
i|=temp;
return i;
}
/*unsigned long int SWAP_long(unsigned long int temp) //四字節(jié)交換
{
unsigned long int i;
i=temp<<24;
i|=(temp<<8)&0x00FF0000;
i|=(temp>>8)&0x0000FF00;
i|=(temp>>24)&0x000000FF;
return i;
}*/
unsigned char LSB(unsigned int temp) //取一個(gè)整數(shù)的低字節(jié)
{
return (unsigned char)temp;
}
unsigned char MSB(unsigned int temp) //取一個(gè)整數(shù)的高字節(jié)
{
return (unsigned char)(temp>>8);
}
code unsigned char LANGUAGE_ID[4]={0x04,0x03,0x09,0x04}; //字符串描述符所用的語(yǔ)言種類
code unsigned char device_serial_number[18]= //設(shè)備序列號(hào)
{0x12,0x03,0x32,0x00,0x30,0x00,0x37,0x00,0x31,0x00,0x30,0x00,0x39,0x00,0x38,0x00,0x32,0x00};
code DEVICE_DESCRIPTOR_STRUCT device_descriptor= //設(shè)備描述符
{
sizeof(DEVICE_DESCRIPTOR_STRUCT), //設(shè)備描述符的字節(jié)數(shù)大小
DEVICE_DESCRIPTOR, //設(shè)備描述符類型編號(hào)
0x1001, //USB版本號(hào)
0x00, //USB分配的設(shè)備類代碼
0x00, //USB分配的子類代碼
0x00, //USB分配的設(shè)備協(xié)議代碼
0x10, //端點(diǎn)0的最大包大小
0x7104, //廠商編號(hào)
0xf0ff, //產(chǎn)品編號(hào)
0x0100, //設(shè)備出廠編號(hào)
0x00, //設(shè)備廠商字符串的索引
0x00, //描述產(chǎn)品字符串的索引
0x02, //描述設(shè)備序列號(hào)字符串的索引
0x01 //可能的配置數(shù)量
};
typedef struct _CON_INT_ENDP_DESCRIPTOR_STRUCT
{
CONFIGURATION_DESCRIPTOR_STRUCT configuration_descriptor;
INTERFACE_DESCRIPTOR_STRUCT interface_descritor;
ENDPOINT_DESCRIPTOR_STRUCT endpoint_descriptor[ENDPOINT_NUMBER];
}CON_INT_ENDP_DESCRIPTOR_STRUCT;
code CON_INT_ENDP_DESCRIPTOR_STRUCT con_int_endp_descriptor=
{
//configuration_descriptor //配置描述符
{
sizeof(CONFIGURATION_DESCRIPTOR_STRUCT), //配置描述符的字節(jié)數(shù)大小
CONFIGURATION_DESCRIPTOR, //配置描述符類型編號(hào)
(sizeof(CONFIGURATION_DESCRIPTOR_STRUCT)+sizeof(INTERFACE_DESCRIPTOR_STRUCT)+sizeof(ENDPOINT_DESCRIPTOR_STRUCT)*ENDPOINT_NUMBER)*256+
(sizeof(CONFIGURATION_DESCRIPTOR_STRUCT)+sizeof(INTERFACE_DESCRIPTOR_STRUCT)+sizeof(ENDPOINT_DESCRIPTOR_STRUCT)*ENDPOINT_NUMBER)/256,
0x01, //只包含一個(gè)接口
0x01, //該配置的編號(hào)
0x00, //iConfiguration字段
0x80, //采用總線供電,不支持遠(yuǎn)程喚醒
0xC8 //從總線獲取最大電流400mA
},
//interface_descritor //接口描述符
{
sizeof(INTERFACE_DESCRIPTOR_STRUCT), //接口描述符的字節(jié)數(shù)大小
INTERFACE_DESCRIPTOR, //接口描述符類型編號(hào)
0x00, //接口編號(hào)為0
0x00, //該接口描述符的編號(hào)
ENDPOINT_NUMBER, //非0端點(diǎn)數(shù)量為2,只使用端點(diǎn)主端點(diǎn)輸入和輸出
0x08, //USB大容量存儲(chǔ)設(shè)備
0x06, //使用的子類,為簡(jiǎn)化塊命令
0x50, //使用的協(xié)議,這里使用單批量傳輸協(xié)議
0x00 //接口描述符字符串索引
},
//endpoint_descriptor[]
{
{ //主端點(diǎn)輸入描述
sizeof(ENDPOINT_DESCRIPTOR_STRUCT), //端點(diǎn)描述符的字節(jié)數(shù)大小
ENDPOINT_DESCRIPTOR, //端點(diǎn)描述符類型編號(hào)
MAIN_POINT_IN, //端點(diǎn)號(hào),主輸入端點(diǎn)
ENDPOINT_TYPE_BULK, //使用的傳輸類型,批量傳輸
0x4000, //該端點(diǎn)支持的最大包尺寸,64字節(jié)
0x00 //中斷掃描時(shí)間,對(duì)批量傳輸無(wú)效
},
{ //主端點(diǎn)輸出描述
sizeof(ENDPOINT_DESCRIPTOR_STRUCT), //端點(diǎn)描述符的字節(jié)數(shù)大小
ENDPOINT_DESCRIPTOR, //端點(diǎn)描述符類型編號(hào)
MAIN_POINT_OUT, //端點(diǎn)號(hào),主輸出端點(diǎn)
ENDPOINT_TYPE_BULK, //使用的傳輸類型,批量傳輸
0x4000, //該端點(diǎn)支持的最大包尺寸,64字節(jié)
0x00 //中斷掃描時(shí)間,對(duì)批量傳輸無(wú)效
}
}
};
union //程序標(biāo)志位
{
unsigned int Register;
struct
{
unsigned char bus_reset :1;
unsigned char suspend :1;
unsigned char remote_wakeup :1;
unsigned char int_isr :1;
unsigned char not_end :1;
unsigned char usb_idle :1;
unsigned char usb_busy :1;
unsigned char setup_packet_in :1;
unsigned char setup_packet_out :1;
unsigned char set_addr :1;
unsigned char usb_endp0_in :1;
unsigned char usb_endp2_in :1;
unsigned char usb_endp2_out :1;
}flags;
}usb_flags;
union //中斷寄存器
{
unsigned char Register[2];
struct
{
unsigned char control_out_port :1;
unsigned char control_in_port :1;
unsigned char port_out_1 :1;
unsigned char port_in_1 :1;
unsigned char main_out_port :1;
unsigned char main_in_port :1;
unsigned char bus_reset :1;
unsigned char suspend_change :1;
unsigned char DMA_EOT :1;
unsigned char not_use :7;
}Interrupt;
}Interrupt_Register;
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -