Skip site navigation (1)Skip section navigation (2)
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>