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.

_______________________________________________
[EMAIL PROTECTED] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-questions
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to