[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[lwip-users] help! Problems Of RTL8019AS.
From: |
xsy414 |
Subject: |
[lwip-users] help! Problems Of RTL8019AS. |
Date: |
Tue, 04 May 2004 14:40:13 +0800 |
hello all,
Now I am working with ARM7DMI + UCOSII + lwip, And the Ethernet
controller is RTL8019AS, compiler is SDT2.51. The problem is that the
value of Register CURR and BNRY are not correct. According to referrence
book, the CURR will be automatically operated by NIC, But in receive
function the value is some specific values, e.g. 0x01, 0x62.
**********************************************************
8019.h
**********************************************************
#define BaseAddr 0x6000000
#define RWPORT (BaseAddr+0x10) /* dma read write address, form
0x10 - 0x17 */
#define RstAddr (BaseAddr+0x18) /* reset register, 0x18, 0x1a, 0x1c,
0x1e even address is recommanded */
/* page 0 */
#define Pstart (BaseAddr+1) /* page start */
#define Pstop (BaseAddr+2) /* page stop */
#define BNRY (BaseAddr+3)
#define TPSR (BaseAddr+4) /* transmit page start */
#define TBCR0 (BaseAddr+5)
#define TBCR1 (BaseAddr+6)
#define ISR (BaseAddr+7) /* interrupt status
register */
#define RSAR0 (BaseAddr+8) /* dma read address */
#define RSAR1 (BaseAddr+9)
#define RBCR0 (BaseAddr+10) /* dma read byte count */
#define RBCR1 (BaseAddr+11)
#define RCR (BaseAddr+12) /* receive config */
#define TCR (BaseAddr+13) /* transmit config */
#define DCR (BaseAddr+14) /* data config */
#define IMR (BaseAddr+15) /* interrupt mask */
#define ID8019L (BaseAddr+10)
#define ID8019H (BaseAddr+11)
/* page 1 */
#define PAR0 (BaseAddr+1)
#define PAR1 (BaseAddr+2)
#define PAR2 (BaseAddr+3)
#define PAR3 (BaseAddr+4)
#define PAR4 (BaseAddr+5)
#define PAR6 (BaseAddr+6)
#define CURR (BaseAddr+7)
#define MAR0 (BaseAddr+8)
#define MAR1 (BaseAddr+9)
#define MAR2 (BaseAddr+10)
#define MAR3 (BaseAddr+11)
#define MAR4 (BaseAddr+12)
#define MAR5 (BaseAddr+13)
#define MAR6 (BaseAddr+14)
#define MAR7 (BaseAddr+15)
/* page 2 */
/* page 3 */
#define CR9346 (BaseAddr+1)
#define CONFIG0 (BaseAddr+3)
#define CONFIG1 (BaseAddr+4)
#define CONFIG2 (BaseAddr+5)
#define CONFIG3 (BaseAddr+6)
**********************************************************
mac.c
**********************************************************
#define RTL8019_OP_16
#define DEBUG_NET
#define RPSTART 0x4c
#define RPSTOP 0x60
#define SPSTART 0x40
static u8_t rBNRY;
static u8_t SrcMacID[ETH_ALEN] = {0x00,0x80,0x48,0x12,0x34,0x56};
static u8_t net_start;
void SetRegPage(u8_t PageIdx)
{
u8_t temp;
temp = inportb(BaseAddr);
temp = (temp&0x3b)|(PageIdx<<6);
outportb(BaseAddr, temp);
}
static void SetMacID()
{
int i;
for(i=0; i<6; i++)
outportb(PAR0+i, SrcMacID[i]);
}
static u8_t Rst8019()
{
int i;
outportb(RstAddr, 0x5a);
i = 20000;
while(i--);
SetRegPage(0);
return (inportb(ISR)&0x80);
}
static void InitRS8019()
{
net_start = 1;
outportb(BaseAddr, 0x21); /* set page 0 and stop */
outportb(RBCR0,0x00);
outportb(RBCR1,0x00); /*these two are added*/
outportb(Pstart, RPSTART); /* set Pstart 0x4c */
outportb(Pstop, RPSTOP); /* set Pstop 0x80 */
outportb(TPSR, SPSTART); /* transmit page start
register, 0x40 */
outportb(RCR, 0xcc); /* set RCR 0xcc */
outportb(TCR, 0xe0); /* set TCR 0xe0 */
#ifdef RTL8019_OP_16
outportb(DCR, 0xc9); /* set DCR 0xc9, 16bit DMA
*/
#else
outportb(DCR, 0xc8); /* 8bit DMA */
#endif
outportb(ISR, 0xff);
outportb(IMR, 0x00); /* set IMR 0x03 */
outportb(BNRY, RPSTART); /* BNRY-> the last page has been
read */
SetRegPage(1);
SetMacID();
outportb(MAR0, 0x00);
outportb(MAR1, 0x41);
outportb(MAR2, 0x00);
outportb(MAR3, 0x80);
outportb(MAR4, 0x00);
outportb(MAR5, 0x00);
outportb(MAR6, 0x00);
outportb(MAR7, 0x00);
outportb(CURR, RPSTART+1);
outportb(BaseAddr, 0x22); /* set page 0 and start */
outportb(IMR, 0xff);
net_start = 0;
rBNRY = RPSTART;
}
int s3c44b0_eth_init(void)
{
if(!Rst8019())
{
uHALr_printf("Rtl8019 Reset Failed!\n");
return -1;
}
uHALr_printf("Rtl8019 Reset Successfully\n");
InitRS8019();
return 0;
}
int s3c44b0_eth_send(unsigned char *data, unsigned short len)
{
static sFlag = 0;
int i;
u8_t send_page;
send_page = SPSTART;
send_page += (sFlag&1)?6:0;
sFlag++;
if(len<60)
for(; len<60; len++)
data[len] = 0x20; //just for pad,
any data
SetRegPage(0);
outportb(BaseAddr, 0x22);
outportb(RSAR0, 0);
outportb(RSAR1, send_page);
outportb(RBCR0, len&0xff);
outportb(RBCR1, len>>8);
outportb(BaseAddr, 0x12);
for(i=0; i<len; i++)
{
outportb(RWPORT, data[i]); // tarns to ram
}
while(inportb(BaseAddr)&4);
outportb(TPSR, send_page);
outportb(TBCR0, len&0xff);
outportb(TBCR1, len>>8);
outportb(BaseAddr, 0x1e); // begin to send
return 0;
}
int s3c44b0_eth_rcv(unsigned char *data, unsigned short *len)
{
u8_t RxPageBeg, RxPageEnd;
u8_t RxNextPage;
u8_t RxStatus;
int i, RxLength;
SetRegPage(0);
outportb(BNRY, rBNRY);
if(inportb(ISR)&1)
outportb(ISR, 0x1);
else
return -1;
SetRegPage(1);
RxPageEnd = inportb(CURR);
SetRegPage(0);
RxPageBeg = rBNRY+1;
if(RxPageBeg>=RPSTOP)
RxPageBeg = RPSTART;
outportb(BaseAddr, 0x22);
//outport(RSAR0, RxPageBeg<<8);
//outport(RBCR0, 256);
outportb(RSAR0, 0);
outportb(RSAR1, RxPageBeg);
outportb(RBCR0, 4);
outportb(RBCR1, 0);
outportb(BaseAddr, 0xa);
RxStatus = inportb(RWPORT);
RxNextPage = inportb(RWPORT);
RxLength = inportb(RWPORT);
RxLength |= inportb(RWPORT)<<8;
*len = RxLength;
uHALr_printf("\nRxBeg = %x, RxEnd = %x, staus = %x, nextpage = %
x, size = %x", RxPageBeg, RxPageEnd, RxStatus, RxNextPage, RxLength);
if(RxLength>ETH_FRAME_LEN)
{
if(RxPageEnd==RPSTART)
rBNRY = RPSTOP-1;
else
rBNRY = RxPageEnd-1;
outportb(BNRY, rBNRY);
return -1;
}
outportb(RSAR0, 4);
outportb(RSAR1, RxPageBeg);
outportb(RBCR0, RxLength);
outportb(RBCR1, RxLength>>8);
outportb(BaseAddr, 0xa);
i = 4;
data -= 4;
for(; RxLength--;)
{
if(!(i&0xff))
{
outportb(BNRY, RxPageBeg);
RxPageBeg++;
if(RxPageBeg>=RPSTOP)
RxPageBeg = RPSTART;
}
data[i++] = inportb(RWPORT);
}
outportb(BNRY, RxPageBeg);
rBNRY = RxPageBeg;
return 0;
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [lwip-users] help! Problems Of RTL8019AS.,
xsy414 <=