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.
_______________________________________________ [EMAIL PROTECTED] mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-questions To unsubscribe, send any mail to "[EMAIL PROTECTED]"