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×ÜÏß
}