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

📄 hardware.c

📁 UCOS 在ARM9_S3c2410上的移植
💻 C
字号:
#define HARDWARE_GLOBALS
#include "config.h"
#include "../include/cfg_net.h"

#define   NET_RST   		0X40000000//0x20000000
#define   NET_BASE_ADDR   	0X83400000//0x20000000
//#include "rtl8019as.h"
EX_RAM uint16 iic=0;

union  REC_BUFF_UNION	REC_BUFF[MAX_REC_BUFF];
/*****************************************************************************
* 名称:WriteToNet()
* 功能:把数据写入RTL8019AS
* 入口参数:	ADDR	写入地址
				EDATA   写入数据
* 出口参数:无
*****************************************************************************/
void  WriteToNet(uint8 ADDR_16,uint16 WRITEDATA)
{
	(*((volatile unsigned short *) NET_BASE_ADDR+ADDR_16))=WRITEDATA;//0x83400000	 
}

/****************************************************************************
* 名称:ReadFromNet()
* 功能:从RTL8019AS把数据读出
* 入口参数:	ADDR		读出地址
* 出口参数:	READDATA   	读出数据
****************************************************************************/
uint16  ReadFromNet(uint8 ADDR_16)
{
	uint16 temp;
	temp=(*((volatile unsigned short *) NET_BASE_ADDR+ADDR_16));//0x83400000
	return (temp);
}

/****************************************************************************
**函数原型:    page()
**入口参数:		pagenumber要切换的页
**出口参数:		无
**返 回 值:	无      
**说    明:	选择页,可选择0,1,2三页,第四页ne000兼容芯片保留 
*****************************************************************************/
void page(uint8 pagenumber)  
{
	uint8 temp;
	temp=ReadFromNet(0);//命令寄存器
	temp=temp&0x3B ;//注意txp位不能要
	pagenumber=pagenumber <<6;
	temp=temp | pagenumber;
	WriteToNet(0,temp);
}

/****************************************************************************
**函数原型:    SetMacID()
**入口参数:		*mac_ptr
**出口参数:		无
**返 回 值:	无            
**说    明:	设置芯片物理地址,物理地址已经存储在程序空间内 
*****************************************************************************/
void SetMacID(uint8 * mac_ptr)   
{
	//把MAC地址写入MY——MAC——ID中
	page(1);
	WriteToNet(1 , *mac_ptr);
	mac_ptr++;
	WriteToNet(2 , *mac_ptr);
	mac_ptr++;
	WriteToNet(3 , *mac_ptr);
	mac_ptr++;
	WriteToNet(4 , *mac_ptr);
	mac_ptr++;
	WriteToNet(5 , *mac_ptr);
	mac_ptr++;
	WriteToNet(6 , *mac_ptr);
	page(0);
}
/****************************************************************************
**函数原型:    Send_Packet(struct _pkst *TxdData)
**入口参数:		struct _pkst *TxdData	:指向要发送数据的结构指针
**出口参数:		无
**返 回 值:	无              
**说    明:	发送数据包,以太网底层驱动程序,所有的数据发送都要通过该程序
*****************************************************************************/
void Send_Packet(struct _pkst *TxdData)  
{
	static uint8 Tx_Buff_Sel=0;
	struct _pkst *ExPtr;//
	//uint16 i;
	uint8 *TEPTR;
	union send_temp{
		uint16 words;
		uint8	bytes[2];
				}send_buff;
	uint16 ii,length=0;
	
	//i=0;//记录发送是否小于60个字节
	page(0);//切换至第0页
	length=length+TxdData->length;
	ExPtr=TxdData->STPTR;
	while(ExPtr!=NULL)//计算出要发送的数据的总长度
	{	
		length=length+ExPtr->length;
		ExPtr=ExPtr->STPTR;
	}
	ii=length;
	Tx_Buff_Sel=Tx_Buff_Sel^1;//发送缓冲区的切换
	if(Tx_Buff_Sel)
	{
		WriteToNet(0x09,0x40);			//设置发送页地址
	}			
	else
	{
		WriteToNet(0x09,0x46);			//设置发送页地址
    	}
	
	WriteToNet(0x08,0x00); 			//写入RSAR0 DMA起始地址低位read page address low
	WriteToNet(0x0b,ii>>8);			//写入RSCR1 DMA 计数器高位read count high
	WriteToNet(0x0a,ii&0x00ff);		//写入RSCR0 DMA 计数器低位read count low;
	WriteToNet(0,0x12);				//启动DMA写write dma, page0
	TEPTR=TxdData->DAPTR;
	for(ii=0;ii<(((TxdData->length)+1)/2);ii++)
	{
		send_buff.bytes[0]=*TEPTR;
		TEPTR++;
		send_buff.bytes[1]=*TEPTR;
		TEPTR++;
		WriteToNet(0x10,send_buff.words);
	}
	ExPtr=TxdData->STPTR;
	while(ExPtr!=NULL)
	{
		TEPTR=ExPtr->DAPTR;
		for(ii=0;ii<((ExPtr->length+1)/2);ii++)
		{
			send_buff.bytes[0]=*TEPTR;
			TEPTR++;
			send_buff.bytes[1]=*TEPTR;
			TEPTR++;
			WriteToNet(0x10,send_buff.words);	
		}
		ExPtr=ExPtr->STPTR;
	}
	//如果少于60
	
	/***************************************/
	//以下为终止DMA操作
	WriteToNet(0x0b,0x00); 
	WriteToNet(0x0a,0x00);
	WriteToNet(0x00,0x22);			//结束或放弃DMA操作
	
	WriteToNet(0x07,0xff);
	if(Tx_Buff_Sel)
	{
		WriteToNet(0x04,0x40);   //txd packet start;
	}
	else
	{
		WriteToNet(0x04,0x46);  //txd packet start;
    	}
	ii=length;
	if(length<60)
	{
		//如果数据长度<60字节,设置长度为60字节
		ii=60;
	}
	
	WriteToNet(0x06,ii>>8);	//high byte counter
	WriteToNet(0x05,ii&0x00ff);//low byte counter
	WriteToNet(0x07,0xff);
	WriteToNet(0x00,0x3e);       //to sendpacket;
	/***************************************/
	//重发数据的处理
	
	for(length=0;length<6;length++)	//最多重发6次
	{
		for(ii=0;ii<1000;ii++)
		{//检查CR寄存器的txp位是否为低,为1说明正在发送,为0说明发完或出错放弃
			if((ReadFromNet(0X00)&0x04)==0)  
			{ break; }
        	}
		if((ReadFromNet(0X04)&0x01)!=0)//表示发送成功,判断发送状态寄存器TSR,决定是否出错
		{break;};
		WriteToNet(0x00,0x3e);       //to sendpacket;
	}
	
	/**************************************/
	//OS_EXIT_CRITICAL();
}

/**********************************************************************
**函数原型:    unsigned char * Rec_Packet()
**入口参数:

⌨️ 快捷键说明

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