omap3530/beagle_drivers/wb/api/hal/cyashalbeagleboard_spi.cpp
changeset 27 117faf51deac
equal deleted inserted replaced
26:b7e488c49d0d 27:117faf51deac
       
     1 // Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of the License "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 // omap3530/beagle_drivers/wb/cyashalbeagleboard_spi.cpp
       
    15 //
       
    16 
       
    17 #include <kern_priv.h>
       
    18 #include <beagle/beagle_gpio.h>
       
    19 #include <beagle/variant.h>
       
    20 #include <assp/omap3530_assp/omap3530_assp_priv.h>
       
    21 #include <assp/omap3530_assp/omap3530_irqmap.h> // GPIO interrupts
       
    22 #include <assp/omap3530_assp/omap3530_gpio.h>
       
    23 
       
    24 #include <assp.h> // Required for definition of TIsr
       
    25 
       
    26 #include <cyasregs.h> // Astoria register definitions
       
    27 #include <cyashalbeagleboard_spi.h>
       
    28 #include <cyashalbeagleboard.h>
       
    29 
       
    30 int gConfigured = 0 ;
       
    31 
       
    32 /***********************************************************************/
       
    33 /******************************* ISR  **********************************/
       
    34 /***********************************************************************/
       
    35 
       
    36 int
       
    37 CyAsHalBeagleBoard__SetupISR(void* handler, void* ptr)
       
    38 {
       
    39 
       
    40 	//Set up the button to proivde a panic button invoking Fault()
       
    41 	if(KErrNone != GPIO::SetPinDirection(KGPIO_INT, GPIO::EInput))
       
    42 		return KErrArgument;
       
    43 
       
    44 	GPIO::SetPinMode(KGPIO_INT, GPIO::EEnabled);
       
    45 
       
    46 	if(KErrNone !=GPIO::BindInterrupt(KGPIO_INT, (TGpioIsr)handler, (TAny*)ptr))
       
    47 		return KErrArgument;
       
    48 
       
    49 	/*EEdgeFalling*/
       
    50 	if(KErrNone !=GPIO::SetInterruptTrigger(KGPIO_INT, GPIO::ELevelLow))
       
    51 		return KErrArgument;
       
    52 
       
    53 	if(KErrNone !=GPIO::EnableInterrupt(KGPIO_INT))
       
    54 	{
       
    55 		GPIO::UnbindInterrupt(KGPIO_INT);
       
    56 		return KErrInUse;
       
    57 	}
       
    58 	return 0 ;
       
    59 }
       
    60 
       
    61 static void
       
    62 ManualTriggerISRTest(void)
       
    63 {
       
    64 	GPIO::TGpioState intState = GPIO::EHigh ;
       
    65 
       
    66 	GPIO::GetInputState(KGPIO_INT, intState);
       
    67 	Kern::Printf("KGPIO_INT before INT is %d", intState);
       
    68 
       
    69 	//Set INT to LOW state
       
    70 	CyAsHalBeagleBoardMcSPI4Ch0_WriteReg(CY_AS_MEM_P0_VM_SET, 0x0545) ;
       
    71 	GPIO::GetInputState(KGPIO_INT, intState);
       
    72 	Kern::Printf("KGPIO_INT after INT is %d", intState);
       
    73 
       
    74 	//return INT to HIGH state
       
    75 	CyAsHalBeagleBoardMcSPI4Ch0_WriteReg(CY_AS_MEM_P0_VM_SET, 0x0745) ;
       
    76 	GPIO::GetInputState(KGPIO_INT, intState);
       
    77 	Kern::Printf("KGPIO_INT after INT is %d", intState);
       
    78 }
       
    79 
       
    80 TUint32 gISRCnt = 1 ;
       
    81 TDfc* gpMyDfc;
       
    82 
       
    83 static void myTestDFCFn(
       
    84     TAny *aPtr)
       
    85 {
       
    86 
       
    87 	TUint32* gpISRCnt = (TUint32*)aPtr ;
       
    88 	Kern::Printf("myTestDFCFn called (%d)",*gpISRCnt);
       
    89 
       
    90 	*gpISRCnt += 1;
       
    91 
       
    92 	Kern::Printf("Enable interrupt");
       
    93 	GPIO::EnableInterrupt(KGPIO_INT) ;
       
    94 }
       
    95 
       
    96 static void myISR(TAny* aPtr)
       
    97 {
       
    98 	Kern::Printf("AstoriaISR");
       
    99 	gpMyDfc->Add();
       
   100 
       
   101 	Kern::Printf("Disable interrupt");
       
   102 	/* Disable Interrupt Here, it will be re-enabled by DFCs
       
   103 	GPIO::DisableInterrupt(KGPIO_INT) ;*/
       
   104 }
       
   105 
       
   106 /***********************************************************************/
       
   107 /**************************** SPI Driver *******************************/
       
   108 /***********************************************************************/
       
   109 
       
   110 extern void
       
   111 McSPI4Ch0_SetXFERLEVEL(TUint16 wcnt, TUint8 afl, TUint8 ael)
       
   112 {
       
   113 	TUint32 r = wcnt ;
       
   114 
       
   115 	r <<= 16 ;
       
   116 	r |= (afl & 0x3f) << 8 ;
       
   117 	r |= (ael & 0x3f) ;
       
   118 
       
   119 	AsspRegister::Write32(KMcSPI4_XFERLEVEL, r);
       
   120 }
       
   121 
       
   122 inline void McSPI4Ch0_Enable(void)
       
   123 {
       
   124 	/* Enable channel 0 */
       
   125 	AsspRegister::Write32(KMcSPI4_CH0CTRL, 0x1);
       
   126 }
       
   127 
       
   128 inline void McSPI4Ch0_Disable(void)
       
   129 {
       
   130 	/* Disable channel 0 */
       
   131 	AsspRegister::Write32(KMcSPI4_CH0CTRL, 0x0);
       
   132 }
       
   133 
       
   134 inline void McSPI4Ch0_TransmitMode(void)
       
   135 {
       
   136 	AsspRegister::Modify32(KMcSPI4_CH0CONF, 0x0, 0x1<<13);
       
   137 }
       
   138 
       
   139 inline void McSPI4Ch0_TransmitAndReceiveMode(void)
       
   140 {
       
   141 	AsspRegister::Modify32(KMcSPI4_CH0CONF, 0x1<<13, 0x0);
       
   142 }
       
   143 
       
   144 extern
       
   145 void McSPI4Ch0_SyncSlave(void)
       
   146 {
       
   147 	Kern::Printf("Sync With SPI slave not implemented\n");
       
   148 }
       
   149 
       
   150 inline void CheckForTxEmpty(void)
       
   151 {
       
   152 	TUint32 r ;
       
   153 	for(;;)
       
   154 	{
       
   155 		r = AsspRegister::Read32(KMcSPI4_CH0STAT);
       
   156 		if ( r & 0x2)
       
   157 		{
       
   158 			break;
       
   159 		}
       
   160 		Kern::Printf("Waiting for TX empty.");
       
   161 	}
       
   162 }
       
   163 
       
   164 inline void CheckForRxFull(void)
       
   165 {
       
   166 	TUint32 r ;
       
   167 	for(;;)
       
   168 	{
       
   169 		r = AsspRegister::Read32(KMcSPI4_CH0STAT);
       
   170 		if ( r & 0x1)
       
   171 		{
       
   172 			break;
       
   173 		}
       
   174 		Kern::Printf("Waiting for RX full.");
       
   175 	}
       
   176 }
       
   177 
       
   178 inline void CheckForTxEmptyRxFull(void)
       
   179 {
       
   180 	TUint32 r ;
       
   181 	for(;;)
       
   182 	{
       
   183 		r = AsspRegister::Read32(KMcSPI4_CH0STAT);
       
   184 		if ( r & 0x3)
       
   185 		{
       
   186 			break;
       
   187 		}
       
   188 		Kern::Printf("Waiting for TX empty and RX full.");
       
   189 	}
       
   190 }
       
   191 
       
   192 extern void
       
   193 McSPI4Ch0_DumpAstoriaRegs(int allReg)
       
   194 {
       
   195 	int i ;
       
   196 	TUint16 regVal = 0 ;
       
   197 
       
   198 	for ( i = 0x80 ; i < 0xfb ; i++ )
       
   199 	{
       
   200 		if ( (i == 0x84) ||
       
   201 		     ((i >= 0x87) && (i <= 0x8f)) ||
       
   202 		     (i == 0x93) ||
       
   203 		     ((i >= 0x96) && (i <= 0x97)) ||
       
   204 		     (i == 0x99) ||
       
   205 		     ((i >= 0x9b) && (i <= 0x9f)) ||
       
   206 		     ((i >= 0xb0) && (i <= 0xbf)) ||
       
   207 		     ((i >= 0xc6) && (i <= 0xd8)) ||
       
   208 		     ((i >= 0xe3) && (i <= 0xef)) ||
       
   209 		     ((i >= 0xf4) && (i <= 0xf7)) )
       
   210 		{
       
   211 			/*skip*/
       
   212 			continue ;
       
   213 		}
       
   214 
       
   215 		regVal = 0 ;
       
   216 		if ( allReg )
       
   217 			CyAsHalBeagleBoardMcSPI4Ch0_ReadReg(i, &regVal) ;
       
   218 		else
       
   219 			CyAsHalBeagleBoardMcSPI4Ch0_ReadReg(CY_AS_MEM_CM_WB_CFG_ID, &regVal) ;
       
   220 		Kern::Printf("REG[%02x] = 0x%04x", i, regVal);
       
   221 	}
       
   222 }
       
   223 
       
   224 static int
       
   225 AstoriaRegTest(int type)
       
   226 {
       
   227 	int errCnt = 0 ;
       
   228 	int i ;
       
   229 	for ( i= 0 ; i < 100 ; i++ )
       
   230 	{
       
   231 		TUint16 regVal0 = 0, regVal1 = 0, regVal2 = 0, regVal3 = 0 ;
       
   232 		TUint16 expVal = 0 ;
       
   233 
       
   234 		if ( type == 1 )
       
   235 		{
       
   236 			Kern::Printf("Write/Read Register with sequential value...");
       
   237 			CyAsHalBeagleBoardMcSPI4Ch0_WriteReg(0xf8, (i+1)) ;
       
   238 			CyAsHalBeagleBoardMcSPI4Ch0_WriteReg(0xf9, (i+2)) ;
       
   239 			CyAsHalBeagleBoardMcSPI4Ch0_WriteReg(0xfa, (i+3)) ;
       
   240 			CyAsHalBeagleBoardMcSPI4Ch0_WriteReg(0xfb, (i+4)) ;
       
   241 		}
       
   242 		else if ( type == 2 )
       
   243 		{
       
   244 			Kern::Printf("Write/Read 0xffff and 0x0 ...");
       
   245 			if ( i % 2 == 0 )
       
   246 			{
       
   247 				expVal = 0xffff ;
       
   248 				CyAsHalBeagleBoardMcSPI4Ch0_WriteReg(0xf8, expVal) ;
       
   249 				CyAsHalBeagleBoardMcSPI4Ch0_WriteReg(0xf9, ~expVal) ;
       
   250 				CyAsHalBeagleBoardMcSPI4Ch0_WriteReg(0xfa, expVal) ;
       
   251 				CyAsHalBeagleBoardMcSPI4Ch0_WriteReg(0xfb, ~expVal) ;
       
   252 
       
   253 			}
       
   254 			else
       
   255 			{
       
   256 				expVal = 0x0 ;
       
   257 				CyAsHalBeagleBoardMcSPI4Ch0_WriteReg(0xf8, expVal) ;
       
   258 				CyAsHalBeagleBoardMcSPI4Ch0_WriteReg(0xf9, ~expVal) ;
       
   259 				CyAsHalBeagleBoardMcSPI4Ch0_WriteReg(0xfa, expVal) ;
       
   260 				CyAsHalBeagleBoardMcSPI4Ch0_WriteReg(0xfb, ~expVal) ;
       
   261 			}
       
   262 		}
       
   263 		else if ( type == 3 )
       
   264 		{
       
   265 			Kern::Printf("Write/Read 0x5555 and 0xaaaa ...");
       
   266 			if ( i % 2 == 0 )
       
   267 			{
       
   268 				expVal = 0x5555 ;
       
   269 				CyAsHalBeagleBoardMcSPI4Ch0_WriteReg(0xf8, expVal) ;
       
   270 				CyAsHalBeagleBoardMcSPI4Ch0_WriteReg(0xf9, ~expVal) ;
       
   271 				CyAsHalBeagleBoardMcSPI4Ch0_WriteReg(0xfa, expVal) ;
       
   272 				CyAsHalBeagleBoardMcSPI4Ch0_WriteReg(0xfb, ~expVal) ;
       
   273 			}
       
   274 			else
       
   275 			{
       
   276 				expVal = 0xaaaa ;
       
   277 				CyAsHalBeagleBoardMcSPI4Ch0_WriteReg(0xf8, expVal) ;
       
   278 				CyAsHalBeagleBoardMcSPI4Ch0_WriteReg(0xf9, ~expVal) ;
       
   279 				CyAsHalBeagleBoardMcSPI4Ch0_WriteReg(0xfa, expVal) ;
       
   280 				CyAsHalBeagleBoardMcSPI4Ch0_WriteReg(0xfb, ~expVal) ;
       
   281 			}
       
   282 		}
       
   283 
       
   284 		CyAsHalBeagleBoardMcSPI4Ch0_ReadReg(0xf8, &regVal0) ;
       
   285 		CyAsHalBeagleBoardMcSPI4Ch0_ReadReg(0xf9, &regVal1) ;
       
   286 		CyAsHalBeagleBoardMcSPI4Ch0_ReadReg(0xfa, &regVal2) ;
       
   287 		CyAsHalBeagleBoardMcSPI4Ch0_ReadReg(0xfb, &regVal3) ;
       
   288 
       
   289 		if ( (type == 1) &&
       
   290 			 (   (regVal0 != (i+1)) ||
       
   291 				 (regVal1 != (i+2)) ||
       
   292 				 (regVal2 != (i+3)) ||
       
   293 				 (regVal3 != (i+4)) ))
       
   294 		{
       
   295 			Kern::Printf("ERROR: Write register failed (%d)\n",i);
       
   296 			Kern::Printf("ERROR: Exp[0]: 0x%04x\n",i+1);
       
   297 			Kern::Printf("ERROR: Act[0]: 0x%04x\n",regVal0);
       
   298 			Kern::Printf("ERROR: Exp[1]: 0x%04x\n",i+2);
       
   299 			Kern::Printf("ERROR: Act[1]: 0x%04x\n",regVal1);
       
   300 			Kern::Printf("ERROR: Exp[2]: 0x%04x\n",i+3);
       
   301 			Kern::Printf("ERROR: Act[2]: 0x%04x\n",regVal2);
       
   302 			Kern::Printf("ERROR: Exp[3]: 0x%04x\n",i+4);
       
   303 			Kern::Printf("ERROR: Act[3]: 0x%04x\n",regVal3);
       
   304 
       
   305 			errCnt++ ;
       
   306 			if ( errCnt > 10 )
       
   307 				return 1;
       
   308 		}
       
   309 		else if ( (type != 1 ) &&
       
   310 				  ((regVal0 != expVal) ||
       
   311 				   (regVal1 != ((~expVal)&0xffff)) ||
       
   312 				   (regVal2 != expVal) ||
       
   313 				   (regVal3 != ((~expVal)&0xffff)) ))
       
   314 		{
       
   315 			Kern::Printf("ERROR: Write register failed (%d)\n",i);
       
   316 			Kern::Printf("ERROR: Exp[0]: 0x%04x\n",expVal);
       
   317 			Kern::Printf("ERROR: Act[0]: 0x%04x\n",regVal0);
       
   318 			Kern::Printf("ERROR: Exp[1]: 0x%04x\n",(~expVal)&0xffff);
       
   319 			Kern::Printf("ERROR: Act[1]: 0x%04x\n",regVal1);
       
   320 			Kern::Printf("ERROR: Exp[2]: 0x%04x\n",expVal);
       
   321 			Kern::Printf("ERROR: Act[2]: 0x%04x\n",regVal2);
       
   322 			Kern::Printf("ERROR: Exp[3]: 0x%04x\n",(~expVal)&0xffff);
       
   323 			Kern::Printf("ERROR: Act[3]: 0x%04x\n",regVal3);
       
   324 
       
   325 			errCnt++ ;
       
   326 			if ( errCnt > 10 )
       
   327 				return 1 ;
       
   328 		}
       
   329 
       
   330 	}
       
   331 	Kern::Printf("Register test PASSED!!\n");
       
   332 	return 0 ;
       
   333 }
       
   334 
       
   335 /******************************************************************************/
       
   336 /******************************************************************************/
       
   337 /******************************************************************************/
       
   338 
       
   339 static void
       
   340 DumpMcSPI4Reg(void)
       
   341 {
       
   342 	TUint32 r ;
       
   343 	TUint32 i;
       
   344 
       
   345 	for ( i = KMcSPI4_SYSCONFIG ; i <= KMcSPI4_RX0 ; i+=0x4 )
       
   346 	{
       
   347 		r = AsspRegister::Read32(i);
       
   348 		switch (i)
       
   349 		{
       
   350 			case KMcSPI4_SYSCONFIG:
       
   351 				Kern::Printf("KMcSPI4_SYSCONFIG = (0x%08x)", r);
       
   352 				break;
       
   353 			case KMcSPI4_SYSSTATUS:
       
   354 				Kern::Printf("KMcSPI4_SYSSTATUS = (0x%08x)", r);
       
   355 				break;
       
   356 			case KMcSPI4_IRQSTATUS:
       
   357 				Kern::Printf("KMcSPI4_IRQSTATUS = (0x%08x)", r);
       
   358 				break;
       
   359 			case KMcSPI4_IRQENABLE:
       
   360 				Kern::Printf("KMcSPI4_IRQENABLE = (0x%08x)", r);
       
   361 				break;
       
   362 			case KMcSPI4_WAKEUPEN:
       
   363 				Kern::Printf("KMcSPI4_WAKEUPEN = (0x%08x)", r);
       
   364 				break;
       
   365 			case KMcSPI4_SYST:
       
   366 				Kern::Printf("KMcSPI4_SYST = (0x%08x)", r);
       
   367 				break;
       
   368 			case KMcSPI4_MODULCTRL:
       
   369 				Kern::Printf("KMcSPI4_MODULCTRL = (0x%08x)", r);
       
   370 				break;
       
   371 			case KMcSPI4_CH0CONF:
       
   372 				Kern::Printf("KMcSPI4_CH0CONF = (0x%08x)", r);
       
   373 				break;
       
   374 			case KMcSPI4_CH0STAT:
       
   375 				Kern::Printf("KMcSPI4_CH0STAT = (0x%08x)", r);
       
   376 				break;
       
   377 			case KMcSPI4_CH0CTRL:
       
   378 				Kern::Printf("KMcSPI4_CH0CTRL = (0x%08x)", r);
       
   379 				break;
       
   380 			case KMcSPI4_TX0:
       
   381 				Kern::Printf("KMcSPI4_TX0 = (0x%08x)", r);
       
   382 				break;
       
   383 			case KMcSPI4_RX0:
       
   384 				Kern::Printf("KMcSPI4_RX0 = (0x%08x)", r);
       
   385 				break;
       
   386 			case KMcSPI4_XFERLEVEL:
       
   387 				Kern::Printf("KMcSPI4_XFERLEVEL = (0x%08x)", r);
       
   388 				break;
       
   389 			default:
       
   390 				Kern::Printf("ERROR: unknow register value", r);
       
   391 		}
       
   392 	}
       
   393 
       
   394 	r = AsspRegister::Read32(KMcSPI4_XFERLEVEL);
       
   395 	Kern::Printf("KMcSPI4_XFERLEVEL = (0x%08x)\n", r);
       
   396 }
       
   397 
       
   398 inline TUint32 constructSPIConfigReg(
       
   399 		TUint8 PHA,
       
   400 		TUint8 POL,
       
   401 		TUint8 CLKD,
       
   402 		TUint8 EPOL,
       
   403 		TUint8 WL,
       
   404 		TUint8 TRM,
       
   405 		TUint8 DMAW,
       
   406 		TUint8 DMAR,
       
   407 		TUint8 DPE0,
       
   408 		TUint8 DPE1,
       
   409 		TUint8 IS,
       
   410 		TUint8 TURBO,
       
   411 		TUint8 FORCE,
       
   412 		TUint8 SPIENSLV,
       
   413 		TUint8 SBE,
       
   414 		TUint8 SBPOL,
       
   415 		TUint8 TCS,
       
   416 		TUint8 FFEW,
       
   417 		TUint8 FFER,
       
   418 		TUint8 CLKG)
       
   419 {
       
   420 	TUint32 r = 0 ;
       
   421 
       
   422 	r = ( CLKG & 0x1 ) << 29;
       
   423 	r |= ( FFER & 0x1 ) << 28;
       
   424 	r |= ( FFEW & 0x1 ) << 27;
       
   425 	r |= ( TCS & 0x3 ) << 25;
       
   426 	r |= ( SBPOL & 0x1 ) << 24;
       
   427 	r |= ( SBE & 0x1 ) << 23;
       
   428 	r |= ( SPIENSLV & 0x3 ) << 21;
       
   429 	r |= ( FORCE & 0x1 ) << 20;
       
   430 	r |= ( TURBO & 0x1 ) << 19;
       
   431 	r |= ( IS & 0x1 ) << 18;
       
   432 	r |= ( DPE1 & 0x1 ) << 17;
       
   433 	r |= ( DPE0 & 0x1 ) << 16;
       
   434 	r |= ( DMAR & 0x1 ) << 15;
       
   435 	r |= ( DMAW & 0x1 ) << 14;
       
   436 	r |= ( TRM & 0x3 ) << 12;
       
   437 	r |= ( WL & 0x1f ) << 7;
       
   438 	r |= ( EPOL & 0x1 ) << 6;
       
   439 	r |= ( CLKD & 0xf ) << 2;
       
   440 	r |= ( POL & 0x1 ) << 1;
       
   441 	r |= PHA & 0x1;
       
   442 	return r ;
       
   443 }
       
   444 
       
   445 static void ConfigMcSPI4Ch0(void)
       
   446 {
       
   447 	TUint32 r ;
       
   448 	Kern::Printf("Configure McSPI4 CH0...\n");
       
   449 
       
   450 	/* Enable McSPI4 functional clock */
       
   451 	r = AsspRegister::Read32(KCM_FCLKEN1_CORE);
       
   452 	AsspRegister::Write32(KCM_FCLKEN1_CORE, (r | 0x200000));
       
   453 
       
   454 	/* Enable McSPI4 interface clock */
       
   455 	r = AsspRegister::Read32(KCM_ICLKEN1_CORE);
       
   456 	AsspRegister::Write32(KCM_ICLKEN1_CORE, (r | 0x200000));
       
   457 
       
   458 	/* Software reset McSPI4 */
       
   459 	AsspRegister::Write32(KMcSPI4_SYSCONFIG, 0x1);
       
   460 
       
   461 	/* Wait until RESETDONE is set in SYSSTATUS */
       
   462 	do
       
   463 	{
       
   464 		r = AsspRegister::Read32(KMcSPI4_SYSSTATUS);
       
   465 		Kern::Printf("KMcSPI4_SYSSTATUS = (0x%08x)\n", r);
       
   466 	}while((r & 0x1) != 1);
       
   467 
       
   468 	/* Disable channel 0 */
       
   469 	McSPI4Ch0_Disable();
       
   470 
       
   471 	/* Disable all interrupts */
       
   472 	AsspRegister::Write32(KMcSPI4_IRQENABLE, 0x0);
       
   473 
       
   474 	/* Clear all interrupts */
       
   475 	AsspRegister::Write32(KMcSPI4_IRQSTATUS, 0x1777f);
       
   476 
       
   477 	/* Set Master mode */
       
   478 #ifdef SINGLE_CHANNEL_MASTER_MODE
       
   479 	AsspRegister::Write32(KMcSPI4_MODULCTRL, 0x1);
       
   480 #else
       
   481 	AsspRegister::Write32(KMcSPI4_MODULCTRL, 0x0);
       
   482 #endif
       
   483 
       
   484 
       
   485 	/* Config clock, wl */
       
   486 	r = constructSPIConfigReg(
       
   487 			0x0, /*PHA*/
       
   488 			0x0, /*POL*/
       
   489 			0x2, /*CLKD 	(divider 2 = 12MHz)3 = 6MHz*/
       
   490 			0x1, /*EPOL 	(active low)*/
       
   491 			0x7, /*WL		(8bit)*/
       
   492 			0x0, /*TRM 		(Transmit and receive mode)*/
       
   493 			0x0, /*DMAW 	(DMAW disable) TODO*/
       
   494 			0x0, /*DMAR 	(DMAR disable) TODO*/
       
   495 			0x1, /*DPE0 	(spim_somi no transmission)*/
       
   496 			0x0, /*DPE1 	(spim_simo transmission)*/
       
   497 			0x0, /*IS		(spim_somi reception)*/
       
   498 			0x0, /*TURBO 	(mutli spi-word transfer)*/
       
   499 			0x0, /*FORCE 	TODO*/
       
   500 			0x0, /*SPIENSLV (not used)*/
       
   501 			0x0, /*SBE		(no start bit) TODO*/
       
   502 			0x0, /*SBPOL	(start bit polarity) */
       
   503 			0x0, /*TCS		(cs time control) TODO*/
       
   504 			0x0, /*FFEW		(FIFO enabled) TODO*/
       
   505 			0x0, /*FFER		(FIFO enabled) TODO*/
       
   506 			0x0  /*CLKG		(One clock cycle granularity)*/
       
   507 			);
       
   508 
       
   509 	AsspRegister::Write32(KMcSPI4_CH0CONF, r);
       
   510 
       
   511 }
       
   512 
       
   513 static void
       
   514 SetPADConfigRegister(void)
       
   515 {
       
   516 	TUint32 r ;
       
   517 	Kern::Printf("Set PAD configuration registers...\n");
       
   518 
       
   519 	/* MUXMODE = 1, INPUTENABLE for SOMI */
       
   520 	AsspRegister::Write32(KPADCONFIG_McSPI4_SIMO_P12_0, 0x1010001);
       
   521 
       
   522 	r = AsspRegister::Read32(KPADCONFIG_McSPI4_CS0_P16_16);
       
   523 	AsspRegister::Write32(KPADCONFIG_McSPI4_CS0_P16_16, ((r & 0xffff) | 0x10000));
       
   524 
       
   525 	/* NOTE:
       
   526 	   we must set SPI clock INPUTENABLE bit otherwise the RX register will not
       
   527 	   latch any data */
       
   528 	AsspRegister::Write32(KPADCONFIG_McSPI4_CLK_P20_0, 0x40001 | 0x0100);
       
   529 
       
   530 	/* MUXMODE = 4 */
       
   531 	r = AsspRegister::Read32(KPADCONFIG_GPIO183_P23_0);
       
   532 	//AsspRegister::Write32(KPADCONFIG_GPIO183_P23_0, ((r & 0xffff0000) | 0x4 | 0x8 | 0x0100));
       
   533 	AsspRegister::Write32(KPADCONFIG_GPIO183_P23_0, ((r & 0xffff0000) | 0x4 ));
       
   534 
       
   535 	r = AsspRegister::Read32(KPADCONFIG_GPIO168_P24_16);
       
   536 	AsspRegister::Write32(KPADCONFIG_GPIO168_P24_16, ((r & 0xffff) | 0x40000 | 0x01000000));
       
   537 
       
   538 }
       
   539 
       
   540 static void
       
   541 ReadPADConfigRegister(void)
       
   542 {
       
   543 	TUint32 r ;
       
   544 
       
   545 	Kern::Printf("Reading PAD configuration registers...");
       
   546 	r = AsspRegister::Read32(KPADCONFIG_McSPI4_SIMO_P12_0);
       
   547 	Kern::Printf("KPADCONFIG_McSPI4_SIMO_P12_0 = (0x%08x)", r);
       
   548 
       
   549 	r = AsspRegister::Read32(KPADCONFIG_McSPI4_SIMO_P18_16);
       
   550 	Kern::Printf("KPADCONFIG_McSPI4_SIMO_P18_16 = (0x%08x)", r);
       
   551 
       
   552 	r = AsspRegister::Read32(KPADCONFIG_McSPI4_CS0_P16_16);
       
   553 	Kern::Printf("KPADCONFIG_McSPI4_CS0_P16_16 = (0x%08x)", r);
       
   554 
       
   555 	r = AsspRegister::Read32(KPADCONFIG_McSPI4_CLK_P20_0);
       
   556 	Kern::Printf("KPADCONFIG_McSPI4_CLK_P20_0 = (0x%08x)", r);
       
   557 
       
   558 	r = AsspRegister::Read32(KPADCONFIG_GPIO157_P22_16);
       
   559 	Kern::Printf("KPADCONFIG_GPIO157_P22_16 = (0x%08x)", r);
       
   560 
       
   561 	r = AsspRegister::Read32(KPADCONFIG_GPIO183_P23_0);
       
   562 	Kern::Printf("KPADCONFIG_GPIO183_P23_0 = (0x%08x)", r);
       
   563 
       
   564 	r = AsspRegister::Read32(KPADCONFIG_GPIO168_P24_16);
       
   565 	Kern::Printf("KPADCONFIG_GPIO168_P24_16 = (0x%08x)", r);
       
   566 
       
   567 }
       
   568 
       
   569 /***********************************************************************/
       
   570 /****************************   Public   *******************************/
       
   571 /***********************************************************************/
       
   572 
       
   573 void
       
   574 CyAsHalBeagleBoardMcSPI4Ch0_WriteEP(TUint32 addr, TUint8* buff, TUint16 size)
       
   575 {
       
   576 	TUint8 size_l = size ;
       
   577 	TUint8 size_h = (size >> 8)&0x7f ;
       
   578 	TUint16 size16 = size / 2 ;
       
   579 	TUint8* p = buff ;
       
   580 
       
   581 	TUint32 r ;
       
   582 
       
   583 	r = 0x00800000;
       
   584 	r |= (addr & 0xff) << 8 ;
       
   585 	r |= size_l << 24 ;
       
   586 	r |= size_h << 16 ;
       
   587 #ifdef SPI_DEBUG_LOG
       
   588 	Kern::Printf("WB SPI write packet header = (0x%08x)", r);
       
   589 #endif
       
   590 	/* Set McSPI4Ch0 to Transmit only mode for write */
       
   591 	McSPI4Ch0_TransmitMode();
       
   592 
       
   593 	McSPI4Ch0_Enable();
       
   594 
       
   595 	CheckForTxEmpty();
       
   596 	AsspRegister::Write32(KMcSPI4_TX0, r);
       
   597 	CheckForTxEmpty();
       
   598 	AsspRegister::Write32(KMcSPI4_TX0, r>>8);
       
   599 	CheckForTxEmpty();
       
   600 	AsspRegister::Write32(KMcSPI4_TX0, r>>16);
       
   601 	CheckForTxEmpty();
       
   602 	AsspRegister::Write32(KMcSPI4_TX0, r>>24);
       
   603 
       
   604 	while(size16 != 0)
       
   605 	{
       
   606 		CheckForTxEmpty();
       
   607 		AsspRegister::Write32(KMcSPI4_TX0, *(p+1));
       
   608 		CheckForTxEmpty();
       
   609 		AsspRegister::Write32(KMcSPI4_TX0, *p);
       
   610 
       
   611 /*#ifdef SPI_DEBUG_LOG
       
   612 		Kern::Printf("0x%02x", *(p+1));
       
   613 		Kern::Printf("0x%02x", *p);
       
   614 #endif*/
       
   615 		p+=2 ;
       
   616 		size16-- ;
       
   617 	}
       
   618 
       
   619 	CheckForTxEmpty();
       
   620 
       
   621 	McSPI4Ch0_Disable();
       
   622 
       
   623 	/*
       
   624 	 * Change back to Transmit and Receive mode for RegRead
       
   625 	 */
       
   626 	McSPI4Ch0_TransmitAndReceiveMode();
       
   627 
       
   628 }
       
   629 
       
   630 void
       
   631 CyAsHalBeagleBoardMcSPI4Ch0_ReadEP(TUint32 addr, TUint8* buff, TUint16 size)
       
   632 {
       
   633 	TUint8 size_l = size ;
       
   634 	TUint8 size_h = (size >> 8)&0x7f ;
       
   635 	TUint16 size16 = size / 2 ;
       
   636 	TUint32 r ;
       
   637 
       
   638 	r = 0x00000000;
       
   639 	r |= (addr & 0xff) << 8 ;
       
   640 	r |= size_l << 24 ;
       
   641 	r |= size_h << 16 ;
       
   642 #ifdef SPI_DEBUG_LOG
       
   643 	Kern::Printf("WB SPI read packet header = (0x%08x)", r);
       
   644 #endif
       
   645 
       
   646 	McSPI4Ch0_Enable();
       
   647 
       
   648 	{
       
   649 		CheckForTxEmpty();
       
   650 		AsspRegister::Write32(KMcSPI4_TX0, r);
       
   651 		CheckForTxEmptyRxFull();
       
   652 		AsspRegister::Read32(KMcSPI4_RX0);
       
   653 
       
   654 		AsspRegister::Write32(KMcSPI4_TX0, r>>8);
       
   655 		CheckForTxEmptyRxFull();
       
   656 		AsspRegister::Read32(KMcSPI4_RX0);
       
   657 
       
   658 
       
   659 		AsspRegister::Write32(KMcSPI4_TX0, r>>16);
       
   660 		CheckForTxEmptyRxFull();
       
   661 		AsspRegister::Read32(KMcSPI4_RX0);
       
   662 
       
   663 		AsspRegister::Write32(KMcSPI4_TX0, r>>24);
       
   664 		CheckForTxEmptyRxFull();
       
   665 		AsspRegister::Read32(KMcSPI4_RX0);
       
   666 
       
   667 		while(size16 != 0)
       
   668 		{
       
   669 			AsspRegister::Write32(KMcSPI4_TX0, 0);
       
   670 			CheckForTxEmptyRxFull();
       
   671 			*(buff+1) = AsspRegister::Read32(KMcSPI4_RX0);
       
   672 
       
   673 			AsspRegister::Write32(KMcSPI4_TX0, 0);
       
   674 			CheckForTxEmptyRxFull();
       
   675 			*buff = AsspRegister::Read32(KMcSPI4_RX0);
       
   676 
       
   677 			buff+=2;
       
   678 			size16--;
       
   679 
       
   680 		}
       
   681 
       
   682 	}
       
   683 
       
   684 	McSPI4Ch0_Disable();
       
   685 
       
   686 }
       
   687 
       
   688 void
       
   689 CyAsHalBeagleBoardMcSPI4Ch0_WriteReg(TUint32 addr, TUint16 value)
       
   690 {
       
   691 	TUint32 r ;
       
   692 
       
   693 	r = 0x02800000;
       
   694 	r |= (addr & 0xff) << 8 ;
       
   695 #ifdef SPI_DEBUG_LOG
       
   696 	Kern::Printf("WB SPI write packet header = (0x%08x), value = (0x%04x)", r, value);
       
   697 #endif
       
   698 
       
   699 	/* Set McSPI4Ch0 to Transmit only mode for write */
       
   700 	McSPI4Ch0_TransmitMode();
       
   701 
       
   702 	McSPI4Ch0_Enable();
       
   703 
       
   704 	CheckForTxEmpty();
       
   705 	AsspRegister::Write32(KMcSPI4_TX0, r);
       
   706 	CheckForTxEmpty();
       
   707 	AsspRegister::Write32(KMcSPI4_TX0, r>>8);
       
   708 	CheckForTxEmpty();
       
   709 	AsspRegister::Write32(KMcSPI4_TX0, r>>16);
       
   710 	CheckForTxEmpty();
       
   711 	AsspRegister::Write32(KMcSPI4_TX0, r>>24);
       
   712 	CheckForTxEmpty();
       
   713 	AsspRegister::Write32(KMcSPI4_TX0, value>>8);
       
   714 	CheckForTxEmpty();
       
   715 	AsspRegister::Write32(KMcSPI4_TX0, value & 0xff );
       
   716 	CheckForTxEmpty();
       
   717 
       
   718 	McSPI4Ch0_Disable();
       
   719 
       
   720 	/*
       
   721 	 * Change back to Transmit and Receive mode for RegRead
       
   722 	 */
       
   723 	McSPI4Ch0_TransmitAndReceiveMode();
       
   724 }
       
   725 
       
   726 void
       
   727 CyAsHalBeagleBoardMcSPI4Ch0_ReadReg(TUint32 addr, TUint16* value)
       
   728 {
       
   729 	TUint32 r ;
       
   730 
       
   731 	r = 0x02000000;
       
   732 	r |= (addr & 0xff) << 8 ;
       
   733 #ifdef SPI_DEBUG_LOG
       
   734 	Kern::Printf("WB SPI read packet header = (0x%08x)", r);
       
   735 #endif
       
   736 
       
   737 	McSPI4Ch0_Enable();
       
   738 
       
   739 	{
       
   740 		TUint16 v ;
       
   741 
       
   742 		CheckForTxEmpty();
       
   743 		AsspRegister::Write32(KMcSPI4_TX0, r);
       
   744 		CheckForTxEmptyRxFull();
       
   745 		AsspRegister::Read32(KMcSPI4_RX0);
       
   746 
       
   747 		AsspRegister::Write32(KMcSPI4_TX0, r>>8);
       
   748 		CheckForTxEmptyRxFull();
       
   749 		AsspRegister::Read32(KMcSPI4_RX0);
       
   750 
       
   751 
       
   752 		AsspRegister::Write32(KMcSPI4_TX0, r>>16);
       
   753 		CheckForTxEmptyRxFull();
       
   754 		AsspRegister::Read32(KMcSPI4_RX0);
       
   755 
       
   756 		AsspRegister::Write32(KMcSPI4_TX0, r>>24);
       
   757 		CheckForTxEmptyRxFull();
       
   758 		AsspRegister::Read32(KMcSPI4_RX0);
       
   759 
       
   760 		AsspRegister::Write32(KMcSPI4_TX0, 0);
       
   761 		CheckForTxEmptyRxFull();
       
   762 		v = AsspRegister::Read32(KMcSPI4_RX0);
       
   763 		*value = v << 8;
       
   764 
       
   765 		AsspRegister::Write32(KMcSPI4_TX0, 0);
       
   766 		CheckForTxEmptyRxFull();
       
   767 		v = AsspRegister::Read32(KMcSPI4_RX0);
       
   768 		*value |= v & 0xff;
       
   769 
       
   770 	}
       
   771 
       
   772 	McSPI4Ch0_Disable();
       
   773 
       
   774 }
       
   775 
       
   776 int
       
   777 CyAsHalBeagleBoard__ConfigureSPI(void)
       
   778 {
       
   779 	/*Configure PAD*/
       
   780 	ReadPADConfigRegister();
       
   781 	SetPADConfigRegister();
       
   782 	ReadPADConfigRegister();
       
   783 
       
   784 	/*Configure McSPI4*/
       
   785 	ConfigMcSPI4Ch0();
       
   786 	DumpMcSPI4Reg();
       
   787 
       
   788 	McSPI4Ch0_Enable();
       
   789 
       
   790 	if(KErrNone != GPIO::SetPinMode(KGPIO_183, GPIO::EEnabled))
       
   791 		Kern::Printf("ERROR: SetPinMode failed!");
       
   792 
       
   793 	if(KErrNone != GPIO::SetPinDirection(KGPIO_183, GPIO::EOutput))
       
   794 		Kern::Printf("ERROR: SetPinDirection failed!");
       
   795 
       
   796 	if(KErrNone != GPIO::SetOutputState(KGPIO_183, GPIO::EHigh))
       
   797 		Kern::Printf("ERROR: SetOutputState failed!");
       
   798 
       
   799 	gConfigured = 1 ;
       
   800 	return 0 ;
       
   801 }
       
   802 
       
   803 /*****************************************************************************/
       
   804 /*****************************************************************************/
       
   805 /*****************************************************************************/
       
   806 
       
   807 extern int
       
   808 CyAsHalBeagleBoard__Test(void)
       
   809 {
       
   810 	int i ;
       
   811 	int errCnt = 0 ;
       
   812 
       
   813 	if ( !gConfigured )
       
   814 	{
       
   815 		CyAsHalBeagleBoard__ConfigureSPI();
       
   816 	}
       
   817 
       
   818 	{
       
   819 		TUint16 regVal = 0 ;
       
   820 
       
   821 		Kern::Printf("Read Astoria ID register\n");
       
   822 
       
   823 		CyAsHalBeagleBoardMcSPI4Ch0_ReadReg(0x80, &regVal) ;
       
   824 
       
   825 		if ( regVal != 0xA200 )
       
   826 		{
       
   827 			Kern::Printf("ERROR: Wrong ID register value\n");
       
   828 			Kern::Printf("ERROR: Exp: 0x%04x\n",0xa200);
       
   829 			Kern::Printf("ERROR: Act: 0x%04x\n",regVal);
       
   830 			errCnt++;
       
   831 			return errCnt ;
       
   832 		}
       
   833 		else
       
   834 		{
       
   835 			Kern::Printf("ID register read successful 0x%04x\n",regVal);
       
   836 		}
       
   837 	}
       
   838 
       
   839 	{
       
   840 		Kern::Printf("Register test...\n");
       
   841 		for ( i = 1 ; i < 4 ; i++ )
       
   842 		{
       
   843 			if ( AstoriaRegTest(i) != 0 )
       
   844 			{
       
   845 				errCnt++ ;
       
   846 				return errCnt ;
       
   847 			}
       
   848 		}
       
   849 
       
   850 	}
       
   851 
       
   852 	{
       
   853 
       
   854 		Kern::Printf("Interrupt test...\n");
       
   855 
       
   856 		/* Setup DFC */
       
   857 		gpMyDfc = new TDfc( myTestDFCFn, (void*)(&gISRCnt), Kern::DfcQue0(), 1 ) ;
       
   858 		CyAsHalBeagleBoard__SetupISR((void*)myISR,(void*)(0));
       
   859 
       
   860 		for ( i = 0 ; i < 5 ; i++ )
       
   861 		{
       
   862 			Kern::Printf("Manually trigger interrupt (%d)\n",i);
       
   863 
       
   864 			ManualTriggerISRTest();
       
   865 
       
   866 
       
   867 			if (gISRCnt != i+1)
       
   868 			{
       
   869 				Kern::Printf("ISR called (%d)\n",gISRCnt);
       
   870 			}
       
   871 			else
       
   872 			{
       
   873 				Kern::Printf("ISR didn't call (%d)\n",gISRCnt);
       
   874 				Kern::Printf("Interrupt test failed\n");
       
   875 				errCnt++ ;
       
   876 				return errCnt ;
       
   877 			}
       
   878 		}
       
   879 	}
       
   880 
       
   881 	Kern::Printf("CyAsHalBeagleBoard__Test Successful!\n");
       
   882 
       
   883 	/*if ( gIndex == 1 )
       
   884 	{
       
   885 		GPIO::TGpioState aState ;
       
   886 
       
   887 		GPIO::GetOutputState(KGPIO_183, aState);
       
   888 
       
   889 		if ( aState == GPIO::EHigh )
       
   890 		{
       
   891 			if(KErrNone != GPIO::SetOutputState(KGPIO_183, GPIO::ELow))
       
   892 				Kern::Printf("ERROR: SetOutputState failed!");
       
   893 		}
       
   894 		else
       
   895 		{
       
   896 			if(KErrNone != GPIO::SetOutputState(KGPIO_183, GPIO::EHigh))
       
   897 				Kern::Printf("ERROR: SetOutputState failed!");
       
   898 		}
       
   899 		gIndex = 0 ;
       
   900 	}*/
       
   901 
       
   902 	/*
       
   903 	if ( gIndex == 2 )
       
   904 	{
       
   905 		McSPI4Ch0_DumpAstoriaRegs(0);
       
   906 	}
       
   907 
       
   908 	if ( gIndex == 3 )
       
   909 	{
       
   910 		McSPI4Ch0_DumpAstoriaRegs(1);
       
   911 		gIndex = 0 ;
       
   912 	}
       
   913 	*/
       
   914 	return 0 ;
       
   915 }
       
   916 
       
   917 /******************************************************************************/
       
   918 /******************************************************************************/
       
   919 /******************************************************************************/
       
   920 
       
   921 
       
   922 
       
   923 
       
   924 
       
   925 
       
   926 
       
   927