mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2024-12-29 04:50:03 +01:00
7db791476e
Signed-off-by: Jean Pierre Dudey <me@jeandudey.tech>
215 lines
7.1 KiB
C
215 lines
7.1 KiB
C
/******************************************************************************
|
|
* Filename: ddi.c
|
|
* Revised: 2018-06-04 16:10:13 +0200 (Mon, 04 Jun 2018)
|
|
* Revision: 52111
|
|
*
|
|
* Description: Driver for the DDI master interface
|
|
*
|
|
* Copyright (c) 2015 - 2017, Texas Instruments Incorporated
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions are met:
|
|
*
|
|
* 1) Redistributions of source code must retain the above copyright notice,
|
|
* this list of conditions and the following disclaimer.
|
|
*
|
|
* 2) Redistributions in binary form must reproduce the above copyright notice,
|
|
* this list of conditions and the following disclaimer in the documentation
|
|
* and/or other materials provided with the distribution.
|
|
*
|
|
* 3) Neither the name of the ORGANIZATION nor the names of its contributors may
|
|
* be used to endorse or promote products derived from this software without
|
|
* specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
* POSSIBILITY OF SUCH DAMAGE.
|
|
*
|
|
******************************************************************************/
|
|
|
|
#include "ddi.h"
|
|
|
|
//*****************************************************************************
|
|
//
|
|
// Handle support for DriverLib in ROM:
|
|
// This section will undo prototype renaming made in the header file
|
|
//
|
|
//*****************************************************************************
|
|
#if !defined(DOXYGEN)
|
|
#undef DDI32RegWrite
|
|
#define DDI32RegWrite NOROM_DDI32RegWrite
|
|
#undef DDI16BitWrite
|
|
#define DDI16BitWrite NOROM_DDI16BitWrite
|
|
#undef DDI16BitfieldWrite
|
|
#define DDI16BitfieldWrite NOROM_DDI16BitfieldWrite
|
|
#undef DDI16BitRead
|
|
#define DDI16BitRead NOROM_DDI16BitRead
|
|
#undef DDI16BitfieldRead
|
|
#define DDI16BitfieldRead NOROM_DDI16BitfieldRead
|
|
#endif
|
|
|
|
//*****************************************************************************
|
|
//
|
|
// Write a 32 bit value to a register in the DDI slave.
|
|
//
|
|
//*****************************************************************************
|
|
void
|
|
DDI32RegWrite(uint32_t ui32Base, uint32_t ui32Reg,
|
|
uint32_t ui32Val)
|
|
{
|
|
// Check the arguments.
|
|
ASSERT(DDIBaseValid(ui32Base));
|
|
ASSERT(ui32Reg < DDI_SLAVE_REGS);
|
|
|
|
// Write the value to the register.
|
|
AuxAdiDdiSafeWrite(ui32Base + ui32Reg, ui32Val, 4);
|
|
}
|
|
|
|
//*****************************************************************************
|
|
//
|
|
// Write a single bit using a 16-bit maskable write
|
|
//
|
|
//*****************************************************************************
|
|
void
|
|
DDI16BitWrite(uint32_t ui32Base, uint32_t ui32Reg,
|
|
uint32_t ui32Mask, uint32_t ui32WrData)
|
|
{
|
|
uint32_t ui32RegAddr;
|
|
uint32_t ui32Data;
|
|
|
|
// Check the arguments.
|
|
ASSERT(DDIBaseValid(ui32Base));
|
|
ASSERT(!((ui32Mask & 0xFFFF0000) ^ (ui32Mask & 0x0000FFFF)));
|
|
ASSERT(!(ui32WrData & 0xFFFF0000));
|
|
|
|
// DDI 16-bit target is on 32-bit boundary so double offset
|
|
ui32RegAddr = ui32Base + (ui32Reg << 1) + DDI_O_MASK16B;
|
|
|
|
// Adjust for target bit in high half of the word.
|
|
if(ui32Mask & 0xFFFF0000)
|
|
{
|
|
ui32RegAddr += 4;
|
|
ui32Mask >>= 16;
|
|
}
|
|
|
|
// Write mask if data is not zero (to set mask bit), else write '0'.
|
|
ui32Data = ui32WrData ? ui32Mask : 0x0;
|
|
|
|
// Update the register.
|
|
AuxAdiDdiSafeWrite(ui32RegAddr, (ui32Mask << 16) | ui32Data, 4);
|
|
}
|
|
|
|
//*****************************************************************************
|
|
//
|
|
// Write a bit field via the DDI using 16-bit maskable write
|
|
//
|
|
//*****************************************************************************
|
|
void
|
|
DDI16BitfieldWrite(uint32_t ui32Base, uint32_t ui32Reg,
|
|
uint32_t ui32Mask, uint32_t ui32Shift,
|
|
uint16_t ui32Data)
|
|
{
|
|
uint32_t ui32RegAddr;
|
|
uint32_t ui32WrData;
|
|
|
|
// Check the arguments.
|
|
ASSERT(DDIBaseValid(ui32Base));
|
|
|
|
// 16-bit target is on 32-bit boundary so double offset.
|
|
ui32RegAddr = ui32Base + (ui32Reg << 1) + DDI_O_MASK16B;
|
|
|
|
// Adjust for target bit in high half of the word.
|
|
if(ui32Shift >= 16)
|
|
{
|
|
ui32Shift = ui32Shift - 16;
|
|
ui32RegAddr += 4;
|
|
ui32Mask = ui32Mask >> 16;
|
|
}
|
|
|
|
// Shift data in to position.
|
|
ui32WrData = ui32Data << ui32Shift;
|
|
|
|
// Write data.
|
|
AuxAdiDdiSafeWrite(ui32RegAddr, (ui32Mask << 16) | ui32WrData, 4);
|
|
}
|
|
|
|
//*****************************************************************************
|
|
//
|
|
// Read a bit via the DDI using 16-bit READ.
|
|
//
|
|
//*****************************************************************************
|
|
uint16_t
|
|
DDI16BitRead(uint32_t ui32Base, uint32_t ui32Reg, uint32_t ui32Mask)
|
|
{
|
|
uint32_t ui32RegAddr;
|
|
uint16_t ui16Data;
|
|
|
|
// Check the arguments.
|
|
ASSERT(DDIBaseValid(ui32Base));
|
|
|
|
// Calculate the address of the register.
|
|
ui32RegAddr = ui32Base + ui32Reg + DDI_O_DIR;
|
|
|
|
// Adjust for target bit in high half of the word.
|
|
if(ui32Mask & 0xFFFF0000)
|
|
{
|
|
ui32RegAddr += 2;
|
|
ui32Mask = ui32Mask >> 16;
|
|
}
|
|
|
|
// Read a halfword on the DDI interface.
|
|
ui16Data = AuxAdiDdiSafeRead(ui32RegAddr, 2);
|
|
|
|
// Mask data.
|
|
ui16Data = ui16Data & ui32Mask;
|
|
|
|
// Return masked data.
|
|
return(ui16Data);
|
|
}
|
|
|
|
//*****************************************************************************
|
|
//
|
|
// Read a bit field via the DDI using 16-bit read.
|
|
//
|
|
//*****************************************************************************
|
|
uint16_t
|
|
DDI16BitfieldRead(uint32_t ui32Base, uint32_t ui32Reg,
|
|
uint32_t ui32Mask, uint32_t ui32Shift)
|
|
{
|
|
uint32_t ui32RegAddr;
|
|
uint16_t ui16Data;
|
|
|
|
// Check the arguments.
|
|
ASSERT(DDIBaseValid(ui32Base));
|
|
|
|
// Calculate the register address.
|
|
ui32RegAddr = ui32Base + ui32Reg + DDI_O_DIR;
|
|
|
|
// Adjust for target bit in high half of the word.
|
|
if(ui32Shift >= 16)
|
|
{
|
|
ui32Shift = ui32Shift - 16;
|
|
ui32RegAddr += 2;
|
|
ui32Mask = ui32Mask >> 16;
|
|
}
|
|
|
|
// Read the register.
|
|
ui16Data = AuxAdiDdiSafeRead(ui32RegAddr, 2);
|
|
|
|
// Mask data and shift into place.
|
|
ui16Data &= ui32Mask;
|
|
ui16Data >>= ui32Shift;
|
|
|
|
// Return data.
|
|
return(ui16Data);
|
|
}
|