Linker errors pertaining to inb , outb and iopl.
Pascal Pype
pascal.pype at skynet.be
Sat Aug 9 11:42:58 PDT 2003
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.
More information about the freebsd-questions
mailing list