From owner-freebsd-questions@FreeBSD.ORG Sat Aug 9 11:42:58 2003 Return-Path: Delivered-To: freebsd-questions@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 2326437B401 for ; Sat, 9 Aug 2003 11:42:58 -0700 (PDT) Received: from sarek.skynet.be (sarek.skynet.be [195.238.3.230]) by mx1.FreeBSD.org (Postfix) with ESMTP id B7C1743FB1 for ; Sat, 9 Aug 2003 11:42:56 -0700 (PDT) (envelope-from pascal.pype@skynet.be) Received: from skynet.be (179.17-201-80.adsl.skynet.be [80.201.17.179]) id h79Igf8C029143 for ; Sat, 9 Aug 2003 20:42:41 +0200 (envelope-from ) Message-ID: <3F354292.1000108@skynet.be> Date: Sat, 09 Aug 2003 20:50:58 +0200 From: Pascal Pype User-Agent: Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.0.2) Gecko/20030323 X-Accept-Language: en-us, en MIME-Version: 1.0 To: questions@freebsd.org Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Subject: Linker errors pertaining to inb , outb and iopl. X-BeenThere: freebsd-questions@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: User questions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 09 Aug 2003 18:42:58 -0000 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 #include #ifdef _UNIX #include //#include #else #include #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.