亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? usb.c

?? 基于at89c51snd1c的硬盤MP3播放器
?? C
?? 第 1 頁 / 共 2 頁
字號:
/************************************************************************************
  本程序僅供廣大電子愛好者制作MP3學習和參考使用,不得用于其它用途,否則后果自負

   USB.C File
   Created by Computer-lov. Date: 2004.9.27
   Last edited date: 2005.5.31
   version 1.1
   Copyright (c) 2005 Computer-lov
   All rigths reserved
*************************************************************************************/

#include "AT89C51SND1C.H"
#include "USB.H"
#include "MASS_STORAGE.H"
#include "IDE.h"
#include "LCD.H"
#include "hardware.h"
#include "keyboard.h"
#include "mp3.h"


CONTROL_DATA_BUFF xdata Control_Data;

CBW xdata cbw;
CSW xdata csw;

unsigned char bdata SCSI_Register;
sbit SCSI_Command    =   SCSI_Register^0;
sbit SCSI_Data       =   SCSI_Register^1;


unsigned char *pData;

unsigned char code DISK_INF[36]
=                                      //磁盤信息
{
 0x00,
 0x00,
 0x02,
 0x02,
 0x1F,
 0x00,0x00,0x00,
 0x49,0x44,0x45,0xA1,0xFA,0x55,0x53,0x42, 
 0xC1,0xF5,0xC8,0xD9,0xD7,0xD4,0xBC,0xBA,0xD7,0xF6,0xB5,0xC4,0x4D,0x50,0x33,0x20,
 0x31,0x2E,0x30,0x31
};


code unsigned char SENSE[0x12]=                                      //模式探測返回數據
{
0x70, 0x00, 0x05, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00
};

unsigned int SWAP(unsigned int temp)                                //高低字節交換
{
 unsigned char i;
 i=((unsigned char *)&temp)[0];
 ((unsigned char *)&temp)[0]=((unsigned char *)&temp)[1];
 ((unsigned char *)&temp)[1]=i;
 return temp;
}

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分配的設備協議代碼
 MAX_CONTROL_DATA_SIZE,                              //端點0的最大包大小
 0x7111,                                             //廠商編號
 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                                                            //中斷掃描時間,對批量傳輸無效
 }
}
};


unsigned int bdata usb_flags_Register;   //程序標志位

sbit USB__bus_reset       = usb_flags_Register^0;
sbit USB_suspend          = usb_flags_Register^1;
sbit USB_remote_wakeup    = usb_flags_Register^2;
sbit USB_int_isr          = usb_flags_Register^3;
sbit USB_not_end          = usb_flags_Register^4;
sbit USB_usb_idle         = usb_flags_Register^5;
sbit USB_usb_busy         = usb_flags_Register^6;
sbit USB_setup_packet_in  = usb_flags_Register^7;
sbit USB_setup_packet_out = usb_flags_Register^8;
sbit USB_set_addr         = usb_flags_Register^9;
sbit USB_usb_endp0_in     = usb_flags_Register^10;
sbit USB_usb_endp1_in     = usb_flags_Register^11;
sbit USB_usb_endp2_out    = usb_flags_Register^12;


unsigned char bdata status_Register;  ////狀態寄存器

sbit status_control_out_port   =  status_Register^0;
sbit status_control_in_port    =  status_Register^1;
sbit status_main_out_port      =  status_Register^2;
sbit status_main_in_port       =  status_Register^3;
sbit status_bus_reset          =  status_Register^4;
sbit status_suspend_change     =  status_Register^5;
sbit status_setup_packet       =  status_Register^6;

//*****************   延時x毫秒函數 ***********
void delay(unsigned int x)                
{
 unsigned int i;
 unsigned int j;
 for(i=0;i<x;i++)
 for(j=0;j<230;j++);
}
//********************************************

unsigned char remove_enable;

void read_usb_status(void)             //讀USB狀態寄存器
{
 status_Register=0;
 if(EORINT){status_bus_reset=1;USBINT=USBINT & (~0x10);return;}
 if(SPINT){status_suspend_change=1;USBINT=USBINT & (~0x01);return;}
 UEPNUM=0;
 if(RXSETUP){status_setup_packet=1;status_control_out_port=1;return;}
 status_control_out_port = RXOUTB0;
 status_control_in_port  = NAKIN;
 cls_NAKIN();
 UEPNUM=1;
 status_main_in_port=NAKIN;
 cls_NAKIN();
 UEPNUM=2;
 status_main_out_port=(RXOUTB0 || RXOUTB1);
 USBINT=0x00;
}

void set_endpoint_enable(void)                  //端點使能
{
 UEPNUM=0;
 UEPCONX=0x80;
 UEPNUM=1;
 UEPCONX=0x86;
 UEPNUM=2;
 UEPCONX=0x82;
}


unsigned char error_count;
void error(unsigned char number)             //出錯處理
{
 number=0;
 error_count++;
 LCD_go_home();
 prints("               ");
 LCD_line_feed();
 prints("               ");
 LCD_go_home();
 prints("Error:");
 printf(error_count);
}

unsigned char read_endpoint_buff(unsigned char endp,unsigned char len,unsigned char * buff)   //讀終端點緩沖
{
 unsigned char i,j;
 UEPNUM=endp;               //選擇端點
 j=UBYCTX;                  //讀字節數
 if(j>len)j=len;
 for(i=0;i<j;i++)
  {
   buff[i]=UEPDATX;
  }
 if(RXOUTB0){UEPSTAX=UEPSTAX & (~0x42); return j;}   //清除RXOUTB0 位
 if(RXOUTB1){UEPSTAX=UEPSTAX & (~0x42); return j;}   //清除RXOUTB1 位
}

unsigned char write_endpoint_buff(unsigned char endp,unsigned char len,unsigned char * buff)    //寫終端點緩沖
{
 unsigned char i;
 remove_enable=0;
 UEPNUM=endp;               //選擇端點
 for(i=0;i<len;i++)         //填數據寄存器
  {
   UEPDATX=buff[i];
  }
 UEPSTAX=UEPSTAX | 0x10;     //設置TXRDY位
 while(!( UEPSTAX & 0x01 ));				//等待TXCMP
 UEPSTAX=UEPSTAX & (~0x01);					//清除TXCMP
 return len;
}

void disconnect_usb(void)
{
 USB_CONNECT=1;
 delay(100);
}

void connect_usb(void)                            //連接USB
{
 USB_CONNECT=0;
}

void init_usb(void)                              //初始化USB
{
 usb_flags_Register=0;
 SCSI_Command=1;
 SCSI_Data=0;
 csw.dCSWSignature=0x55534253;

 USBIEN=0x00;                                    //不允許USB中斷
 USBCLK=0x03;                                   
 USBCON=0x80;
 set_endpoint_enable();
 UEPRST=0x07;                                    //端點FIFO復位
 UEPRST=0x00;
}

void usb_bus_reset(void)                         //USB總線復位處理
{
 usb_flags_Register=0;
 SCSI_Command=1;
 SCSI_Data=0;
 csw.dCSWSignature=0x55534253;
 USBADDR=0x80;
 LCD_go_home();
 prints("               ");
 LCD_line_feed();
 prints("               ");
 LCD_go_home();
 prints("移動硬盤模式");
 LCD_line_feed();
 prints("運行中......");
 remove_enable=0;
}

void usb_bus_suspend(void)                       //USB總線掛起處理
{
 LCD_go_home();
 prints("現在可以安全的 ");
 LCD_line_feed();
 prints("拔下USB 連線了 ");
 remove_enable=1;
}

void set_usb_address(void)                       //設置地址
{
 USB_set_addr=1;
 write_endpoint_buff(0,0,0);
 USBADDR=0x80 | (Control_Data.DeviceRequest.wValue);
 USBCON=USBCON | 0x01;
 USB_usb_endp0_in=0;
 USB_setup_packet_out=0;
}

void get_status(unsigned char receiver)           //獲取狀態響應
{
 unsigned char status[2];
 switch (receiver)
  {
   case 0:                        //獲取設備狀態
    status[0]=0x00;
    status[1]=0x00;
    break;
   case 1:                        //獲取接口狀態
    status[0]=0x00;
    status[0]=0x00;
    break;
   case 2:                        //獲取端點狀態
    status[0]=0x00;
    status[1]=0x00;
    break;
   }
  UEPNUM=0;
  UEPSTAX=(UEPSTAX | 0x80);       //數據階段的輸入
  write_endpoint_buff(0,2,status);
  UEPSTAX=(UEPSTAX & (~0x80));
  USB_usb_endp0_in=0;
}

void clear_feature(unsigned char receiver)    
{
 receiver=0;
 write_endpoint_buff(0,0,0);
 USB_usb_endp0_in=0;
 USB_setup_packet_out=0;
}

void set_feature(unsigned char receiver)
{
 receiver=0;
 write_endpoint_buff(0,0,0);
 USB_usb_endp0_in=0;
 USB_setup_packet_out=0;
}

void set_descriptor(void)
{
 write_endpoint_buff(0,0,0);
 USB_usb_endp0_in=0;
 USB_setup_packet_out=0;
}

void set_configuration(void)
{
 write_endpoint_buff(0,0,0);
 USBCON=USBCON | 0x02;
 USB_usb_endp0_in=0;
 USB_setup_packet_out=0;
 UEPNUM=1;
 UEPCONX = 0x86 ;
 UEPNUM=2;
 UEPCONX = 0x82;
 LCD_go_home();
 prints("               ");
 LCD_line_feed();
 prints("               ");
 LCD_go_home();
 prints("移動硬盤模式");
 LCD_line_feed();
 prints("運行中......");
}

void get_configuration(void)               //獲取配置狀態
{
 unsigned char value=0x01;
 UEPNUM=0;
 UEPSTAX=(UEPSTAX | 0x80);       //數據階段的輸入
 write_endpoint_buff(0,1,&value);
 UEPSTAX=(UEPSTAX & (~0x80));
 USB_usb_endp0_in=0;
}

void set_interface(void)                   //設置接口
{
 write_endpoint_buff(0,0,0);
 USB_usb_endp0_in=0;
 USB_setup_packet_out=0;
}

void get_interface(void)                  //獲取接口狀態
{
 unsigned char value=0x01;
 UEPNUM=0;
 UEPSTAX=(UEPSTAX | 0x80);                //數據階段的輸入
 write_endpoint_buff(0,1,&value);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品电影院| 精品美女在线观看| 蜜臀久久久99精品久久久久久| 26uuu成人网一区二区三区| 色哦色哦哦色天天综合| 美女网站在线免费欧美精品| 中文字幕精品一区二区三区精品| 欧美群妇大交群的观看方式| av成人老司机| 国产精品自在在线| 日精品一区二区| 亚洲激情欧美激情| 国产精品入口麻豆九色| 精品久久久网站| 欧美日韩免费观看一区二区三区| 波多野结衣在线一区| 精彩视频一区二区三区| 日韩一区精品字幕| 亚洲欧洲av色图| 国产日产欧美一区二区三区| 精品国产污污免费网站入口 | 国产精品久久一级| 2021国产精品久久精品 | 国产精品不卡在线观看| 精品久久久久久久久久久久包黑料 | 中文字幕在线一区二区三区| 精品成人一区二区| 91精品国产综合久久国产大片| 在线精品视频免费播放| 91首页免费视频| av网站一区二区三区| 国产99久久久精品| 国产精品亚洲第一区在线暖暖韩国| 日本aⅴ亚洲精品中文乱码| 亚洲一级不卡视频| 亚洲一区二区三区视频在线播放 | 久久精品在线观看| 精品国产sm最大网站免费看| 日韩欧美www| 日韩美女在线视频 | 一区二区不卡在线播放| 亚洲激情五月婷婷| 亚洲精品国产精华液| 亚洲精品成人精品456| 亚洲精品高清在线观看| 一区二区三区免费网站| 一区二区免费视频| 香蕉成人啪国产精品视频综合网| 亚洲电影激情视频网站| 日本中文字幕一区| 蜜臀精品一区二区三区在线观看| 乱一区二区av| 国产伦精品一区二区三区免费 | 毛片一区二区三区| 国产在线精品一区二区夜色| 欧美疯狂做受xxxx富婆| 欧美剧情电影在线观看完整版免费励志电影| 欧美日韩一二区| 日韩欧美黄色影院| 欧美激情一区不卡| 亚洲精品日日夜夜| 日韩电影在线观看网站| 国产一区二区网址| 北条麻妃一区二区三区| 欧美亚洲另类激情小说| 这里只有精品99re| 久久久久久久久久久久久久久99| 国产精品美女视频| 亚洲国产成人av好男人在线观看| 免费在线观看不卡| 成人丝袜18视频在线观看| 色狠狠色噜噜噜综合网| 日韩欧美综合在线| 国产精品色噜噜| 午夜视频一区二区三区| 国模娜娜一区二区三区| 97精品国产露脸对白| 7777精品久久久大香线蕉| 国产欧美一区二区三区网站| 亚洲精品五月天| 精品一区二区免费| 在线亚洲高清视频| 日韩一区二区电影在线| 亚洲欧美综合另类在线卡通| 日韩精品一区第一页| 成人午夜电影小说| 91超碰这里只有精品国产| 欧美国产一区视频在线观看| 午夜精品福利一区二区三区av| 国产另类ts人妖一区二区| 精品视频123区在线观看| 国产日韩亚洲欧美综合| 午夜一区二区三区在线观看| 丰满亚洲少妇av| 欧美一区二区黄色| 亚洲狼人国产精品| 国产成人在线视频播放| 欧美美女bb生活片| 国产精品久久久久久久久久免费看| 日本在线不卡一区| 91国内精品野花午夜精品| 久久久综合九色合综国产精品| 午夜久久电影网| 成人av资源在线| 26uuu亚洲综合色| 视频在线在亚洲| 91官网在线观看| 中文字幕一区av| 国产大陆a不卡| 日韩欧美成人一区二区| 午夜私人影院久久久久| 色综合视频在线观看| 国产欧美日产一区| 另类小说视频一区二区| 欧美日韩高清一区| 亚洲激情欧美激情| 91亚洲国产成人精品一区二三| 国产夜色精品一区二区av| 麻豆成人在线观看| 制服丝袜激情欧洲亚洲| 亚洲国产婷婷综合在线精品| 91偷拍与自偷拍精品| 国产精品久久三| 成人午夜精品在线| 国产午夜久久久久| 国产一本一道久久香蕉| 久久午夜羞羞影院免费观看| 极品瑜伽女神91| 欧美videos大乳护士334| 青青青爽久久午夜综合久久午夜 | 国产精品人妖ts系列视频| 国产一区二区三区在线观看免费 | 亚洲精品免费一二三区| 99re6这里只有精品视频在线观看| 欧美国产日韩在线观看| 国产一区二区成人久久免费影院| 亚洲精品一区在线观看| 国产在线播放一区二区三区| 久久夜色精品一区| 国产精品影视在线观看| 国产欧美一区二区精品婷婷| 国产成人免费视频精品含羞草妖精| 国产亚洲精品资源在线26u| 国产激情视频一区二区三区欧美 | 亚洲精品成人天堂一二三| 在线亚洲+欧美+日本专区| 亚洲精品va在线观看| 在线观看日韩毛片| 午夜婷婷国产麻豆精品| 日韩精品综合一本久道在线视频| 精品一区二区三区在线观看| 久久精品视频免费观看| 白白色亚洲国产精品| 亚洲精品国产成人久久av盗摄 | 国产精品卡一卡二卡三| 91女神在线视频| 亚洲韩国一区二区三区| 91精品久久久久久蜜臀| 国产尤物一区二区在线| 国产精品美女久久久久aⅴ| 色婷婷精品大在线视频| 日韩精品亚洲一区二区三区免费| 日韩精品自拍偷拍| 成人激情文学综合网| 一区二区久久久久| 日韩免费视频线观看| 国产一区二区免费在线| 亚洲人快播电影网| 91精品欧美久久久久久动漫 | 九一九一国产精品| 国产精品麻豆久久久| 欧美日精品一区视频| 久久国产精品第一页| 国产精品免费免费| 欧美日本视频在线| 国产精品99精品久久免费| 一区二区在线观看免费视频播放 | 亚洲三级免费观看| 91精品麻豆日日躁夜夜躁| 粉嫩一区二区三区性色av| 亚洲成av人片一区二区| 久久香蕉国产线看观看99| 欧美网站大全在线观看| 国产一区二区剧情av在线| 亚洲一区二区三区四区在线观看| 精品少妇一区二区三区在线播放| 99这里只有精品| 美女任你摸久久| 丁香一区二区三区| 亚洲午夜av在线| 中文字幕久久午夜不卡| 欧美一级日韩不卡播放免费| 波多野结衣中文字幕一区二区三区| 日本中文字幕一区二区视频| √…a在线天堂一区| 欧美精品一区二| 欧美日本韩国一区二区三区视频| 成人app下载| 经典三级在线一区| 五月婷婷综合在线|