mirror of
https://github.com/rvtr/twl_wrapsdk.git
synced 2025-10-31 06:11:10 -04:00
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/twl_wrapsdk/trunk@6 4ee2a332-4b2b-5046-8439-1ba90f034370
202 lines
5.5 KiB
C
202 lines
5.5 KiB
C
/*---------------------------------------------------------------------------*
|
|
Project: TwlSDK - SPI
|
|
File: spi.h
|
|
|
|
Copyright 2007 Nintendo. All rights reserved.
|
|
|
|
These coded instructions, statements, and computer programs contain
|
|
proprietary information of Nintendo of America Inc. and/or Nintendo
|
|
Company Ltd., and are protected by Federal copyright law. They may
|
|
not be disclosed to third parties or copied or duplicated in any form,
|
|
in whole or in part, without the prior written consent of Nintendo.
|
|
|
|
$Log: $
|
|
$NoKeywords: $
|
|
*---------------------------------------------------------------------------*/
|
|
|
|
#ifndef TWL_SPI_SPI_H_
|
|
#define TWL_SPI_SPI_H_
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#include <nitro/ioreg.h>
|
|
#include <nitro/hw/ARM7/ioreg_SPI.h>
|
|
|
|
//----------------------------------------------------------------
|
|
// enums
|
|
//
|
|
//---- SPI baud rate
|
|
typedef enum
|
|
{
|
|
SPI_BAUDRATE_4MHZ = 0,
|
|
SPI_BAUDRATE_2MHZ = 1,
|
|
SPI_BAUDRATE_1MHZ = 2,
|
|
SPI_BAUDRATE_512KHZ = 3,
|
|
SPI_BAUDRATE_8MHZ = 4
|
|
}
|
|
SPIBaudRate;
|
|
|
|
//---- SPI baud rate
|
|
typedef enum
|
|
{
|
|
SPI_TRANSMODE_1BYTE = 0,
|
|
SPI_TRANSMODE_CONTINUOUS = 1
|
|
}
|
|
SPITransMode;
|
|
|
|
//---- Clock mode
|
|
#ifdef SDK_TS
|
|
typedef enum
|
|
{
|
|
SPI_CLKMODE_8CLK = 0,
|
|
SPI_CLKMODE_16CLK = 1
|
|
}
|
|
SPIClockMode;
|
|
#endif
|
|
|
|
//---- communication partner
|
|
#ifdef SDK_TS
|
|
typedef enum
|
|
{
|
|
SPI_COMMPARTNER_PMIC = 0,
|
|
SPI_COMMPARTNER_EEPROM = 1,
|
|
SPI_COMMPARTNER_TP = 2
|
|
}
|
|
SPICommPartner;
|
|
|
|
#else /* !SDK_TS */
|
|
typedef enum
|
|
{
|
|
SPI_COMMPARTNER_PMIC = 0,
|
|
SPI_COMMPARTNER_EEPROM = 1
|
|
}
|
|
SPICommPartner;
|
|
|
|
#define SPI_COMMPARTNER_TP (SPI_COMMPARTNER_PMIC)
|
|
#endif
|
|
|
|
|
|
//----------------------------------------------------------------
|
|
// assertion definition
|
|
//
|
|
#define SPI_COMMPARTNER_ASSERT( x ) SDK_ASSERT( (u32)x <= SPI_COMMPARTNER_EEPROM )
|
|
#define SPI_TRANSMODE_ASSERT( x ) SDK_ASSERT( (u32)x <= SPI_TRANSMODE_CONTINUOUS )
|
|
#define SPI_BAUDRATE_ASSERT( x ) SDK_ASSERT( (u32)x <= SPI_BAUDRATE_512KHZ )
|
|
|
|
|
|
//----------------------------------------------------------------
|
|
//---- enable/disable/restore SPIEnable
|
|
static inline BOOL SPI_Enable(void)
|
|
{
|
|
BOOL pre = (reg_SPI_SPICNT & ~REG_SPI_SPICNT_E_MASK) >> REG_SPI_SPICNT_E_SHIFT;
|
|
reg_SPI_SPICNT =
|
|
(u16)((reg_SPI_SPICNT & ~REG_SPI_SPICNT_E_MASK) | (1UL << REG_SPI_SPICNT_E_SHIFT));
|
|
return pre;
|
|
}
|
|
|
|
static inline BOOL SPI_Disable(void)
|
|
{
|
|
BOOL pre = (reg_SPI_SPICNT & ~REG_SPI_SPICNT_E_MASK) >> REG_SPI_SPICNT_E_SHIFT;
|
|
reg_SPI_SPICNT = (u16)((reg_SPI_SPICNT & ~REG_SPI_SPICNT_E_MASK));
|
|
return pre;
|
|
}
|
|
|
|
static inline BOOL SPI_Restore(BOOL flag)
|
|
{
|
|
BOOL pre = (reg_SPI_SPICNT & ~REG_SPI_SPICNT_E_MASK) >> REG_SPI_SPICNT_E_SHIFT;
|
|
reg_SPI_SPICNT =
|
|
(u16)((reg_SPI_SPICNT & ~REG_SPI_SPICNT_E_MASK) |
|
|
(flag ? 1UL << REG_SPI_SPICNT_E_SHIFT : 0));
|
|
return pre;
|
|
}
|
|
|
|
//----------------------------------------------------------------
|
|
//---- Set/Get Interrupt
|
|
static inline void SPI_SetInterrupt(BOOL e)
|
|
{
|
|
reg_SPI_SPICNT =
|
|
(u16)((reg_SPI_SPICNT & REG_SPI_SPICNT_I_MASK) | (e ? 1UL << REG_SPI_SPICNT_I_SHIFT : 0));
|
|
}
|
|
|
|
static inline BOOL SPI_GetInterrupt(void)
|
|
{
|
|
return (BOOL)((reg_SPI_SPICNT & REG_SPI_SPICNT_I_MASK) >> REG_SPI_SPICNT_I_SHIFT);
|
|
}
|
|
|
|
//----------------------------------------------------------------
|
|
//---- Set/Get comminucation partner
|
|
static inline void SPI_SetCommPartner(SPICommPartner p)
|
|
{
|
|
SPI_COMMPARTNER_ASSERT(p);
|
|
reg_SPI_SPICNT =
|
|
(u16)((reg_SPI_SPICNT & REG_SPI_SPICNT_SEL_MASK) | (p << REG_SPI_SPICNT_SEL_SHIFT));
|
|
}
|
|
|
|
static inline SPICommPartner SPI_GetCommPartner(void)
|
|
{
|
|
return (SPICommPartner)((reg_SPI_SPICNT & REG_SPI_SPICNT_SEL_MASK) >> REG_SPI_SPICNT_SEL_SHIFT);
|
|
}
|
|
|
|
//----------------------------------------------------------------
|
|
//---- set/Get Transfer mode
|
|
static inline void SPI_SetTransMode(SPITransMode mode)
|
|
{
|
|
SPI_TRANSMODE_ASSERT(mode);
|
|
reg_SPI_SPICNT =
|
|
(u16)((reg_SPI_SPICNT & REG_SPI_SPICNT_MODE_MASK) | (mode << REG_SPI_SPICNT_MODE_SHIFT));
|
|
}
|
|
|
|
static inline SPITransMode SPI_GetTransMode(void)
|
|
{
|
|
return (SPITransMode)((reg_SPI_SPICNT & REG_SPI_SPICNT_MODE_MASK) >> REG_SPI_SPICNT_MODE_SHIFT);
|
|
}
|
|
|
|
//----------------------------------------------------------------
|
|
//---- check SPI is busy
|
|
static inline BOOL SPI_IsBusy(void)
|
|
{
|
|
return (BOOL)((reg_SPI_SPICNT & REG_SPI_SPICNT_BUSY_MASK) >> REG_SPI_SPICNT_BUSY_SHIFT);
|
|
}
|
|
|
|
//----------------------------------------------------------------
|
|
//---- set/get Baudrate
|
|
static inline void SPI_SetBaudRate(SPIBaudRate baud)
|
|
{
|
|
SPI_BAUDRATE_ASSERT(baud);
|
|
reg_SPI_SPICNT =
|
|
(u16)((reg_SPI_SPICNT & REG_SPI_SPICNT_BAUDRATE_MASK) |
|
|
(baud << REG_SPI_SPICNT_BAUDRATE_SHIFT));
|
|
}
|
|
|
|
static inline SPIBaudRate SPI_GetBaudRate(void)
|
|
{
|
|
return (SPIBaudRate)((reg_SPI_SPICNT & REG_SPI_SPICNT_BAUDRATE_MASK) >>
|
|
REG_SPI_SPICNT_BAUDRATE_SHIFT);
|
|
}
|
|
|
|
//----------------------------------------------------------------
|
|
//---- set/get data to/from SPI
|
|
static inline void SPI_SendData(u8 data)
|
|
{
|
|
reg_SPI_SPID = (u16)data;
|
|
}
|
|
|
|
static inline u8 SPI_GetData(void)
|
|
{
|
|
return (u8)(reg_SPI_SPICNT & 0xff);
|
|
}
|
|
|
|
//----------------------------------------------------------------
|
|
// subroutine definition
|
|
//
|
|
void SPI_Init(u32 prio);
|
|
|
|
#ifdef __cplusplus
|
|
} /* extern "C" */
|
|
#endif
|
|
|
|
/* TWL_SPI_SPI_H_ */
|
|
#endif
|