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

📄 pc1394regaccesstest1.c

📁 vxWorks下pc1394的驱动程序
💻 C
📖 第 1 页 / 共 5 页
字号:
   /* CFG_ROM_MAP */
   ulTempData = pciReadLong((int)(pPc1394Dev.pciControllerSpace0 + CFG_ROM_MAP_ADR));

   pCfgRomAdrs = (unsigned long*)ulTempData;
   printf("pc1394DevCfgROMAccessTest: configROM addr = 0x%.8x\n\n", ulTempData);

   for(i = 0; i < 16; i++)
      {
      pCfgRomData[i] = pciReadLong((int)(ulTempData + i * 4));
      }

   for(i = 0; i < 16; i++)
      {
      printf("0x%.8x :     0x%.8x\n\n", ulTempData + i * 4, pCfgRomData[i]);
      }

   return(OK);
}

/******************************************************************************
TITLE:  	pc1394DevGetCfgROMHeader
DESC:   	routine to get config ROM header register of PC 1394 card   
PARAM:  	none
RETURN: 	ulTempData   - value return from Link 
******************************************************************************/
unsigned long pc1394DevGetCfgROMHeader(void)
{
   unsigned long ulTempData;

   ulTempData = pciReadLong((int)(pPc1394Dev.pciControllerSpace0 + CFG_ROM_HEADER_ADR));

   return(ulTempData);
}

/******************************************************************************
TITLE:  	pc1394DevGetBusIdentification
DESC:   	routine to get Bus Identification register of PC 1394 card   
PARAM:  	none
RETURN: 	ulTempData   - value return from Link 
******************************************************************************/
unsigned long pc1394DevGetBusIdentification(void)
{
   unsigned long ulTempData;

   ulTempData = pciReadLong((int)(pPc1394Dev.pciControllerSpace0 + BUS_ID_ADR));

   return(ulTempData);
}

/******************************************************************************
TITLE:  	pc1394DevGetBusOptions
DESC:   	routine to get Bus Options register of PC 1394 card   
PARAM:  	none
RETURN: 	ulTempData   - value return from Link 
******************************************************************************/
unsigned long pc1394DevGetBusOptions(void)
{
   unsigned long ulTempData;

   ulTempData = pciReadLong((int)(pPc1394Dev.pciControllerSpace0 + BUS_OPTION_ADR));

   return(ulTempData);
}

/******************************************************************************
TITLE:  	pc1394DevSetBusOptions
DESC:   	routine to get Bus Options register of PC 1394 card   
PARAM:  	ulRegData      - data to write to register
RETURN: 	OK          - operation runs successfully
         ERROR       - operation runs failed 
******************************************************************************/
unsigned long pc1394DevSetBusOptions(unsigned long ulRegData)
{
   pciWriteLong((int)(pPc1394Dev.pciControllerSpace0 + BUS_OPTION_ADR), ulRegData);

   return(ERROR);
}

/******************************************************************************
TITLE:  	pc1394DevGetBusMaxRec
DESC:   	routine to get BusOptions.max_rec of PC 1394 card   
PARAM:  	none
RETURN: 	ulTempData   - value return from Link 
******************************************************************************/
unsigned long pc1394DevGetBusMaxRec(void)
{
   unsigned long ulTempData;

   ulTempData = pc1394DevGetBusOptions();

   ulTempData = (ulTempData & 0x0000f000) >> 12;

   return(ulTempData);
}

/******************************************************************************
TITLE:  	pc1394DevSetBusMaxRec
DESC:   	routine to set BusOptions.max_rec of PC 1394 card   
PARAM:  	ulMaxRec     - data to write to the specific field of BusOptions register
RETURN: 	OK          - operation runs successfully
         ERROR       - operation runs failed

NOTE:    ulMaxRec should be 2^X format.         
******************************************************************************/
STATUS pc1394DevSetBusMaxRec(unsigned long ulMaxRec)
{
   unsigned long ulTempData;
   unsigned long ulTempMaxRec;

   if ((ulMaxRec > 65536) | (ulMaxRec < 4))
      {
      printf("pc1394DevSetBusMaxRec: parameter ulMaxRec should be in [4..65536].\n");
      return(ERROR);
      }
   switch (ulMaxRec)
      {
      case 4:
         ulTempMaxRec = 0x1;
         break;
      case 8:
         ulTempMaxRec = 0x2;
         break;
      case 16:
         ulTempMaxRec = 0x3;
         break;
      case 32:
         ulTempMaxRec = 0x4;
         break;
      case 64:
         ulTempMaxRec = 0x5;
         break;
      case 128:
         ulTempMaxRec = 0x6;
         break;
      case 256:
         ulTempMaxRec = 0x7;
         break;
      case 512:
         ulTempMaxRec = 0x8;
         break;
      case 1024:
         ulTempMaxRec = 0x9;
         break;
      case 2048:
         ulTempMaxRec = 0xa;
         break;
      case 4096:
         ulTempMaxRec = 0xb;
         break;
      case 8192:
         ulTempMaxRec = 0xc;
         break;
      case 16384:
         ulTempMaxRec = 0xd;
         break;
      case 32768:
         ulTempMaxRec = 0xe;
         break;
      default:
         printf("pc1394DevSetBusMaxRec: parameter ulMaxRec should be in 2^X format.\n");
         return(ERROR);         
      }

/*   
   printf("pc1394DevSetBusMaxRec: ulTempMaxRec = 0x%.4x\n", ulTempMaxRec);
*/     /* comment by chenxuhao at 2004-11-16 */

   ulTempData = pc1394DevGetBusOptions();

   ulTempData = (ulTempData & 0x00000007) | (ulTempMaxRec << 12);

/*   
   printf("pc1394DevSetBusMaxRec: ulTempData = 0x%.8x\n", ulTempData);
*/     /* comment by chenxuhao at 2004-11-16 */

   pc1394DevSetBusOptions(ulTempData);

   return(OK);
}

/******************************************************************************
TITLE:  	pc1394DevGetBusLinkSpeed
DESC:   	routine to get BusOptions.link_spd of PC 1394 card   
PARAM:  	none
RETURN: 	ulTempData   - value return from Link 
******************************************************************************/
unsigned long pc1394DevGetBusLinkSpeed(void)
{
   unsigned long ulTempData;

   ulTempData = pc1394DevGetBusOptions();

   ulTempData = ulTempData & 0x00000007;

   return(ulTempData);
}

/******************************************************************************
TITLE:  	pc1394DevSetBusLinkSpeed
DESC:   	routine to set BusOptions.LinkSpeed of PC 1394 card   
PARAM:  	ulLinkSpeed - data to write to the specific field of BusOptions register
RETURN: 	OK          - operation runs successfully
         ERROR       - operation runs failed 
******************************************************************************/
STATUS pc1394DevSetBusLinkSpeed(unsigned long ulLinkSpeed)
{
   unsigned long ulTempData;

   if (ulLinkSpeed > 2)
      {
      printf("pc1394DevSetBusMaxRec: parameter ulLinkSpeed should be less than 3.\n");
      return(ERROR);
      }

   ulTempData = pc1394DevGetBusOptions();

   ulTempData = (ulTempData & 0x0000f000) | ulLinkSpeed;

   pc1394DevSetBusOptions(ulTempData);

   return(OK);
}

/******************************************************************************
TITLE:  	pc1394DevGetPhyReg
DESC:   	routine to get specified PHY register
PARAM:  	ulRegAdrs   - which PHY reg to read
RETURN: 	ulPhyRdData - value return from PHY 
         ERROR       - operation runs failed
******************************************************************************/
int pc1394DevGetPhyReg(unsigned long ulRegAdrs)
{
   int iReadCount;
   unsigned long ulTempData;
   unsigned long ulPhyRegAdrs;
   unsigned long ulPhyRdAdrs;
   unsigned long ulPhyRdData;
   unsigned long *pCfgRomAdrs;

   ulPhyRegAdrs = ulRegAdrs;
/*
   printf("pc1394DevGetPhyReg: ulPhyRegAdrs = 0x%.8x\n", ulPhyRegAdrs);
*/
   ulTempData = (ulPhyRegAdrs << 8) | DATA_BIT15;
/*
printf("pc1394DevGetPhyReg: ulTempData = 0x%.8x\n", ulTempData);
*/
   pciWriteLong((int)(pPc1394Dev.pciControllerSpace0 + PHY_CTR_REG_ADR), ulTempData);

   iReadCount = 0;
   ulTempData = 0;
   while ((!(ulTempData & DATA_BIT31)) && (iReadCount < 30))
      {
      taskDelay(1);
      ulTempData = pciReadLong((int)(pPc1394Dev.pciControllerSpace0 + PHY_CTR_REG_ADR));
      iReadCount++;
      }
   
   if ((!(ulTempData & DATA_BIT31)) && (iReadCount == 30))
      {
      printf("pc1394DevGetPhyReg: read count error.\n");
      return(ERROR);
      }      

/*
printf("pc1394DevGetPhyReg: ulTempData = 0x%.8x\n", ulTempData);
*/
   ulPhyRdAdrs = (ulTempData & 0x0f000000) >> 24;
   if (ulPhyRegAdrs != ulPhyRdAdrs)
      {
      printf("pc1394DevGetPhyReg: read address error.\n");
      return(ERROR);
      }

   ulPhyRdData = (ulTempData & 0x00ff0000) >> 16;

   return(ulPhyRdData);
}

/******************************************************************************
TITLE:  	pc1394DevSetPhyReg
DESC:   	routine to set specified PHY register
PARAM:  	ulRegAdrs   - which PHY reg to write
         ulRegData   - data to write to the specific PHY reg
RETURN: 	OK          - operation runs successfully 
         ERROR       - operation runs failed
******************************************************************************/
STATUS pc1394DevSetPhyReg(unsigned long ulRegAdrs, unsigned long ulRegData)
{
   int iReadCount;
   unsigned long ulTempData;
   unsigned long ulPhyRegAdrs;
   unsigned long ulPhyRdAdrs;
   unsigned long ulPhyWrData;
   unsigned long *pCfgRomAdrs;

   ulPhyRegAdrs = ulRegAdrs;
   ulPhyWrData  = ulRegData;
/*
   printf("pc1394DevSetPhyReg: ulPhyRegAdrs = 0x%.8x\n", ulPhyRegAdrs);
*/
   ulTempData = ((ulPhyRegAdrs & 0xf) << 8) | DATA_BIT14 | (ulPhyWrData & 0xff);
/*
   printf("pc1394DevSetPhyReg: ulTempData = 0x%.8x\n", ulTempData);
*/
   pciWriteLong((int)(pPc1394Dev.pciControllerSpace0 + PHY_CTR_REG_ADR), ulTempData);

   iReadCount = 0;
   ulTempData = 0;
   while ((!(ulTempData & DATA_BIT31)) && (iReadCount < 30))
      {
      taskDelay(1);
      ulTempData = pciReadLong((int)(pPc1394Dev.pciControllerSpace0 + PHY_CTR_REG_ADR));
      iReadCount++;
      }
   
   if ((!(ulTempData & DATA_BIT31)) && (iReadCount == 30))
      {
      printf("pc1394DevSetPhyReg: read count error.\n");
      return(ERROR);
      }      

/*
   printf("pc1394DevSetPhyReg: ulTempData = 0x%.8x\n", ulTempData);

   ulPhyRdAdrs = (ulTempData & 0x0f000000) >> 24;
   if (ulPhyRegAdrs != ulPhyRdAdrs)
      {
      printf("pc1394DevSetPhyReg: read address error.\n");
      return(ERROR);
      }
*/
   return(OK);
}


/******************************************************************************
TITLE:  	pc1394DevGetPhyReg0Test
DESC:   	test routine to get PHY register 0
PARAM:  	none
RETURN: 	OK    - operation runs successfully
         ERROR - operation runs failed
******************************************************************************/
STATUS pc1394DevGetPhyReg0Test(void)
{
   int iReadCount;
   unsigned long ulTempData;
   unsigned long ulPhyRegAdrs;
   unsigned long ulPhyRdAdrs;
   unsigned long ulPhyRdData;
   unsigned long *pCfgRomAdrs;
   /* PHY_CTR_REG 0 */
   ulPhyRegAdrs = 0x0000;
   ulTempData = (ulPhyRegAdrs << 8) | DATA_BIT15;
   pciWriteLong((int)(pPc1394Dev.pciControllerSpace0 + PHY_CTR_REG_ADR), ulTempData);

   iReadCount = 0;
   ulTempData = 0;
   while ((!(ulTempData & DATA_BIT31)) && (iReadCount < 30))
      {
      taskDelay(1);
      ulTempData = pciReadLong((int)(pPc1394Dev.pciControllerSpace0 + PHY_CTR_REG_ADR));
      iReadCount++;
      }

⌨️ 快捷键说明

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