ioport.h
来自「WinCE 3.0 BSP, 包含Inter SA1110, Intel_815」· C头文件 代码 · 共 356 行
H
356 行
#ifndef __IOPORT_H__
#define __IOPORT_H__
#include <ceddk.h>
// the USE_MEMORY_MAPPED_PORTS define affects the way ports are mapped.
// the IGS2010 can be accessed as Port mapped or Memory mapped
// control registers. To determine a port mapped address you
// add 0x00800000 to the port address, e.g. 0x3CF, plus the base
// address of the card. A card mapped at 0xFE000000 will access
// port 0x3CF at 0xFE8003CF. This works on X86 and RISC platforms.
// Type conversions from Port to derived types
#define PORT_WO_8 *(WOPort8 *)&
#define PORT_RO_8 *(ROPort8 *)&
#define PORT_RW_8 *(RWPort8 *)&
#define PORT_WO_16 *(WOPort16 *)&
#define PORT_RO_16 *(ROPort16 *)&
#define PORT_RW_16 *(RWPort16 *)&
#define MM_RO_8 *(ROReg8 *)&
#define MM_RW_8 *(RWReg8 *)&
#define MM_RO_16 *(ROReg16 *)&
#define MM_RW_16 *(RWReg16 *)&
#define MM_WO_16 *(WOReg16 *)&
#define MM_RW_32 *(RWReg32 *)&
#define MM_WO_32 *(WOReg32 *)&
// Sample usage:
// #define reg_TST_WO (PORT_WO_8 m_Port[PortId_3DA])
// #define reg_TST_RO (PORT_RO_8 m_Port[PortId_3DA])
// #define reg_TST_RW (PORT_RW_8 m_Port[PortId_3DA])
#define PORT_RANGE_SIZE 4096
struct PortRange
{
PortRange *m_pNextRange;
unsigned long m_nFirstPortNo;
unsigned char *m_nPortBase;
};
class Port
{
protected:
unsigned char * m_pPort;
public:
void Map( unsigned long port, PortRange * &pFirstRange );
};
class WOPort8 : public Port
{
public:
unsigned char operator =(unsigned char v)
{
#ifdef USE_MEMORY_MAPPED_PORTS
WRITE_REGISTER_UCHAR( (PUCHAR)m_pPort, v );
#else //USE_MEMORY_MAPPED_PORTS
WRITE_PORT_UCHAR( (PUCHAR)m_pPort, v );
#endif //USE_MEMORY_MAPPED_PORTS
return v;
}
};
class ROPort8 : public Port
{
public:
operator unsigned char()
{
#ifdef USE_MEMORY_MAPPED_PORTS
return READ_REGISTER_UCHAR( (PUCHAR)m_pPort );
#else //USE_MEMORY_MAPPED_PORTS
return READ_PORT_UCHAR( (PUCHAR)m_pPort );
#endif //USE_MEMORY_MAPPED_PORTS
}
};
class RWPort8 : public Port
{
public:
unsigned char operator =(unsigned char v)
{
#ifdef USE_MEMORY_MAPPED_PORTS
WRITE_REGISTER_UCHAR( (PUCHAR)m_pPort, v );
#else //USE_MEMORY_MAPPED_PORTS
WRITE_PORT_UCHAR( (PUCHAR)m_pPort, v );
#endif //USE_MEMORY_MAPPED_PORTS
return v;
}
operator unsigned char()
{
#ifdef USE_MEMORY_MAPPED_PORTS
return READ_REGISTER_UCHAR( (PUCHAR)m_pPort );
#else //USE_MEMORY_MAPPED_PORTS
return READ_PORT_UCHAR( (PUCHAR)m_pPort );
#endif //USE_MEMORY_MAPPED_PORTS
}
};
class RWSplitPort8
{
private:
Port *m_pReadPort;
Port *m_pWritePort;
public:
void Init( Port &readPort, Port &writePort )
{
m_pReadPort = &readPort;
m_pWritePort = &writePort;
}
unsigned char operator =(unsigned char v)
{
return (PORT_WO_8 (*m_pWritePort)) = v;
}
operator unsigned char()
{
return (PORT_RO_8 (*m_pReadPort));
}
};
class WOPort16 : public Port
{
public:
unsigned short operator =(unsigned short v)
{
#ifdef USE_MEMORY_MAPPED_PORTS
WRITE_REGISTER_USHORT( (PUSHORT)m_pPort, v );
#else //USE_MEMORY_MAPPED_PORTS
WRITE_PORT_USHORT( (unsigned short *)m_pPort, v );
#endif //USE_MEMORY_MAPPED_PORTS
return v;
}
};
class ROPort16 : public Port
{
public:
operator unsigned short()
{
#ifdef USE_MEMORY_MAPPED_PORTS
return READ_REGISTER_USHORT( (PUSHORT)m_pPort );
#else //USE_MEMORY_MAPPED_PORTS
return READ_PORT_USHORT( (unsigned short *)m_pPort );
#endif //USE_MEMORY_MAPPED_PORTS
}
};
class RWPort16 : public Port
{
public:
unsigned short operator =(unsigned short v)
{
#ifdef USE_MEMORY_MAPPED_PORTS
WRITE_REGISTER_USHORT( (PUSHORT)m_pPort, v );
#else //USE_MEMORY_MAPPED_PORTS
WRITE_PORT_USHORT( (unsigned short *)m_pPort, v );
#endif //USE_MEMORY_MAPPED_PORTS
return v;
}
operator unsigned short()
{
#ifdef USE_MEMORY_MAPPED_PORTS
return READ_REGISTER_USHORT( (PUSHORT)m_pPort );
#else //USE_MEMORY_MAPPED_PORTS
return READ_PORT_USHORT( (unsigned short *)m_pPort );
#endif //USE_MEMORY_MAPPED_PORTS
}
};
class IndexedReg8
{
public:
RWPort8 *m_pAddressPort;
RWPort8 *m_pDataPort;
public:
void Init( RWPort8 &m_regAddress, RWPort8 &m_regData )
{
m_pAddressPort = &m_regAddress;
m_pDataPort = &m_regData;
}
RWPort8& operator [](int nSubscript)
{
*m_pAddressPort = (unsigned char)nSubscript;
return *m_pDataPort;
}
};
class FlipIndexedReg8
{
private:
RWPort8 *m_pRWPort; // Write addr or data here, read addr here
ROPort8 *m_pReadDataPort; // Read data here
ROPort8 *m_pResetPort; // Read here to set m_pRWPort[writes] to addr
RWSplitPort8 m_regData; // Points to RWPort for writes, and ReadDataPort for reads
public:
void ResetToAddr()
{
// Set m_pRWPort[writes] to addr
volatile unsigned char temp = *m_pResetPort;
}
void Init( Port &rwPort, Port &readDataPort, Port &resetPort )
{
m_pRWPort = &(PORT_RW_8 rwPort);
m_pReadDataPort = &(PORT_RO_8 readDataPort);
m_regData.Init( readDataPort, rwPort );
m_pResetPort = &(PORT_RO_8 resetPort);
}
RWSplitPort8& operator [](int nSubscript)
{
ResetToAddr();
*m_pRWPort = (unsigned char)nSubscript;
return m_regData;
}
};
class SubIndexedReg16
{
private:
volatile unsigned short *m_pMMReg;
unsigned short m_nRegId;
public:
void Init( unsigned short *pMMReg, unsigned short regNo )
{
m_pMMReg = pMMReg;
m_nRegId = regNo<<12;
}
operator unsigned short()
{
*m_pMMReg = 0xF000 | (m_nRegId>>12);
return 0x0FFF & *m_pMMReg;
}
unsigned short operator =(unsigned short v)
{
*m_pMMReg = v | m_nRegId;
return v;
}
};
class SubIndexedRegArray16
{
private:
unsigned short *m_pMMReg; // Address used for reads & writes
SubIndexedReg16 m_aSubReg[16];
public:
void Init( unsigned short *pMMReg )
{
int i;
for( i=0; i<16; i++ )
m_aSubReg[i].Init( pMMReg, i);
}
SubIndexedReg16& operator [](int nSubscript)
{
return m_aSubReg[nSubscript];
}
};
class RWReg8
{
private:
volatile unsigned char m_nV;
public:
unsigned char operator =(unsigned char v)
{
m_nV = v;
return v;
}
operator unsigned char()
{
return m_nV;
}
};
class ROReg8
{
private:
volatile unsigned char m_nV;
public:
operator unsigned char()
{
return m_nV;
}
};
class RWReg16
{
private:
volatile unsigned short m_nV;
public:
unsigned short operator =(unsigned short v)
{
m_nV = v;
return v;
}
operator unsigned short()
{
return m_nV;
}
};
class ROReg16
{
private:
volatile unsigned short m_nV;
public:
operator unsigned short()
{
return m_nV;
}
};
class WOReg16
{
private:
volatile unsigned short m_nV;
public:
unsigned short operator =(unsigned short v)
{
m_nV = v;
return v;
}
};
class RWReg32
{
private:
volatile unsigned long m_nV;
public:
unsigned long operator =(unsigned long v)
{
m_nV = v;
return v;
}
operator unsigned long()
{
return m_nV;
}
};
class WOReg32
{
private:
volatile unsigned long m_nV;
public:
unsigned long operator =(unsigned long v)
{
m_nV = v;
return v;
}
};
#endif // __IOPORT_H__
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?