Date: Sat, 09 Aug 2003 20:50:58 +0200 From: Pascal Pype <pascal.pype@skynet.be> To: questions@freebsd.org Subject: Linker errors pertaining to inb , outb and iopl. Message-ID: <3F354292.1000108@skynet.be>
next in thread | raw e-mail | index | archive | help
Hello , When I try to compile a utility that does serial port I/O upon the regiser level , linker errors are issued about inb , outb and iopl calls. In concreto , when one comiles the following code: /* serTR.cc -- srcTree/utilities/serTR/src */ #define _C_PLUS_PLUS // General headers. #include <stdio.h> #include <string.h> #ifdef _UNIX #include <unistd.h> //#include <sys/io.h> #else #include <conio.h> #endif // Serial transmission / receival utility specific headers. #include "type.h" #include "trace.h" #include "serTR.h" #ifdef _CARRY_OUT_PULSE_DELAY static VOID Delay(U32 PulseWidth) { // Delay U32 i; for (i=0;i < PulseWidth;i++) {}; } // Delay #endif // Class constructor. TSerTR::TSerTR() : mLineCtrlRegOffset(3), mInterruptEnableRegAccMask(0x7F), mInterruptDisableMask(0xF0), mTxFrameFmtByte(0x03), mDivisorLatchByteRegsAccMask(0x80), mMaxBaudRate(115200), mDivisorLatchLowByteMask(0x00FF), mDivisorLatchHighByteMask(0xFF00), mNrBitsPerByte(8), mDivisorLatchByteRegsHideMask(0x7F), mRtsEnableMask(0x02), mRtsDisableMask(0xFD), mWaitOnCtsMask(0x11), mWaitOnEmptyTxHoldingRegMask(0x20), mWaitOnRxDataReadyMask(0x01), #ifdef _CARRY_OUT_PULSE_DELAY mPulseWidth(2525), #endif mNrPorts(2) { // TSerTR::TSerTR m_pSerDevAddrLst = new U16[mNrPorts]; m_pSerDevAddrLst[0] = 0x3F8; m_pSerDevAddrLst[1] = 0x2f8; #ifdef _UNIX iopl(3); #endif m_fIsOpened = TRUE; } // TSerTR::TSerTR // Class method helpers. VOID TSerTR::DetermineBaudRate(U32 BaudRate) { // TSerTR::DetermineBaudRate // Open access to the divisor latch. U8 DivisorLatchByteRegsAccByte = InPortByte(mLineCtrlReg) | mDivisorLatchByteRegsAccMask; OutPortByte(mLineCtrlReg,DivisorLatchByteRegsAccByte); // Determine the baud rate. U32 Divisor = mMaxBaudRate / BaudRate; U16 DivisorLatchLowByteReg = mBaseReg; U8 DivisorLatchLowByte = (U8) (Divisor & mDivisorLatchLowByteMask); OutPortByte(DivisorLatchLowByteReg,DivisorLatchLowByte); U16 DivisorLatchHighByteReg = mBaseReg + 1; U8 DivisorLatchHighByte = (U8) ((Divisor & mDivisorLatchHighByteMask) >> (mNrBitsPerByte * sizeof(U8))); OutPortByte(DivisorLatchHighByteReg,DivisorLatchHighByte); // Close access to the divisor latch. U8 DivisorLatchByteRegsHideByte = InPortByte(mLineCtrlReg) & mDivisorLatchByteRegsHideMask; OutPortByte(mLineCtrlReg,DivisorLatchByteRegsHideByte); } // TSerTR::DetermineBaudRate // Class method. VOID TSerTR::Open(U8 PortNr, U32 BaudRate) { // TSerTR::TSerTR // Determine the registers according to the choosen port. mBaseReg = m_pSerDevAddrLst[PortNr]; mLineCtrlReg = mBaseReg + mLineCtrlRegOffset; mModemCtrlReg = mLineCtrlReg + 1; mLineStReg = mModemCtrlReg + 1; mModemStReg = mLineStReg + 1; /* Disable serial interrupts : 1. choose the interrupt enable register, 2. disable all serial interrupts. */ U8 InterruptEnableRegAccByte = InPortByte(mLineCtrlReg) & mInterruptEnableRegAccMask; OutPortByte(mLineCtrlReg,InterruptEnableRegAccByte); U16 InterruptEnableReg = mBaseReg + 1; U8 InterruptDisableByte = InPortByte(InterruptEnableReg) & mInterruptDisableMask; OutPortByte(InterruptEnableReg,InterruptDisableByte); // The transmission frame format = no parity , 1 stop bit. OutPortByte(mLineCtrlReg,mTxFrameFmtByte); DetermineBaudRate(BaudRate); // Reset the request to send line. OutPortByte(mModemCtrlReg,InPortByte(mModemCtrlReg) & mRtsDisableMask); // Flush the receiver buffer. if (InPortByte(mLineStReg) & mWaitOnRxDataReadyMask) { U8 FlushByte = InPortByte(mBaseReg); } } // TSerTR::Open // Class method. VOID TSerTR::Close() { // TSerTR::Close OutPortByte(mModemCtrlReg,InPortByte(mModemCtrlReg) & mRtsDisableMask); } // TSerTR::Close // Class method helpers. VOID TSerTR::TransmitByte(U8 Byte) { // TSerTR::TransmitByte for (;;) { if ((InPortByte(mModemStReg) & mWaitOnCtsMask) == mWaitOnCtsMask) { while (!(InPortByte(mLineStReg) & mWaitOnEmptyTxHoldingRegMask)) {}; OutPortByte(mBaseReg,Byte); break; } } } // TSerTR::TransmitByte U8 TSerTR::ReceiveByte() { // TSerTR::ReceiveByte OutPortByte(mModemCtrlReg,InPortByte(mModemCtrlReg) | mRtsEnableMask); while (!(InPortByte(mLineStReg) & mWaitOnRxDataReadyMask)) {}; OutPortByte(mModemCtrlReg,InPortByte(mModemCtrlReg) & mRtsDisableMask); #ifdef _CARRY_OUT_PULSE_DELAY Delay(mPulseWidth); #endif return InPortByte(mBaseReg); } // TSerTR::ReceiveByte // Class methods. VOID TSerTR::TransmitSynchr(PU8 pData, U32 Len) { // TSerTR::TransmitSynchr U32 i; for (i = 0;i < Len;i++) TransmitByte(pData[i]); } // TSerTR::TransmitSynchr VOID TSerTR::ReceiveSynchr(PU8 pData, U32 Len) { // TSerTR::ReceiveSynchr U32 i; for (i = 0;i < Len;i++) pData[i] = ReceiveByte(); } // TSerTR::ReceiveSynchr one gets the following linker errors : ./../utilities/serTR/dbgTrace/serTR.o: In function `TSerTR::Open(unsigned char, unsigned long)': /home/pascal/unix/srcTree/utilities/serTR/./src/serTR.cc(.text+0x44): undefined reference to `inb' /home/pascal/unix/srcTree/utilities/serTR/./src/serTR.cc(.text+0x5a): undefined reference to `outb' /home/pascal/unix/srcTree/utilities/serTR/./src/serTR.cc(.text+0x6e): undefined reference to `inb' /home/pascal/unix/srcTree/utilities/serTR/./src/serTR.cc(.text+0x80): undefined reference to `outb' /home/pascal/unix/srcTree/utilities/serTR/./src/serTR.cc(.text+0x95): undefined reference to `outb' /home/pascal/unix/srcTree/utilities/serTR/./src/serTR.cc(.text+0xa5): undefined reference to `inb' /home/pascal/unix/srcTree/utilities/serTR/./src/serTR.cc(.text+0xbb): undefined reference to `outb' /home/pascal/unix/srcTree/utilities/serTR/./src/serTR.cc(.text+0xdd): undefined reference to `outb' /home/pascal/unix/srcTree/utilities/serTR/./src/serTR.cc(.text+0xfe): undefined reference to `outb' /home/pascal/unix/srcTree/utilities/serTR/./src/serTR.cc(.text+0x10e): undefined reference to `inb' /home/pascal/unix/srcTree/utilities/serTR/./src/serTR.cc(.text+0x124): undefined reference to `outb' /home/pascal/unix/srcTree/utilities/serTR/./src/serTR.cc(.text+0x13c): undefined reference to `inb' /home/pascal/unix/srcTree/utilities/serTR/./src/serTR.cc(.text+0x14d): undefined reference to `outb' /home/pascal/unix/srcTree/utilities/serTR/./src/serTR.cc(.text+0x15a): undefined reference to `inb' /home/pascal/unix/srcTree/utilities/serTR/./src/serTR.cc(.text+0x174): undefined reference to `inb' ./../utilities/serTR/dbgTrace/serTR.o: In function `TSerTR::TSerTR(void)': /home/pascal/unix/srcTree/utilities/serTR/./src/serTR.cc(.text+0x1f5): undefined reference to `iopl' ./../utilities/serTR/dbgTrace/serTR.o: In function `TSerTR::DetermineBaudRate(unsigned long)': /home/pascal/unix/srcTree/utilities/serTR/./src/serTR.cc(.text+0x21b): undefined reference to `inb' /home/pascal/unix/srcTree/utilities/serTR/./src/serTR.cc(.text+0x231): undefined reference to `outb' /home/pascal/unix/srcTree/utilities/serTR/./src/serTR.cc(.text+0x253): undefined reference to `outb' /home/pascal/unix/srcTree/utilities/serTR/./src/serTR.cc(.text+0x278): undefined reference to `outb' /home/pascal/unix/srcTree/utilities/serTR/./src/serTR.cc(.text+0x288): undefined reference to `inb' /home/pascal/unix/srcTree/utilities/serTR/./src/serTR.cc(.text+0x29e): undefined reference to `outb' ./../utilities/serTR/dbgTrace/serTR.o: In function `TSerTR::Close(void)': /home/pascal/unix/srcTree/utilities/serTR/./src/serTR.cc(.text+0x2c7): undefined reference to `inb' /home/pascal/unix/srcTree/utilities/serTR/./src/serTR.cc(.text+0x2d8): undefined reference to `outb' ./../utilities/serTR/dbgTrace/serTR.o: In function `TSerTR::TransmitByte(unsigned char)': /home/pascal/unix/srcTree/utilities/serTR/./src/serTR.cc:189: undefined reference to `inb' /home/pascal/unix/srcTree/utilities/serTR/./src/serTR.cc:190: undefined reference to `inb' /home/pascal/unix/srcTree/utilities/serTR/./src/serTR.cc:33: undefined reference to `outb' ./../utilities/serTR/dbgTrace/serTR.o: In function `TSerTR::ReceiveByte(void)': /home/pascal/unix/srcTree/utilities/serTR/./src/serTR.cc:189: undefined reference to `inb' /home/pascal/unix/srcTree/utilities/serTR/./src/serTR.cc:189: undefined reference to `outb' /home/pascal/unix/srcTree/utilities/serTR/./src/serTR.cc:190: undefined reference to `inb' /home/pascal/unix/srcTree/utilities/serTR/./src/serTR.cc:33: undefined reference to `inb' /home/pascal/unix/srcTree/utilities/serTR/./src/serTR.cc:33: undefined reference to `outb' /home/pascal/unix/srcTree/utilities/serTR/./src/serTR.cc:211: undefined reference to `inb' ./../utilities/serTR/dbgTrace/serTR.o: In function `TSerTR::TransmitSynchr(unsigned char *, unsigned long)': /home/pascal/unix/srcTree/utilities/serTR/./src/serTR.cc:177: undefined reference to `inb' /home/pascal/unix/srcTree/utilities/serTR/./src/serTR.cc:178: undefined reference to `inb' /home/pascal/unix/srcTree/utilities/serTR/./src/serTR.cc:179: undefined reference to `outb' ./../utilities/serTR/dbgTrace/serTR.o: In function `TSerTR::ReceiveSynchr(unsigned char *, unsigned long)': /home/pascal/unix/srcTree/utilities/serTR/./src/serTR.cc(.text+0x47d): undefined reference to `inb' /home/pascal/unix/srcTree/utilities/serTR/./src/serTR.cc(.text+0x48e): undefined reference to `outb' /home/pascal/unix/srcTree/utilities/serTR/./src/serTR.cc(.text+0x4a1): undefined reference to `inb' /home/pascal/unix/srcTree/utilities/serTR/./src/serTR.cc(.text+0x4c3): undefined reference to `inb' /home/pascal/unix/srcTree/utilities/serTR/./src/serTR.cc(.text+0x4d4): undefined reference to `outb' /home/pascal/unix/srcTree/utilities/serTR/./src/serTR.cc(.text+0x4f2):undefined reference to `inb Bye , Pype Pascal.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3F354292.1000108>