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

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

?? ch374_hid.c

?? MCS51和CH374做USB主機與HID設備通信
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* 設定全速USB設備運行環境 */
void	HostSetFullSpeed( void )  
{
	Write374Byte( REG_USB_SETUP, Read374Byte( REG_USB_SETUP ) & ~ BIT_SETP_USB_SPEED | BIT_SETP_AUTO_SOF  );  // 全速且發SOF
	mDelaymS( 1 );
}

/* 設定低速USB設備運行環境 */
void	HostSetLowSpeed( void )  
{
	Write374Byte( REG_USB_SETUP, Read374Byte( REG_USB_SETUP ) | BIT_SETP_USB_SPEED | BIT_SETP_AUTO_SOF );  // 低速且發SOF
	mDelaymS( 1 );
}

 /* 初始化USB主機 */
void	Init374Host( void ) 
{
	Write374Byte( REG_USB_SETUP, 0x00 );
	SetHostUsbAddr( 0x00 );
	Write374Byte( REG_USB_H_CTRL, 0x00 );
	Write374Byte( REG_INTER_FLAG, BIT_IF_USB_PAUSE | BIT_IF_INTER_FLAG );  // 清所有中斷標志
//	Write374Byte( REG_INTER_EN, BIT_IE_TRANSFER );                         // 允許傳輸完成中斷,因為本程序使用查詢方式檢測USB設備插拔,所以無需USB設備檢測中斷
	Write374Byte( REG_INTER_EN, BIT_IE_TRANSFER | BIT_IE_DEV_DETECT );     // 允許傳輸完成中斷和USB設備檢測中斷
	Write374Byte( REG_SYS_CTRL, BIT_CTRL_OE_POLAR );                       // 對于CH374T或者UEN引腳懸空的CH374S必須置BIT_CTRL_OE_POLAR為1
	HostSetBusFree( );                                                     // USB總線空閑
}

/* 獲取設備描述符 */
UINT8	GetDeviceDescr( PUINT8 buf )  
{
	UINT8	s, len;
	s = HostCtrlTransfer374( SetupGetDevDescr, buf, &len );                // 執行控制傳輸
	if ( s == USB_INT_SUCCESS ) {
		UsbDevEndpSize = ( (PUSB_DEV_DESCR)buf ) -> bMaxPacketSize0;      // 端點0最大包長度,這是簡化處理,正常應該先獲取前8字節后立即更新UsbDevEndpSize再繼續
		if ( len < ( (PUSB_SETUP_REQ)SetupGetDevDescr ) -> wLengthL ) s = USB_INT_BUF_OVER;  // 描述符長度錯誤
	}
	return( s );
}

/* 獲取配置描述符 */
UINT8	GetConfigDescr( PUINT8 buf )  
{
	UINT8	s, len,i,c,j;
	UINT8	BufLogDescr[ sizeof( SetupGetCfgDescr ) ] ;

	s = HostCtrlTransfer374( SetupGetCfgDescr, buf, &len );    // 執行控制傳輸
	if ( s == USB_INT_SUCCESS ) 
    {
		for(i=0;i!=len;i++)
			printf("%02x ",(unsigned short)buf[i]);
		printf("\n");
		if ( len < ( (PUSB_SETUP_REQ)SetupGetCfgDescr ) -> wLengthL ) s = USB_INT_BUF_OVER;  // 返回長度錯誤
		else 
        {
			memcpy ( BufLogDescr, SetupGetCfgDescr, sizeof( SetupGetCfgDescr ) );
			( (PUSB_SETUP_REQ)BufLogDescr ) -> wLengthL = ( (PUSB_CFG_DESCR)buf ) -> wTotalLengthL;  // 完整配置描述符的總長度
			s = HostCtrlTransfer374( BufLogDescr, buf, &len );   // 執行控制傳輸
			if ( s == USB_INT_SUCCESS ) 
            {
//簡單分析配置描述符,獲取端點地址,這里只處理一個端點的情況
		        for ( i = 0; i < ( (PUSB_CFG_DESCR)buf ) -> wTotalLengthL; i ++ ) printf( "%02X ", (UINT16)( buf[i] ) );  //配置描述符
		        printf( "\n" );
                for(i=0;i<( (PUSB_CFG_DESCR)buf ) -> wTotalLengthL;i++) 
                {
                    if((buf[i]==0x09)&&(buf[i+1]==0x21)&&(buf[i+6]==0x22))  hid_des_leng=buf[i+7];    //獲取報告描述符的長度         
                }
                printf("hid_des_leng=%02x\n",(unsigned short)hid_des_leng);
                endp_out_addr=endp_in_addr=0;endp_num=0;
                for(i=0;i<( (PUSB_CFG_DESCR)buf ) -> wTotalLengthL;i++) 
                {
                    if((buf[i]==0x09)&&(buf[i+1]==0x04)&&(buf[i+5]==0x03)&&(buf[i+7]==0x01)||(buf[i+7]==0x02))  //接口描述符為HID的鼠標、鍵盤   
                    { 
	                    for(j=0;j<( (PUSB_CFG_DESCR)buf ) -> wTotalLengthL-i;j++) 
                        {
	                        if((buf[i+j]==0x07)&&(buf[i+j+1]==0x05)&&(buf[i+j+3]==0x03))   c=buf[i+j+2];        //判斷是否為中斷端點
	                        if ( c&0x80 )    endp_in_addr=c&0x0f;         // IN端點的地址                                
							    else                                      // OUT端點 
                                {
								    endp_out_addr=c&0x0f;
							    }
                            if((endp_out_addr!=0)||(endp_in_addr!=0))   break;                                       
	                    }
                    }
                    if((endp_out_addr!=0)||(endp_in_addr!=0))   break;           
                }
                printf("endp_in_addr=%02x\n",(unsigned short)endp_in_addr);
                printf("endp_out_addr=%02x\n",(unsigned short)endp_out_addr);
			}
		}
	}
	return( s );
}

/* 設置USB設備地址 */
UINT8	SetUsbAddress( UINT8 addr )  
{
	UINT8	s;
	UINT8	BufSetAddr[ sizeof( SetupSetUsbAddr ) ] ;
	memcpy ( BufSetAddr, SetupSetUsbAddr, sizeof( SetupSetUsbAddr ) );
	( (PUSB_SETUP_REQ)BufSetAddr ) -> wValueL = addr;        // USB設備地址
	s = HostCtrlTransfer374( BufSetAddr, NULL, NULL );       // 執行控制傳輸
	if ( s == USB_INT_SUCCESS ) {
		SetHostUsbAddr( addr );                              // 設置USB主機當前操作的USB設備地址
	}
	mDelaymS( 3 );                                           // 等待USB設備完成操作
	return( s );
}

/* 設置USB設備配置 */
UINT8	SetUsbConfig( UINT8 cfg )  
{
	UINT8	BufSetCfg[ sizeof( SetupSetUsbConfig ) ] ;
	memcpy ( BufSetCfg, SetupSetUsbConfig, sizeof( SetupSetUsbConfig ) );
	( (PUSB_SETUP_REQ)BufSetCfg ) -> wValueL = cfg;          // USB設備配置
	return( HostCtrlTransfer374( BufSetCfg, NULL, NULL ) );  // 執行控制傳輸
}

/* 設置Idle */
UINT8  Set_Idle( )    
{
	UINT8  s;
	s=HostCtrlTransfer374(SetupSetidle,NULL,NULL);
	return s;
}

/* 獲取報表描述符 */
unsigned char Get_Hid_Des(unsigned char *p)//獲取報表描述符
{
	unsigned char s;
//	leng=SetupGetHidDes[0x06]-0x40;//報表描述符的長度在發送數據長度的基礎上減去0X40
	unsigned char buffer[8];
	memcpy ( buffer, SetupGetHidDes, 8 );
	buffer[0x06] = hid_des_leng+0x40;
	s=HostCtrlTransfer374(buffer,p,&buffer[0x06]);
	return s;
}


/* 設置報表 */
UINT8  Set_Report(unsigned char *p)
{
	UINT8  s,l=1;
	s=HostCtrlTransfer374(SetupSetReport,p,&l);            //實際的數據可以寫別的數據,這個你可以用計算機抓下數據在發下去
	return s;
}

/* 為printf和getkey輸入輸出初始化串口 */
void	mInitSTDIO( )
{
	SCON = 0x50;
	PCON = 0x80;
	TMOD = 0x20;
	TH1 = 0xf3;                                           //24MHZ, 9600                          
	TR1 = 1;
	TI = 1;
}


int	main( void ) 
{
	UINT8	i, s,close_bit_flag=0;
	UINT8   idata	buf[80];            //由于報告描述符大小不定,緩沖區的大小最好定義大些
//	P1&=0xF8;                           // 如果在U盤文件讀寫模塊上試用本程序必須加上本行
	AUXR |= 0x02;
	mDelaymS( 50 );                     // 等待CH374復位完成
	CH374_PORT_INIT( );                 // CH374接口初始化 
	mInitSTDIO( );                      // 為了讓計算機通過串口監控演示過程 
	for(i=0;i!=64;i++)
    {
		s=Read374Byte(i);
		printf("%02x ",(unsigned short)s);
	}
	printf("\n");
	printf( "Start CH374 Host\n" );
	Init374Host( );                     // 初始化USB主機
	while ( 1 ) 
    {
		HostSetBusFree( );              // 設定USB主機空閑
		while ( 1 )
        {
			if ( Query374Interrupt( ) ) HostDetectInterrupt( );  // 如果有USB主機中斷則處理
			if ( Query374DeviceIn( ) ) break;                    // 有USB設備
		}
		mDelaymS( 250 );                                         // 由于USB設備剛插入尚未穩定,故等待USB設備數百毫秒,消除插拔抖動
		if ( Query374Interrupt( ) ) HostDetectInterrupt( );      // 如果有USB主機中斷則處理

		printf( "Reset Device\n" );
		HostSetBusReset( );                                      // USB總線復位
		for ( i = 0; i < 100; i ++ )                             // 等待USB設備復位后重新連接
        {
			if ( Query374DeviceIn( ) ) break;                    // 有USB設備
			mDelaymS( 1 );
		}
		if ( Query374Interrupt( ) ) HostDetectInterrupt( );      // 如果有USB主機中斷則處理
		if ( Query374DeviceIn( ) )                               // 有USB設備
        {  
			if ( Query374DevFullSpeed( ) )
            {
				printf( "Start Full-Speed Device\n" );
				HostSetFullSpeed( );                             // 檢測到全速USB設備
			}
			else 
            {
				printf( "Start Low-Speed Device\n" );
				HostSetLowSpeed( );                             // 檢測到低速USB設備
				LOW_SPEED_BIT=1;
			}
		}
		else 
        {
			continue;                                           // 設備已經斷開,繼續等待
		}
		mDelaymS( 50 );
		close_bit_flag=0;
		printf( "GetDeviceDescr: " );
		s = GetDeviceDescr( buf );                             // 獲取設備描述符
		printf("device_status=%02x \n",(unsigned short)s);
		if ( s != USB_INT_SUCCESS )
        {
			goto WaitDeviceOut;                                // 終止操作,等待USB設備拔出
		}
		for ( i = 0; i < ( (PUSB_SETUP_REQ)SetupGetDevDescr ) -> wLengthL; i ++ ) printf( "%02X ", (UINT16)( buf[i] ) );
		printf( "\n" );
		s = SetUsbAddress( 0x02 );                             // 設置USB設備地址
		printf("address_status=%02x\n",(unsigned short)s);
		if ( s != USB_INT_SUCCESS ) 
        {
			goto WaitDeviceOut;                                // 終止操作,等待USB設備拔出
		}
		s = GetConfigDescr( buf );                             // 獲取配置描述符
		printf("config_status=%02x\n",(unsigned short)s);
		if ( s != USB_INT_SUCCESS ) 
        {
			goto WaitDeviceOut;                                // 終止操作,等待USB設備拔出
		}

// 分析配置描述符,獲取端點數據/各端點地址/各端點大小等,更新變量endp_addr和endp_size等 
		s = SetUsbConfig( ( (PUSB_CFG_DESCR)buf ) -> bConfigurationValue );   // 設置USB設備配置
		if ( s != USB_INT_SUCCESS ) 
        {
//	     	printf( "ERROR = %02X\n", (UINT16)s );
			goto WaitDeviceOut;                               // 終止操作,等待USB設備拔出
		}
		else 	printf( "SetUsbConfig_success\n" );

//-------------------------以下進行HID類的簡單操作-----------------------------------------------------------
        printf("Set_Idle\n");
		s=Set_Idle( );                                        //設置IDLE,這個步驟是按照HID類的協議來做的
		if(s!=USB_INT_SUCCESS)
        {
			printf("Set_Idle_Err=%02x\n",(unsigned short)s);
            if(s&0x0f==USB_INT_RET_STALL)  goto next_operate1; //返回STALL可能本身不支持
		}
		else printf("Set_idle success\n");
next_operate1:
        printf("Get_Hid_Des\n");
		s=Get_Hid_Des(buf);                                  // 獲取報表描述符描述符
		if(s==USB_INT_SUCCESS)
        {
			printf("HID_Desc: ");
			for(i=0;i!=hid_des_leng;i++)  printf("%02x ",(unsigned short)buf[i]);
			printf("\n");
		}
		else
        {
			goto WaitDeviceOut;                             //出錯退出
		}

        printf("Set_Report \n");                            //對于鍵盤發Set_Report來點亮燈,對于鼠標則不需要這一步
		buf[0]=0x01;
		s=Set_Report(buf);                                 //設置報表
		if(s==USB_INT_SUCCESS)   
        {
             printf("Set_Report success\n");
        }
		else
        { 
              printf("Set_Report Err=%02x\n",(unsigned short)s);      //設置報告出錯
              if(s&0x0f==USB_INT_RET_STALL)  goto next_operate2;      //返回STALL可能本身不支持		  
		}
next_operate2:

// 下面開始讀取數據 ( 實際在讀取數據的時候,要先發送中斷端點的令牌來讀取數據,接著才能獲取到數據 )
		tog1=FALSE;                                  //開始取DATA0
		while(1)
        {
			s=Interrupt_Data_Trans(buf);
//          printf("s:%x \n",(unsigned short)s);
			if(s==USB_INT_SUCCESS)
            {
				for(i=0;i!=8;i++)	printf("%02x ",(unsigned short)buf[i]);
				printf("\n");
			}
			else if(s==USB_INT_DISCONNECT)            //  這個是為了知道設備拔出產生的中斷狀態
            {
				close_bit_flag=1;
				break;				
			}
		}
WaitDeviceOut:                                       // 等待USB設備拔出
		printf( "Wait Device Out\n" );
	    if(close_bit_flag==0){
		    while ( 1 )
            {
			     if ( Query374Interrupt( ) ) HostDetectInterrupt( );  // 如果有USB主機中斷則處理
			     if ( Query374DeviceIn( ) == FALSE ) break;           // 沒有USB設備
		    }
	    }
		mDelaymS( 100 );                                             // 等待設備完全斷開,消除插拔抖動
    }
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品国产三级电影在线观看| 国产精品色哟哟| 国产一区999| 一区二区三区在线免费播放| 久久色在线观看| 日韩亚洲欧美一区| 欧美日韩国产高清一区二区| 91色porny| 高清成人在线观看| 国产在线精品一区二区不卡了| 成人av一区二区三区| 成人免费不卡视频| 91在线观看污| 91激情在线视频| 97成人超碰视| 久久精品一区蜜桃臀影院| 久久精品视频一区二区三区| 亚洲444eee在线观看| 天堂一区二区在线免费观看| 亚洲小说春色综合另类电影| 亚洲第四色夜色| 色婷婷综合久久久中文字幕| 99在线精品观看| 8x福利精品第一导航| 制服.丝袜.亚洲.另类.中文 | 国产精品欧美综合在线| 蜜臀久久99精品久久久久宅男 | 在线观看免费成人| 91精品国产色综合久久久蜜香臀| 91精品国产综合久久久蜜臀图片 | 91麻豆精品在线观看| 国产日产亚洲精品系列| 亚洲免费观看在线视频| 亚洲国产aⅴ天堂久久| 色综合夜色一区| 欧美二区乱c少妇| 久久亚洲精华国产精华液| 亚洲mv在线观看| 欧美日韩三级视频| 日本一区二区综合亚洲| 国产精品自拍av| 91污片在线观看| 国产精品无人区| 99久久久无码国产精品| 欧美韩日一区二区三区四区| 亚洲综合丝袜美腿| 九九国产精品视频| 欧洲一区二区av| 亚洲国产精品久久人人爱| eeuss鲁片一区二区三区在线观看| 中文字幕精品在线不卡| 91在线精品一区二区三区| 亚洲美女在线一区| 欧美高清视频不卡网| 蜜桃视频一区二区| 国产欧美一区二区在线观看| 99久久精品免费看国产| 亚洲一二三专区| 日韩欧美精品三级| 亚洲第一综合色| 精品久久人人做人人爽| 视频一区视频二区中文字幕| 日韩欧美卡一卡二| 99精品黄色片免费大全| 青青青伊人色综合久久| 欧美日韩中文字幕精品| 久草热8精品视频在线观看| 亚洲国产成人午夜在线一区| 欧美羞羞免费网站| 亚洲狠狠丁香婷婷综合久久久| 国产成人a级片| 久久综合av免费| 97se狠狠狠综合亚洲狠狠| 日韩电影免费一区| 制服丝袜亚洲网站| 丰满白嫩尤物一区二区| 亚洲福利一区二区| 国产人伦精品一区二区| 欧美日韩一区精品| 成人自拍视频在线观看| 日本亚洲最大的色成网站www| 欧美精品一区二区蜜臀亚洲| 色婷婷久久久亚洲一区二区三区| 久久精品72免费观看| 精品国产一区二区三区忘忧草 | 国产在线播放一区| 亚洲一区二区三区激情| 久久久精品国产免大香伊| 国模无码大尺度一区二区三区| 日韩一区二区三区在线视频| 成人亚洲精品久久久久软件| 日韩不卡一二三区| 亚洲激情在线播放| 久久久精品影视| 亚洲国产激情av| 91丨porny丨国产入口| 狠狠色狠狠色合久久伊人| 亚洲一区免费视频| 国产精品美女一区二区三区| 黄色小说综合网站| 不卡免费追剧大全电视剧网站| 99久久精品99国产精品 | 美国三级日本三级久久99| 久久精品国产网站| 国产91丝袜在线播放九色| 成人av免费观看| 欧美日韩在线三区| 亚洲精品一区二区三区在线观看 | 91老师片黄在线观看| 欧美美女bb生活片| 精品福利在线导航| 国产精品白丝在线| 91精品国产一区二区| 久久久一区二区三区捆绑**| 成人欧美一区二区三区1314| 国产亚洲欧美日韩日本| 中文字幕字幕中文在线中不卡视频| 26uuu国产一区二区三区| 国产欧美日韩三级| 香港成人在线视频| 国产精品一区二区你懂的| 91在线你懂得| 日韩欧美国产精品| 亚洲免费观看高清完整版在线观看熊| 性做久久久久久| 成人手机在线视频| 91精品中文字幕一区二区三区 | 自拍偷自拍亚洲精品播放| 蜜桃免费网站一区二区三区| 91香蕉视频mp4| 久久亚洲影视婷婷| 五月综合激情网| 丝袜美腿一区二区三区| 成人黄色小视频| 欧美一区二区在线不卡| 亚洲女同一区二区| 精品一区二区三区不卡| 在线看国产一区二区| 国产肉丝袜一区二区| 日韩国产一二三区| 色呦呦国产精品| 中文字幕乱码亚洲精品一区| 日韩成人免费在线| 欧美三级资源在线| 成人免费一区二区三区在线观看| 蜜桃精品在线观看| 欧美日韩中文一区| 亚洲精品视频在线看| 国产福利精品一区二区| 日韩亚洲国产中文字幕欧美| 一区二区三区 在线观看视频| 成人天堂资源www在线| 精品国产露脸精彩对白 | 一区二区三区影院| 成人一级片网址| 久久蜜桃av一区精品变态类天堂 | 一区二区三区精品久久久| 懂色av一区二区夜夜嗨| 精品福利一区二区三区免费视频| 亚洲第一福利一区| 欧美日韩精品免费观看视频| 亚洲资源在线观看| 在线欧美日韩精品| 亚洲欧美国产毛片在线| 色综合中文字幕| 一区二区三区视频在线看| 色综合久久99| 一区二区成人在线观看| 欧洲精品在线观看| 亚洲午夜久久久久| 欧美色涩在线第一页| 亚洲.国产.中文慕字在线| 色琪琪一区二区三区亚洲区| 亚洲免费高清视频在线| 色婷婷久久久久swag精品| 亚洲午夜私人影院| 在线不卡中文字幕| 蜜桃久久久久久久| 久久久久国产免费免费 | 美女网站视频久久| 日韩精品一区二区三区中文不卡| 免费在线欧美视频| 精品福利二区三区| 国产福利精品一区| 中文字幕一区二区三区色视频| 色综合久久久久综合99| 亚洲成人第一页| 日韩欧美一级特黄在线播放| 国产乱码精品一区二区三区五月婷 | 久久99国产乱子伦精品免费| 精品国产91亚洲一区二区三区婷婷| 国产资源在线一区| 国产精品福利一区二区三区| 一本色道久久综合亚洲aⅴ蜜桃| 一区二区三区免费在线观看| 欧美一级免费大片| 国产精品影视网| 亚洲色大成网站www久久九九| 欧美天堂一区二区三区| 久久草av在线|