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

📄 peephole.c

📁 网络驱动开发
💻 C
📖 第 1 页 / 共 2 页
字号:
   USHORT  ConvertData;

   //
   //  Convert RD_INSTRUCTION_93C46 command into a bit string.
   //
   for (i = RD_INSTRUCTION_LEN_93C46, ConvertData = RD_INSTRUCTION_93C46;
        i > 0;
        i--, ConvertData >>= 1)
   {
       OpBitStr[i-1] = (UCHAR)(ConvertData & 1);
   }

   //
   //  The instruction followed is to set up clock pulse in advance for
   //  reading serial EEPROM for circuit repuirements before reading
   //  the chip.
   //
   OperateArray[0] = 0;
   OperateArray[1] = CHIP_SELECT;
   j = 2;
   for (i = 0; i < RD_INSTRUCTION_LEN_93C46; i++)
   {
       temp = (i * 2) + j;
       OperateArray[temp] = (OpBitStr[i] == 0)?
                               (USHORT)(CHIP_SELECT) :
                               (USHORT)(CHIP_SELECT | SERIAL_DATA_INPUT);

       OperateArray[temp+1] = OperateArray[temp] | SERIAL_DATA_CLOCK;
   }

   j += i*2;

   //
   //  Convert "address" into a bit string.
   //
   for (i = ADDRESS_LENGTH2_93C46, ConvertData = address;
        i > 0;
        i--, ConvertData >>= 1)
   {
       AddrBitStr[i-1] = (UCHAR)(ConvertData & 1);
   }

   //
   //  The instruction followed keeps on setting up clock pulse in advance
   //  for reading serial EEPROM for circuit repuirements before reading
   //  the chip.
   //
   for (i = 0; i < ADDRESS_LENGTH2_93C46; i++)
   {
       temp = (i * 2) + j;
       OperateArray[temp] = (AddrBitStr[i] == 0)?
                               (USHORT)(CHIP_SELECT) :
                               (USHORT)(CHIP_SELECT | SERIAL_DATA_INPUT);

       OperateArray[temp+1] = OperateArray[temp] | SERIAL_DATA_CLOCK;
   }

   *length = j + (i * 2);

}


NDIS_STATUS
ReadSerialEEPROM93C46Word(
   IN  PADAPTER_BLOCK  pAdapter,
   IN  USHORT          address,
   OUT PUSHORT         pData
)
/*++

Routine Description:

   This routine reads in 1-word of node address from serial EEPROM.   

Arguments:

   pAdapter    -   Pointer to the adapter to program.
   address     -   Offset of node address will be read.
   pData       -   Pointer to the read-in node address.

Return Value:

   NDIS_STATUS_FAILURE -   fail to read a word size of the node address
                           from EEPROM.
   NDIS_STATUS_SUCCESS -   otherwise.

--*/

{
   NDIS_STATUS     Status = NDIS_STATUS_SUCCESS;
   USHORT          OperateArray[ 2 + (2*RD_INSTRUCTION_93C46) + (2*ADDRESS_LENGTH2_93C46)];
   UCHAR           length, i;
	ULONG           data1;


   DBGPRINT(DBG_COMP_PEEPHOLE, DBG_LEVEL_INFO,
       ("==>ReadSerialEEPROM93C46Word\n"));


   SetRead93C46StructureWord(OperateArray, address, &length);
   
   do 
   {
       for ( i = 0; ( i < length ); i++ )
       {
           TBATM155_PH_WRITE_DEV(
               pAdapter,
               MAC_ADDR_ROM_OFFSET,
               OperateArray[i],
               &Status);

           if (NDIS_STATUS_SUCCESS != Status)
           {
               DBGPRINT(DBG_COMP_PEEPHOLE, DBG_LEVEL_ERR,
                   ("Failed to access mac address 1.\n"));

               break;
           }

	    }

       if (NDIS_STATUS_SUCCESS != Status)
           break;


       TBATM155_PH_WRITE_DEV(
           pAdapter,
           MAC_ADDR_ROM_OFFSET,
           CHIP_SELECT,
           &Status);

       if (NDIS_STATUS_SUCCESS != Status)
       {
           DBGPRINT(DBG_COMP_PEEPHOLE, DBG_LEVEL_ERR,
               ("Failed to access mac address 2.\n"));

           break;
       }

       //
       // read 1 word data from EEPROM now.
       //
       for ( i = 0, *pData = 0; (i < 16); i++ ) 
       {
           //
           // raise data clock to get ready of 
           // reading data from EEPROM 93C46.
           //
           TBATM155_PH_WRITE_DEV(
               pAdapter,
               MAC_ADDR_ROM_OFFSET,
               CHIP_SELECT | SERIAL_DATA_CLOCK,
               &Status);

           if (NDIS_STATUS_SUCCESS != Status)
           {
               DBGPRINT(DBG_COMP_PEEPHOLE, DBG_LEVEL_ERR,
                  ("Failed to access mac address 3.\n"));

               break;
           }

           //
           // read 1 bit in from serial EEPROM.
           //
           TBATM155_PH_READ_DEV(
               pAdapter,
               MAC_ADDR_ROM_OFFSET,
               &data1,
               &Status);

           if (NDIS_STATUS_SUCCESS != Status)
           {
               DBGPRINT(DBG_COMP_PEEPHOLE, DBG_LEVEL_ERR,
                  ("Failed to access mac address 4.\n"));

               break;
           }

           //
           // To merge the input 1-bit data into word data.
           //
           *pData <<= 1;
           *pData |= (data1 & 0x8)? 1 : 0;

           //
           // Drop the data clock of EEPROM.
           //
           TBATM155_PH_WRITE_DEV(
               pAdapter,
               MAC_ADDR_ROM_OFFSET,
               CHIP_SELECT,
               &Status);

           if (NDIS_STATUS_SUCCESS != Status)
           {
               DBGPRINT(DBG_COMP_PEEPHOLE, DBG_LEVEL_ERR,
                  ("Failed to access mac address 5.\n"));

               break;
           }
   	}

   } while (FALSE);

   DBGPRINT(DBG_COMP_PEEPHOLE, DBG_LEVEL_INFO,
       ("<==ReadSerialEEPROM93C46Word: odata=0x%x\n", *pData));

   return (Status);

}


NDIS_STATUS
tbAtm155Read_PermanentAddress(
   IN  PADAPTER_BLOCK  pAdapter,
   OUT PUCHAR          pNodeaddress
)
/*++

Routine Description:

   This routine reads node address from EEPROM 93C46.

Arguments:

   pPermanentAddress	-	Pointer to the node address.

Return Value:

   NDIS_STATUS_FAILURE -   if fail to read the node address from EEPROM.
   NDIS_STATUS_SUCCESS -   otherwise.

--*/

{
   NDIS_STATUS         Status = NDIS_STATUS_SUCCESS;
   USHORT              data;
   UCHAR               i;


   DBGPRINT(DBG_COMP_PEEPHOLE, DBG_LEVEL_INFO,
       ("==>tbAtm155Read_PermanentAddress\n"));


   for ( i = 0; i < ATM_MAC_ADDRESS_LENGTH; i += 2 )
   {
       Status = ReadSerialEEPROM93C46Word(pAdapter, (USHORT)(i >> 1), &data);

       if (NDIS_STATUS_SUCCESS != Status)
       {
           DBGPRINT(DBG_COMP_PEEPHOLE, DBG_LEVEL_ERR,
               ("tbAtm155Read_PermanentAddress error at offset (%d).\n", i));

           break;
       }
       
       pNodeaddress[i] = (UCHAR)( data >> 8 );
       pNodeaddress[i+1] = (UCHAR)( data & 0x00FF );
   }

   if (NDIS_STATUS_SUCCESS == Status)
   {
       // 
       //  check if node address is invalid. 
       //  (an invalid node address: ff-ff-ff-ff-ff-ff)
       // 
       for (Status = NDIS_STATUS_FAILURE, i = ATM_MAC_ADDRESS_LENGTH - 1;
            i >= 0;
            i--)
       {
           if (pNodeaddress[i] != 0x0FF)
           {
               Status = NDIS_STATUS_SUCCESS;
               break;
           }
   
       }
   }


   if (NDIS_STATUS_SUCCESS != Status)
   {
       DBGPRINT(DBG_COMP_PEEPHOLE, DBG_LEVEL_ERR,
           ("tbAtm155Read_PermanentAddress is bad.\n"));
   }
       
   DBGPRINT(DBG_COMP_PEEPHOLE, DBG_LEVEL_INFO,
       ("<==tbAtm155Read_PermanentAddress\n"));

	return(Status);

}



⌨️ 快捷键说明

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