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

📄 mac_au1000.c

📁 MIPS下的boottloader yamon 的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
					pdevice->status.tx_ed_errors++;

				if (status & MAC_TRANSMIT_LC_MASK)
					pdevice->status.tx_lc_errors++;

				if (status & MAC_TRANSMIT_EC_MASK)
					pdevice->status.tx_lc_errors++;
				else /* Collision Count is only valid if EC is not set */
					pdevice->status.collisions += 
					((status & MAC_TRANSMIT_CC_MASK) >> MAC_TRANSMIT_CC) ;

				if (status & MAC_TRANSMIT_UR_MASK)
					pdevice->status.tx_ur_errors++;
				
			}

			  break ;
		  }

		  /* wait 1 ms */

		  // MAC_AU1000_wait( 1 ) ;

		  /* wait at most 1 second */

		  i++ ;
	
		  /* This corresponds to 1 second at 384MHz */

		  if ( i > 0x16e36000)
		  {
			  pdevice->status.tx_errors++;
			  pdevice->status.tx_timeout_errors++;

			  /* re-init driver and controller */
			  MAC_AU1000_init( 0, 0, NULL ) ;

			  return( ERROR_LAN_TXM_ERROR ) ;
		  }
	}

	return( OK ) ;
}

/************************************************************************
 *
 *                          MAC_AU1000_ctrl
 *  Description :
 *  -------------
 *  This service requests special service via 'ctrl'
 *  
 *
 *  Parameters :
 *  ------------
 *
 *  'major',     IN,    major device number
 *  'minor',     IN,    minor device number for multi device drivers
 *  'p_param',   INOUT, LAN variable of type, t_LAN_IO_desc.
 *
 *
 *  Return values :
 *  ---------------
 *
 *  'OK'(=0)
 *
 *
 ************************************************************************/
static
INT32 MAC_AU1000_ctrl(
		  UINT32 major, 		 /* IN: major device number 			*/
		  UINT32 minor, 		 /* IN: minor device number 			*/
		  t_LAN_CTRL_desc *p_param )   /* IN-OUT:						*/
{
	t_MAC_AU1000_device 		 *pdevice ;

	/* get device context for this minor device */
	pdevice = &minor_device[minor] ;

	switch( p_param->command )
	{
	  case LAN_CTRL_DISPLAY_STATISTICS:
#ifdef ETH_DEBUG
		  MAC_AU1000_dump_regs( pdevice ) ;

		  /* The below was removed.  May want to add a dump of current DMA pointers */
		 /* MAC_AU1000_dump_packetstatus( pdevice ) ; */
#endif
		  MAC_AU1000_MII_status( pdevice ) ;
		  MAC_AU1000_dump_status( pdevice ) ;
	  break ;

	  case LAN_CTRL_STOP_CONTROLLER:
		  MAC_AU1000_stop( pdevice ) ;
	  break ;

	  case LAN_CTRL_START_CONTROLLER:
		  /* re-init driver and controller */
		  MAC_AU1000_init( 0, 0, NULL ) ;
	  break ;

	  default:
	  break ;
	}
	return( OK ) ;
}


/************************************************************************
 *
 *                          MAC_AU1000_dump_regs
 *  Description :
 *  -------------
 *    Dump all AU1000 LAN controller registers
 * 
 *
 *  Parameters :
 *  ------------
 *
 *  'pdevice',     IN,    reference for this device  context
 *
 *
 *  Return values :
 *  ---------------
 *
 *  'OK'(=0)
 *
 *
 *
 ************************************************************************/
static
INT32 MAC_AU1000_dump_regs( t_MAC_AU1000_device *pdevice )
{
	volatile void *pmac ;

	pmac = pdevice->pAU1000CtrlRegs ;

	sprintf( msg, "\n\r MAC_AU1000_dump_regs:\n\r") ;
	PUTS( DEFAULT_PORT, msg ) ;

	sprintf( msg, "\n\r Control Base = %08x\n\r", (UINT32) pdevice->pAU1000CtrlRegs) ;
	PUTS( DEFAULT_PORT, msg ) ;

	sprintf( msg, "     MAC_CONTROL:   0x%08X\n\r", MACREG(pmac, MAC_CONTROL) ) ;
	PUTS( DEFAULT_PORT, msg ) ;
	sprintf( msg, "     MAC_ADDRHI:   0x%08X\n\r", MACREG(pmac, MAC_ADDRHI) ) ;
	PUTS( DEFAULT_PORT, msg ) ;
	sprintf( msg, "     MAC_ADDRLO:   0x%08X\n\r", MACREG(pmac, MAC_ADDRLO) ) ;
	PUTS( DEFAULT_PORT, msg ) ;
	sprintf( msg, "     MAC_MCHASHH:   0x%08X\n\r", MACREG(pmac, MAC_MCHASHH) ) ;
	PUTS( DEFAULT_PORT, msg ) ;
	sprintf( msg, "     MAC_MCHASHL:   0x%08X\n\r", MACREG(pmac, MAC_MCHASHL) ) ;
	PUTS( DEFAULT_PORT, msg ) ;
	sprintf( msg, "     MAC_MIICTRL:   0x%08X\n\r", MACREG(pmac, MAC_MIICTRL) ) ;
	PUTS( DEFAULT_PORT, msg ) ;
	sprintf( msg, "     MAC_MIIDATA:   0x%08X\n\r", MACREG(pmac, MAC_MIIDATA) ) ;
	PUTS( DEFAULT_PORT, msg ) ;
	sprintf( msg, "     MAC_FLOWCTL:   0x%08X\n\r", MACREG(pmac, MAC_FLOWCTL) ) ;
	PUTS( DEFAULT_PORT, msg ) ;
	sprintf( msg, "     MAC_VLAN1TG:   0x%08X\n\r", MACREG(pmac, MAC_VLAN1TG) ) ;
	PUTS( DEFAULT_PORT, msg ) ;
	sprintf( msg, "     MAC_VLAN2TG:   0x%08X\n\r", MACREG(pmac, MAC_VLAN2TG) ) ;
	PUTS( DEFAULT_PORT, msg ) ;

	/* Revise:	Need to add DMA registers here */

	return( OK ) ;
}

/************************************************************************
 *
 *                          MAC_AU1000_dump_status
 *  Description :
 *  -------------
 *    Dump all AU1000 LAN controller statistics
 * 
 *
 *  Parameters :
 *  ------------
 *
 *  'pdevice',     IN,    reference for this device  context
 *
 *
 *  Return values :
 *  ---------------
 *
 *  'OK'(=0)
 *
 *
 *
 ************************************************************************/
static
INT32 MAC_AU1000_dump_status( t_MAC_AU1000_device *pdevice )
{
	sprintf( msg, " Packets received:               %ld\n\r", pdevice->status.rx_packets ) ;
	PUTS( DEFAULT_PORT, msg ) ;
	sprintf( msg, " Packets transmitted:            %ld\n\r", pdevice->status.tx_packets ) ;
	PUTS( DEFAULT_PORT, msg ) ;
	sprintf( msg, " Bytes received:                 %ld\n\r", pdevice->status.rx_bytes ) ;
	PUTS( DEFAULT_PORT, msg ) ;
	sprintf( msg, " Bytes transmitted:              %ld\n\r", pdevice->status.tx_bytes ) ;
	PUTS( DEFAULT_PORT, msg ) ;
	sprintf( msg, " Receive errors:                 %ld\n\r", pdevice->status.rx_errors ) ;
	PUTS( DEFAULT_PORT, msg ) ;
	sprintf( msg, " Transmit errors:                %ld\n\r", pdevice->status.tx_errors ) ;
	PUTS( DEFAULT_PORT, msg ) ;
	sprintf( msg, " Multicasts received:            %ld\n\r", pdevice->status.multicast ) ;
	PUTS( DEFAULT_PORT, msg ) ;
	sprintf( msg, " Collisions:                     %ld\n\r", pdevice->status.collisions) ;
	PUTS( DEFAULT_PORT, msg ) ;
#ifdef ETH_DEBUG
	sprintf( msg, "     rx_zero_length_errors:      %ld\n\r", pdevice->status.rx_zero_length_errors ) ;
	PUTS( DEFAULT_PORT, msg ) ;
	sprintf( msg, "     rx_buffer_length_errors:    %ld\n\r", pdevice->status.rx_buffer_length_errors) ;
	PUTS( DEFAULT_PORT, msg ) ;
#endif
	sprintf( msg, " Receive length errors:          %ld\n\r", pdevice->status.rx_length_errors ) ;
	PUTS( DEFAULT_PORT, msg ) ;
	sprintf( msg, " Receive CRC errors:             %ld\n\r", pdevice->status.rx_cr_errors ) ;
	PUTS( DEFAULT_PORT, msg ) ;
	sprintf( msg, " Receive Dribble errors:         %ld\n\r", pdevice->status.rx_db_errors ) ;
	PUTS( DEFAULT_PORT, msg ) ;
	sprintf( msg, " Receive frame length:		    %ld\n\r", pdevice->status.rx_fl_errors ) ;
	PUTS( DEFAULT_PORT, msg ) ;
	sprintf( msg, " Transmit aborted errors:        %ld\n\r", pdevice->status.tx_fa_errors) ;
	PUTS( DEFAULT_PORT, msg ) ;
	sprintf( msg, " Transmit lost carrier errors:   %ld\n\r", pdevice->status.tx_ls_errors) ;
	PUTS( DEFAULT_PORT, msg ) ;
	sprintf( msg, " Transmit FIFO underrun errors:  %ld\n\r", pdevice->status.tx_ur_errors) ;
	PUTS( DEFAULT_PORT, msg ) ;
   sprintf( msg, " Transmit late collision errors: %ld\n\r", pdevice->status.tx_lc_errors) ;
	PUTS( DEFAULT_PORT, msg ) ;
	sprintf( msg, " Transmit timeout errors:        %ld\n\r", pdevice->status.tx_ed_errors) ;
	PUTS( DEFAULT_PORT, msg ) ;
} ;


/************************************************************************
 *
 *                          MAC_AU1000_MII_status
 *  Description :
 *  -------------
 *    Display MII status 
 *  
 *
 *  Parameters :
 *  ------------
 *
 *  'pdevice',     IN,    reference for this device  context
 *
 *
 *  Return values :
 *  ---------------
 *
 *  'OK'(=0)
 *
 *
 *
 ************************************************************************/
static
INT32 MAC_AU1000_MII_status( t_MAC_AU1000_device *pdevice )
{
	UINT32 opmode ;

   /* check link status, spin here till done */
	while ( MACREG( pdevice->pAU1000CtrlRegs, MAC_MIICTRL) & MAC_MIICTRL_MBUSY_MASK) ;

	/* set PHY address and read PHY Control register (This address is 0x00 so will
	be read automatically */
	MACREG( pdevice->pAU1000CtrlRegs, MAC_MIICTRL) = PHY_ADDRESS << MAC_MIICTRL_PHYA;

	/* check link status, spin here till done */
	while ( MACREG( pdevice->pAU1000CtrlRegs, MAC_MIICTRL) & MAC_MIICTRL_MBUSY_MASK);

	/* check read register value */
	if ( MACREG( pdevice->pAU1000CtrlRegs, MAC_MIIDATA) == PHY_CONTROL_DEFAULT)
	{
		sprintf( msg, " MII status: Link is up") ;
		PUTS( DEFAULT_PORT, msg ) ;
	}
	else
	{
		/* link is down */
		sprintf( msg, " MII status: Link is down!" ) ;
		PUTS( DEFAULT_PORT, msg ) ;
	}
	return(OK) ;
}

/************************************************************************
 *
 *	Bosporus specific functions for SPI configuration of switch
 *
 ************************************************************************/

#ifdef BOSPORUS_CONFIG

#define sys_pinfunc		(*(long *)0xb190002c)
#define sys_trioutclr	(*(long *)0xb1900100)
#define sys_outputset	(*(long *)0xb1900108)
#define sys_outputrd	(*(long *)0xb1900108)
#define sys_outputclr	(*(long *)0xb190010c)
#define sys_pinstate	(*(long *)0xb1900110)
#define gpio2_mode		(*(long *)0xb1700014)
#define gpio2_data		(*(long *)0xb1700008)

#define SPIQ			0x1000
#define SCL				0x2000
#define SDA				0x4000
#define SPISEL			0x8000

#define SPI_RDBIT		((sys_pinstate & SPIQ) != 0)

int	spi_shift(int val, int n)
/*
 *	shift n bits out from val, return bits shifted in
 */
{
    int		rv, databit;

    rv = 0;
    while( n-- > 0 )
    {
        databit = (val >> n ) & 1;
        if( databit )				// falling clock edge, output data
        {
            sys_outputclr = SCL;
            sys_outputset = SDA;
        }
        else
            sys_outputclr = SCL | SDA;
        delay3(2);					// about 1us
        sys_outputset = SCL;		// rising clock edge, input data
        rv = (rv << 1) | SPI_RDBIT;
        delay3(2);					// about 1us
    }
    return rv;
}

int	spi_readreg(int addr)
{
    int		v;

    spi_shift(0,2);					// two clocks before select
    sys_outputclr |= SPISEL;		// drop select
    spi_shift(3,8);					// read command
    spi_shift(addr,8);				// register address
    v = spi_shift(0,8);				// read data
    sys_outputset |= SPISEL;		// de-select
    spi_shift(0,2);					// two more clocks unselected
    return v;
}

void	spi_writereg(int addr, int val)
{
    spi_shift(0,2);					// two clocks before select
    sys_outputclr |= SPISEL;		// drop select
    spi_shift(2,8);					// write command
    spi_shift(addr,8);				// register address
    spi_shift(val,8);				// write data
    sys_outputset |= SPISEL;		// de-select
    spi_shift(0,2);					// two more clocks unselected
}

void	spi_dumpregs()
{
    int		i;

    for( i = 0; i < 128; ++i )
    {
        if( (i % 16) == 0 )
            printf("%02X: ",i);
        printf("%02x ",spi_readreg(i));
        if( (i % 16) == 15 )
            printf("\n");
    }
}

void	bosporus_init_switch()
{

    spi_writereg(1,1);		// write the "start switch" bit
	delay3(2);
    spi_writereg(1,1);		// write the "start switch" bit
	delay3(2);
}

#endif


⌨️ 快捷键说明

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