533 lines
14 KiB
C
533 lines
14 KiB
C
|
#ifndef __LIBXIPHOS_H__
|
||
|
#define __LIBXIPHOS_H__
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
#include <inttypes.h> /* required by libmtd.h */
|
||
|
#include <libmtd.h> /* required for libmtd_t */
|
||
|
#include <stddef.h>
|
||
|
|
||
|
/* String identifying this library's version */
|
||
|
extern const char *xsc_libxiphos_version;
|
||
|
|
||
|
/** Type for boolean values */
|
||
|
typedef int xsc_bool_t;
|
||
|
|
||
|
/** Type for the LibNOR instance descriptor */
|
||
|
typedef void * xsc_libnor_t;
|
||
|
|
||
|
/** Type for identifying the nominal or the gold (redundant) flash copy */
|
||
|
typedef enum {
|
||
|
XSC_LIBNOR_COPY_NOMINAL,
|
||
|
XSC_LIBNOR_COPY_GOLD,
|
||
|
XSC_LIBNOR_COPY_TOTAL_NUMBER
|
||
|
} xsc_libnor_copy_t;
|
||
|
|
||
|
/** Type for identifying one of the two NOR flash chips */
|
||
|
typedef enum {
|
||
|
XSC_LIBNOR_CHIP_0, /* First NOR flash chip */
|
||
|
#if (!defined(CONFIG_Q7AE))
|
||
|
XSC_LIBNOR_CHIP_1, /* Second NOR flash chip */
|
||
|
#endif
|
||
|
XSC_LIBNOR_CHIP_TOTAL_NUMBER
|
||
|
} xsc_libnor_chip_t;
|
||
|
|
||
|
/* Type for identifying the boot stage */
|
||
|
typedef enum {
|
||
|
XSC_BOOT_STAGE_INITRAMFS, /* Booted from initramfs */
|
||
|
XSC_BOOT_STAGE_ROOTFS, /* Booted from rootfs flash partition */
|
||
|
XSC_BOOT_STAGE_TOTAL_NUMBER
|
||
|
} xsc_boot_stage_t;
|
||
|
|
||
|
typedef enum {
|
||
|
XSC_POWER_OFF, /* Power disabled */
|
||
|
XSC_POWER_ON /* Power enabled */
|
||
|
} xsc_power_t;
|
||
|
|
||
|
/** Type for identifying the partitions of a NOR flash copy */
|
||
|
typedef enum {
|
||
|
XSC_LIBNOR_PART_NA = 0,
|
||
|
XSC_LIBNOR_PART_FW,
|
||
|
XSC_LIBNOR_PART_XSCINFO,
|
||
|
XSC_LIBNOR_PART_ROOTFS,
|
||
|
XSC_LIBNOR_PART_UENV,
|
||
|
XSC_LIBNOR_PART_DTB,
|
||
|
XSC_LIBNOR_PART_KERNEL,
|
||
|
XSC_LIBNOR_PART_INITRAMFS,
|
||
|
XSC_LIBNOR_PART_BCH,
|
||
|
XSC_LIBNOR_PART_RWINFO,
|
||
|
XSC_LIBNOR_PART_ROINFO,
|
||
|
XSC_LIBNOR_PART_SYSTEM,
|
||
|
XSC_LIBNOR_PART_ALL
|
||
|
} xsc_libnor_partitions_t;
|
||
|
|
||
|
typedef enum {
|
||
|
XSC_LIBNOR_SYSFILE_NA = 0,
|
||
|
XSC_LIBNOR_SYSFILE_KERNEL,
|
||
|
XSC_LIBNOR_SYSFILE_DTB,
|
||
|
XSC_LIBNOR_SYSFILE_LOGIC,
|
||
|
} xsc_libnor_system_files_t;
|
||
|
|
||
|
/** Type for identifying the action on the scratch buffer */
|
||
|
typedef enum {
|
||
|
SCRATCH_READ = 0,
|
||
|
SCRATCH_WRITE,
|
||
|
SCRATCH_CLEAR
|
||
|
} xsc_scratch_action_t;
|
||
|
|
||
|
struct xsc_scratch_op {
|
||
|
xsc_scratch_action_t action;
|
||
|
char *var_name;
|
||
|
char *var_value;
|
||
|
};
|
||
|
|
||
|
/** Type for specifying an error or status code */
|
||
|
typedef int xsc_status_t;
|
||
|
#define XSC_SUCCESS (0) /* No Error */
|
||
|
#define XSC_ERROR (-1) /* Error */
|
||
|
#define XSC_EINVAL (-2) /* Invalid inputs */
|
||
|
#define XSC_EBUSY (-3) /* Device is busy */
|
||
|
|
||
|
/** Returns the copy name */
|
||
|
const char *get_copy_name(xsc_libnor_t desc);
|
||
|
|
||
|
/** Returns the chip and copy for the given partition name */
|
||
|
xsc_status_t parse_copy_name(const char* name, xsc_libnor_chip_t *chip,
|
||
|
xsc_libnor_copy_t *copy);
|
||
|
|
||
|
/* In the following structure, sizes of the memory and swap fields
|
||
|
* are given as multiples of mem_unit bytes. */
|
||
|
struct xsc_proc_info {
|
||
|
long uptime; /* Seconds since boot */
|
||
|
unsigned long loads[3]; /* 1, 5, and 15 minute load averages */
|
||
|
unsigned long totalram; /* Total usable main memory size */
|
||
|
unsigned long freeram; /* Available memory size */
|
||
|
unsigned long sharedram; /* Amount of shared memory */
|
||
|
unsigned long bufferram; /* Memory used by buffers */
|
||
|
unsigned short procs; /* Number of current processes */
|
||
|
unsigned long totalhigh; /* Total high memory size */
|
||
|
unsigned long freehigh; /* Available high memory size */
|
||
|
unsigned int mem_unit; /* Memory unit size in bytes */
|
||
|
};
|
||
|
|
||
|
/* Retrieve the system information */
|
||
|
xsc_status_t xsc_info_proc(struct xsc_proc_info *info);
|
||
|
|
||
|
/**
|
||
|
* xsc_info_pa3_status
|
||
|
*
|
||
|
* Returns the ProASIC3 Logic status register.
|
||
|
*/
|
||
|
xsc_status_t xsc_info_pa3_status(uint32_t *status);
|
||
|
|
||
|
/** Libsensors */
|
||
|
|
||
|
/** The user application is expected to use libsensors for reading ADCs
|
||
|
* Refer to libsensor documentation.
|
||
|
* */
|
||
|
|
||
|
xsc_status_t xsc_ubi_get_mountinfo(int ubi_dev, int *mounted, int *rw, char
|
||
|
*tgt, char *src, size_t bufsize);
|
||
|
|
||
|
xsc_status_t xsc_get_mountinfo(const char *source, int *mounted, char
|
||
|
*target, size_t bufsize);
|
||
|
|
||
|
/**
|
||
|
* xsc_info_pa3_logicrev
|
||
|
*/
|
||
|
xsc_status_t xsc_info_pa3_logicrev(uint32_t *status);
|
||
|
|
||
|
/**
|
||
|
* xsc_boot_get_chip_copy
|
||
|
*
|
||
|
* Gets the currently booted NOR flash chip and copy
|
||
|
*
|
||
|
*/
|
||
|
xsc_status_t xsc_boot_get_chip_copy(xsc_libnor_chip_t *boot_chip, xsc_libnor_copy_t *boot_copy);
|
||
|
|
||
|
/**
|
||
|
* xsc_boot_copy
|
||
|
*
|
||
|
* Reboot on the chip copy specified
|
||
|
*
|
||
|
*/
|
||
|
void xsc_boot_copy(xsc_libnor_chip_t boot_chip, xsc_libnor_copy_t boot_copy);
|
||
|
|
||
|
#if (defined(CONFIG_Q8_REVA) || defined(CONFIG_Q8S_REVA) || defined(CONFIG_Q8_REVB) || defined(CONFIG_Q8S_REVB))
|
||
|
/**
|
||
|
* xsc_get_cur_lim_pwm
|
||
|
*
|
||
|
* Get the current limit PWM
|
||
|
* Restricted to Q8 devices
|
||
|
*
|
||
|
*/
|
||
|
xsc_status_t xsc_get_cur_lim_pwm(uint32_t *pwm);
|
||
|
|
||
|
/**
|
||
|
* xsc_set_cur_lim_pwm
|
||
|
*
|
||
|
* Set the current limit PWM (range:0..15)
|
||
|
* Restricted to Q8 devices
|
||
|
*
|
||
|
*/
|
||
|
xsc_status_t xsc_set_cur_lim_pwm(uint32_t pwm);
|
||
|
#endif
|
||
|
|
||
|
/* # LibNOR: Q-card NOR flash management */
|
||
|
|
||
|
/**
|
||
|
* xsc_libnor_open - open the Xiphos NOR library to use the given copy and chip
|
||
|
*
|
||
|
**/
|
||
|
xsc_status_t xsc_libnor_open(xsc_libnor_t *desc, xsc_libnor_chip_t chip, xsc_libnor_copy_t copy);
|
||
|
|
||
|
/**
|
||
|
* xsc_libnor_open - open the Xiphos NOR library
|
||
|
*
|
||
|
**/
|
||
|
xsc_status_t xsc_libnor_open_any(xsc_libnor_t *desc);
|
||
|
|
||
|
/**
|
||
|
* xsc_libnor_close - close the Xiphos NOR library
|
||
|
*
|
||
|
**/
|
||
|
void xsc_libnor_close(xsc_libnor_t desc);
|
||
|
|
||
|
/**
|
||
|
* xsc_libnor_getmtd
|
||
|
*
|
||
|
* Return the MTD number for the specified name
|
||
|
* */
|
||
|
xsc_status_t xsc_libnor_getmtd(xsc_libnor_t desc, const char *name,
|
||
|
int *mtd_num);
|
||
|
|
||
|
/**
|
||
|
* xsc_libnor_mtd_getsize
|
||
|
*
|
||
|
* Return the size of the specified MTD partition
|
||
|
*/
|
||
|
xsc_status_t xsc_libnor_mtd_getsize(xsc_libnor_t desc, const int mtd_num,
|
||
|
size_t *mtd_size);
|
||
|
|
||
|
/**
|
||
|
* xsc_libnor_copy_getmtd
|
||
|
*
|
||
|
* Return the MTD number for the specified copy (nom0, nom1, gold0, gold1)
|
||
|
* */
|
||
|
xsc_status_t xsc_libnor_copy_getmtd(xsc_libnor_t desc, int *mtd_num);
|
||
|
|
||
|
/**
|
||
|
* xsc_libnor_part_getmtd
|
||
|
*
|
||
|
* Return the MTD number for the specified partition (e.g. rootfs)
|
||
|
* */
|
||
|
xsc_status_t xsc_libnor_part_getmtd(xsc_libnor_t desc, const char *part_name, int *mtd_num);
|
||
|
|
||
|
/**
|
||
|
* xsc_erase_mtdn
|
||
|
*
|
||
|
* Erase the MTD blocks of the specified partition
|
||
|
*
|
||
|
* progress(int block_num, int erase_block_cnt, void* user_data): prototype for
|
||
|
* the user function that is called before each block erasure.
|
||
|
* If NULL the MTD section is wiped in one operation.
|
||
|
* user_data: pointer to the data that will be feed to the progress function.
|
||
|
*
|
||
|
* */
|
||
|
xsc_status_t xsc_erase_mtdn(xsc_libnor_t desc, int mtdn, void (*progress)(int, int, void *), void *user_data);
|
||
|
|
||
|
|
||
|
/**
|
||
|
* xsc_libnor_mtd_write
|
||
|
*
|
||
|
* Erase the MTD blocks of the specified partition then write the content of
|
||
|
* the buffer to the partition
|
||
|
*
|
||
|
* bufsize should equal MTD size
|
||
|
*/
|
||
|
xsc_status_t xsc_libnor_mtd_write(xsc_libnor_t desc, int mtdn, int fd,
|
||
|
char* buf, size_t bufsize);
|
||
|
|
||
|
/**
|
||
|
* xsc_remount_rw
|
||
|
*
|
||
|
* Remount specified filesystem
|
||
|
* */
|
||
|
xsc_status_t xsc_remount_rw(const char *name);
|
||
|
|
||
|
/**
|
||
|
* xsc_umount
|
||
|
*
|
||
|
* Umount specified filesystem
|
||
|
* */
|
||
|
xsc_status_t xsc_umount(const char *name);
|
||
|
|
||
|
/**
|
||
|
* xsc_mtd_is_attached
|
||
|
*
|
||
|
* Check wether MTD section is attached to the current UBI filesystem
|
||
|
*
|
||
|
* mtdn: MTD number
|
||
|
* Return the UBI device number
|
||
|
* */
|
||
|
int xsc_mtd_is_attached(int mtdn, int *dev_num);
|
||
|
|
||
|
/**
|
||
|
* xsc_mtd_ubi_attach
|
||
|
*
|
||
|
* Attach MTD section to a new UBI filesystem. If the MTD section is
|
||
|
* already attached to a UBI filesystem, do nothing.
|
||
|
*
|
||
|
* mtdn: MTD number
|
||
|
* Return UBI device number
|
||
|
* */
|
||
|
xsc_status_t xsc_mtd_ubi_attach(int mtdn, int *dev_num);
|
||
|
|
||
|
/**
|
||
|
* xsc_mtd_ubi_detach
|
||
|
*
|
||
|
* Remove specified UBI filesystem.
|
||
|
*
|
||
|
* dev_num: UBI device number
|
||
|
* */
|
||
|
xsc_status_t xsc_mtd_ubi_detach(int dev_num);
|
||
|
|
||
|
/**
|
||
|
* xsc_libnor_set_writeprotect
|
||
|
*
|
||
|
* Lock or unlock a whole (all partitions) NOR chip copy, resets hashes on lock
|
||
|
* User can provide a callback function for the long operation of reading
|
||
|
* the whole partition and computing the MD5SUM: md5progress
|
||
|
* */
|
||
|
typedef void (*cb_md5_progress_t)(size_t n, size_t total_size, void *user_data);
|
||
|
|
||
|
xsc_status_t xsc_libnor_set_writeprotect(xsc_libnor_t desc,
|
||
|
xsc_bool_t lock, xsc_bool_t auto_lock,
|
||
|
cb_md5_progress_t md5progress, void *md5progress_user_data);
|
||
|
|
||
|
/**
|
||
|
* xsc_libnor_get_writeprotect
|
||
|
*
|
||
|
* Returns the state of the writeprotection on a NOR chip copy.
|
||
|
*
|
||
|
* lock: set to 'True' if completely locked, 'False' otherwise
|
||
|
*
|
||
|
* */
|
||
|
xsc_status_t xsc_libnor_get_writeprotect(xsc_libnor_t desc,
|
||
|
xsc_bool_t *lock);
|
||
|
|
||
|
|
||
|
int xsc_mtd_lock_copy(xsc_libnor_t desc, int mtdn, int lock, int check);
|
||
|
|
||
|
/*
|
||
|
* xsc_mtd_lock_copy_q7ae - Get the locked status of a copy on the Q7AE.
|
||
|
*
|
||
|
* On Q7AE, one copy is on 2 chips. This function sets status to TRUE only if both chips are locked.
|
||
|
*/
|
||
|
|
||
|
xsc_status_t xsc_mtd_lock_copy_q7ae(xsc_libnor_t desc, int lock, int check, xsc_bool_t *status);
|
||
|
|
||
|
/**
|
||
|
* xsc_part_getinfo
|
||
|
*
|
||
|
* Return the MTD number, the size and the lock status of the specified partition
|
||
|
*/
|
||
|
xsc_status_t xsc_part_getinfo(xsc_libnor_t libnor, const char *part,
|
||
|
int *mtdn, size_t *size, xsc_bool_t *lock);
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
* To further manipulate the nor flash, one can use the libmtd_t descriptor
|
||
|
* along with the mtd_num of a partition and <libmtd.h>. See documentation
|
||
|
* of libmtd.
|
||
|
*
|
||
|
* */
|
||
|
|
||
|
/* ## Watchdog */
|
||
|
struct watchdog_s;
|
||
|
|
||
|
/**
|
||
|
* \brief Take control of the watchdog and activate it
|
||
|
* \param handle Returned handle
|
||
|
* \return 0 on success, != 0 on failure
|
||
|
* */
|
||
|
int xsc_watchdog_init(struct watchdog_s **handle);
|
||
|
|
||
|
/**
|
||
|
* \brief Release the watchdog handle: only stops the watchdog if
|
||
|
* magic close is set to 1
|
||
|
*
|
||
|
* \param handle The handle to release
|
||
|
* \param magic_close set to 1 to also stop the watchdog
|
||
|
* \return 0 on success, -1 otherwise
|
||
|
**/
|
||
|
int xsc_watchdog_close(struct watchdog_s *handle, int magic_close);
|
||
|
|
||
|
/**
|
||
|
* \brief Keep the watchdog alive
|
||
|
*
|
||
|
* \param handle The handle to the initialized watchdog
|
||
|
* \return 0 on success, -1 otherwise
|
||
|
* */
|
||
|
int xsc_watchdog_keepalive(struct watchdog_s *handle);
|
||
|
|
||
|
/**
|
||
|
* \brief Disable the watchdog
|
||
|
*
|
||
|
* \param handle The handle to the initialized watchdog
|
||
|
* \return 0 on success, -1 otherwise
|
||
|
* */
|
||
|
int xsc_watchdog_disable(struct watchdog_s *handle);
|
||
|
|
||
|
/**
|
||
|
* \brief Enable the watchdog
|
||
|
*
|
||
|
* \param handle The handle to the initialized watchdog
|
||
|
* \return 0 on success, -1 otherwise
|
||
|
* */
|
||
|
int xsc_watchdog_enable(struct watchdog_s *handle);
|
||
|
|
||
|
/**
|
||
|
* \brief Set watchdog timeout after which the ProASIC will
|
||
|
* reset the SoC
|
||
|
*
|
||
|
* \param handle The handle to the initialized watchdog
|
||
|
* \param timeout_seconds The number of seconds after which the
|
||
|
* watchdog will reset
|
||
|
* \return 0 on success, -1 otherwise
|
||
|
* */
|
||
|
int xsc_watchdog_set_timeout(struct watchdog_s *handle, int timeout_seconds);
|
||
|
|
||
|
/**
|
||
|
* \brief Get watchdog timeout after which the ProASIC will
|
||
|
* reset the SoC
|
||
|
*
|
||
|
* \param handle The handle to the initialized watchdog
|
||
|
* \param timeout_seconds The number of seconds after which the
|
||
|
* watchdog will reset
|
||
|
* \return 0 on success, -1 otherwise
|
||
|
* */
|
||
|
int xsc_watchdog_get_timeout(struct watchdog_s *handle, int *timeout_seconds);
|
||
|
|
||
|
/**
|
||
|
* \brief Set the no-way-out flag which will prohibit disabling the
|
||
|
* watchdog
|
||
|
*
|
||
|
* \return 0 on success, -1 otherwise
|
||
|
* */
|
||
|
int xsc_watchdog_set_nowayout();
|
||
|
|
||
|
/**
|
||
|
* \brief Get the status (enabled or disabled) and nowayout flag (set or not)
|
||
|
*
|
||
|
* \param nowayout The nowayout flag status (0 = not set, 1 = set)
|
||
|
* \param status The status flag (0 = watchdog disabled, 1 = watchdog active)
|
||
|
* \return 0 on success, -1 otherwise
|
||
|
* */
|
||
|
int xsc_watchdog_get_status(int *nowayout, int *status);
|
||
|
|
||
|
/** Devices management */
|
||
|
typedef enum {
|
||
|
XSC_DEV_MMC0 = 0,
|
||
|
XSC_DEV_MMC1,
|
||
|
XSC_DEV_MMC_BOTH,
|
||
|
XSC_DEV_USB,
|
||
|
} xsc_device_t;
|
||
|
|
||
|
/**
|
||
|
* xsc_device_get_paths - scans the /dev directory, recognize the device entries
|
||
|
* and return the corresponding devices paths.
|
||
|
* Paths are stored in strings allocated via malloc() and shall be freed by
|
||
|
* xsc_device_free_paths.
|
||
|
*
|
||
|
* return count
|
||
|
* */
|
||
|
int xsc_device_get_paths(xsc_device_t dev, char ***list);
|
||
|
|
||
|
void xsc_device_free_paths(int count, char **list);
|
||
|
|
||
|
/** USB external storage */
|
||
|
|
||
|
xsc_status_t xsc_usb_enable_power(xsc_power_t power);
|
||
|
|
||
|
xsc_status_t xsc_usb_get_power_status(xsc_power_t *power);
|
||
|
|
||
|
/**
|
||
|
* xsc_usb_remove_all - disconnect and lock-down all USB devices
|
||
|
* */
|
||
|
void xsc_usb_remove_all(void);
|
||
|
|
||
|
/**
|
||
|
* xsc_usb_authorize_all - authorize the USB devices to connect to the system
|
||
|
* */
|
||
|
void xsc_usb_authorize_all(void);
|
||
|
|
||
|
/** SD external storage */
|
||
|
|
||
|
/**
|
||
|
* Check if any partition of the given slot is mounted.
|
||
|
*/
|
||
|
xsc_status_t xsc_sd_ismounted(xsc_device_t slot, int *mounted);
|
||
|
/**
|
||
|
* xsc_sd_umount - umount all partitions of the given sd
|
||
|
* supports XSC_DEV_MMC0, XSC_DEV_MMC1 and XSC_DEV_MMC_BOTH
|
||
|
*/
|
||
|
xsc_status_t xsc_sd_umount(xsc_device_t slot);
|
||
|
|
||
|
/**
|
||
|
* xsc_sd_enable_power - enable power on selected devices
|
||
|
* If force is true, the power off will be done even if partitions are mounted
|
||
|
* supports XSC_DEV_MMC0, XSC_DEV_MMC1 and XSC_DEV_MMC_BOTH
|
||
|
*/
|
||
|
xsc_status_t xsc_sd_set_power(xsc_device_t slot, xsc_power_t power, int force);
|
||
|
|
||
|
/**
|
||
|
* xsc_sd_get_power_status - Get the power status
|
||
|
* supports XSC_DEV_MMC0 and XSC_DEV_MMC1 only
|
||
|
*/
|
||
|
xsc_status_t xsc_sd_get_power_status(xsc_device_t slot, xsc_power_t *power);
|
||
|
|
||
|
/**
|
||
|
* xsc_nor_status - get the current status of the NOR chips.
|
||
|
* copy is the current selected copy and power is the current power state.
|
||
|
* If power is OFF, copy is undefined.
|
||
|
*/
|
||
|
xsc_status_t xsc_nor_status(xsc_libnor_copy_t *copy, xsc_power_t *power);
|
||
|
|
||
|
/**
|
||
|
* xsc_nor_select - Select the given NOR copy
|
||
|
*/
|
||
|
xsc_status_t xsc_nor_select(xsc_libnor_copy_t copy);
|
||
|
|
||
|
/**
|
||
|
* xsc_nor_set_power - Set the NOR power to ON or OFF
|
||
|
*/
|
||
|
xsc_status_t xsc_nor_set_power(xsc_power_t power);
|
||
|
|
||
|
/**
|
||
|
* Print the environment.
|
||
|
*/
|
||
|
void *xsc_fw_printenv(char *flashbuf, size_t flash_bufsize);
|
||
|
|
||
|
/**
|
||
|
* Search the environment for a variable.
|
||
|
* Return the value, if found, or NULL, if not found.
|
||
|
*/
|
||
|
char *xsc_fw_getenv(const char *name, char *flashbuf, size_t flash_bufsize);
|
||
|
|
||
|
/*
|
||
|
* Set/Clear a single variable in the environment.
|
||
|
* This is called in sequence to update the environment
|
||
|
* in RAM without updating the copy in flash after each set
|
||
|
*/
|
||
|
int xsc_fw_env_write(const char *name, const char *value, char *flashbuf, size_t flash_bufsize);
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#endif // __LIBXIPHOS_H__
|
||
|
|