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

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

?? ch375prt.c

?? usb375打印機驅動
?? C
?? 第 1 頁 / 共 2 頁
字號:
unsigned char endp_in_addr;		/* 雙向打印機發(fā)送端點的端點地址,一般不用 */
BOOL1	tog_recv;				/* 雙向打印機發(fā)送端點的同步標志,一般不用 */

unsigned char issue_token( unsigned char endp_and_pid ) {  /* 執(zhí)行USB事務 */
/* 執(zhí)行完成后, 將產生中斷通知單片機, 如果是USB_INT_SUCCESS就說明操作成功 */
	CH375_WR_CMD_PORT( CMD_ISSUE_TOKEN );
	CH375_WR_DAT_PORT( endp_and_pid );  /* 高4位目的端點號, 低4位令牌PID */
	return( wait_interrupt() );  /* 等待CH375操作完成 */
}

unsigned char issue_token_X( unsigned char endp_and_pid, unsigned char tog ) {  /* 執(zhí)行USB事務,適用于CH375A */
/* 執(zhí)行完成后, 將產生中斷通知單片機, 如果是USB_INT_SUCCESS就說明操作成功 */
	CH375_WR_CMD_PORT( CMD_ISSUE_TKN_X );
	CH375_WR_DAT_PORT( tog );  /* 同步標志的位7為主機端點IN的同步觸發(fā)位, 位6為主機端點OUT的同步觸發(fā)位, 位5~位0必須為0 */
	CH375_WR_DAT_PORT( endp_and_pid );  /* 高4位目的端點號, 低4位令牌PID */
	return( wait_interrupt() );  /* 等待CH375操作完成 */
}

void soft_reset_print( ) {  /* 控制傳輸:軟復位打印機 */
	tog_send=tog_recv=0;  /* 復位USB數據同步標志 */
	toggle_send( 0 );  /* SETUP階段為DATA0 */
	buffer[0]=0x21; buffer[1]=2; buffer[2]=buffer[3]=buffer[4]=buffer[5]=buffer[6]=buffer[7]=0;  /* SETUP數據,SOFT_RESET */
	wr_usb_data( 8, buffer );  /* SETUP數據總是8字節(jié) */
	if ( issue_token( ( 0 << 4 ) | DEF_USB_PID_SETUP )==USB_INT_SUCCESS ) {  /* SETUP階段操作成功 */
		toggle_recv( 1 );  /* STATUS階段,準備接收DATA1 */
		if ( issue_token( ( 0 << 4 ) | DEF_USB_PID_IN )==USB_INT_SUCCESS ) return;  /* STATUS階段操作成功,操作成功返回 */
	}
}

#define	USB_INT_RET_NAK		0x2A		/* 00101010B,返回NAK */
void send_data( unsigned short len, unsigned char *buf ) {  /* 主機發(fā)送數據塊,一次最多64KB */
	unsigned char l, s;
	while( len ) {  /* 連續(xù)輸出數據塊給USB打印機 */
		toggle_send( tog_send );  /* 數據同步 */
		l = len>endp_out_size?endp_out_size:len;  /* 單次發(fā)送不能超過端點尺寸 */
		wr_usb_data( l, buf );  /* 將數據先復制到CH375芯片中 */
		s = issue_token( ( endp_out_addr << 4 ) | DEF_USB_PID_OUT );  /* 請求CH375輸出數據 */
		if ( s==USB_INT_SUCCESS ) {  /* CH375成功發(fā)出數據 */
			tog_send = ~ tog_send;  /* 切換DATA0和DATA1進行數據同步 */
			len-=l;  /* 計數 */
			buf+=l;  /* 操作成功 */
		}
		else if ( s==USB_INT_RET_NAK ) {  /* USB打印機正忙,如果未執(zhí)行SET_RETRY命令則CH375自動重試,所以不會返回USB_INT_RET_NAK狀態(tài) */
			/* USB打印機正忙,正常情況下應該稍后重試 */
			/* s=get_port_status( );  如果有必要,可以檢查是什么原因導致打印機忙 */
		}
		else {  /* 操作失敗,正常情況下不會失敗 */
			clr_stall( endp_out_addr );  /* 清除打印機的數據接收端點,或者 soft_reset_print() */
/*			soft_reset_print();  打印機出現(xiàn)意外錯誤,軟復位 */
			tog_send = 0;  /* 操作失敗 */
		}
/* 如果數據量較大,可以定期調用get_port_status()檢查打印機狀態(tài) */
	}
}

unsigned char get_port_status( ) {  /* 查詢打印機端口狀態(tài),返回狀態(tài)碼,如果為0FFH則說明操作失敗 */
/* 返回狀態(tài)碼中: 位5(Paper Empty)為1說明無紙, 位4(Select)為1說明打印機聯(lián)機, 位3(Not Error)為0說明打印機出錯 */
	toggle_send( 0 );  /* 下面通過控制傳輸獲取打印機的狀態(tài), SETUP階段為DATA0 */
	buffer[0]=0xA1; buffer[1]=1; buffer[2]=buffer[3]=buffer[4]=buffer[5]=0; buffer[6]=1; buffer[7]=0;  /* SETUP數據,GET_PORT_STATUS */
	wr_usb_data( 8, buffer );  /* SETUP數據總是8字節(jié) */
	if ( issue_token( ( 0 << 4 ) | DEF_USB_PID_SETUP )==USB_INT_SUCCESS ) {  /* SETUP階段操作成功 */
		toggle_recv( 1 );  /* DATA階段,準備接收DATA1 */
		if ( issue_token( ( 0 << 4 ) | DEF_USB_PID_IN )==USB_INT_SUCCESS ) {  /* DATA階段操作成功 */
			rd_usb_data( buffer );  /* 讀出接收到的數據,通常只有1個字節(jié) */
			toggle_send( 1 );  /* STATUS階段為DATA1 */
			wr_usb_data( 0, buffer );  /* 發(fā)送0長度的數據說明控制傳輸成功 */
			if ( issue_token( ( 0 << 4 ) | DEF_USB_PID_OUT )==USB_INT_SUCCESS ) return( buffer[0] );  /* 返回狀態(tài)碼 */
		}
	}
	return( 0xFF );  /* 返回操作失敗 */
}

unsigned char get_port_status_X( ) {  /* 查詢打印機端口狀態(tài),返回狀態(tài)碼,如果為0FFH則說明操作失敗,適用于CH375A */
/* 返回狀態(tài)碼中: 位5(Paper Empty)為1說明無紙, 位4(Select)為1說明打印機聯(lián)機, 位3(Not Error)為0說明打印機出錯 */
	buffer[0]=0xA1; buffer[1]=1; buffer[2]=buffer[3]=buffer[4]=buffer[5]=0; buffer[6]=1; buffer[7]=0;  /* 控制傳輸獲取打印機狀態(tài),SETUP數據 */
	wr_usb_data( 8, buffer );  /* SETUP數據總是8字節(jié) */
	if ( issue_token_X( ( 0 << 4 ) | DEF_USB_PID_SETUP, 0x00 )==USB_INT_SUCCESS ) {  /* SETUP階段DATA0操作成功 */
		if ( issue_token_X( ( 0 << 4 ) | DEF_USB_PID_IN, 0x80 )==USB_INT_SUCCESS ) {  /* DATA階段DATA1接收操作成功 */
			rd_usb_data( buffer );  /* 讀出接收到的數據,通常只有1個字節(jié) */
			wr_usb_data( 0, buffer );  /* 發(fā)送0長度的數據DATA1說明控制傳輸成功 */
			if ( issue_token_X( ( 0 << 4 ) | DEF_USB_PID_OUT, 0x40 )==USB_INT_SUCCESS ) return( buffer[0] );  /* STATUS階段操作成功,返回狀態(tài)碼 */
		}
	}
	return( 0xFF );  /* 返回操作失敗 */
}

unsigned char get_descr( unsigned char type ) {  /* 從設備端獲取描述符 */
	CH375_WR_CMD_PORT( CMD_GET_DESCR );
	CH375_WR_DAT_PORT( type );  /* 描述符類型, 只支持1(設備)或者2(配置) */
	return( wait_interrupt() );  /* 等待CH375操作完成 */
}

unsigned char set_addr( unsigned char addr ) {  /* 設置設備端的USB地址 */
	unsigned char status;
	CH375_WR_CMD_PORT( CMD_SET_ADDRESS );  /* 設置USB設備端的USB地址 */
	CH375_WR_DAT_PORT( addr );  /* 地址, 從1到127之間的任意值, 常用2到20 */
	status=wait_interrupt();  /* 等待CH375操作完成 */
	if ( status==USB_INT_SUCCESS ) {  /* 操作成功 */
		CH375_WR_CMD_PORT( CMD_SET_USB_ADDR );  /* 設置USB主機端的USB地址 */
		CH375_WR_DAT_PORT( addr );  /* 當目標USB設備的地址成功修改后,應該同步修改主機端的USB地址 */
	}
	mDelaymS( 5 );
	return( status );
}

unsigned char set_config( unsigned char cfg ) {  /* 設置設備端的USB配置 */
	tog_send=tog_recv=0;  /* 復位USB數據同步標志 */
	CH375_WR_CMD_PORT( CMD_SET_CONFIG );  /* 設置USB設備端的配置值 */
	CH375_WR_DAT_PORT( cfg );  /* 此值取自USB設備的配置描述符中 */
	return( wait_interrupt() );  /* 等待CH375操作完成 */
}

#define	UNKNOWN_USB_DEVICE	0xF1
#define	UNKNOWN_USB_PRINT	0xF2

unsigned char init_print() {  /* 初始化USB打印機,完成打印機枚舉 */
#define	p_dev_descr		((PUSB_DEV_DESCR)buffer)
#define	p_cfg_descr		((PUSB_CFG_DESCR_LONG)buffer)
	unsigned char status, len, c;
	status=get_descr(1);  /* 獲取設備描述符 */
	if ( status==USB_INT_SUCCESS ) {
		len=rd_usb_data( buffer );  /* 將獲取的描述符數據從CH375中讀出到單片機的RAM緩沖區(qū)中,返回描述符長度 */
		if ( len<18 || p_dev_descr->bDescriptorType!=1 ) return( UNKNOWN_USB_DEVICE );  /* 意外錯誤:描述符長度錯誤或者類型錯誤 */
		if ( p_dev_descr->bDeviceClass!=0 ) return( UNKNOWN_USB_DEVICE );  /* 連接的USB設備不是USB打印機,或者不符合USB規(guī)范 */
		status=set_addr(3);  /* 設置打印機的USB地址 */
		if ( status==USB_INT_SUCCESS ) {
			status=get_descr(2);  /* 獲取配置描述符 */
			if ( status==USB_INT_SUCCESS ) {  /* 操作成功則讀出描述符并分析 */
				len=rd_usb_data( buffer );  /* 將獲取的描述符數據從CH375中讀出到單片機的RAM緩沖區(qū)中,返回描述符長度 */
				if ( p_cfg_descr->itf_descr.bInterfaceClass!=7 || p_cfg_descr->itf_descr.bInterfaceSubClass!=1 ) return( UNKNOWN_USB_PRINT );  /* 不是USB打印機或者不符合USB規(guī)范 */
				endp_out_addr=endp_in_addr=0;
				c=p_cfg_descr->endp_descr[0].bEndpointAddress;  /* 第一個端點的地址 */
				if ( c&0x80 ) endp_in_addr=c&0x0f;  /* IN端點的地址 */
				else {  /* OUT端點 */
					endp_out_addr=c&0x0f;
					endp_out_size=p_cfg_descr->endp_descr[0].wMaxPacketSize;  /* 數據接收端點的最大包長度 */
				}
				if ( p_cfg_descr->itf_descr.bNumEndpoints>=2 ) {  /* 接口有兩個以上的端點 */
					if ( p_cfg_descr->endp_descr[1].bDescriptorType==5 ) {  /* 端點描述符 */
						c=p_cfg_descr->endp_descr[1].bEndpointAddress;  /* 第二個端點的地址 */
						if ( c&0x80 ) endp_in_addr=c&0x0f;  /* IN端點 */
						else {  /* OUT端點 */
							endp_out_addr=c&0x0f;
							endp_out_size=p_cfg_descr->endp_descr[1].wMaxPacketSize;
						}
					}
				}
				if ( p_cfg_descr->itf_descr.bInterfaceProtocol<=1 ) endp_in_addr=0;  /* 單向接口不需要IN端點 */
				if ( endp_out_addr==0 ) return( UNKNOWN_USB_PRINT );  /* 不是USB打印機或者不符合USB規(guī)范 */
				status=set_config( p_cfg_descr->cfg_descr.bConfigurationValue );  /* 加載USB配置值 */
				if ( status==USB_INT_SUCCESS ) {
					CH375_WR_CMD_PORT( CMD_SET_RETRY );  /* 設置USB事務操作的重試次數 */
					CH375_WR_DAT_PORT( 0x25 );
					CH375_WR_DAT_PORT( 0x89 );  /* 位7為1則收到NAK時無限重試, 位3~位0為超時后的重試次數 */
/* 如果單片機在打印機忙時并無事可做,建議設置位7為1,使CH375在收到NAK時自動重試直到操作成功或者失敗 */
/* 如果希望單片機在打印機忙時能夠做其它事,那么應該設置位7為0,使CH375在收到NAK時不重試,
   所以在下面的USB通訊過程中,如果USB打印機正忙,issue_token等子程序將得到狀態(tài)碼USB_INT_RET_NAK */
				}
			}
		}
	}
	return(status);
}

/* 主機端的主程序簡單示例 */
main() {
	unsigned char xdata data_to_send[200];  /* 緩沖區(qū) */
	unsigned char str_to_print[]="OK, support text print\n";
	unsigned char s;
	mDelaymS( 200 );
	set_usb_mode( 6 );  /* 設置USB主機模式 */
	while ( wait_interrupt()!=USB_INT_CONNECT );  /* 等待USB打印機連接上來 */

/* 如果設備端是CH341轉打印口或者是CH37X,那么以下步驟是可選的,如果是其它USB芯片,那么可能需要執(zhí)行以下步驟 */
#define USB_RESET_FIRST	1  /* USB規(guī)范中未要求在USB設備插入后必須復位該設備,但是計算機的WINDOWS總是這樣做,所以有些USB設備也要求在插入后必須先復位才能工作 */
#ifdef USB_RESET_FIRST
	set_usb_mode( 7 );  /* 復位USB設備,CH375向USB信號線的D+和D-輸出低電平 */
/* 如果單片機對CH375的INT#引腳采用中斷方式而不是查詢方式,那么應該在復制USB設備期間禁止CH375中斷,在USB設備復位完成后清除CH375中斷標志再允許中斷 */
	mDelaymS( 10 );  /* 復位時間不少于1mS,建議為10mS */
	set_usb_mode( 6 );  /* 結束復位 */
	mDelaymS( 100 );
	while ( wait_interrupt()!=USB_INT_CONNECT );  /* 等待復位之后的設備端再次連接上來 */
#endif

	mDelaymS( 200 );  /* 有些USB設備要等待數百毫秒才能正常工作 */
	if ( init_print()!=USB_INT_SUCCESS ) while(1);  /* 錯誤 */
	while ( 1 ) {
		s = get_port_status( );
		if ( s!=0xFF ) {
/*			if ( s&0x20 ) printf("No paper!\n");
			if ( (s&0x08) == 0 ) printf("Print ERROR!\n");*/
		}
		send_data( strlen(str_to_print), str_to_print );  /* 輸出數據給打印機,與通過并口方式輸出一樣 */
		send_data( sizeof(data_to_send), data_to_send );  /* 輸出的數據必須按照打印機的格式要求或者遵循打印描述語言 */
		/* 可以再次繼續(xù)發(fā)送數據或者接收數據 */
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩高清在线观看| 亚洲地区一二三色| av综合在线播放| 亚洲日本护士毛茸茸| 色呦呦国产精品| 一区二区三区四区av| 欧美日本韩国一区二区三区视频 | 欧美日韩五月天| 日韩二区三区四区| 欧美精品一区二区三区蜜桃| 丁香六月综合激情| 一区二区三区视频在线观看| 欧美乱妇一区二区三区不卡视频| 蜜桃视频一区二区| 欧美激情在线一区二区三区| www.成人网.com| 一区二区三区欧美视频| 欧美一区二区在线不卡| 国产精品99久久久久久似苏梦涵 | 久草精品在线观看| 欧美国产视频在线| 91福利资源站| 日本欧美一区二区在线观看| 久久久国产午夜精品| 91麻豆文化传媒在线观看| 日本不卡中文字幕| 日本一区二区三区四区在线视频| 91色porny| 久久精品999| 亚洲色图色小说| 欧美一区二区大片| 成人99免费视频| 天天影视涩香欲综合网| 国产色产综合色产在线视频| 91精彩视频在线观看| 奇米精品一区二区三区在线观看 | 午夜伊人狠狠久久| 国产亚洲一区二区三区在线观看| 91丨九色丨黑人外教| 男女男精品视频| 亚洲欧洲日本在线| 日韩精品中午字幕| 色悠悠久久综合| 精品无码三级在线观看视频 | 日本不卡一区二区三区高清视频| 日本一二三四高清不卡| 欧美日韩一区二区三区四区五区 | 午夜免费久久看| 中文字幕乱码一区二区免费| 欧美日韩大陆在线| 成人美女在线视频| 青青草伊人久久| 亚洲色图视频免费播放| 精品盗摄一区二区三区| 欧美亚洲综合在线| 国产91精品久久久久久久网曝门 | 99r国产精品| 另类小说色综合网站| 亚洲精品高清视频在线观看| 日韩午夜av电影| aaa欧美日韩| 韩国毛片一区二区三区| 亚洲乱码中文字幕| 国产亚洲综合av| 日韩精品中文字幕在线一区| 在线精品视频免费观看| 成人黄色电影在线 | 99久久精品99国产精品| 免费在线观看精品| 亚洲一区二区三区中文字幕| 中文无字幕一区二区三区| 制服丝袜亚洲精品中文字幕| 成人性视频网站| 毛片av一区二区| 亚洲一区二区精品3399| 中文字幕av在线一区二区三区| 91精品婷婷国产综合久久竹菊| 色婷婷激情久久| 99视频在线精品| 国产成a人亚洲| 国产原创一区二区三区| 免费三级欧美电影| 婷婷丁香激情综合| 一区二区成人在线观看| 亚洲欧洲国产日韩| 国产蜜臀97一区二区三区| 欧美va亚洲va香蕉在线| 4438成人网| 欧美日韩在线播放| 国产成人丝袜美腿| 美女高潮久久久| 免费在线观看精品| 奇米影视一区二区三区小说| 午夜视频一区二区| 午夜久久久久久久久| 亚洲国产一区二区三区青草影视| 亚洲精品欧美综合四区| 亚洲日本中文字幕区| 国产婷婷一区二区| 久久久久9999亚洲精品| 日韩欧美成人午夜| 日韩一区和二区| 欧美一区二区久久久| 欧美一区二区视频在线观看2020| 欧美日韩国产高清一区二区 | 日本v片在线高清不卡在线观看| 亚洲综合色噜噜狠狠| 亚洲免费av高清| 亚洲欧美二区三区| 亚洲在线观看免费视频| 一区二区成人在线视频| 亚洲福利一二三区| 亚洲成a人片在线不卡一二三区| 欧美视频在线播放| 欧美日韩中文字幕一区二区| 欧美三级韩国三级日本一级| 欧美精品一级二级三级| 欧美日本韩国一区二区三区视频| 欧美精品日日鲁夜夜添| 欧美福利电影网| 日韩三级中文字幕| 欧美精品一区二区三区一线天视频 | 欧美喷潮久久久xxxxx| 欧美日韩国产综合草草| 91精品国产91久久久久久一区二区| 欧美一区二区视频在线观看| 欧美电影精品一区二区| 欧美精品一区男女天堂| 中文成人av在线| 亚洲欧美日韩系列| 亚洲午夜激情网页| 免费成人美女在线观看| 麻豆专区一区二区三区四区五区| 狠狠色伊人亚洲综合成人| 国产91色综合久久免费分享| 99久久精品一区| 欧美久久久久免费| 精品免费日韩av| 国产精品久久夜| 综合激情成人伊人| 亚洲一区在线视频| 毛片一区二区三区| 成人av资源站| 日本电影欧美片| 日韩欧美一区二区三区在线| 国产校园另类小说区| 国产精品欧美一级免费| 一区二区三区日本| 日本麻豆一区二区三区视频| 国产在线麻豆精品观看| 99久久99久久免费精品蜜臀| 欧美亚洲国产怡红院影院| 日韩欧美一级二级| 国产精品欧美一级免费| 婷婷综合五月天| 国产夫妻精品视频| 欧美色手机在线观看| 欧美成人一区二区三区在线观看| 中文欧美字幕免费| 亚洲电影视频在线| 国产一区在线视频| 色香蕉久久蜜桃| 日韩精品一区二区三区在线观看| 国产日韩欧美综合在线| 亚洲激情网站免费观看| 麻豆精品一区二区三区| 国产91精品免费| 在线播放中文一区| 国产精品午夜在线| 日韩av在线发布| 不卡电影免费在线播放一区| 欧美精品99久久久**| 中文在线一区二区| 蜜臀91精品一区二区三区| 国产成人在线视频网址| 欧美日韩一级黄| 欧美高清在线视频| 日韩中文字幕区一区有砖一区| 国产99精品视频| 91精品在线观看入口| 亚洲欧美色图小说| 国内精品伊人久久久久av影院 | 97精品电影院| 精品美女一区二区| 亚洲欧美韩国综合色| 久久成人免费日本黄色| 在线一区二区视频| 国产欧美日韩另类一区| 日韩和欧美一区二区三区| 成人白浆超碰人人人人| 日韩免费视频线观看| 亚洲精品一卡二卡| 国产成人aaaa| 日韩欧美久久久| 亚洲高清免费观看| 成人黄色在线视频| 精品少妇一区二区三区视频免付费| 亚洲综合在线免费观看| 亚洲少妇30p| 久久爱www久久做|