📄 d12ci.c
字号:
//************************************************************************* // // P H I L I P S P R O P R I E T A R Y // // COPYRIGHT (c) 1997 BY PHILIPS SINGAPORE. // -- ALL RIGHTS RESERVED -- // // File Name: D12CI.C // Author: Wenkai Du // Created: 8 Jun 98 // Modified: // Revision: 2.2 // //************************************************************************* // // 98/11/27 I/O mode Main endpoints read/write update (WK) // 98/12/2 Added D12_ReadMainEndpoint (WK) //*************************************************************************#include <sysdef.h>#include "d12ci.h"#include "d12hal.h"#if !PC_SIM#pragma codeseg(BANK23)#endifunsigned char ENDPT_INT;unsigned char OTHER_INT;unsigned char DBUFFER[DBUFFER_SIZE];void D12_SetAddressEnable(unsigned char bAddress, unsigned char bEnable){ outportb(D12_COMMAND, 0xD0); if(bEnable) { bAddress |= 0x80; } outportb(D12_DATA, bAddress);}void D12_SetEndpointEnable(unsigned char bEnable){ outportb(D12_COMMAND, 0xD8); if(bEnable) { outportb(D12_DATA, 1); } else { outportb(D12_DATA, 0); }}void D12_SetMode(unsigned char bConfig, unsigned char bClkDiv){ outportb(D12_COMMAND, 0xF3); outportb(D12_DATA, bConfig); outportb(D12_DATA, bClkDiv);}void D12_SetDMA(unsigned char bMode){ outportb(D12_COMMAND, 0xFB); outportb(D12_DATA, bMode);}unsigned short D12_ReadInterruptRegister(void){ unsigned char b1; unsigned int j; outportb(D12_COMMAND, 0xF4); b1 = inportb(D12_DATA); j = inportb(D12_DATA); j <<= 8; j += b1; return j;}/* Read Interrupt Register Function *//* Write to pre-determined Registers */void UpdateIntReg(void){ outportb(D12_COMMAND, 0xF4); //Read Interrupt Command ENDPT_INT = inportb(D12_DATA);// Interrupt Register Byte1 OTHER_INT = inportb(D12_DATA); // Interrupt Register Byte2}unsigned char D12_SelectEndpoint(unsigned char bEndp){ unsigned char c; outportb(D12_COMMAND, bEndp); c = inportb(D12_DATA); return c;}unsigned char D12_ReadLastTransactionStatus(unsigned char bEndp){ outportb(D12_COMMAND, 0x40 + bEndp); return inportb(D12_DATA);}unsigned char D12_ReadEndpointStatus(unsigned char bEndp){ unsigned char c; outportb(D12_COMMAND, 0x80 + bEndp); c = inportb(D12_DATA); return c;}void D12_SetEndpointStatus(unsigned char bEndp, unsigned char bStalled){ outportb(D12_COMMAND, 0x40 + bEndp); outportb(D12_DATA, bStalled);}void D12_SendResume(void){ outportb(D12_COMMAND, 0xF6);}unsigned short D12_ReadCurrentFrameNumber(void){ unsigned short i,j; outportb(D12_COMMAND, 0xF5); i= inportb(D12_DATA); j = inportb(D12_DATA); i += (j<<8); return i;}unsigned short D12_ReadChipID(void){ unsigned short i,j; outportb(D12_COMMAND, 0xFD); i=inportb(D12_DATA); j=inportb(D12_DATA); i += (j<<8); return i;}unsigned char D12_ReadEndpoint(unsigned char endp, unsigned char * buf, unsigned char len){ unsigned char i, j; outportb(D12_COMMAND, endp); if((inportb(D12_DATA) & D12_FULLEMPTY) == 0) { return 0; } outportb(D12_COMMAND, 0xF0); j = inportb(D12_DATA); j = inportb(D12_DATA); if(j > len) j = len; for(i=0; i<j; i++) *(buf+i) = inportb(D12_DATA); outportb(D12_COMMAND, 0xF2); return j;}// D12_ReadMainEndpoint() added by V2.2 to support double-buffering.// Caller should assume maxium 128 bytes of returned data.unsigned char D12_ReadMainEndpoint(unsigned char * buf){ unsigned char i, j, k = 0, bDblBuf = 1; outportb(D12_COMMAND, 0x84); if( (inportb(D12_DATA) & 0x60) == 0x60) bDblBuf = 2; while(bDblBuf) { outportb(D12_COMMAND, 4); if((inportb(D12_DATA) & D12_FULLEMPTY) == 0) break; outportb(D12_COMMAND, 0xF0); j = inportb(D12_DATA); j = inportb(D12_DATA); for(i=0; i<j; i++) *(buf+i+k) = inportb(D12_DATA); k += j; outportb(D12_COMMAND, 0xF2); bDblBuf --; } return k;}unsigned char D12_WriteEndpoint(unsigned char endp, unsigned char * buf, unsigned char len){ unsigned char i; outportb(D12_COMMAND, endp); // inportb(D12_DATA); outportb(D12_COMMAND, 0xF0); outportb(D12_DATA, 0); outportb(D12_DATA, len); for(i=0; i<len; i++) outportb(D12_DATA, *(buf+i)); outportb(D12_COMMAND, 0xFA); return len;}void D12_AcknowledgeEndpoint(unsigned char endp){ outportb(D12_COMMAND, endp); outportb(D12_COMMAND, 0xF1); if(endp == 0) outportb(D12_COMMAND, 0xF2);}void D12_SendZeroPacket(unsigned char endp){ DBUFFER[0] = 0; D12_WriteEndpoint(D12_ENDPOINT0_IN, DBUFFER, 0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -