?? 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 <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)
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 + -