www.pudn.com > USBDriver.rar > D12CI.c


/****************************************Copyright (c)************************************************** 
**                               ¹ãÖÝÖÜÁ¢¹¦µ¥Æ¬»ú·¢Õ¹ÓÐÏÞ¹«Ë¾ 
**                                     ÑÐ    ¾¿    Ëù 
**                                        ²úÆ·Ò»²¿  
** 
**                                 http://www.zlgmcu.com 
** 
** ÎÄ   ¼þ   Ãû: D12CI.c 
** ×îºóÐÞ¸ÄÈÕÆÚ: 2004Äê7ÔÂ2ÈÕ 
** Ãè        Êö: USBÇý¶¯³ÌÐòÈí¼þ°ü: PDIUSBD12 É豸¶ËÇý¶¯³ÌÐò ½Ó¿Ú¿ØÖÆÇý¶¯²ã 
** °æ	     ±¾: V1.0 
**********************************************************************************************************/ 
 
#include "D12Config.h" 
#include "D12HAL.h" 
#include "d12ci.h" 
 
/************************************************************ 
** º¯ÊýÃû³Æ: INT16U readchipid(void) 
** ¹¦ÄÜÃèÊö: ¶ÁȡоƬID 
** Êä¡¡  Èë: ÎÞ 
** Êä ¡¡ ³ö: оƬµÄIDºÅ 
************************************************************/ 
INT16U readchipid(void) 
{ 
	INT8U i; 
	INT16U chipid; 
	 
	outportc(0xFD);				//·¢ËͶÁPDIUSBD12оƬIDºÅÃüÁî			 
	i = inportd();				//¶ÁÈ¡IDºÅµÍ×Ö½Ú 
	chipid = inportd();			//¶ÁÈ¡IDºÅ¸ßλ×Ö½Ú 
	chipid = chipid * 256 + i;	//×é³É16λµÄPDIUSBD12оƬIDºÅ 
	 
	return chipid; 
} 
 
	/***************************************** 
		ÓëCPU ÎÞ¹Ø, Óë USBÏà¹ØµÄº¯Êý 
	*****************************************/ 
 
 
/************************************************************ 
** º¯ÊýÃû³Æ: void D12_SetAddressEnable(INT8U bAddress,INT8U bEnable) 
** ¹¦ÄÜÃèÊö: ÉèÖõØÖ·/ʹÄÜ 
** Êä¡¡  Èë: INT8U bAddress:  µØÖ· 
	     	 INT8U bEnable :  0 --- ½ûÖ¹ 
	     		     		  1 --- ʹÄÜ 
** Êä ¡¡ ³ö: ÎÞ 
************************************************************/ 
void D12_SetAddressEnable(INT8U bAddress, INT8U bEnable) 
{ 
	outportc(0xD0);				//Êä³öÉèÖõØÖ·/ʹÄÜÖ¸Áî 
	if(bEnable) 
		bAddress |= 0x80;		//bit7ÖÃ1,ʹÄÜ 
	outportd(bAddress);			//Êä³öÉèÖÃÖµ 
} 
 
 
/************************************************************ 
** º¯ÊýÃû³Æ: void D12_SetEndpointEnable(INT8U bEnable) 
** ¹¦ÄÜÃèÊö: ÉèÖö˵ãʹÄÜ 
** Êä¡¡  Èë: INT8U bEnable :  0 --- ½ûÖ¹ 
	     		     		  1 --- ÔÊÐí 
** Êä ¡¡ ³ö: ÎÞ 
************************************************************/ 
void D12_SetEndpointEnable(INT8U bEnable) 
{ 
	outportc(0xD8);				//Êä³öÉèÖö˵ãʹÄÜÖ¸Áî 
	if(bEnable) 
		outportd(0x01);			//ÉèÖö˵ãÔÊÐí 
	else 
		outportd(0x00);			//ÉèÖö˵ã½ûÖ¹ 
} 
 
/************************************************************ 
** º¯ÊýÃû³Æ: void D12_SetMode(INT8U bConfig,INT8U bClkDiv) 
** ¹¦ÄÜÃèÊö: ģʽÉèÖà 
** Êä¡¡  Èë: INT8U bConfig:  ÅäÖÃ×Ö½ÚÐÅÏ¢ 
	     	 INT8U bClkDiv:  ·ÖƵϵÊý 
** Êä ¡¡ ³ö: ÎÞ 
************************************************************/ 
void D12_SetMode(INT8U bConfig,INT8U bClkDiv) 
{ 
	outportc(0xF3);				//Êä³öÉèÖÃģʽָÁî 
	outportd(bConfig);			//Êä³öÅäÖÃ×Ö½ÚÐÅÏ¢ 
	outportd(bClkDiv);			//Êä³öʱÖÓ·ÖÆµÒòÊý×Ö½Ú 
} 
 
/************************************************************ 
** º¯ÊýÃû³Æ: void D12_SetDMA(INT8U bMode) 
** ¹¦ÄÜÃèÊö: ÉèÖÃDMA¹¤×÷·½Ê½ÉèÖà 
** Êä¡¡  Èë: INT8U bMode: 	ÉèÖÃÖµ 
** Êä ¡¡ ³ö: ÎÞ 
************************************************************/ 
void D12_SetDMA(INT8U bMode) 
{ 
	outportc(0xFB);				//ÉèÖÃDMA¹¤×÷·½ÃüÁî 
	outportd(bMode);			//Êä³öÉèÖÃÖµ 
} 
 
/************************************************************ 
** º¯ÊýÃû³Æ: INT16U D12_ReadInterruptRegister(void) 
** ¹¦ÄÜÃèÊö: ¶ÁÈ¡ÖжϼĴæÆ÷Öµ 
** Êä¡¡  Èë: ÎÞ 
** Êä ¡¡ ³ö: ÖжϼĴæÆ÷Öµ 
************************************************************/ 
INT16U D12_ReadInterruptRegister(void) 
{ 
	INT8U b1; 
	INT16U j; 
 
	outportc(0xF4);				//¶ÁÈ¡ÖжϼĴæÆ÷ÃüÁî 
	b1 = inportd();				//¶ÁÈ¡µÍ8λ×Ö½Ú 
	j = inportd();				//¶ÁÈ¡¸ß8λ×Ö½Ú 
 
	j = j * 256;			 
	j += b1;					//×éºÏΪ16λ 
 
	return j; 
} 
 
/************************************************************ 
** º¯ÊýÃû³Æ: INT8U D12_SelectEndpoint(INT8U bEndp) 
** ¹¦ÄÜÃèÊö: ¶ËµãÑ¡Ôñ,½«ÄÚ²¿Ö¸Õë³õʼ»¯µ½Ñ¡ÔñµÄ»º³åÇøÆðʼλÖà 
** Êä¡¡  Èë: INT8U bEndp£º   ¶ËµãË÷ÒýºÅ,ȡֵ0 ~ 5 
** Êä ¡¡ ³ö: ¶Á³öµÄ×Ö½Ú 
************************************************************/ 
INT8U D12_SelectEndpoint(INT8U bEndp) 
{ 
	INT8U c; 
 
	outportc(bEndp);			//¶ËµãÑ¡Ôñ 
	c = inportd();				//¶Á³öÒ»¸ö×Ö½Ú 
 
	return c; 
} 
 
/************************************************************ 
** º¯ÊýÃû³Æ: INT8U D12_ReadEndpointStatus(INT8U bEndp) 
** ¹¦ÄÜÃèÊö: ¶ÁÈ¡¶Ëµã״̬ 
** Êä¡¡  Èë: INT8U bEndp£º   ¶ËµãË÷ÒýºÅ,ȡֵ0 ~ 5 
** Êä ¡¡ ³ö: ¶Ëµã״̬ 
************************************************************/ 
INT8U D12_ReadEndpointStatus(INT8U bEndp) 
{ 
	INT8U c; 
 
	outportc(0x80 + bEndp);		//¶ÁÈ¡¶Ëµã״̬ÃüÁî 
	c = inportd();				//¶ÁÈ¡¶Ëµã״̬ 
	return c; 
} 
 
/************************************************************ 
** º¯ÊýÃû³Æ: INT8U D12_ReadLastTransactionStatus(INT8U bEndp) 
** ¹¦ÄÜÃèÊö: ¶ÁÈ¡×îºó´¦Àí״̬¼Ä´æÆ÷¬ 
** Êä¡¡  Èë: INT8U bEndp£º   ¶ËµãË÷ÒýºÅ,ȡֵ0 ~ 5 
** Êä ¡¡ ³ö: ¶Ëµã×îºó´¦ÀíµÄ״̬ 
************************************************************/ 
INT8U D12_ReadLastTransactionStatus(INT8U bEndp) 
{ 
	outportc(0x40 + bEndp);		//Êä³ö¶ÁÈ¡×îºó´¦Àí״̬¼Ä´æÆ÷¬ 
	return inportd();			//¶Áȡ״̬ 
} 
 
 
/************************************************************ 
** º¯ÊýÃû³Æ: INT8U D12_ReadEndpointStatus(INT8U bEndp) 
** ¹¦ÄÜÃèÊö: ÉèÖö˵ã״̬ 
** Êä¡¡  Èë: INT8U bEndp£º   ¶ËµãË÷ÒýºÅ,ȡֵ0 ~ 5 
	         INT8U bStalled: ״ֵ̬ 
** Êä ¡¡ ³ö: ¶Ëµã״̬ 
************************************************************/ 
void D12_SetEndpointStatus(INT8U bEndp,INT8U bStalled) 
{ 
	outportc(0x40 + bEndp);		//·¢ËÍÉèÖö˵ã״̬ÃüÁî 
	outportd(bStalled);			//ÉèÖö˵ã״̬ 
} 
 
 
/************************************************************ 
** º¯ÊýÃû³Æ: void D12_SendResume(void) 
** ¹¦ÄÜÃèÊö: ´«Êä»Ö¸´ 
** Êä¡¡  Èë: ÎÞ 
** Êä ¡¡ ³ö: ÎÞ 
************************************************************/ 
void D12_SendResume(void) 
{ 
	outportc(0xF6);				//ÉèÖ÷¢Ëͻָ´ 
} 
 
/************************************************************ 
** º¯ÊýÃû³Æ: INT16U D12_ReadCurrentFrameNumber(void) 
** ¹¦ÄÜÃèÊö: ¶ÁÈ¡µ±Ç°Ö¡ºÅ 
** Êä¡¡  Èë: ÎÞ 
** Êä ¡¡ ³ö: µ±Ç°Ö¡ºÅ 
************************************************************/ 
INT16U D12_ReadCurrentFrameNumber(void) 
{ 
	INT16U i,j; 
 
	outportc(0xF5);				//·¢ËͶÁÈ¡µ±Ç°Ö¡ÊýÄ¿ÃüÁî 
	i= inportd();				//¶Áȡ֡ÊýÄ¿µÄµÍ8λ 
	j = inportd();				//¶Áȡ֡ÊýÄ¿µÄ¸ß8λ 
 
	i += (j * 256);				 
 
	return i;					//·µÄ¿µ±Ç°Ö¡ÊýÄ¿ 
} 
 
 
/************************************************************ 
** º¯ÊýÃû³Æ: INT8U D12_ReadEndpoint(INT8U endp,INT8U len,INT8U * buf) 
** ¹¦ÄÜÃèÊö: ¶ÁÈ¡¶ËµãÊý¾Ý 
** Êä¡¡  Èë: INT8U endp:     ¶ËµãË÷ÒýºÅ,ȡֵ 0 ~ 5  
	    	 INT8U len:	     Òª¶ÁÈ¡µÄÊý¾Ý³¤¶È 
	     	 INT8U * buf:    ½ÓÊÕÊý¾ÝÖ¸Õë 
** Êä ¡¡ ³ö: ʵ¼Ê¶ÁµÃµÄ×Ö½ÚÊý 
************************************************************/ 
INT8U D12_ReadEndpoint(INT8U endp, INT8U len, INT8U * buf) 
{ 
	INT8U i, j; 
 
	outportc(endp);						//·¢ËÍÑ¡Ôñ¶ËµãÃüÁî 
	if((inportd() & 0x01) == 0) {		//Èç¹û»º³åÇøÎª¿Õ 
		return 0;						//Ôò·µ»Ø¶Áµ½0×Ö½Ú 
	} 
 
	outportc(0xF0);						//·¢ËͶÁ»º³åÇøÃüÁî 
	j = inportd();						//¶ÁÈ¡±£Áô×Ö½Ú 
	j = inportd();						//¶ÁÈ¡Êý¾Ý×Ö½ÚµÄÊýÄ¿/³¤¶È 
 
	if(j > len) 
		j = len;						//Èç¹û´óÓÚÒªÇó¶ÁµÄ×Ö½ÚÊýÄ¿ 
										//ÔòÖ»¶ÁȡҪÇóµÄ×Ö½Ú³¤¶È 
	for(i=0; i= 4){ 
		outportc(endp);		//Ñ¡ÔñµÚ2¸ö»º³åÇø 
		outportc(0xF2);		//Çå¿ÕµÚ2¸ö»º³åÇø 
	} 
} 
 
 
/************************************************************ 
** º¯ÊýÃû³Æ: void disconnect_USB(void)  
** ¹¦ÄÜÃèÊö: ¶Ï¿ªUSB×ÜÏß 
************************************************************/ 
void disconnect_USB(void) 
{ 
	// Initialize D12 configuration 
	D12_SetMode(D12_NOLAZYCLOCK, D12_SETTOONE | D12_CLOCK_12M); 
}//SoftConnect ¶Ï¿ª 
 
/************************************************************ 
** º¯ÊýÃû³Æ: void connect_USB(void) 
** ¹¦ÄÜÃèÊö: Á¬½ÓUSB×ÜÏß 
************************************************************/ 
void connect_USB(void) 
{ 
	// Initialize D12 configuration 
	D12_SetMode(D12_NOLAZYCLOCK|D12_SOFTCONNECT, D12_SETTOONE | D12_CLOCK_12M); 
}//SoftConnect Á¬½ÓÉÏ,²¢ÉèÖÃΪÎÞLazyClock,ģʽΪ·Çͬ²½Ä£Ê½ 
 
/************************************************************ 
** º¯ÊýÃû³Æ: void reconnect_USB(void) 
** ¹¦ÄÜÃèÊö: ÖØÐÂÁ¬½ÓUSB×ÜÏß 
************************************************************/ 
void reconnect_USB(void) 
{ 
	INT32U clk_cnt; 
 
	disconnect_USB();				//¶Ï¿ªÐ¾Æ¬ÓëUSB×ÜÏßÁ¬½Ó 
    for (clk_cnt = 0;clk_cnt<= 0x6FFFF;clk_cnt++); //ÑÓʱ´¦Àí 
    connect_USB();					//Á¬½Óµ½USB×ÜÏß 
}