?? hardware.c
字號:
#define HARDWARE_GLOBALS
#include "config.h"
#include "../include/cfg_net.h"
#include "dm9000_driver.h"
EX_RAM uint16 iic=0;
union REC_BUFF_UNION REC_BUFF[MAX_REC_BUFF];
board_info_t NetDriverInfo[MAX_NET_PORT]; /* driver status */
static uint8 nfloor = 0;
void outb(uint8 reg, uint32 IOaddr);
uint8 inb(uint32 IOaddr);
void outw(uint16 reg, uint32 IOaddr);
uint16 inw(uint32 IOaddr);
void outl(uint32 reg, uint32 IOaddr);
uint32 inl(uint32 IOaddr);
static uint8 ior(board_info_t *db, uint8 reg);
//static uint16 iors(board_info_t *db, uint16 reg);
static void iow(board_info_t *db, uint8 reg, uint8 value);
static uint16 phy_read(board_info_t *db, uint8 reg);
static void phy_write(board_info_t *db, uint8 reg, uint16 value);
static void set_PHY_mode(board_info_t *db);
static void program_dm9801(board_info_t *db, uint16 HPNA_rev);
static void program_dm9802(board_info_t *db);
static void identify_nic(board_info_t *db);
void udelay(uint16 DelayTime);
void init_dm9000(unsigned char num);
/**********************************************************************
**函數原型: void Send_Packet(struct _pkst *TxdData)
**入口參數: struct _pkst *TxdData :指向要發送數據的結構指針
**
**出口參數: 無
**返 回 值: 無
**說 明: 發送數據包,以太網底層驅動程序,所有的數據發送都要通過該程序
************************************************************************/
void Send_Packet(struct _pkst *TxdData)//
{
board_info_t *db = &NetDriverInfo[0];
char * data_ptr;
int i, tmplen;
uint8 int_status;
struct _pkst *ExPtr;//
uint16 ii,length=0,temp16;
/* Disable all interrupt */
iow(db, 0xff, 0x80);
length=length+TxdData->length;
ExPtr=TxdData->STPTR;
while(ExPtr!=NULL)//計算出要發送的數據的總長度
{
length=length+ExPtr->length;
ExPtr=ExPtr->STPTR;
}
ii=length;
/* Move data to DM9000 TX RAM */
outb(0xf8, db->ioaddr);
data_ptr = (char *)TxdData->DAPTR;
if (db->io_mode == DM9000_BYTE_MODE) {
/* Byte mode */
for (i = 0; i < (TxdData->length); i++)
outb((data_ptr[i] & 0xff), db->io_data);
} else if (db->io_mode == DM9000_WORD_MODE) {
/* Word mode */
tmplen = ((TxdData->length) + 1) / 2;
if((uint32)data_ptr&0x00000001)
{
for (i = 0; i < tmplen; i++)
{
temp16=data_ptr[i*2]+data_ptr[i*2+1]*256;
outw(temp16, db->io_data);
}
}
else
for (i = 0; i< tmplen; i++)
outw(((uint16 *)data_ptr)[i], db->io_data);
} else {
/* DWord mode */
tmplen = ((TxdData->length) + 3) / 4;
for (i = 0; i< tmplen; i++)
outl(((uint32 *)data_ptr)[i], db->io_data);
}
ExPtr=TxdData->STPTR;
while(ExPtr!=NULL)
{
data_ptr = (char *)ExPtr->DAPTR;
if (db->io_mode == DM9000_BYTE_MODE) {
/* Byte mode */
for (i = 0; i < ExPtr->length; i++)
outb((data_ptr[i] & 0xff), db->io_data);
} else if (db->io_mode == DM9000_WORD_MODE) {
/* Word mode */
tmplen = (ExPtr->length + 1) / 2;
if((uint32)data_ptr&0X00000001)
{
for (i = 0; i < tmplen; i++)
{
temp16=data_ptr[i*2]+data_ptr[i*2+1]*256;
outw(temp16, db->io_data);
}
}
else
for (i = 0; i< tmplen; i++)
outw(((uint16 *)data_ptr)[i], db->io_data);
} else {
/* DWord mode */
tmplen = (ExPtr->length + 3) / 4;
for (i = 0; i< tmplen; i++)
outl(((uint32 *)data_ptr)[i], db->io_data);
}
ExPtr=ExPtr->STPTR;
}
/* Set TX length to DM9000 */
iow(db, 0xfc, ii & 0xff);
iow(db, 0xfd, (ii >> 8) & 0xff);
/* Issue TX polling command */
iow(db, 0x2, 0x1); /* Cleared after TX complete */
/* Re-enable interrupt*/
iow(db,0xff,0x83);
for(length=0;length<6;length++)
{
for(ii=0;ii<1000;ii++)
{//檢查CR寄存器的txp位是否為低,為1說明正在發送,為0說明發完或出錯放棄
int_status = ior(db, 0xfe); /* Got ISR */
if (int_status & DM9000_TX_INTR)
{ break; }
}
if(int_status & DM9000_TX_INTR)//表示發送成功,判斷發送狀態寄存器TSR,決定是否出錯
{
iow(db, 0xfe, int_status); /* Clear ISR status */
break;
}
}
}
/**********************************************************************
**函數原型: unsigned char * Rec_Packet()
**入口參數:
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -