lwip-users
[Top][All Lists]
Advanced

[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;               
}





reply via email to

[Prev in Thread] Current Thread [Next in Thread]