You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
2.9 KiB
80 lines
2.9 KiB
/*
|
|
* Copyright 2017 NXP
|
|
* All rights reserved.
|
|
*
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
|
|
#ifndef __ROM_API_H_
|
|
#define __ROM_API_H_
|
|
|
|
/* Component ID definition, used by tools. */
|
|
#ifndef FSL_COMPONENT_ID
|
|
#define FSL_COMPONENT_ID "platform.drivers.rom_api"
|
|
#endif
|
|
|
|
// Power APIs
|
|
typedef struct _PWRD
|
|
{
|
|
void (*set_pll)(unsigned int cmd[], unsigned int resp[]);
|
|
void (*set_power)(unsigned int cmd[], unsigned int resp[]);
|
|
void (*set_fro_frequency)(unsigned frequency);
|
|
void (*power_mode_configure)(unsigned int power_mode, unsigned int peripheral_ctrl);
|
|
void (*set_aclkgate)(unsigned aclkgate);
|
|
unsigned (*get_aclkgate)(void);
|
|
} PWRD_API_T;
|
|
|
|
// Integer divide API routines
|
|
typedef struct
|
|
{
|
|
int quot; // Quotient
|
|
int rem; // Remainder
|
|
} IDIV_RETURN_T;
|
|
|
|
typedef struct
|
|
{
|
|
unsigned quot; // Quotient
|
|
unsigned rem; // Reminder
|
|
} UIDIV_RETURN_T;
|
|
|
|
typedef struct
|
|
{
|
|
int (*sidiv)(int numerator, int denominator); // Signed integer division
|
|
unsigned (*uidiv)(unsigned numerator, unsigned denominator); // Unsigned integer division
|
|
IDIV_RETURN_T (*sidivmod)(int numerator, int denominator); // Signed integer division with remainder
|
|
UIDIV_RETURN_T (*uidivmod)(unsigned numerator, unsigned denominator); // Unsigned integer division with remainder
|
|
} ROM_DIV_API_T;
|
|
|
|
// The master structure that defines the table of all ROM APIs on the device (a.k.a ROM Driver table)
|
|
typedef struct _ROM_API
|
|
{
|
|
const unsigned int reserved3[3]; // Offsets 0, 4, 8
|
|
const PWRD_API_T *pPWRD; // Offset 0xC. Power APIs function table base address
|
|
const ROM_DIV_API_T *divApiBase; // Offset 0x10. Integer division routines function table base address
|
|
const unsigned int reserved7[7]; // Offsets 0x14 - 0x2C
|
|
} LPC_ROM_API_T;
|
|
|
|
#define ROM_DRIVER_BASE (0x0F001FF8UL)
|
|
|
|
// Define a pointer to the master table
|
|
#define LPC_ROM_API (*(LPC_ROM_API_T **)ROM_DRIVER_BASE)
|
|
|
|
// Use like this:
|
|
// ROM_DIV_API_T const *pROMDiv = LPC_ROM_API->divApiBase; // Create and initialize a pointer to the DIVIDE
|
|
// functions table
|
|
// int32_t result; // Declare an int variable
|
|
// result = pROMDiv->sidiv(-99, 6); // Call the sidiv routine, result now contains
|
|
// -99/6 = -16
|
|
// ROM_DIV_API_T const *pPwr = LPC_ROM_API->pPWRD; // Create and initialize a pointer to the power
|
|
// API functions table
|
|
// pPwr->set_power((uint32_t *)&cmd_table, (uint32_t *)&result_table); // Call the set_power routine
|
|
|
|
// Alternate form
|
|
#define LPC_PWRD_API ((const PWRD_API_T *)((*(LPC_ROM_API_T **)(ROM_DRIVER_BASE))->pPWRD))
|
|
#define LPC_DIVD_API ((ROM_DIV_API_T *)((*(LPC_ROM_API_T **)(ROM_DRIVER_BASE))->divApiBase))
|
|
|
|
// Use like this:
|
|
// LPC_PWRD_API->set_power((uint32_t *)&cmd_table, (uint32_t *)&result_table); // Call the set_power routine
|
|
|
|
#endif // rom_api.h
|
|
|