📄 addi_eeprom.c
字号:
v_EepromClock76(dw_Address, dw_RegisterValue); /**********************/ /* Get the result bit */ /**********************/ dw_RegisterValueRead = inl(dw_Address); /***************/ /* Wait 0.1 ms */ /***************/ udelay(100); /***************************************/ /* Get bit value and shift into result */ /***************************************/ if (dw_RegisterValueRead & 0x8) { /**********/ /* Read 1 */ /**********/ *pw_Value = (*pw_Value << 1) | 0x1; } else { /**********/ /* Read 0 */ /**********/ *pw_Value = (*pw_Value << 1); } } /*************************/ /* Clear all EEPROM bits */ /*************************/ dw_RegisterValue = 0x0; /********************************************************************/ /* Toggle EEPROM's Chip select to get it out of Shift Register Mode */ /********************************************************************/ outl(dw_RegisterValue,dw_Address); /***************/ /* Wait 0.1 ms */ /***************/ udelay(100); } /******************************************/ /* EEPROM HEADER READ FUNCTIONS */ /******************************************//*+----------------------------------------------------------------------------+| Function Name : INT i_EepromReadMainHeader(WORD w_PCIBoardEepromAddress, || PCHAR pc_PCIChipInformation,comedi_device *dev) |+----------------------------------------------------------------------------+| Task : Read from eeprom Main Header |+----------------------------------------------------------------------------+| Input Parameters : WORD w_PCIBoardEepromAddress : PCI eeprom address || | | PCHAR pc_PCIChipInformation : PCI Chip Type. || || comedi_device *dev : comedi device structure || pointer |+----------------------------------------------------------------------------+| Output Parameters : - |+----------------------------------------------------------------------------+| Return Value : 0 |+----------------------------------------------------------------------------+*/INT i_EepromReadMainHeader(WORD w_PCIBoardEepromAddress,PCHAR pc_PCIChipInformation,comedi_device *dev){ WORD w_Temp,i,w_Count=0; UINT ui_Temp; str_MainHeader s_MainHeader; str_DigitalInputHeader s_DigitalInputHeader; str_DigitalOutputHeader s_DigitalOutputHeader; //str_TimerMainHeader s_TimerMainHeader,s_WatchdogMainHeader; str_AnalogOutputHeader s_AnalogOutputHeader; str_AnalogInputHeader s_AnalogInputHeader; // Read size s_MainHeader.w_HeaderSize = w_EepromReadWord(w_PCIBoardEepromAddress,pc_PCIChipInformation,0x100+8); // Read nbr of functionality w_Temp = w_EepromReadWord(w_PCIBoardEepromAddress,pc_PCIChipInformation,0x100+10); s_MainHeader.b_Nfunctions =(BYTE)w_Temp & 0x00FF; // Read functionality details for(i=0;i<s_MainHeader.b_Nfunctions;i++) { // Read Type w_Temp = w_EepromReadWord(w_PCIBoardEepromAddress,pc_PCIChipInformation,0x100+12+w_Count); s_MainHeader.s_Functions[i].b_Type =(BYTE) w_Temp & 0x3F; w_Count=w_Count+2; //Read Address s_MainHeader.s_Functions[i].w_Address= w_EepromReadWord(w_PCIBoardEepromAddress,pc_PCIChipInformation,0x100+12+w_Count); w_Count=w_Count+2; } // Display main header info for(i=0;i<s_MainHeader.b_Nfunctions;i++) { switch(s_MainHeader.s_Functions[i].b_Type) { case EEPROM_DIGITALINPUT: i_EepromReadDigitalInputHeader(w_PCIBoardEepromAddress,pc_PCIChipInformation, s_MainHeader.s_Functions[i].w_Address,&s_DigitalInputHeader); this_board->i_NbrDiChannel=s_DigitalInputHeader.w_Nchannel; break; case EEPROM_DIGITALOUTPUT: i_EepromReadDigitalOutputHeader(w_PCIBoardEepromAddress,pc_PCIChipInformation, s_MainHeader.s_Functions[i].w_Address,&s_DigitalOutputHeader); this_board->i_NbrDoChannel=s_DigitalOutputHeader.w_Nchannel; ui_Temp=0xffffffff; this_board->i_DoMaxdata= ui_Temp >>(32 - this_board->i_NbrDoChannel); break; case EEPROM_ANALOGINPUT: i_EepromReadAnlogInputHeader(w_PCIBoardEepromAddress,pc_PCIChipInformation, s_MainHeader.s_Functions[i].w_Address,&s_AnalogInputHeader); if (!(strcmp(this_board->pc_DriverName, "apci3200"))) this_board->i_NbrAiChannel=s_AnalogInputHeader.w_Nchannel * 4; else this_board->i_NbrAiChannel=s_AnalogInputHeader.w_Nchannel; this_board->i_Dma=s_AnalogInputHeader.b_HasDma; this_board->ui_MinAcquisitiontimeNs=(UINT)s_AnalogInputHeader.w_MinConvertTiming * 1000; this_board->ui_MinDelaytimeNs =(UINT)s_AnalogInputHeader.w_MinDelayTiming * 1000; ui_Temp=0xffff; this_board->i_AiMaxdata = ui_Temp >> (16 - s_AnalogInputHeader.b_Resolution); break; case EEPROM_ANALOGOUTPUT: i_EepromReadAnlogOutputHeader(w_PCIBoardEepromAddress,pc_PCIChipInformation, s_MainHeader.s_Functions[i].w_Address,&s_AnalogOutputHeader); this_board->i_NbrAoChannel=s_AnalogOutputHeader.w_Nchannel; ui_Temp=0xffff; this_board->i_AoMaxdata= ui_Temp >>(16 - s_AnalogOutputHeader.b_Resolution); break; case EEPROM_TIMER: this_board->i_Timer=1;//Timer subdevice present break; case EEPROM_WATCHDOG: this_board->i_Timer=1; //Timer subdevice present break; case EEPROM_TIMER_WATCHDOG_COUNTER: this_board->i_Timer=1; //Timer subdevice present } } return 0;}/*+----------------------------------------------------------------------------+| Function Name : INT i_EepromReadDigitalInputHeader(WORD || w_PCIBoardEepromAddress,PCHAR pc_PCIChipInformation, || WORD w_Address,str_DigitalInputHeader *s_Header) || |+----------------------------------------------------------------------------+| Task : Read Digital Input Header |+----------------------------------------------------------------------------+| Input Parameters : WORD w_PCIBoardEepromAddress : PCI eeprom address || || PCHAR pc_PCIChipInformation : PCI Chip Type. || || str_DigitalInputHeader *s_Header: Digita Input Header || Pointer |+----------------------------------------------------------------------------+| Output Parameters : - |+----------------------------------------------------------------------------+| Return Value : 0 |+----------------------------------------------------------------------------+*/INT i_EepromReadDigitalInputHeader(WORD w_PCIBoardEepromAddress,PCHAR pc_PCIChipInformation,WORD w_Address,str_DigitalInputHeader *s_Header){ WORD w_Temp; // read nbr of channels s_Header->w_Nchannel=w_EepromReadWord(w_PCIBoardEepromAddress,pc_PCIChipInformation,0x100+w_Address+6); // interruptible or not w_Temp=w_EepromReadWord(w_PCIBoardEepromAddress,pc_PCIChipInformation,0x100+w_Address+8); s_Header->b_Interruptible=(BYTE) (w_Temp>>7)& 0x01;// How many interruptible logic s_Header->w_NinterruptLogic=w_EepromReadWord(w_PCIBoardEepromAddress,pc_PCIChipInformation,0x100+w_Address+10); return 0;}/*+----------------------------------------------------------------------------+| Function Name : INT i_EepromReadDigitalOutputHeader(WORD || w_PCIBoardEepromAddress,PCHAR pc_PCIChipInformation, || WORD w_Address,str_DigitalOutputHeader *s_Header) || |+----------------------------------------------------------------------------+| Task : Read Digital Output Header |+----------------------------------------------------------------------------+| Input Parameters : WORD w_PCIBoardEepromAddress : PCI eeprom address || || PCHAR pc_PCIChipInformation : PCI Chip Type. || || str_DigitalOutputHeader *s_Header: Digital Output Header|| Pointer |+----------------------------------------------------------------------------+| Output Parameters : - |+----------------------------------------------------------------------------+| Return Value : 0 |+----------------------------------------------------------------------------+*/INT i_EepromReadDigitalOutputHeader(WORD w_PCIBoardEepromAddress,PCHAR pc_PCIChipInformation,WORD w_Address,str_DigitalOutputHeader *s_Header){// Read Nbr channels s_Header->w_Nchannel=w_EepromReadWord(w_PCIBoardEepromAddress,pc_PCIChipInformation,0x100+w_Address+6);return 0;}/*+----------------------------------------------------------------------------+| Function Name : INT i_EepromReadTimerHeader(WORD w_PCIBoardEepromAddress, || PCHAR pc_PCIChipInformation,WORD w_Address, || str_TimerMainHeader *s_Header) | +----------------------------------------------------------------------------+| Task : Read Timer or Watchdog Header |+----------------------------------------------------------------------------+| Input Parameters : WORD w_PCIBoardEepromAddress : PCI eeprom address || | | PCHAR pc_PCIChipInformation : PCI Chip Type. || | | str_TimerMainHeader *s_Header: Timer Header || Pointer |+----------------------------------------------------------------------------+| Output Parameters : - |+----------------------------------------------------------------------------+| Return Value : 0 |+----------------------------------------------------------------------------+*/INT i_EepromReadTimerHeader(WORD w_PCIBoardEepromAddress,PCHAR pc_PCIChipInformation,WORD w_Address,str_TimerMainHeader *s_Header){WORD i,w_Size=0,w_Temp; //Read No of Timers_Header->w_Ntimer=w_EepromReadWord(w_PCIBoardEepromAddress,pc_PCIChipInformation,0x100+w_Address+6);//Read header sizefor(i=0;i<s_Header->w_Ntimer;i++){ s_Header->s_TimerDetails[i].w_HeaderSize=w_EepromReadWord(w_PCIBoardEepromAddress,pc_PCIChipInformation,0x100+w_Address+8+w_Size+0); w_Temp=w_EepromReadWord(w_PCIBoardEepromAddress,pc_PCIChipInformation,0x100+w_Address+8+w_Size+2) ; //Read Resolution s_Header->s_TimerDetails[i].b_Resolution=(BYTE)(w_Temp>>10)&0x3F; //Read Mode s_Header->s_TimerDetails[i].b_Mode =(BYTE) (w_Temp>>4)&0x3F; w_Temp=w_EepromReadWord(w_PCIBoardEepromAddress,pc_PCIChipInformation,0x100+w_Address+8+w_Size+4) ; //Read MinTiming s_Header->s_TimerDetails[i].w_MinTiming =(w_Temp>>6)&0x3FF; //Read Timebase s_Header->s_TimerDetails[i].b_TimeBase =(BYTE)(w_Temp)&0x3F; w_Size += s_Header->s_TimerDetails[i].w_HeaderSize;} return 0;}/*+----------------------------------------------------------------------------+| Function Name : INT i_EepromReadAnlogOutputHeader(WORD || w_PCIBoardEepromAddress,PCHAR pc_PCIChipInformation, || WORD w_Address,str_AnalogOutputHeader *s_Header) | +----------------------------------------------------------------------------+| Task : Read Nalog Output Header |+----------------------------------------------------------------------------+| Input Parameters : WORD w_PCIBoardEepromAddress : PCI eeprom address || | | PCHAR pc_PCIChipInformation : PCI Chip Type. || || str_AnalogOutputHeader *s_Header:Anlog Output Header || Pointer |+----------------------------------------------------------------------------+| Output Parameters : - |+----------------------------------------------------------------------------+| Return Value : 0 |+----------------------------------------------------------------------------+*/INT i_EepromReadAnlogOutputHeader(WORD w_PCIBoardEepromAddress,PCHAR pc_PCIChipInformation,WORD w_Address,str_AnalogOutputHeader *s_Header){ WORD w_Temp; // No of channels for 1st hard component w_Temp=w_EepromReadWord(w_PCIBoardEepromAddress,pc_PCIChipInformation,0x100+w_Address+10); s_Header->w_Nchannel=(w_Temp>>4)& 0x03FF; // Resolution for 1st hard component w_Temp=w_EepromReadWord(w_PCIBoardEepromAddress,pc_PCIChipInformation,0x100+w_Address+16); s_Header->b_Resolution=(BYTE)(w_Temp>>8) & 0xFF; return 0;}/*+----------------------------------------------------------------------------+| Function Name : INT i_EepromReadAnlogInputHeader(WORD || w_PCIBoardEepromAddress,PCHAR pc_PCIChipInformation, || WORD w_Address,str_AnalogInputHeader *s_Header) |+----------------------------------------------------------------------------+| Task : Read Nalog Output Header |+----------------------------------------------------------------------------+| Input Parameters : WORD w_PCIBoardEepromAddress : PCI eeprom address || || PCHAR pc_PCIChipInformation : PCI Chip Type. || || str_AnalogInputHeader *s_Header:Anlog Input Header | | Pointer |+----------------------------------------------------------------------------+| Output Parameters : - |+----------------------------------------------------------------------------+| Return Value : 0 |+----------------------------------------------------------------------------+*/// Reads only for ONE hardware componentINT i_EepromReadAnlogInputHeader(WORD w_PCIBoardEepromAddress,PCHAR pc_PCIChipInformation,WORD w_Address,str_AnalogInputHeader *s_Header){ WORD w_Temp,w_Offset; w_Temp=w_EepromReadWord(w_PCIBoardEepromAddress,pc_PCIChipInformation,0x100+w_Address+10); s_Header->w_Nchannel=(w_Temp>>4)& 0x03FF; s_Header->w_MinConvertTiming=w_EepromReadWord(w_PCIBoardEepromAddress,pc_PCIChipInformation,0x100+w_Address+16);s_Header->w_MinDelayTiming=w_EepromReadWord(w_PCIBoardEepromAddress,pc_PCIChipInformation,0x100+w_Address+30);w_Temp=w_EepromReadWord(w_PCIBoardEepromAddress,pc_PCIChipInformation,0x100+w_Address+20);s_Header->b_HasDma=(w_Temp>>13) & 0x01; // whether dma present or notw_Temp=w_EepromReadWord(w_PCIBoardEepromAddress,pc_PCIChipInformation,0x100+w_Address+72);// reading Yw_Temp=w_Temp & 0x00FF;if(w_Temp)//Y>0{w_Offset=74+(2*w_Temp)+(10*(1+(w_Temp/16)));// offset of first analog input single headerw_Offset= w_Offset+2; // resolution}else//Y=0{ w_Offset=74; w_Offset= w_Offset+2; // resolution}// read Resolutionw_Temp=w_EepromReadWord(w_PCIBoardEepromAddress,pc_PCIChipInformation,0x100+w_Address+w_Offset);s_Header->b_Resolution=w_Temp & 0x001F;// last 5 bitsreturn 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -