rtt-f030/bsp/nuvoton_nuc472/Libraries/StdDriver/src/ps2.c

184 lines
4.3 KiB
C
Raw Normal View History

2017-12-17 12:08:31 +08:00
/******************************************************************************
* @file ps2.c
* @version V1.00
* $Revision: 5 $
* $Date: 14/10/03 11:59a $
* @brief NUC472/NUC442 PS2 driver source file
*
* @note
* Copyright (C) 2013 Nuvoton Technology Corp. All rights reserved.
*****************************************************************************/
#include <stdio.h>
#include "NUC472_442.h"
/*---------------------------------------------------------------------------------------------------------*/
/* Includes of local headers */
/*---------------------------------------------------------------------------------------------------------*/
#include "ps2.h"
/** @addtogroup NUC472_442_Device_Driver NUC472/NUC442 Device Driver
@{
*/
/** @addtogroup NUC472_442_PS2_Driver PS2 Driver
@{
*/
/** @addtogroup NUC472_442_PS2_EXPORTED_FUNCTIONS PS2 Exported Functions
@{
*/
/**
* @brief The function is used to enable PS2 specified interrupt.
*
* @param[in] u32Mask The specified interrupt of PS2 module:
* - \ref PS2_CTL_TXIEN_Msk : PS2 Tx interrupt
* - \ref PS2_CTL_RXIEN_Msk : PS2 Rx interrupt
*
* @return None
*/
void PS2_EnableInt(uint32_t u32Mask)
{
PS2->CTL |= u32Mask;
}
/**
* @brief The function is used to disable PS2 specified interrupt.
*
* @param[in] u32Mask The specified interrupt of PS2 module:
* - \ref PS2_CTL_TXIEN_Msk : PS2 Tx interrupt
* - \ref PS2_CTL_RXIEN_Msk : PS2 Rx interrupt
*
* @return None
*/
void PS2_DisableInt(uint32_t u32Mask)
{
PS2->CTL &= ~u32Mask;
}
/**
* @brief This function use to enable PS2 function and set one byte per trnasfer.
*
* @param None
*
* @return None
*/
void PS2_Open(void)
{
/* Reset PS2 device */
SYS->IPRST1 |= SYS_IPRST1_PS2RST_Msk;
SYS->IPRST1 &= ~SYS_IPRST1_PS2RST_Msk;
/* Enable PS2 module */
PS2->CTL |= PS2_CTL_PS2EN_Msk;
/* Set One byte per trnasfer */
PS2->CTL &= ~PS2_CTL_TXFDEPTH_Msk;
/* Clear Tx FIFO */
PS2->CTL |= PS2_CTL_CLRFIFO_Msk;
PS2->CTL &= (~PS2_CTL_CLRFIFO_Msk);
}
/**
* @brief This function use to disable PS2 function.
*
* @param None
*
* @return None
*/
void PS2_Close(void)
{
/* Enable PS2 module */
PS2->CTL &= ~PS2_CTL_PS2EN_Msk;
}
/**
* @brief This function use to read PS2 Rx data.
*
* @param None
*
* @return Rx data
*/
uint8_t PS2_Read(void)
{
return (uint8_t)(PS2->RXDAT & PS2_RXDAT_DAT_Msk);
}
/**
* @brief This function use to transmit PS2 data.
*
* @param[in] pu32Buf The buffer to send the data to PS2 transmission FIFO.
* @param[in] u32ByteCount The byte number of data.
*
* @return FALSE: transmit data time-out
* TRUE: transmit data successful
*/
int32_t PS2_Write(uint32_t *pu32Buf, uint32_t u32ByteCount)
{
uint32_t u32TxFIFO_Depth = 16;
uint32_t u32delayno, txcnt, remainder;
uint8_t i=0;
txcnt = u32ByteCount / u32TxFIFO_Depth;
remainder = u32ByteCount % u32TxFIFO_Depth;
if(remainder) txcnt++;
u32delayno = 0;
while (!(PS2->STATUS & PS2_STATUS_TXEMPTY_Msk)) {
u32delayno++;
if (u32delayno >= 0xF0000000)
return FALSE; // Time Out
}
if(u32ByteCount >= u32TxFIFO_Depth)//Tx fifo is 16 bytes
PS2_SET_TX_BYTE_CNT(u32TxFIFO_Depth);
do {
u32delayno = 0;
while (!(PS2->STATUS & PS2_STATUS_TXEMPTY_Msk)) {
u32delayno++;
if(u32delayno >= 0xF0000000)
return FALSE; // Time Out
}
if((txcnt == 1) && (remainder != 0))
PS2_SET_TX_BYTE_CNT(u32ByteCount);
PS2->TXDAT0 = pu32Buf[i];
PS2->TXDAT1 = pu32Buf[i+1];
PS2->TXDAT2 = pu32Buf[i+2];
PS2->TXDAT3 = pu32Buf[i+3];
i = i + 4;
} while(--txcnt);
u32delayno = 0;
while(!(PS2->STATUS & PS2_STATUS_TXEMPTY_Msk)) {
u32delayno++;
if(u32delayno >= 0xF0000000)
return FALSE; // Time Out
}
return TRUE;
}
/*@}*/ /* end of group NUC472_442_PS2_EXPORTED_FUNCTIONS */
/*@}*/ /* end of group NUC472_442_PS2_Driver */
/*@}*/ /* end of group NUC472_442_Device_Driver */
/*** (C) COPYRIGHT 2013 Nuvoton Technology Corp. ***/