Files
6CAR/drivers/include/sdrv_scr.h
2026-04-18 09:16:58 +08:00

93 lines
2.5 KiB
C

/**
* @file sdrv_scr.h
* @brief SemiDrive Status and Controller Register driver header file.
*
* @copyright Copyright (c) 2022 Semidrive Semiconductor.
* All rights reserved.
*/
#ifndef _SDRV_SCR_H_
#define _SDRV_SCR_H_
#include <sdrv_common.h>
#include <types.h>
/* SCR signal types. */
#define TYPE_RW 0u
#define TYPE_RO 1u
#define TYPE_L16 2u
#define TYPE_L31 3u
#define TYPE_R16W16 4u
/**
* @brief SCR signal structure.
*
* @note Do NOT define SCR signals by yourself. Use signals defined in
* "scr_hw.h", which is automatically generated.
*/
typedef struct scr_signal {
/**< Signal type. */
uint16_t type;
/**< Start bit from register offset of current SCR type. */
uint16_t start_bit;
/**< Signal width in bits. */
uint16_t width;
} scr_signal_t;
/**
* @brief SCR device structure.
*/
typedef struct sdrv_scr {
paddr_t base; /**< scr module base */
} sdrv_scr_t;
/**
* @brief SCR driver error codes.
*/
enum {
/* The signal is locked, so it cannot be updated. */
SDRV_SCR_LOCKED = SDRV_ERROR_STATUS(SDRV_STATUS_GROUP_SCR, 0),
/* The signal is locked, or not L16/L31, so it cannot be locked. */
SDRV_SCR_CANNOT_LOCK = SDRV_ERROR_STATUS(SDRV_STATUS_GROUP_SCR, 1),
/* The signal isn't writeable. */
SDRV_SCR_CANNOT_WRITE = SDRV_ERROR_STATUS(SDRV_STATUS_GROUP_SCR, 2),
};
/**
* @brief Get value of signal.
*
* @param scr SCR controller.
* @param signal Signal defined in "scr_hw.h".
* @return Signal value.
*/
uint32_t scr_get(const sdrv_scr_t *scr, const scr_signal_t *signal);
/**
* @brief Set value of signal.
*
* @param scr SCR controller.
* @param signal Signal defined in "scr_hw.h".
* @param value Signal value.
* @return SDRV_STATUS_OK if successfully set. SDRV_SCR_LOCKED if signal is
* locked, or SDRV_SCR_CANNOT_WRITE if signal is read only.
*/
status_t scr_set(const sdrv_scr_t *scr, const scr_signal_t *signal, uint32_t value);
/**
* @brief Lock the given signal.
*
* @param scr SCR controller.
* @param signal Signal defined in "scr_hw.h", which should be of L16/L31 type.
* @return SDRV_STATUS_OK if successfully locked signal.
*/
status_t scr_lock(const sdrv_scr_t *scr, const scr_signal_t *signal);
/**
* @brief Check the lock status of signal
*
* @param scr SCR controller.
* @param signal Signal defined in "scr_hw.h", which should be of L16/L31 type.
* @return True if signal is locked.
*/
bool scr_is_locked(const sdrv_scr_t *scr, const scr_signal_t *signal);
#endif /*_SDRV_SCR_H_*/