baseport/syborg/serial/syborg_serial.cpp
changeset 63 84dca1410127
parent 16 73107a0bc259
equal deleted inserted replaced
62:99ca724f9829 63:84dca1410127
     8 *
     8 *
     9 * Initial Contributors:
     9 * Initial Contributors:
    10 * Nokia Corporation - initial contribution.
    10 * Nokia Corporation - initial contribution.
    11 *
    11 *
    12 * Contributors:
    12 * Contributors:
       
    13 * NTT DOCOMO, INC. -- Fix bug 2186 - QEMU baseport serial driver doesn't work with multiple UARTs and is unreliable
    13 *
    14 *
    14 * Description: Minimalistic serial driver
    15 * Description: Minimalistic serial driver
    15 *
    16 *
    16 * TODO: Handle multiple Units, hardcoded FIFO Size
       
    17 */
    17 */
    18 
    18 
    19 #include "syborg_serial.h"
    19 #include "syborg_serial.h"
    20 
    20 
    21 //#define DPRINT(x) Kern::Printf(x)
    21 //#define DPRINT(x) Kern::Printf(x)
    22 //#define DPRINT2(x,y) Kern::Printf(x,y)
    22 //#define DPRINT2(x,y) Kern::Printf(x,y)
    23 
    23 
    24 #define DPRINT(x)
    24 #define DPRINT(x)
    25 #define DPRINT2(x,y)
    25 #define DPRINT2(x,y)
    26 
    26 
       
    27 _LIT(KSerialDfcQName,"SerialDFC");
       
    28 const TInt KDfcQuePriority = 27;
    27 // ---------------------------------------------------------------
    29 // ---------------------------------------------------------------
    28 // ---------------------------------------------------------------
    30 // ---------------------------------------------------------------
    29 
    31 
    30 DDriverSyborgComm::DDriverSyborgComm()
    32 DDriverSyborgComm::DDriverSyborgComm()
    31 {
    33 	{
    32   iVersion=TVersion(KCommsMajorVersionNumber,KCommsMinorVersionNumber,KCommsBuildVersionNumber);
    34 	DPRINT("DDriverSyborgComm::DDriverSyborgComm()");
    33 }
    35 	iVersion=TVersion(KCommsMajorVersionNumber, KCommsMinorVersionNumber, KCommsBuildVersionNumber);
       
    36 	}
       
    37 
       
    38  DDriverSyborgComm::~DDriverSyborgComm()
       
    39 	{
       
    40 	DPRINT("~DDriverSyborgComm::DDriverSyborgComm()");
       
    41 	}
    34 
    42 
    35 TInt DDriverSyborgComm::Install()
    43 TInt DDriverSyborgComm::Install()
    36 {
    44 	{
    37   DPRINT("DDriverSyborgComm::Install");
    45 	DPRINT("DDriverSyborgComm::Install");
    38   return SetName(&KPddName);
    46 	return SetName(&KPddName);
    39 }
    47 	}
    40 
    48 
    41 void DDriverSyborgComm::GetCaps(TDes8 &aDes) const
    49 void DDriverSyborgComm::GetCaps(TDes8 &aDes) const
    42 {
    50 	{
    43   DPRINT("DDriverSyborgComm::GetCaps");
    51 	DPRINT("DDriverSyborgComm::GetCaps");
    44 
    52 
    45   TCommCaps3 capsBuf;
    53 	TCommCaps3 capsBuf;
    46   TCommCapsV03 &c=capsBuf();
    54 	TCommCapsV03 &c=capsBuf();
    47   c.iRate=KCapsBps110|KCapsBps150|KCapsBps300|KCapsBps600|KCapsBps1200|KCapsBps2400|KCapsBps4800|KCapsBps9600|KCapsBps19200|KCapsBps38400|KCapsBps57600|KCapsBps115200|KCapsBps230400;
    55 	c.iRate=KCapsBps110|KCapsBps150|KCapsBps300|KCapsBps600|KCapsBps1200|KCapsBps2400|KCapsBps4800|KCapsBps9600|KCapsBps19200|KCapsBps38400|KCapsBps57600|KCapsBps115200|KCapsBps230400;
    48   c.iDataBits=KCapsData5|KCapsData6|KCapsData7|KCapsData8;
    56 	c.iDataBits=KCapsData5|KCapsData6|KCapsData7|KCapsData8;
    49   c.iStopBits=KCapsStop1|KCapsStop2;
    57 	c.iStopBits=KCapsStop1|KCapsStop2;
    50   c.iParity=KCapsParityNone|KCapsParityEven|KCapsParityOdd;
    58 	c.iParity=KCapsParityNone|KCapsParityEven|KCapsParityOdd;
    51   c.iHandshake=KCapsObeyXoffSupported|KCapsSendXoffSupported|KCapsObeyCTSSupported|KCapsFailCTSSupported|KCapsObeyDSRSupported|KCapsFailDSRSupported|KCapsObeyDCDSupported|KCapsFailDCDSupported|KCapsFreeRTSSupported|KCapsFreeDTRSupported;
    59 	c.iHandshake=KCapsObeyXoffSupported|KCapsSendXoffSupported|KCapsObeyCTSSupported|KCapsFailCTSSupported|KCapsObeyDSRSupported|KCapsFailDSRSupported|KCapsObeyDCDSupported|KCapsFailDCDSupported|KCapsFreeRTSSupported|KCapsFreeDTRSupported;
    52   c.iSignals=KCapsSignalCTSSupported|KCapsSignalDSRSupported|KCapsSignalDCDSupported|KCapsSignalRTSSupported|KCapsSignalDTRSupported;
    60 	c.iSignals=KCapsSignalCTSSupported|KCapsSignalDSRSupported|KCapsSignalDCDSupported|KCapsSignalRTSSupported|KCapsSignalDTRSupported;
    53   c.iSIR=0;
    61 	c.iSIR=0;
    54   c.iNotificationCaps=KNotifyDataAvailableSupported|KNotifySignalsChangeSupported;
    62 	c.iNotificationCaps=KNotifyDataAvailableSupported|KNotifySignalsChangeSupported;
    55   c.iFifo=KCapsHasFifo;
    63 	c.iFifo=KCapsHasFifo;
    56   c.iRoleCaps=0;
    64 	c.iRoleCaps=0;
    57   c.iFlowControlCaps=0;
    65 	c.iFlowControlCaps=0;
    58   c.iBreakSupported=ETrue;
    66 	c.iBreakSupported=ETrue;
    59   aDes.FillZ(aDes.MaxLength());
    67 	aDes.FillZ(aDes.MaxLength());
    60   aDes=capsBuf.Left(Min(capsBuf.Length(),aDes.MaxLength()));
    68 	aDes=capsBuf.Left(Min(capsBuf.Length(),aDes.MaxLength()));
    61 }
    69 	}
    62 
    70 
    63 TInt DDriverSyborgComm::Create(DBase*& aChannel, TInt aUnit, const TDesC8* anInfo, const TVersion& aVer)
    71 TInt DDriverSyborgComm::Create(DBase*& aChannel, TInt aUnit, const TDesC8* anInfo, const TVersion& aVer)
    64 {
    72 	{
    65   DPRINT("DDriverSyborgComm::Create");
    73 	DPRINT("DDriverSyborgComm::Create");
    66 
    74 
    67   DCommSyborgSoc* pD=new DCommSyborgSoc;
    75 	DCommSyborgSoc* pD=new DCommSyborgSoc(this);
    68   aChannel=pD;
    76 	aChannel=pD;
    69   TInt r=KErrNoMemory;
    77 	TInt r=KErrNoMemory;
    70   if (pD)
    78 	if (pD)
    71 	r=pD->DoCreate(aUnit,anInfo);
    79 		{
    72   return r;
    80 		r=pD->DoCreate(aUnit,anInfo);
    73 }
    81 		}
       
    82 	return r;
       
    83 	}
    74 
    84 
    75 TInt DDriverSyborgComm::Validate(TInt aUnit, const TDesC8* /*anInfo*/, const TVersion& aVer)
    85 TInt DDriverSyborgComm::Validate(TInt aUnit, const TDesC8* /*anInfo*/, const TVersion& aVer)
    76 {
    86 	{
    77   DPRINT("DDriverSyborgComm::Validate");
    87 	DPRINT("DDriverSyborgComm::Validate");
    78   if ((!Kern::QueryVersionSupported(iVersion,aVer)) || 
    88 	if ((!Kern::QueryVersionSupported(iVersion,aVer)) ||
    79 	  (!Kern::QueryVersionSupported(aVer,TVersion(KMinimumLddMajorVersion,KMinimumLddMinorVersion,KMinimumLddBuild))))
    89 	  (!Kern::QueryVersionSupported(aVer,TVersion(KMinimumLddMajorVersion,KMinimumLddMinorVersion,KMinimumLddBuild))))
    80 	return KErrNotSupported;
    90 		return KErrNotSupported;
    81   return KErrNone;
    91 	return KErrNone;
    82 }
    92 	}
       
    93 
       
    94 /* Reference counted open on Serial Block Drivers DfcQueue */
       
    95 TInt DDriverSyborgComm::OpenDfcQueue()
       
    96 	{
       
    97 	DPRINT("DDriverSyborgComm::OpenDfcQueue()");
       
    98 	if (iDfcQRefCount > 0)
       
    99 		{
       
   100 		iDfcQRefCount++;
       
   101 		return KErrNone;
       
   102 		}
       
   103 		
       
   104 	TInt err = Kern::DynamicDfcQCreate(iDfcQueue, KDfcQuePriority, KSerialDfcQName);
       
   105  
       
   106     if (!err)
       
   107 		{
       
   108 		iDfcQRefCount++;
       
   109 		}
       
   110     return err;
       
   111   }
       
   112 
       
   113 /*  Reference counted open on Serial Block Drivers DfcQueue */
       
   114 void DDriverSyborgComm::CloseDfcQueue()
       
   115 	{
       
   116 	DPRINT("DDriverSyborgComm::CloseDfcQueue()");
       
   117     iDfcQRefCount--;
       
   118     if (iDfcQRefCount == 0)
       
   119 		{
       
   120 		iDfcQueue->Destroy();
       
   121 		}
       
   122 	}
       
   123 
       
   124 TDfcQue* DDriverSyborgComm::DfcQueue()
       
   125 	{
       
   126     return iDfcQueue;
       
   127 	}
    83 
   128 
    84 // ---------------------------------------------------------------
   129 // ---------------------------------------------------------------
    85 // ---------------------------------------------------------------
   130 // ---------------------------------------------------------------
    86 
   131 
    87 DCommSyborgSoc::DCommSyborgSoc()
   132 DCommSyborgSoc::DCommSyborgSoc(DDriverSyborgComm* aDriverSyborgComm)
    88 {
   133 	:iDriverSyborgComm(aDriverSyborgComm)
    89 }
   134 	{
       
   135 	}
    90 
   136 
    91 DCommSyborgSoc::~DCommSyborgSoc()
   137 DCommSyborgSoc::~DCommSyborgSoc()
    92 {
   138 	{
    93   Interrupt::Unbind(iIrq);
   139 	(TInt)Interrupt::Unbind(iIrq);
    94 }
   140 	if (iDfcQueueOpened)
       
   141 		{
       
   142 		iDriverSyborgComm->CloseDfcQueue();
       
   143 		}
       
   144 	}
    95 
   145 
    96 TInt DCommSyborgSoc::DoCreate(TInt aUnit, const TDesC8* /*anInfo*/)
   146 TInt DCommSyborgSoc::DoCreate(TInt aUnit, const TDesC8* /*anInfo*/)
    97 {
   147 	{
    98   DPRINT2("DCommSyborgSoc::DoCreate %d",aUnit);
   148 	DPRINT2("DCommSyborgSoc::DoCreate %d",aUnit);
    99   switch(aUnit)
   149 	TInt err = KErrNone;
   100 	{
   150 	switch(aUnit)
   101 	case 0:
   151 		{
   102 	  iPortAddr = KHwBaseUart0;
   152 		case 0:
   103 	  iIrq = EIntSerial0;
   153 			iPortAddr = KHwBaseUart0;
   104 	  break;
   154 			iIrq = EIntSerial0;
   105 	case 1:
   155 			break;
   106 	  iPortAddr = KHwBaseUart1;
   156 		case 1:
   107 	  iIrq = EIntSerial1;
   157 			iPortAddr = KHwBaseUart1;
   108 	  break;
   158 			iIrq = EIntSerial1;
   109 	case 2:
   159 			break;
   110 	  iPortAddr = KHwBaseUart2;
   160 		case 2:
   111 	  iIrq = EIntSerial2;
   161 			iPortAddr = KHwBaseUart2;
   112 	  break;
   162 			iIrq = EIntSerial2;
   113 	case 3:
   163 			break;
   114 	  iPortAddr = KHwBaseUart3;
   164 		case 3:
   115 	  iIrq = EIntSerial3;
   165 			iPortAddr = KHwBaseUart3;
   116 	  break;
   166 			iIrq = EIntSerial3;
   117 	default:
   167 			break;
   118 	  iPortAddr = KHwBaseUart0;
   168 		default:
   119 	  iIrq = EIntSerial0;
   169 			err = KErrNotSupported;
   120 	  break;
   170 		break;
   121 	}
   171 		}
   122 
   172 
   123   Interrupt::Bind(EIntSerial0,Isr,this);
   173 	if (!err)
   124 
   174 		{
   125   return KErrNone;
   175 		err = iDriverSyborgComm->OpenDfcQueue();
   126 
   176 		iDfcQueueOpened = ETrue;
   127 }
   177 		}
       
   178 	if (!err)
       
   179 		{
       
   180 		err = Interrupt::Bind(iIrq,Isr,this);
       
   181 		}
       
   182 	return err;
       
   183 	}
   128 
   184 
   129 TInt DCommSyborgSoc::Start()
   185 TInt DCommSyborgSoc::Start()
   130 {
   186 	{
   131   DPRINT("DCommSyborgSoc::Start");
   187 	DPRINT("DCommSyborgSoc::Start");
   132   WriteReg(iPortAddr, SERIAL_INT_ENABLE, 0x1);
   188 	WriteReg(iPortAddr, SERIAL_INT_ENABLE, 0x1);
   133   Interrupt::Enable(iIrq);
   189 	TInt err = Interrupt::Enable(iIrq);
   134   return KErrNone;
   190 	return err;
   135 }
   191 	}
   136 
   192 
   137 void DCommSyborgSoc::Stop(TStopMode aMode)
   193 void DCommSyborgSoc::Stop(TStopMode aMode)
   138 {
   194 	{
   139   DPRINT("DCommSyborgSoc::Stop");
   195 	DPRINT("DCommSyborgSoc::Stop");
   140   WriteReg(iPortAddr, SERIAL_INT_ENABLE, 0x0);
   196 	WriteReg(iPortAddr, SERIAL_INT_ENABLE, 0x0);
   141   Interrupt::Disable(iIrq);
   197 	(TInt)Interrupt::Disable(iIrq);
   142 }
   198 	}
   143 
   199 
   144 void DCommSyborgSoc::Break(TBool aState)
   200 void DCommSyborgSoc::Break(TBool aState)
   145 {
   201 	{
   146   DPRINT("DCommSyborgSoc::Break");
   202 	DPRINT("DCommSyborgSoc::Break");
   147 }
   203 	}
   148 
   204 
   149 void DCommSyborgSoc::EnableTransmit()
   205 void DCommSyborgSoc::EnableTransmit()
   150 {
   206 	{
   151   DPRINT("DCommSyborgSoc::EnableTransmit");
   207 	DPRINT("DCommSyborgSoc::EnableTransmit");
   152   while (Kern::PowerGood())
   208 	while (Kern::PowerGood())
   153 	{
   209 		{
   154 	  TInt r=TransmitIsr();
   210 		TInt r=TransmitIsr();
   155 	  if (r<0)
   211 		if (r<0)
   156 		break;
   212 			{
   157 	  WriteReg(iPortAddr, SERIAL_DATA, r);
   213 			break;
   158 	}
   214 			}
   159 
   215 		WriteReg(iPortAddr, SERIAL_DATA, r);
   160 	iLdd->iTxError = KErrNone;
   216 		}
   161 	iLdd->iTxCompleteDfc.Add();
   217 
   162 
   218 	// Request LDD to check if more data is available in the client buffer.
   163 }
   219 	// TransmitISR only copies data from the LDD buffer which is 1k.
       
   220 	iLdd->CheckTxBuffer();
       
   221 	}
   164 
   222 
   165 TUint DCommSyborgSoc::Signals() const
   223 TUint DCommSyborgSoc::Signals() const
   166 {
   224 	{
   167   DPRINT("DCommSyborgSoc::Signals");
   225 	DPRINT("DCommSyborgSoc::Signals");
   168   return(0);
   226 	return(0);
   169 }
   227 	}
   170   
   228 
   171 void DCommSyborgSoc::SetSignals(TUint aSetMask, TUint aClearMask)
   229 void DCommSyborgSoc::SetSignals(TUint aSetMask, TUint aClearMask)
   172 {
   230 	{
   173   DPRINT("DCommSyborgSoc::SetSignals");
   231 	DPRINT("DCommSyborgSoc::SetSignals");
   174 }
   232 	}
   175 
   233 
   176 TInt DCommSyborgSoc::ValidateConfig(const TCommConfigV01 &aConfig) const
   234 TInt DCommSyborgSoc::ValidateConfig(const TCommConfigV01 &aConfig) const
   177 {
   235 	{
   178   DPRINT("DCommSyborgSoc::ValidateConfig");
   236 	DPRINT("DCommSyborgSoc::ValidateConfig");
   179   return KErrNone;
   237 	return KErrNone;
   180 }
   238 	}
   181 
   239 
   182 void DCommSyborgSoc::Configure(TCommConfigV01 &aConfig)
   240 void DCommSyborgSoc::Configure(TCommConfigV01 &aConfig)
   183 {
   241 	{
   184   DPRINT("DCommSyborgSoc::Configure");
   242 	DPRINT("DCommSyborgSoc::Configure");
   185 }
   243 	}
   186 
   244 
   187 void DCommSyborgSoc::Caps(TDes8 &aCaps) const
   245 void DCommSyborgSoc::Caps(TDes8 &aCaps) const
   188 {
   246 	{
   189   DPRINT("DCommSyborgSoc::Caps");
   247 	DPRINT("DCommSyborgSoc::Caps");
   190   TCommCaps3 capsBuf;
   248 	TCommCaps3 capsBuf;
   191   TCommCapsV03 &c=capsBuf();
   249 	TCommCapsV03 &c=capsBuf();
   192   c.iRate=KCapsBps110|KCapsBps150|KCapsBps300|KCapsBps600|KCapsBps1200|KCapsBps2400|KCapsBps4800|KCapsBps9600|KCapsBps19200|KCapsBps38400|KCapsBps57600|KCapsBps115200|KCapsBps230400;
   250 	c.iRate=KCapsBps110|KCapsBps150|KCapsBps300|KCapsBps600|KCapsBps1200|KCapsBps2400|KCapsBps4800|KCapsBps9600|KCapsBps19200|KCapsBps38400|KCapsBps57600|KCapsBps115200|KCapsBps230400;
   193   c.iDataBits=KCapsData5|KCapsData6|KCapsData7|KCapsData8;
   251 	c.iDataBits=KCapsData5|KCapsData6|KCapsData7|KCapsData8;
   194   c.iStopBits=KCapsStop1|KCapsStop2;
   252 	c.iStopBits=KCapsStop1|KCapsStop2;
   195   c.iParity=KCapsParityNone|KCapsParityEven|KCapsParityOdd;
   253 	c.iParity=KCapsParityNone|KCapsParityEven|KCapsParityOdd;
   196   c.iHandshake=KCapsObeyXoffSupported|KCapsSendXoffSupported|KCapsObeyCTSSupported|KCapsFailCTSSupported|KCapsObeyDSRSupported|KCapsFailDSRSupported|KCapsObeyDCDSupported|KCapsFailDCDSupported|KCapsFreeRTSSupported|KCapsFreeDTRSupported;
   254 	c.iHandshake=KCapsObeyXoffSupported|KCapsSendXoffSupported|KCapsObeyCTSSupported|KCapsFailCTSSupported|KCapsObeyDSRSupported|KCapsFailDSRSupported|KCapsObeyDCDSupported|KCapsFailDCDSupported|KCapsFreeRTSSupported|KCapsFreeDTRSupported;
   197   c.iSignals=KCapsSignalCTSSupported|KCapsSignalDSRSupported|KCapsSignalDCDSupported|KCapsSignalRTSSupported|KCapsSignalDTRSupported;
   255 	c.iSignals=KCapsSignalCTSSupported|KCapsSignalDSRSupported|KCapsSignalDCDSupported|KCapsSignalRTSSupported|KCapsSignalDTRSupported;
   198   c.iSIR=0;
   256 	c.iSIR=0;
   199   c.iNotificationCaps=KNotifyDataAvailableSupported|KNotifySignalsChangeSupported;
   257 	c.iNotificationCaps=KNotifyDataAvailableSupported|KNotifySignalsChangeSupported;
   200   c.iFifo=KCapsHasFifo;
   258 	c.iFifo=KCapsHasFifo;
   201   c.iRoleCaps=0;
   259 	c.iRoleCaps=0;
   202   c.iFlowControlCaps=0;
   260 	c.iFlowControlCaps=0;
   203   c.iBreakSupported=ETrue;
   261 	c.iBreakSupported=ETrue;
   204   aCaps.FillZ(aCaps.MaxLength());
   262 	aCaps.FillZ(aCaps.MaxLength());
   205   aCaps=capsBuf.Left(Min(capsBuf.Length(),aCaps.MaxLength()));
   263 	aCaps=capsBuf.Left(Min(capsBuf.Length(),aCaps.MaxLength()));
   206 }
   264 	}
   207 
   265 
   208 TInt DCommSyborgSoc::DisableIrqs()
   266 TInt DCommSyborgSoc::DisableIrqs()
   209 {
   267 	{
   210   DPRINT("DCommSyborgSoc::DisableIrqs");
   268 	DPRINT("DCommSyborgSoc::DisableIrqs");
   211   return NKern::DisableAllInterrupts();
   269 	return NKern::DisableAllInterrupts();
   212 }
   270 	}
   213 
   271 
   214 void DCommSyborgSoc::RestoreIrqs(TInt aIrq)
   272 void DCommSyborgSoc::RestoreIrqs(TInt aIrq)
   215 {
   273 	{
   216   DPRINT("DCommSyborgSoc::RestoreIrqs");
   274 	DPRINT("DCommSyborgSoc::RestoreIrqs");
   217   NKern::RestoreInterrupts(aIrq);
   275 	NKern::RestoreInterrupts(aIrq);
   218 }
   276 	}
   219 
   277 
   220 TDfcQue* DCommSyborgSoc::DfcQ(TInt /*aUnit*/)
   278 TDfcQue* DCommSyborgSoc::DfcQ(TInt aUnit)
   221 {
   279 	{
   222   return Kern::DfcQue0();
   280 	return iDriverSyborgComm->DfcQueue();
   223 }
   281 	}
   224 
   282 
   225 void DCommSyborgSoc::CheckConfig(TCommConfigV01& aConfig)
   283 void DCommSyborgSoc::CheckConfig(TCommConfigV01& aConfig)
   226 {
   284 	{
   227   DPRINT("DCommSyborgSoc::CheckConfig");
   285 	DPRINT("DCommSyborgSoc::CheckConfig");
   228 }
   286 	}
   229 
   287 
   230 void DCommSyborgSoc::Isr(TAny* aPtr)
   288 void DCommSyborgSoc::Isr(TAny* aPtr)
   231 {
   289 	{
   232   DCommSyborgSoc& d=*(DCommSyborgSoc*)aPtr;
   290 	DCommSyborgSoc& d=*(DCommSyborgSoc*)aPtr;
   233   TUint rx[32];
   291 	TUint rx[32];
   234   TInt rxi=0;
   292 	TInt rxi=0;
   235 
   293 
   236   DPRINT2("DCommSyborgSoc::Isr %x",d.iIrq);
   294 	TInt fifo = ReadReg(d.iPortAddr, SERIAL_FIFO_COUNT );
   237 
   295 	while(fifo > 0 && rxi<32)
   238   // Is now auto clear
   296 		{
   239   //  WriteReg(d.iPortAddr, SERIAL_CLEAR_INT, 0x0); // clear interrupts
   297 		TUint ch = ReadReg(d.iPortAddr, SERIAL_DATA);
   240 
   298 		rx[rxi++]=ch;
   241   while(ReadReg(d.iPortAddr, SERIAL_FIFO_COUNT)!=0) {
   299 
   242 	TUint ch = ReadReg(d.iPortAddr, SERIAL_DATA);
   300 		fifo = ReadReg(d.iPortAddr, SERIAL_FIFO_COUNT );
   243 	rx[rxi++]=ch;
   301 		}
   244   }
   302 	d.ReceiveIsr(rx,rxi,0);
   245   d.ReceiveIsr(rx,rxi,0);
   303 	}
   246 }
       
   247 
       
   248 // ---------------------------------------------------------------
       
   249 // ---------------------------------------------------------------
       
   250 
   304 
   251 DECLARE_STANDARD_PDD()
   305 DECLARE_STANDARD_PDD()
   252 {
   306 	{
   253   DPRINT("DECLARE_STANDARD_PDD()");
   307 	DPRINT("DECLARE_STANDARD_PDD()");
   254   return new DDriverSyborgComm;
   308 	return new DDriverSyborgComm;
   255 }
   309 	}
   256 
   310