📄 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 + -