⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 d12ci.c

📁 USB接口芯片D12在STC单片机上的驱动开发
💻 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 <reg51.h>                /* special function register declarations   */

#include "epphal.h"
#include "mainloop.h"
#include "d12ci.h"
#include "stdio.h"

//#define DEBUG

extern EPPFLAGS bEPPflags;

void D12_SetAddressEnable(unsigned char bAddress, unsigned char bEnable)
{
	if(bEPPflags.bits.in_isr == 0)
		DISABLE;

	outportb(D12_COMMAND, 0xD0);
	if(bEnable)
		bAddress |= 0x80;
	outportb(D12_DATA, bAddress);

	if(bEPPflags.bits.in_isr == 0)
		ENABLE;
}

void D12_SetEndpointEnable(unsigned char bEnable)
{
	if(bEPPflags.bits.in_isr == 0)
		DISABLE;

	outportb(D12_COMMAND, 0xD8);
	if(bEnable)
		outportb(D12_DATA, 1);
	else
		outportb(D12_DATA, 0);

	if(bEPPflags.bits.in_isr == 0)
		ENABLE;
}

void D12_SetMode(unsigned char bConfig, unsigned char bClkDiv)
{
	if(bEPPflags.bits.in_isr == 0)
		DISABLE;

	outportb(D12_COMMAND, 0xF3);
	outportb(D12_DATA, bConfig);
	outportb(D12_DATA, bClkDiv);

	if(bEPPflags.bits.in_isr == 0)
		ENABLE;
}

void D12_SetDMA(unsigned char bMode)
{
	if(bEPPflags.bits.in_isr == 0)
		DISABLE;

	outportb(D12_COMMAND, 0xFB);
	outportb(D12_DATA, bMode);

	if(bEPPflags.bits.in_isr == 0)
		ENABLE;
}

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 b1;		//return j;
}

unsigned char D12_SelectEndpoint(unsigned char bEndp)
{
	unsigned char c;

	if(bEPPflags.bits.in_isr == 0)
		DISABLE;

	outportb(D12_COMMAND, bEndp);
	c = inportb(D12_DATA);

	if(bEPPflags.bits.in_isr == 0)
		ENABLE;

	return c;
}

unsigned char D12_ReadLastTransactionStatus(unsigned char bEndp)
{
//#define mydebug
	outportb(D12_COMMAND, 0x40 + bEndp);
	return inportb(D12_DATA);
#ifdef mydebug
	printf("\toutput port is 0x%bx, val is 0x%bx.", D12_COMMAND, 0x40 + bEndp);
//	printf("\tinput data is 0x%bx.\n", inportb(D12_DATA));	
#endif
}

unsigned char D12_ReadEndpointStatus(unsigned char bEndp)
{
	unsigned char c;

	if(bEPPflags.bits.in_isr == 0)
		DISABLE;

	outportb(D12_COMMAND, 0x80 + bEndp);
	c = inportb(D12_DATA);

	if(bEPPflags.bits.in_isr == 0)
		ENABLE;

	return c;
}

void D12_SetEndpointStatus(unsigned char bEndp, unsigned char bStalled)
{
	if(bEPPflags.bits.in_isr == 0)
		DISABLE;

	outportb(D12_COMMAND, 0x40 + bEndp);
	outportb(D12_DATA, bStalled);

	if(bEPPflags.bits.in_isr == 0)
		ENABLE;
}

void D12_SendResume(void)
{
	outportb(D12_COMMAND, 0xF6);
}

unsigned short D12_ReadCurrentFrameNumber(void)
{
	unsigned short i,j;

	if(bEPPflags.bits.in_isr == 0)
		DISABLE;

	outportb(D12_COMMAND, 0xF5);
	i= inportb(D12_DATA);
	j = inportb(D12_DATA);

	i += (j<<8);

	if(bEPPflags.bits.in_isr == 0)
		ENABLE;

	return i;
}

unsigned short D12_ReadChipID(void)
{
	unsigned short i,j;

	if(bEPPflags.bits.in_isr == 0)
		DISABLE;

	outportb(portbase+D12_COMMAND, 0xFD);
	i=inportb(portbase+D12_DATA);
	j=inportb(portbase+D12_DATA);
	i += (j<<8);

	if(bEPPflags.bits.in_isr == 0)
		ENABLE;

	return i;
}

unsigned char D12_ReadEndpoint(unsigned char endp, unsigned char * buf, unsigned char len)
{
	unsigned char i, j;

	if(bEPPflags.bits.in_isr == 0)
		DISABLE;

	outportb(D12_COMMAND, endp);
	if((inportb(D12_DATA) & D12_FULLEMPTY) == 0) {
		if(bEPPflags.bits.in_isr == 0)
			ENABLE;
		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);

	if(bEPPflags.bits.in_isr == 0)
		ENABLE;

	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;

	if(bEPPflags.bits.in_isr == 0)
		DISABLE;

	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 --;
	}

	if(bEPPflags.bits.in_isr == 0)
		ENABLE;

	return k;
}

unsigned char D12_WriteEndpoint(unsigned char endp, unsigned char * buf, unsigned char len)
{
	unsigned char idata i;

	if(bEPPflags.bits.in_isr == 0)
		DISABLE;

	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);

	if(bEPPflags.bits.in_isr == 0)
		ENABLE;

	return len;
}

void D12_AcknowledgeEndpoint(unsigned char endp)
{
	outportb(D12_COMMAND, endp);
	outportb(D12_COMMAND, 0xF1);
	if(endp == 0)
		outportb(D12_COMMAND, 0xF2);
}

#ifndef __C51__
unsigned char D12Eval_inportb(void)
{
	return inportb(D12_EVAL_PORT_I);
}

void D12Eval_outportb(unsigned char val, unsigned char mask)
{
	static unsigned char last_val = 0;

	val = (val & mask) | (last_val & (~mask));
	outportb(D12_EVAL_PORT_O, val);
	last_val = val;
}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -