?? usb.c
字號:
/******************************************************************
本程序只供學習使用,未經作者許可,不得用于其它任何用途
我的郵箱:computer-lov@tom.com
歡迎訪問我的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]= //模式探測返回數據
{
0x70, 0x00, 0x05, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00
};
code unsigned char DBR[512]= //DOS引導記錄
{
0xeb, 0x3e, 0x90, //跳轉指令
0x4d, 0x53, 0x44, 0x4f, 0x53, 0x35, 0x2e, 0x30, //文件系統版本信息
0x00, 0x02, //扇區字節數
0x20, //每簇扇區數
0x01, 0x00, //保留扇區數
0x02, //該分區的FAT副本數
0xF0, 0x01, //根目錄項數
0x00, 0x00, //小扇區數
0xf8, //媒體描述符
0x10, 0x00, //每FAT扇區數
0x20, 0x00, //每道扇區數
0x40, 0x00, //磁頭數
0x00, 0x00, 0x00, 0x00, //隱藏扇區數
0x40, 0xff, 0x01, 0x00, //大扇區數
0x80, //磁盤驅動器參數,80表示硬盤
0x00, //保留
0x29, //擴展引導標記,0x29表示后三個區可用
0x88, 0x09, 0x71, 0x20, //標卷序列號
0xBC, 0xD9, 0x55, 0xC5, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //磁盤標卷
0x46, 0x41, 0x54, 0x31, 0x36, 0x20, 0x20, 0x20, //文件系統類型信息
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]= //根目錄
{
0xBC, 0xD9, 0x55, 0xC5, 0xCC, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, //磁盤標卷
0x08, //文件屬性,表示磁盤標卷
0x00, //保留
0x00, //創建時間毫秒時間戳
0x00, 0x40, //文件創建時間
0x41, 0x31, //文件創建日期
0x42, 0x31, //最后訪問日期
0x00, 0x00, //起始簇號高位字節,FAT12/16必須為0
0x00, 0x40, //最后寫時間
0x42, 0x31, //最后寫日期
0x00, 0x00, //起始簇低位字節
0x00, 0x00, 0x00, 0x00, //文件長度
'T', 'E', 'S', 'T', ' ', ' ', ' ', ' ', 'T', 'X', 'T', //文件名
0x01, //文件屬性,表示磁盤標卷
0x00, //保留
0x00, //創建時間毫秒時間戳
0x00, 0x40, //文件創建時間
0x41, 0x31, //文件創建日期
0x42, 0x31, //最后訪問日期
0x00, 0x00, //起始簇號高位字節,FAT12/16必須為0
0x00, 0x40, //最后寫時間
0x42, 0x31, //最后寫日期
0x02, 0x00, //起始簇低位字節
0xe9, 0x00, 0x00, 0x00, //文件長度
};
code unsigned char FILE_DATA[233]=
{"這是一個測試程序,用來測試文件系統是否工作正常。如果你能看到這些文字,那么說明你的電腦已經中了最無恥的108病毒了,請馬上把所有文件刪除,并格式化硬盤后,將硬盤壓碎,以免你也被感染!如果你在30秒內還未開始刪除文件,你的電腦將會永久報廢!"};
unsigned int SWAP(unsigned int temp) //高低字節交換
{
unsigned int i;
i=temp;
i<<=8;
temp>>=8;
i|=temp;
return i;
}
/*unsigned long int SWAP_long(unsigned long int temp) //四字節交換
{
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) //取一個整數的低字節
{
return (unsigned char)temp;
}
unsigned char MSB(unsigned int temp) //取一個整數的高字節
{
return (unsigned char)(temp>>8);
}
code unsigned char LANGUAGE_ID[4]={0x04,0x03,0x09,0x04}; //字符串描述符所用的語言種類
code unsigned char device_serial_number[18]= //設備序列號
{0x12,0x03,0x32,0x00,0x30,0x00,0x37,0x00,0x31,0x00,0x30,0x00,0x39,0x00,0x38,0x00,0x32,0x00};
code DEVICE_DESCRIPTOR_STRUCT device_descriptor= //設備描述符
{
sizeof(DEVICE_DESCRIPTOR_STRUCT), //設備描述符的字節數大小
DEVICE_DESCRIPTOR, //設備描述符類型編號
0x1001, //USB版本號
0x00, //USB分配的設備類代碼
0x00, //USB分配的子類代碼
0x00, //USB分配的設備協議代碼
0x10, //端點0的最大包大小
0x7104, //廠商編號
0xf0ff, //產品編號
0x0100, //設備出廠編號
0x00, //設備廠商字符串的索引
0x00, //描述產品字符串的索引
0x02, //描述設備序列號字符串的索引
0x01 //可能的配置數量
};
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), //配置描述符的字節數大小
CONFIGURATION_DESCRIPTOR, //配置描述符類型編號
(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, //只包含一個接口
0x01, //該配置的編號
0x00, //iConfiguration字段
0x80, //采用總線供電,不支持遠程喚醒
0xC8 //從總線獲取最大電流400mA
},
//interface_descritor //接口描述符
{
sizeof(INTERFACE_DESCRIPTOR_STRUCT), //接口描述符的字節數大小
INTERFACE_DESCRIPTOR, //接口描述符類型編號
0x00, //接口編號為0
0x00, //該接口描述符的編號
ENDPOINT_NUMBER, //非0端點數量為2,只使用端點主端點輸入和輸出
0x08, //USB大容量存儲設備
0x06, //使用的子類,為簡化塊命令
0x50, //使用的協議,這里使用單批量傳輸協議
0x00 //接口描述符字符串索引
},
//endpoint_descriptor[]
{
{ //主端點輸入描述
sizeof(ENDPOINT_DESCRIPTOR_STRUCT), //端點描述符的字節數大小
ENDPOINT_DESCRIPTOR, //端點描述符類型編號
MAIN_POINT_IN, //端點號,主輸入端點
ENDPOINT_TYPE_BULK, //使用的傳輸類型,批量傳輸
0x4000, //該端點支持的最大包尺寸,64字節
0x00 //中斷掃描時間,對批量傳輸無效
},
{ //主端點輸出描述
sizeof(ENDPOINT_DESCRIPTOR_STRUCT), //端點描述符的字節數大小
ENDPOINT_DESCRIPTOR, //端點描述符類型編號
MAIN_POINT_OUT, //端點號,主輸出端點
ENDPOINT_TYPE_BULK, //使用的傳輸類型,批量傳輸
0x4000, //該端點支持的最大包尺寸,64字節
0x00 //中斷掃描時間,對批量傳輸無效
}
}
};
union //程序標志位
{
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;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -