📄 pquicc.c
字号:
/* */
/* DESCRIPTION */
/* */
/* This function will handle interrupt service for PQUICC */
/* */
/* AUTHOR */
/* */
/* Bill Haggerty Accelerated Technology Inc. */
/* */
/* CALLED BY */
/* */
/* No functions call this function */
/* */
/* CALLS */
/* */
/* DEV_Get_Dev_For_Vector */
/* PQUICC_Recv_Frame */
/* */
/* INPUTS */
/* */
/* int : interrupt vector */
/* */
/* OUTPUTS */
/* */
/* None */
/* */
/* HISTORY */
/* */
/* NAME DATE REMARKS */
/* */
/* B. Haggerty 05-07-1998 Created version 1.0 */
/* */
/****************************************************************************/
VOID PQUICC_LISR(INT vector)
{
DV_DEVICE_ENTRY *device;
unsigned long event,temp;
device = DEV_Get_Dev_For_Vector(vector);
event = pquicc->scc_regs[0].scc_scce;
event &= pquicc->scc_regs[0].scc_sccm;
temp = event;
pquicc->scc_regs[0].scc_scce = temp;
if ( (event & ETHERNET_RXF) )
{
PQUICC_Recv_Frame(device);
}
if ( (event & ETHERNET_BSY) )
{
pquicc->scc_regs[0].scc_scce = 0x0004;
}
if ( (event & ETHERNET_RXB) )
{
PQUICC_Recv_Frame(device);
}
if ( (event & ETHERNET_TXB) )
{
pquicc->scc_regs[0].scc_scce = 0x0002;
}
if ( (event & ETHERNET_TXE) )
{
pquicc->scc_regs[0].scc_scce = 0x0010;
}
} /*PQUICC_LISR */
/****************************************************************************/
/* FUNCTION */
/* */
/* PQUICC_Recv_HISR */
/* */
/* DESCRIPTION */
/* */
/* This function will handle sending the Buffers_Available event to wake */
/* up the timer_task to demux input packets. */
/* */
/* AUTHOR */
/* */
/* Bill Haggerty */
/* */
/* CALLED BY */
/* */
/* PQUICC_Recv_Frame */
/* */
/* CALLS */
/* */
/* NU_Set_Events */
/* */
/* INPUTS */
/* */
/* None */
/* */
/* OUTPUTS */
/* */
/* None */
/* */
/* HISTORY */
/* */
/* NAME DATE REMARKS */
/* */
/* B. Haggerty 05-07-1998 Created version 1.0 */
/* */
/****************************************************************************/
VOID PQUICC_Recv_HISR (VOID)
{
NU_Set_Events(&Buffers_Available, (UNSIGNED)2, NU_OR);
Hisr_Activated = 0;
}
/****************************************************************************/
/* FUNCTION */
/* */
/* PQUICC_BD_Init */
/* */
/* DESCRIPTION */
/* */
/* Initialize RX and TX Buffer Descriptor rings. */
/* The buffers are in IMMR + 0x2000. */
/* The TX buffers are after the RX buffers. */
/* */
/* */
/* */
/* AUTHOR */
/* */
/* Bill Haggerty */
/* */
/* CALLED BY */
/* */
/* PQUICC_Open */
/* */
/* CALLS */
/* */
/* get_IMMR */
/* */
/* INPUTS */
/* */
/* int : Num_of_Buffers - Number of buffers */
/* */
/* OUTPUTS */
/* */
/* None */
/* */
/* HISTORY */
/* */
/* NAME DATE REMARKS */
/* */
/* B. Haggerty 05-07-1998 Created version 1.0 */
/* */
/****************************************************************************/
STATUS PQUICC_BD_Init(INT Num_of_Buffers)
{
unsigned long *Buffer_Base_Addr;
int BD_RX_Counter,BD_TX_Counter;
unsigned long RX_BD_Size;
Buffer_Base_Addr = (unsigned long *) ((get_IMMR() & 0xffff0000) + 0x2000);
First_RX_BD = (struct _rx_bd *)Buffer_Base_Addr;
First_TX_BD = (struct _tx_bd *)Buffer_Base_Addr;
First_TX_BD = First_TX_BD + Num_of_Buffers;
pquicc->pram[0].enet_scc.rbase = (ushort)First_RX_BD;
pquicc->pram[0].enet_scc.tbase = (ushort)First_TX_BD;
rx_bd = First_RX_BD;
for ( BD_RX_Counter = 0;
BD_RX_Counter < Num_of_Buffers;
BD_RX_Counter++)
{
rx_bd->status = 0;
rx_bd->data_len = 0;
rx_bd->status |= RX_BD_Interrupt;
rx_bd->status |= RX_BD_Empty;
rx_bd->data_ptr = (ulong)RX_Buff_Mem[BD_RX_Counter];
rx_bd++;
}
rx_bd--;
rx_bd->status |= RX_BD_Interrupt | RX_BD_Wrap;
rx_bd->status |= RX_BD_Empty;
rx_bd = First_RX_BD;
tx_bd = (struct _tx_bd *)First_TX_BD;
for ( BD_TX_Counter = 0;
BD_TX_Counter < Num_of_Buffers;
BD_TX_Counter++)
{
tx_bd->status = 0;
tx_bd->data_len = 0;
tx_bd->data_ptr = (ulong)TX_Buff_Mem[BD_TX_Counter];
tx_bd++;
}
tx_bd--;
tx_bd->status = TX_BD_Wrap;
tx_bd = (struct _tx_bd *)First_TX_BD;
return NU_SUCCESS;
}
/****************************************************************************/
/* FUNCTION */
/* */
/* PQUICC_Open */
/* */
/* DESCRIPTION */
/* */
/* This function initializes the PQUICC SCC1 as an Ethernet controller. */
/* */
/* AUTHOR */
/* */
/* Bill Haggerty */
/* */
/* CALLED BY */
/* */
/* PQUICC_Init */
/* */
/* CALLS */
/* */
/* NU_Register_LISR */
/* NU_Allocate_Memory */
/* NU_Create_HISR */
/* get_IMMR */
/* PQUICC_BD_Init */
/* */
/* INPUTS */
/* */
/* uchar ether_addr pointer : MAC address of device */
/* device pointer : device to initialize */
/* */
/* OUTPUTS */
/* */
/* None */
/* */
/* HISTORY */
/* */
/* NAME DATE REMARKS */
/* */
/* B. Haggerty 05-07-1998 Created version 1.0 */
/* */
/****************************************************************************/
STATUS PQUICC_Open (uchar *ether_addr, DV_DEVICE_ENTRY *device)
{
STATUS status;
VOID *pointer;
struct scc_regs *regs;
int i,scc_num, shift=0;
unsigned short base;
VOID (*old_lisr) (INT);
unsigned long *bcsr1, *simask;
int delay;
/* make sure scc_num is zero */
scc_num = 0;
/* Register the ethernet LISR */
NU_Register_LISR(94, PQUICC_LISR, &old_lisr);
/* Set the Nucleus PLUS High Level Interrupt Service Routines. */
Hisr_Activated = 0;
/* create the HISR for handling the interrupt from the Ethernet card */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -