mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
Merge branch 'feature/xtensa_cleanup' into 'master'
xtensa: remove unused header files See merge request idf/esp-idf!2471
This commit is contained in:
commit
eeff0ca1fa
@ -16,7 +16,6 @@
|
||||
#include <xtensa/coreasm.h>
|
||||
#include <xtensa/corebits.h>
|
||||
#include <xtensa/config/system.h>
|
||||
#include <xtensa/simcall.h>
|
||||
#include "freertos/xtensa_context.h"
|
||||
#include "esp_panic.h"
|
||||
#include "sdkconfig.h"
|
||||
|
@ -1,28 +0,0 @@
|
||||
/* This header is supposed to be obtained from <board>/xtensa/board.h
|
||||
using a -I directive passed to the compiler. */
|
||||
|
||||
#error "Unspecified board. Missing -I directive to select supported Xtensa board, usually -I XTENSA_TOOLS_ROOT/xtensa-elf/include/xtensa/<BOARD> (XTENSA_TOOLS_ROOT is root of Xtensa Tools install, see xt-run --show-config=xttools)"
|
||||
|
||||
/*
|
||||
* Copyright (c) 2013 Tensilica Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,93 +0,0 @@
|
||||
/* Xtensa Debug-FileSystem definitions */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2005-2009 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
* They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
* third parties in any manner, medium, or form, in whole or in part, without
|
||||
* the prior written consent of Tensilica Inc.
|
||||
*/
|
||||
|
||||
#ifndef __DEBUGFS_H__
|
||||
#define __DEBUGFS_H__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
int xt_dbfs_open(const char *pathname, int flags, mode_t mode);
|
||||
int xt_dbfs_ftruncate(int fd, off_t length);
|
||||
int xt_dbfs_truncate(const char * filename, off_t length);
|
||||
int xt_dbfs_creat(const char *pathname, mode_t mode);
|
||||
int xt_dbfs_errno(void);
|
||||
int xt_dbfs_lseek(int fd, off_t offset, int whence);
|
||||
ssize_t xt_dbfs_write(int fd, const void * buf, size_t bytes);
|
||||
ssize_t xt_dbfs_open_append_close(const char * filename, int align,
|
||||
const void * buf, size_t bytes);
|
||||
ssize_t xt_dbfs_read(int fd, void * buf, size_t bytes);
|
||||
int xt_dbfs_close(int fd);
|
||||
int xt_dbfs_unlink(const char *pathname);
|
||||
|
||||
/* By default, this function is a wrapper around sbrk, and follows
|
||||
sbrk semantics:
|
||||
|
||||
On success, it returns increment bytes of memory allocated from
|
||||
system memory.
|
||||
|
||||
On failure, it returns 0xFFFFFFFF
|
||||
|
||||
|
||||
If you want to use a method of allocating memory other than sbrk,
|
||||
implement xt_dbfs_sbrk in your own sources, and the linker will
|
||||
automatically use that copy.
|
||||
*/
|
||||
void * xt_dbfs_sbrk(int increment);
|
||||
|
||||
|
||||
|
||||
#ifdef REPLACE_FS_WITH_DBFS
|
||||
#define open xt_dbfs_open
|
||||
#define close xt_dbfs_close
|
||||
#define creat xt_dbfs_creat
|
||||
#define lseek xt_dbfs_lseek
|
||||
#define write xt_dbfs_write
|
||||
#define read xt_dbfs_read
|
||||
#define close xt_dbfs_close
|
||||
#define unlink xt_dbfs_unlink
|
||||
|
||||
#define rmdir NOT_IMPLEMENTED_IN_DBFS
|
||||
#define opendir NOT_IMPLEMENTED_IN_DBFS
|
||||
#define closedir NOT_IMPLEMENTED_IN_DBFS
|
||||
#define dirfs NOT_IMPLEMENTED_IN_DBFS
|
||||
#define readdir NOT_IMPLEMENTED_IN_DBFS
|
||||
#define scandir NOT_IMPLEMENTED_IN_DBFS
|
||||
#define seekdir NOT_IMPLEMENTED_IN_DBFS
|
||||
#define telldir NOT_IMPLEMENTED_IN_DBFS
|
||||
|
||||
#define fcntl NOT_IMPLEMENTED_IN_DBFS
|
||||
#define dup2 NOT_IMPLEMENTED_IN_DBFS
|
||||
#define dup NOT_IMPLEMENTED_IN_DBFS
|
||||
#define flock NOT_IMPLEMENTED_IN_DBFS
|
||||
#define lockf NOT_IMPLEMENTED_IN_DBFS
|
||||
#define link NOT_IMPLEMENTED_IN_DBFS
|
||||
#define stat NOT_IMPLEMENTED_IN_DBFS
|
||||
#define fstat NOT_IMPLEMENTED_IN_DBFS
|
||||
#define lstat NOT_IMPLEMENTED_IN_DBFS
|
||||
#define chmod NOT_IMPLEMENTED_IN_DBFS
|
||||
#define fchmod NOT_IMPLEMENTED_IN_DBFS
|
||||
#define chmown NOT_IMPLEMENTED_IN_DBFS
|
||||
#define lchown NOT_IMPLEMENTED_IN_DBFS
|
||||
#define fchown NOT_IMPLEMENTED_IN_DBFS
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
@ -1,45 +0,0 @@
|
||||
|
||||
/*
|
||||
* Copyright (c) 2013 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
* They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
* third parties in any manner, medium, or form, in whole or in part, without
|
||||
* the prior written consent of Tensilica Inc.
|
||||
*/
|
||||
|
||||
#ifndef __XT_FEEDBACK_INCLUDED__
|
||||
#define __XT_FEEDBACK_INCLUDED__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* xt_feedback_save_and_reset
|
||||
|
||||
Save and reset the accumulated feedback data.
|
||||
*/
|
||||
extern void xt_feedback_save_and_reset(void);
|
||||
|
||||
/* xt_feedback_enable
|
||||
|
||||
Turn on feedback accumulation. Ordinarily, feedback accumulation is on
|
||||
by default. If you turn it off using xt_feedback_disable, You can turn
|
||||
it on again via this function.
|
||||
*/
|
||||
extern void xt_feedback_enable (void);
|
||||
|
||||
/* xt_feedback_disable
|
||||
|
||||
Turn off feedback accumulation. If you don't want to gather feedback for a
|
||||
portion of your code, use this function and then xt_feedback_enable when
|
||||
you want to start again.
|
||||
*/
|
||||
extern void xt_feedback_disable (void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __XT_FEEDBACK_INCLUDED__ */
|
||||
|
@ -1,80 +0,0 @@
|
||||
/* Xtensa Debug-FileSystem definitions
|
||||
*
|
||||
* Copyright (c) 2006-2009 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
* They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
* third parties in any manner, medium, or form, in whole or in part, without
|
||||
* the prior written consent of Tensilica Inc.
|
||||
*/
|
||||
|
||||
#ifndef __DEBUGFS_H__
|
||||
#define __DEBUGFS_H__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdlib.h>
|
||||
#include <errno.h>
|
||||
|
||||
int _gdbio_open_r(void * ptr, const char *pathname, int flags, mode_t mode);
|
||||
int _gdbio_creat_r(void * ptr, const char *pathname, mode_t mode);
|
||||
int _gdbio_lseek_r(void * ptr, int fd, off_t offset, int whence);
|
||||
ssize_t _gdbio_write_r(void * ptr, int fd, const void * buf, size_t bytes);
|
||||
ssize_t _gdbio_read_r(void * ptr, int fd, void * buf, size_t bytes);
|
||||
int _gdbio_close_r(void * ptr, int fd);
|
||||
int _gdbio_unlink_r(void * ptr, const char * pathname);
|
||||
|
||||
static inline
|
||||
int gdbio_open(const char *pathname, int flags, mode_t mode) {
|
||||
return _gdbio_open_r(&errno, pathname, flags, mode);
|
||||
}
|
||||
static inline int
|
||||
gdbio_creat(const char *pathname, mode_t mode) {
|
||||
return _gdbio_open_r(&errno, pathname, O_CREAT|O_WRONLY|O_TRUNC, mode);
|
||||
}
|
||||
static inline int
|
||||
gdbio_errno(void) {
|
||||
return errno;
|
||||
}
|
||||
static inline int
|
||||
gdbio_lseek(int fd, off_t offset, int whence) {
|
||||
return _gdbio_lseek_r(&errno, fd, offset, whence);
|
||||
}
|
||||
static inline
|
||||
ssize_t gdbio_write(int fd, const void * buf, size_t bytes) {
|
||||
return _gdbio_write_r(&errno, fd, buf, bytes);
|
||||
}
|
||||
static inline
|
||||
ssize_t gdbio_read(int fd, void * buf, size_t bytes) {
|
||||
return _gdbio_read_r(&errno, fd, buf, bytes);
|
||||
}
|
||||
static inline int
|
||||
gdbio_close(int fd) {
|
||||
return _gdbio_close_r(&errno, fd);
|
||||
}
|
||||
static inline int
|
||||
gdbio_unlink(const char * pathname) {
|
||||
return _gdbio_unlink_r(&errno, pathname);
|
||||
}
|
||||
|
||||
#ifdef REPLACE_FS_WITH_GDBIO
|
||||
#define open gdbio_open
|
||||
#define close gdbio_close
|
||||
#define creat gdbio_creat
|
||||
#define lseek gdbio_lseek
|
||||
#define write gdbio_write
|
||||
#define read gdbio_read
|
||||
#define close gdbio_close
|
||||
#define unlink gdbio_unlink
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
@ -1,99 +0,0 @@
|
||||
/* Copyright (c) 2011-2012 Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
// These coded instructions, statements, and computer programs are the
|
||||
// copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
// They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
// third parties in any manner, medium, or form, in whole or in part, without
|
||||
// the prior written consent of Tensilica Inc.
|
||||
*/
|
||||
|
||||
#ifndef _JTAG_XTENSA_H_
|
||||
#define _JTAG_XTENSA_H_
|
||||
|
||||
|
||||
/* ---------------- JTAG registers ------------------ */
|
||||
|
||||
/* -- ER and later JTAG registers */
|
||||
typedef enum {
|
||||
regIR,
|
||||
regBypass,
|
||||
regNAR,
|
||||
regNDR,
|
||||
regIdcode,
|
||||
regPWRCTL,
|
||||
regPWRSTAT,
|
||||
regJtagMAX,
|
||||
} xtensaJtagReg;
|
||||
|
||||
/* -- pre-ER JTAG registers */
|
||||
typedef enum {
|
||||
regOldIR,
|
||||
regOldBypass,
|
||||
regOldDIRW,
|
||||
regOldDIR,
|
||||
regOldDDR,
|
||||
regOldDOSR,
|
||||
regOldESR,
|
||||
regOldDCR,
|
||||
regOldTraxNDR,
|
||||
regOldTraxNAR,
|
||||
regOldMAX
|
||||
} xtensaOldJtagReg;
|
||||
|
||||
|
||||
/* ---------------- JTAG Instructions ------------------ */
|
||||
|
||||
/* -- pre-ER JTAG instructions */
|
||||
typedef enum {
|
||||
ji_EnableOCD = 0x11,
|
||||
ji_DebugInt,
|
||||
ji_RetDebugInt, // TBD: remove
|
||||
ji_DisRetOCD, // TBD: remove
|
||||
ji_ExecuteDI,
|
||||
ji_LoadDI,
|
||||
ji_ScanDDR,
|
||||
ji_ReadDOSR,
|
||||
ji_ScanDCR,
|
||||
ji_LoadWDI,
|
||||
ji_TRAX = 0x1c,
|
||||
ji_BYPASS = 0x1f,
|
||||
} xtensaJtagInstruction;
|
||||
|
||||
typedef enum {
|
||||
OCDNormalMode,
|
||||
OCDRunMode,
|
||||
OCDHaltMode,
|
||||
OCDStepMode
|
||||
} xtensaMode;
|
||||
|
||||
typedef struct {
|
||||
xtensaMode mode;
|
||||
int DRsel;
|
||||
XTMP_core core;
|
||||
XTMP_tap tap;
|
||||
int core_num;
|
||||
jtagReg_t *jtagRegs;
|
||||
void *dap; // used for ARM DAP only
|
||||
bool isBig;
|
||||
int dir_array_option; // used by pre-ER devices only
|
||||
// for testing, below - FIXME - delete later
|
||||
int ocdReg;
|
||||
unsigned int wr_data;
|
||||
XTMP_event start_OCD_trans;
|
||||
bool data_cycle;
|
||||
bool data_pending;
|
||||
} coreSlaveData_t;
|
||||
|
||||
|
||||
enum OCD_ACCESS_TYPE{
|
||||
NEXUS_ACCESS,
|
||||
CS_ACCESS,
|
||||
};
|
||||
|
||||
// pre-ER Xtensa initializiation
|
||||
EXTERN XTMP_deviceStatus
|
||||
XTMP_jtagCoreSlaveEX(XTMP_component component, XTMP_jtagSlave slave, void* mydata);
|
||||
|
||||
extern char *OCDrd;
|
||||
extern char *OCDwr;
|
||||
|
||||
#endif
|
@ -1,62 +0,0 @@
|
||||
/*******************************************************************************
|
||||
Copyright (c) 2009-2013 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
These coded instructions, statements, and computer programs are the
|
||||
copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
third parties in any manner, medium, or form, in whole or in part, without
|
||||
the prior written consent of Tensilica Inc.
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
lcd-splc780d-4bitmode-board.h Board-specific LCD info for these boards:
|
||||
Avnet AV110 (XT-AV110)
|
||||
Xilinx ML605 (XT-ML605)
|
||||
Xilinx KC705 (XT-KC705)
|
||||
|
||||
Interface between board-independent driver and board-specific header.
|
||||
|
||||
This is used by a board-independent SPLC780D LCD controller (4 bit mode)
|
||||
driver to obtain board-specific information about LCD displays on the board,
|
||||
such as the controller register base address and spacing (a function of how
|
||||
the address lines are connected on the board) and length of the visible window
|
||||
of the display (a function of the LCD panel the controller drives).
|
||||
The driver doesnot refer directly to the board-specific header, which therefore is not
|
||||
constrained to use macro names consistent with other boards.
|
||||
|
||||
!! Must not contain any board-specific macro names (only controller specific) !!
|
||||
|
||||
Included at compile-time via an include path specific to the board.
|
||||
|
||||
The listed boards contain a single MYTech MOC-16216B-B display driven by
|
||||
a Sunplus SPLC870D controller.
|
||||
|
||||
*******************************************************************************/
|
||||
|
||||
#ifndef _LCD_SPLC780D_4BIT_BOARD_H
|
||||
#define _LCD_SPLC780D_4BIT_BOARD_H
|
||||
|
||||
#include <xtensa/board.h> /* Board info */
|
||||
|
||||
|
||||
/* Base address of the controller's registers. */
|
||||
#ifdef SPLC780D_4BIT_VADDR
|
||||
#define SPLC780D_4BIT_REGBASE SPLC780D_4BIT_VADDR
|
||||
#endif
|
||||
|
||||
/*
|
||||
The controller's registers are connected at word addresses on these boards.
|
||||
Each byte-wide register appears as the least-significant-byte (LSB) of the
|
||||
word regardless of the endianness of the processor (so if using word accesses
|
||||
then endianness doesn't matter).
|
||||
*/
|
||||
#define SPLC780D_4BIT_REGSPACING 4
|
||||
typedef unsigned splc780d_4bit_reg_t;
|
||||
|
||||
/* Include generic information shared by all boards that use this device. */
|
||||
#include <xtensa/lcd-splc780d-4bitmode.h>
|
||||
|
||||
|
||||
/* Display limits of the LCD panel. */
|
||||
#define DISPLAY_VISIBLE_LEN 16 /* length (chars) of visible window */
|
||||
|
||||
#endif /* _LCD_SPLC780D_4BIT_BOARD_H */
|
||||
|
@ -1,105 +0,0 @@
|
||||
/*******************************************************************************
|
||||
|
||||
Copyright (c) 2009-2010 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
These coded instructions, statements, and computer programs are the
|
||||
copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
third parties in any manner, medium, or form, in whole or in part, without
|
||||
the prior written consent of Tensilica Inc.
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
lcd-SPLC780D-4bitmode.h Generic definitions for Sunplus SPLC780D LCD Controller
|
||||
operating in 4 bit mode.
|
||||
|
||||
This is used by board-support-packages with one or more LCD displays that use
|
||||
a SPLC780D controller in 4 bit mode. A BSP provides a base address for each
|
||||
instance of an SPLC780D LCD controller on the board.
|
||||
|
||||
Note that LCD display operation is almost totally independent of the LCD
|
||||
display, depending almost entirely on the controller. However the display
|
||||
may limit the number of characters of the controller's RAM buffer that are
|
||||
actually visible at one time. The length of the display's visible window
|
||||
is not specifified in this controller-specific header, but comes to the
|
||||
driver from the board-specific "display.h" header.
|
||||
|
||||
*******************************************************************************/
|
||||
|
||||
#ifndef _LCD_SPLC780D_4BIT_H_
|
||||
#define _LCD_SPLC780D_4BIT_H_
|
||||
|
||||
|
||||
/* Offsets to controller registers from base. */
|
||||
#define SPLC780D_4BIT_INST 0
|
||||
#define SPLC780D_4BIT_DATA (SPLC780D_4BIT_INST + SPLC780D_4BIT_REGSPACING)
|
||||
|
||||
|
||||
#define SPLC780D_4BIT_INST_INIT1 0xFF /* First command in
|
||||
init sequence */
|
||||
#define SPLC780D_4BIT_INST_INIT2 0x30 /* Second command in
|
||||
init sequence,
|
||||
issued 3 times */
|
||||
#define SPLC780D_4BIT_INST_INIT3 0x20 /* Third and last command
|
||||
in init sequence */
|
||||
#define SPLC780D_4BIT_INST_CLEAR 0x01 /* clear (blank) display) */
|
||||
#define SPLC780D_4BIT_INST_SET_MODE 0x28 /* Set LCD mode. Supported
|
||||
setting is 4 bit data
|
||||
length, 2 lines, 5*8 */
|
||||
#define SPLC780D_4BIT_INST_DSPLY_ON 0x0C /* Set Display ON */
|
||||
#define SPLC780D_4BIT_INST_CRSR_INC 0x06 /* Set cursor moving direction
|
||||
as increment */
|
||||
|
||||
#define SPLC780D_4BIT_LINET_ADDR 0x80 /* clear (blank) display) */
|
||||
#define SPLC780D_4BIT_LINEB_ADDR 0xC0 /* clear (blank) display) */
|
||||
|
||||
#ifndef __ASSEMBLER__
|
||||
|
||||
/* C interface to controller registers. */
|
||||
struct splc780d_4bit_s {
|
||||
splc780d_4bit_reg_t inst; /* instruction register */
|
||||
splc780d_4bit_reg_t data; /* data register */
|
||||
};
|
||||
|
||||
typedef volatile struct splc780d_4bit_s splc780d_4bit_t;
|
||||
|
||||
/*
|
||||
Prototypes of high level driver functions.
|
||||
*/
|
||||
|
||||
/* Write an instruction byte to LCD, result in two back to back writes since the
|
||||
* LCD is hooked up in 4 bit mode*/
|
||||
extern void lcd_write_inst_byte(splc780d_4bit_t *lcd, unsigned char inst);
|
||||
|
||||
/* Write a data byte to LCD, result in two back to back writes since the
|
||||
* LCD is hooked up in 4 bit mode*/
|
||||
extern void lcd_write_data_byte(splc780d_4bit_t *lcd, unsigned char data);
|
||||
|
||||
/*
|
||||
Initialize the display with default settings.
|
||||
*/
|
||||
extern void splc780d_4bit_init_default(splc780d_4bit_t *lcd);
|
||||
|
||||
/*
|
||||
Write a single character at a given position (chars from left, starting at 0).
|
||||
Wait long enough afterward for the controller to be ready for more input.
|
||||
Positions beyond the end of the display are ignored.
|
||||
*/
|
||||
extern void splc780d_4bit_write_char(splc780d_4bit_t *lcd, unsigned pos, const char c);
|
||||
|
||||
/*
|
||||
Write a string to the display starting at the left (position 0).
|
||||
Blank-pad to or truncate at the end of the display (overwrites any previous
|
||||
string so don't need to blank the display first).
|
||||
Wait long enough after each char for the controller to be ready for more input.
|
||||
*/
|
||||
extern void splc780d_4bit_write_string(splc780d_4bit_t *lcd, const char *s);
|
||||
|
||||
/*
|
||||
Blank (clear) the entire display.
|
||||
Wait long enough afterward for the controller to be ready for more input.
|
||||
*/
|
||||
extern void splc780d_4bit_blank(splc780d_4bit_t *lcd);
|
||||
|
||||
#endif /* __ASSEMBLER__ */
|
||||
|
||||
#endif /* _LCD_SPLC780D_4BIT_H_ */
|
||||
|
@ -1,151 +0,0 @@
|
||||
/*******************************************************************************
|
||||
|
||||
Copyright (c) 2006-2007 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
These coded instructions, statements, and computer programs are the
|
||||
copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
third parties in any manner, medium, or form, in whole or in part, without
|
||||
the prior written consent of Tensilica Inc.
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
lcd-SPLC780D.h Generic definitions for Sunplus SPLC780D LCD Controller
|
||||
|
||||
This is used by board-support-packages with one or more LCD displays that use
|
||||
a SPLC780D controller. A BSP provides a base address for each instance of an
|
||||
SPLC780D LCD controller on the board.
|
||||
|
||||
Note that LCD display operation is almost totally independent of the LCD
|
||||
display, depending almost entirely on the controller. However the display
|
||||
may limit the number of characters of the controller's RAM buffer that are
|
||||
actually visible at one time. The length of the display's visible window
|
||||
is not specifified in this controller-specific header, but comes to the
|
||||
driver from the board-specific "display.h" header.
|
||||
|
||||
*******************************************************************************/
|
||||
|
||||
#ifndef _LCD_SPLC780D_H_
|
||||
#define _LCD_SPLC780D_H_
|
||||
|
||||
|
||||
/* Offsets to controller registers from base. */
|
||||
#define SPLC780D_INST 0
|
||||
#define SPLC780D_DATA (SPLC780D_INST + SPLC780D_REGSPACING)
|
||||
|
||||
/*
|
||||
Bit fields and their values in the instruction register.
|
||||
These fields are NOT orthogonal - they overlap!
|
||||
Thus only one field may be written at a time, determined by the
|
||||
most-significant 1 bit in the pattern (the field selector).
|
||||
All less significant bits are part of the value of the selected field.
|
||||
The fields and their values are grouped together to emphasize this format.
|
||||
Field selector macro names end in '_' (implying something more needs
|
||||
to be ORed) and the value macros are indented. The pattern written to a
|
||||
bitfield is a bitwise OR of a field selector and one or more values, eg.
|
||||
(SPLC780D_INST_ON_ | SPLC780D_INST_ON_DISPLAY | SPLC780D_INST_ON_CURSOR)
|
||||
A single bit field (eg. SPCL780D_INST_HOME) need not have a value.
|
||||
|
||||
NOTE: Controller requires a software delay after writing to the control
|
||||
or data registers. For the data register it is 38us. For the control
|
||||
register it is 38us for most bit fields, with the following exceptions:
|
||||
SPLC780D_FUNC_ 100us.
|
||||
SPLC780D_INST_CLEAR, SPLC780D_INST_HOME 1520us.
|
||||
For more details and reset timing, see the SUNPLUS SPLC780D data sheet.
|
||||
*/
|
||||
|
||||
#define SPLC780D_INST_CLEAR_ 0x1 /* clear (blank) display) */
|
||||
|
||||
#define SPLC780D_INST_HOME_ 0x2 /* home cursor and shift pos */
|
||||
|
||||
#define SPLC780D_INST_ENTRY_ 0x4 /* combine *ENTRY_* flags below */
|
||||
#define SPLC780D_INST_ENTRY_SHIFT 0x1 /* display shift on entry / not */
|
||||
#define SPLC780D_INST_ENTRY_INCR 0x2 /* cursor incr / decr */
|
||||
#define SPLC780D_INST_ENTRY_DECR 0 /* cursor incr / decr */
|
||||
|
||||
#define SPLC780D_INST_ON_ 0x8 /* combine *ON_* flags below */
|
||||
#define SPLC780D_INST_ON_DISPLAY 0x4 /* display on / off */
|
||||
#define SPLC780D_INST_ON_CURSOR 0x2 /* cursor on / off */
|
||||
#define SPLC780D_INST_ON_BLINK 0x1 /* blink on / off */
|
||||
|
||||
#define SPLC780D_INST_SHIFT_ 0x10 /* combine *SHIFT_* flags below */
|
||||
#define SPLC780D_INST_SHIFT_DISP 0x8 /* shift display / move cursor */
|
||||
#define SPLC780D_INST_SHIFT_CURS 0 /* shift display / move cursor */
|
||||
#define SPLC780D_INST_SHIFT_RIGHT 0x4 /* shift right / left */
|
||||
#define SPLC780D_INST_SHIFT_LEFT 0 /* shift right / left */
|
||||
|
||||
#define SPLC780D_INST_FUNC_ 0x20 /* combine *FUNC_* flags below */
|
||||
#define SPLC780D_INST_FUNC_8BIT 0x10 /* data length 8 bit / 4 bit */
|
||||
#define SPLC780D_INST_FUNC_4BIT 0 /* data length 8 bit / 4 bit */
|
||||
#define SPLC780D_INST_FUNC_2LINE 0x08 /* display lines 2 / 1 */
|
||||
#define SPLC780D_INST_FUNC_1LINE 0 /* display lines 2 / 1 */
|
||||
#define SPLC780D_INST_FUNC_F5x10 0x04 /* character font 5x10 / 5x8 */
|
||||
#define SPLC780D_INST_FUNC_F5x8 0 /* character font 5x10 / 5x8 */
|
||||
/* font must be 5x8 for 2 lines */
|
||||
#define SPLC780D_INST_CGEN_ 0x40 /* set char generator address */
|
||||
#define SPLC780D_INST_CGEN_ADDR 0x3F /* to address in this field */
|
||||
#define SPLC780D_INST_DRAM_ 0x80 /* set display data RAM address */
|
||||
#define SPLC780D_INST_DRAM_ADDR 0x7F /* to address in this field */
|
||||
#define SPLC780D_INST_DRAM_LINE2 0x40 /* address offset to line 2 */
|
||||
/* Controller limits */
|
||||
#define SPLC780D_RAMLEN_1LINE 0x50 /* length of line in RAM (1 line) */
|
||||
#define SPLC780D_RAMLEN_2LINE 0x28 /* length of line in RAM (2 line) */
|
||||
|
||||
|
||||
#ifndef __ASSEMBLER__
|
||||
|
||||
/* C interface to controller registers. */
|
||||
struct splc780d_s {
|
||||
splc780d_reg_t inst; /* instruction register */
|
||||
splc780d_reg_t data; /* data register */
|
||||
};
|
||||
|
||||
typedef volatile struct splc780d_s splc780d_t;
|
||||
|
||||
/*
|
||||
Prototypes of high level driver functions.
|
||||
*/
|
||||
|
||||
/*
|
||||
Initialize the display with the FUNC_, ENTRY_ and ON_ fields as specified in
|
||||
terms of the values above. The splc780d_init_default() macro is an example.
|
||||
*/
|
||||
extern void splc780d_init(splc780d_t *lcd,
|
||||
unsigned func, unsigned entry, unsigned on);
|
||||
|
||||
/*
|
||||
Initialize the display to default mode: 8-bit interface, 2 line, 5x8 font,
|
||||
increment cursor on entry, display on (cursor and blinking off).
|
||||
*/
|
||||
#define splc780d_init_default(lcd) \
|
||||
splc780d_init( lcd, \
|
||||
SPLC780D_INST_FUNC_8BIT \
|
||||
| SPLC780D_INST_FUNC_2LINE \
|
||||
| SPLC780D_INST_FUNC_F5x8, \
|
||||
SPLC780D_INST_ENTRY_INCR, \
|
||||
SPLC780D_INST_ON_DISPLAY \
|
||||
)
|
||||
|
||||
/*
|
||||
Write a single character at a given position (chars from left, starting at 0).
|
||||
Wait long enough afterward for the controller to be ready for more input.
|
||||
Positions beyond the end of the display are ignored.
|
||||
*/
|
||||
extern void splc780d_write_char(splc780d_t *lcd, unsigned pos, const char c);
|
||||
|
||||
/*
|
||||
Write a string to the display starting at the left (position 0).
|
||||
Blank-pad to or truncate at the end of the display (overwrites any previous
|
||||
string so don't need to blank the display first).
|
||||
Wait long enough after each char for the controller to be ready for more input.
|
||||
*/
|
||||
extern void splc780d_write_string(splc780d_t *lcd, const char *s);
|
||||
|
||||
/*
|
||||
Blank (clear) the entire display.
|
||||
Wait long enough afterward for the controller to be ready for more input.
|
||||
*/
|
||||
extern void splc780d_blank(splc780d_t *lcd);
|
||||
|
||||
#endif /* __ASSEMBLER__ */
|
||||
|
||||
#endif /* _LCD_SPLC780D_H_ */
|
||||
|
@ -1,184 +0,0 @@
|
||||
// overlay.h -- Overlay manager header file
|
||||
// $Id$
|
||||
|
||||
// Copyright (c) 2013 Tensilica Inc.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included
|
||||
// in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
|
||||
#ifndef OVERLAY_H
|
||||
#define OVERLAY_H
|
||||
|
||||
|
||||
#include <xtensa/xtruntime.h>
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
// Define this to turn off overlay support
|
||||
#ifdef XT_DISABLE_OVERLAYS
|
||||
|
||||
#define OVERLAY(n)
|
||||
#define DECLARE_OVERLAY(n)
|
||||
|
||||
#define xt_overlay_map(ov_id)
|
||||
#define xt_overlay_map_async(ov_id) 0
|
||||
#define xt_overlay_map_in_progress() 0
|
||||
#define xt_overlay_get_id() 0
|
||||
#define xt_overlay_get_state(pc) 0
|
||||
#define xt_overlay_check_map(pc,ps,ovstate,sp) 0
|
||||
|
||||
#else
|
||||
|
||||
// Shorthand for convenience and portability.
|
||||
#define OVERLAY(n) __attribute__((overlay(n)))
|
||||
|
||||
// Structure of the overlay table required by gdb and the overlay
|
||||
// manager. Should not be accessed by user code unless overriding
|
||||
// the load process.
|
||||
struct ovly_table {
|
||||
void * vma; // The overlay's mapped address.
|
||||
unsigned int size; // The size of the overlay, in bytes.
|
||||
void * lma; // The overlay's load address.
|
||||
unsigned int mapped; // Non-zero if overlay is currently mapped; zero otherwise.
|
||||
};
|
||||
|
||||
// Constructed by the linker. Required for gdb and for the overlay
|
||||
// manager. Should not be accessed by user code unless overriding
|
||||
// the load process.
|
||||
extern struct ovly_table _ovly_table[];
|
||||
|
||||
// Functions.
|
||||
void xt_overlay_map(int ov_id);
|
||||
int xt_overlay_map_async(int ov_id);
|
||||
int xt_overlay_map_in_progress(void);
|
||||
unsigned int xt_overlay_get_state(unsigned int pc);
|
||||
unsigned int xt_overlay_check_map(unsigned int * pc, unsigned int * ps,
|
||||
unsigned int ovstate, unsigned int sp);
|
||||
int xt_overlay_start_map(void * dst, void * src, unsigned int len, int ov_id);
|
||||
int xt_overlay_is_mapping(int ov_id);
|
||||
void xt_overlay_fatal_error(int ov_id);
|
||||
|
||||
|
||||
// Returns the current overlay ID. If no overlay is mapped or an overlay
|
||||
// is in the middle of being mapped, returns -1. Inlined to avoid calling
|
||||
// out of overlay (wastes cycles, can end up reading wrong ID on interrupt
|
||||
// activity).
|
||||
//
|
||||
static inline int xt_overlay_get_id(void)
|
||||
{
|
||||
#pragma always_inline
|
||||
extern short _mapping_id;
|
||||
extern short _ovly_id;
|
||||
|
||||
int ret;
|
||||
unsigned int flags = XTOS_SET_INTLEVEL(15);
|
||||
|
||||
if (_mapping_id >= 0) {
|
||||
ret = -1;
|
||||
}
|
||||
else {
|
||||
ret = _ovly_id;
|
||||
}
|
||||
|
||||
XTOS_RESTORE_INTLEVEL(flags);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
// The following macros are used to declare numbered overlays and generate
|
||||
// the corresponding call stubs. Use as follows:
|
||||
//
|
||||
// DECLARE_OVERLAY(n)
|
||||
//
|
||||
// See documentation for more details.
|
||||
|
||||
//#include <xtensa/config/core-isa.h>
|
||||
|
||||
// At this time overlays are not supported without windowing.
|
||||
#if defined(__XTENSA_WINDOWED_ABI__)
|
||||
|
||||
#define xstr(x) str(x)
|
||||
#define str(x) #x
|
||||
|
||||
// At entry, register a8 holds the return address and a9 holds the target
|
||||
// function address. This stub saves a8 on the stack at (SP - 20) which
|
||||
// is the only location that is safe for us to use. Then it allocates 32
|
||||
// bytes on the stack for working storage, loads the overlay number into
|
||||
// a8, and jumps to the common handler. The common handler will make sure
|
||||
// that the called function is loaded into memory before calling it.
|
||||
// NOTE: we are using the stack area normally reserved for nested functions.
|
||||
// This means nested functions cannot be used when overlays are in use.
|
||||
|
||||
#define CALL_IN(num) \
|
||||
asm(".section .gnu.linkonce.t.overlay.call." xstr(num) ".text, \"ax\"\n" \
|
||||
".global _overlay_call_in_" xstr(num) "_\n" \
|
||||
".align 4\n" \
|
||||
"_overlay_call_in_" xstr(num) "_:\n" \
|
||||
"s32e a8, a1, -20\n" \
|
||||
"addi a8, a1, -32\n" \
|
||||
"movsp a1, a8\n" \
|
||||
"movi a8, " xstr(num) "\n" \
|
||||
"j _overlay_call_in_common\n" \
|
||||
".size _overlay_call_in_" xstr(num) "_, . - _overlay_call_in_" xstr(num) "_\n");
|
||||
|
||||
// The call-out stub first calls the target function, then loads the overlay
|
||||
// number into register a14 and jumps to the common handler. The handler will
|
||||
// make sure that the caller function is present in memory before returning.
|
||||
// Note that registers a10-a13 may contain return values so must be preserved.
|
||||
//
|
||||
// Because we came here via a call4, the return address is in a4, and the top
|
||||
// 2 bits are set to the window increment. We'll restore the top 2 bits of
|
||||
// the return address from the called function's address, assuming that both
|
||||
// are in the same 1 GB segment. For now this is always true.
|
||||
|
||||
#define CALL_OUT(num) \
|
||||
asm(".section .gnu.linkonce.t.overlay.call." xstr(num) ".text, \"ax\"\n" \
|
||||
".global _overlay_call_out_" xstr(num) "_\n" \
|
||||
".align 4\n" \
|
||||
"_overlay_call_out_" xstr(num) "_:\n" \
|
||||
"slli a4, a4, 2\n" \
|
||||
"srli a4, a4, 2\n" \
|
||||
"extui a8, a9, 30, 2\n" \
|
||||
"slli a8, a8, 30\n" \
|
||||
"or a4, a4, a8\n" \
|
||||
"callx8 a9\n" \
|
||||
"movi a14, " xstr(num) "\n" \
|
||||
"j _overlay_call_out_common\n" \
|
||||
".size _overlay_call_out_" xstr(num) "_, . - _overlay_call_out_" xstr(num) "_\n");
|
||||
|
||||
// Generate a call-in and a call-out stub for each overlay.
|
||||
|
||||
#define DECLARE_OVERLAY(num) \
|
||||
CALL_IN(num) \
|
||||
CALL_OUT(num)
|
||||
|
||||
#endif // defined(__XTENSA_WINDOWED_ABI__)
|
||||
|
||||
#endif // XT_DISABLE_OVERLAYS
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // OVERLAY_H
|
||||
|
@ -1,140 +0,0 @@
|
||||
// overlay_os_asm.h -- Overlay manager assembly macros for OS use.
|
||||
// $Id$
|
||||
|
||||
// Copyright (c) 2013 Tensilica Inc.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included
|
||||
// in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
|
||||
#ifndef OVERLAY_OS_ASM_H
|
||||
#define OVERLAY_OS_ASM_H
|
||||
|
||||
// The macros in here are intended to be used by RTOS task switch code
|
||||
// to check overlay status. Such code is usually in assembly and cannot
|
||||
// call C code without penalty. For C code usage, it is best to use the
|
||||
// corresponding C functions from the library.
|
||||
|
||||
|
||||
// Inline assembly version of xt_overlay_get_state(). The arguments are
|
||||
// three AR registers (a0-a15):
|
||||
//
|
||||
// "pcreg" - should contain the outgoing task's PC, i.e. the point at
|
||||
// which the task got interrupted. The return value is also
|
||||
// returned in this register.
|
||||
// "sr1/2" - Scratch registers. These must be distinct from "pcreg".
|
||||
//
|
||||
// The return value is a 32-bit result that should be saved with the
|
||||
// task context and passed as-is to xt_overlay_check_map.
|
||||
|
||||
.macro _xt_overlay_get_state pcreg sr1 sr2
|
||||
|
||||
movi \sr1, _mapping_id
|
||||
movi \sr2, _ovly_id
|
||||
l16si \sr1, \sr1, 0
|
||||
l16ui \sr2, \sr2, 0
|
||||
slli \sr1, \sr1, 16
|
||||
or \pcreg, \sr1, \sr2
|
||||
|
||||
.endm
|
||||
|
||||
|
||||
// Inline assembly version of xt_overlay_check_map(). It requires 5 AR
|
||||
// registers (a0-a15) as arguments.
|
||||
//
|
||||
// "pcreg" - should contain the interrupted task's PC, i.e. the point
|
||||
// at which the task got interrupted. This will be adjusted
|
||||
// if required.
|
||||
// "psreg" - should contain the interrupted task's PS. This will be
|
||||
// adjusted if required.
|
||||
// "ovreg" - should contain the overlay state on entry. Contents may
|
||||
// be clobbered.
|
||||
// "spreg" - should contain the tasks stack pointer on entry.
|
||||
// "sr1" - Scratch register. Must be distinct from any of the above.
|
||||
//
|
||||
// The return values are "pcreg" and "psreg" and these must be used
|
||||
// to update the task's PC and PS.
|
||||
// Note that this macro may store data below the "spreg" pointer. If
|
||||
// it does, then it will also disable interrupts via the PS, so that
|
||||
// the task resumes with all interrupts disabled (to avoid corrupting
|
||||
// this data).
|
||||
//
|
||||
// (SP - 24) Overlay ID to restore
|
||||
// (SP - 28) Task PC
|
||||
// (SP - 32) Task PS
|
||||
|
||||
.macro _xt_overlay_check_map pcreg psreg ovreg spreg sr1
|
||||
|
||||
// There are four cases to deal with:
|
||||
//
|
||||
// _ovly_id = -1, _mapping_id = -1
|
||||
// No overlay is mapped or mapping, nothing to do.
|
||||
//
|
||||
// _ovly_id >= 0, _mapping_id = -1
|
||||
// An overlay was mapped, check PC to see if we need a restore.
|
||||
//
|
||||
// _ovly_id = -1, _mapping_id >= 0
|
||||
// An overlay is being mapped. Either it belongs to this task, which
|
||||
// implies that the PC is in the mapping function, or it does not
|
||||
// belong to this task. Either way there is nothing to do.
|
||||
//
|
||||
// _ovly_id >= 0, _mapping_id >= 0
|
||||
// Illegal, cannot happen by design. Don't need to handle this.
|
||||
//
|
||||
// So, the logic is to check _ovly_id first. If this is >= 0, then
|
||||
// we check the task PC. If the PC is in the regions of interest then
|
||||
// we'll patch the return PC to invoke xt_overlay_restore.
|
||||
|
||||
.L1:
|
||||
extui \sr1, \ovreg, 0, 16 // Extract _ovly_id
|
||||
bbsi.l \sr1, 15, .Lno // If -1 then we're done
|
||||
mov \ovreg, \sr1 // Restore this one
|
||||
|
||||
// Next check the PC to see if it falls within the ranges of interest.
|
||||
|
||||
.L2:
|
||||
movi \sr1, _overlay_vma // Is PC < VMA range ?
|
||||
bltu \pcreg, \sr1, .L3
|
||||
movi \sr1, _overlay_vma_end // Is PC > VMA range ?
|
||||
bgeu \pcreg, \sr1, .L3
|
||||
j .L4 // PC is in VMA range
|
||||
.L3:
|
||||
movi \sr1, _overlay_call_stubs_start // Is PC < call stubs range ?
|
||||
bltu \pcreg, \sr1, .Lno
|
||||
movi \sr1, _overlay_call_stubs_end // Is PC > call stubs range ?
|
||||
bgeu \pcreg, \sr1, .Lno
|
||||
|
||||
// If we get here then a restore is needed. Save the overlay ID, PC and PS.
|
||||
// Return modified PC and PS so that xt_overlay_restore() will execute in
|
||||
// the context of the task when resumed. Note that the OS resumption code
|
||||
// may expect PS.EXCM to be set so we leave it as is in the return value.
|
||||
|
||||
.L4:
|
||||
s32e \ovreg, \spreg, -24 // Save overlay ID
|
||||
s32e \pcreg, \spreg, -28 // Save task PC
|
||||
s32e \psreg, \spreg, -32 // Save task PS
|
||||
movi \pcreg, xt_overlay_restore // Adjust resumption PC
|
||||
movi \sr1, 15
|
||||
or \psreg, \psreg, \sr1 // Set intlevel to highest
|
||||
.Lno:
|
||||
|
||||
.endm
|
||||
|
||||
#endif // OVERLAY_OS_ASM_H
|
||||
|
@ -1,60 +0,0 @@
|
||||
/* Copyright (c) 2004-2006 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
/ These coded instructions, statements, and computer programs are the
|
||||
/ copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
/ They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
/ third parties in any manner, medium, or form, in whole or in part, without
|
||||
/ the prior written consent of Tensilica Inc.
|
||||
*/
|
||||
|
||||
/* sim.h
|
||||
*
|
||||
* Definitions and prototypes for specific ISS SIMCALLs
|
||||
* (ie. outside the standard C library).
|
||||
*/
|
||||
|
||||
#ifndef _INC_SIM_H_
|
||||
#define _INC_SIM_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Shortcuts for enabling/disabling profiling in the Xtensa ISS */
|
||||
extern void xt_iss_profile_enable(void);
|
||||
extern void xt_iss_profile_disable(void);
|
||||
|
||||
/* Shortcut for setting the trace level in the Xtensa ISS */
|
||||
extern void xt_iss_trace_level(unsigned level);
|
||||
|
||||
/* Generic interface for passing client commands in the Xtensa ISS:
|
||||
* returns 0 on success, -1 on failure.
|
||||
*/
|
||||
extern int xt_iss_client_command(const char *client, const char *command);
|
||||
|
||||
/* Interface for switching simulation modes in the Xtensa ISS:
|
||||
* returns 0 on success, -1 on failure.
|
||||
*/
|
||||
#define XT_ISS_CYCLE_ACCURATE 0
|
||||
#define XT_ISS_FUNCTIONAL 1
|
||||
extern int xt_iss_switch_mode(int mode);
|
||||
|
||||
|
||||
/* Interface for waiting on a system synchronization event */
|
||||
extern void xt_iss_event_wait(unsigned event_id);
|
||||
|
||||
/* Interface for firing a system synchronization event */
|
||||
extern void xt_iss_event_fire(unsigned event_id);
|
||||
|
||||
/* Interface for invoking a user simcall action,
|
||||
* which can be registered in XTMP or XTSC.
|
||||
*/
|
||||
extern int xt_iss_simcall(int arg1, int arg2, int arg3,
|
||||
int arg4, int arg5, int arg6);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /*_INC_SIM_H_*/
|
||||
|
@ -1,71 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001 Tensilica Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/* simboard.h - Xtensa ISS "Board" specific definitions */
|
||||
|
||||
#ifndef _INC_SIMBOARD_H_
|
||||
#define _INC_SIMBOARD_H_
|
||||
|
||||
#include <xtensa/config/core.h>
|
||||
#include <xtensa/config/system.h>
|
||||
|
||||
|
||||
/*
|
||||
* Device addresses.
|
||||
*/
|
||||
|
||||
/* System ROM: */
|
||||
#define XTBOARD_ROM_SIZE XSHAL_ROM_SIZE
|
||||
#ifdef XSHAL_ROM_VADDR
|
||||
#define XTBOARD_ROM_VADDR XSHAL_ROM_VADDR
|
||||
#endif
|
||||
#ifdef XSHAL_ROM_PADDR
|
||||
#define XTBOARD_ROM_PADDR XSHAL_ROM_PADDR
|
||||
#endif
|
||||
|
||||
/* System RAM: */
|
||||
#define XTBOARD_RAM_SIZE XSHAL_RAM_SIZE
|
||||
#ifdef XSHAL_RAM_VADDR
|
||||
#define XTBOARD_RAM_VADDR XSHAL_RAM_VADDR
|
||||
#endif
|
||||
#ifdef XSHAL_RAM_PADDR
|
||||
#define XTBOARD_RAM_PADDR XSHAL_RAM_PADDR
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Things that depend on device addresses.
|
||||
*/
|
||||
|
||||
#define XTBOARD_CACHEATTR_WRITEBACK XSHAL_ISS_CACHEATTR_WRITEBACK
|
||||
#define XTBOARD_CACHEATTR_WRITEALLOC XSHAL_ISS_CACHEATTR_WRITEALLOC
|
||||
#define XTBOARD_CACHEATTR_WRITETHRU XSHAL_ISS_CACHEATTR_WRITETHRU
|
||||
#define XTBOARD_CACHEATTR_BYPASS XSHAL_ISS_CACHEATTR_BYPASS
|
||||
#define XTBOARD_CACHEATTR_DEFAULT XSHAL_ISS_CACHEATTR_DEFAULT
|
||||
|
||||
#define XTBOARD_BUSINT_PIPE_REGIONS 0
|
||||
#define XTBOARD_BUSINT_SDRAM_REGIONS 0
|
||||
|
||||
|
||||
#endif /*_INC_SIMBOARD_H_*/
|
||||
|
@ -1,139 +0,0 @@
|
||||
/* Error numbers for Xtensa ISS semihosting. */
|
||||
|
||||
/* Copyright (c) 2003 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
These coded instructions, statements, and computer programs are the
|
||||
copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
third parties in any manner, medium, or form, in whole or in part, without
|
||||
the prior written consent of Tensilica Inc. */
|
||||
|
||||
#ifndef _SIMCALL_ERRNO_H
|
||||
#define _SIMCALL_ERRNO_H
|
||||
|
||||
/* Define the error numbers (using the default newlib values) with prefixes
|
||||
so they can be used in ISS without conflicting with the host values. */
|
||||
|
||||
#define _SIMC_EPERM 1
|
||||
#define _SIMC_ENOENT 2
|
||||
#define _SIMC_ESRCH 3
|
||||
#define _SIMC_EINTR 4
|
||||
#define _SIMC_EIO 5
|
||||
#define _SIMC_ENXIO 6
|
||||
#define _SIMC_E2BIG 7
|
||||
#define _SIMC_ENOEXEC 8
|
||||
#define _SIMC_EBADF 9
|
||||
#define _SIMC_ECHILD 10
|
||||
#define _SIMC_EAGAIN 11
|
||||
#define _SIMC_ENOMEM 12
|
||||
#define _SIMC_EACCES 13
|
||||
#define _SIMC_EFAULT 14
|
||||
#define _SIMC_ENOTBLK 15
|
||||
#define _SIMC_EBUSY 16
|
||||
#define _SIMC_EEXIST 17
|
||||
#define _SIMC_EXDEV 18
|
||||
#define _SIMC_ENODEV 19
|
||||
#define _SIMC_ENOTDIR 20
|
||||
#define _SIMC_EISDIR 21
|
||||
#define _SIMC_EINVAL 22
|
||||
#define _SIMC_ENFILE 23
|
||||
#define _SIMC_EMFILE 24
|
||||
#define _SIMC_ENOTTY 25
|
||||
#define _SIMC_ETXTBSY 26
|
||||
#define _SIMC_EFBIG 27
|
||||
#define _SIMC_ENOSPC 28
|
||||
#define _SIMC_ESPIPE 29
|
||||
#define _SIMC_EROFS 30
|
||||
#define _SIMC_EMLINK 31
|
||||
#define _SIMC_EPIPE 32
|
||||
#define _SIMC_EDOM 33
|
||||
#define _SIMC_ERANGE 34
|
||||
#define _SIMC_ENOMSG 35
|
||||
#define _SIMC_EIDRM 36
|
||||
#define _SIMC_ECHRNG 37
|
||||
#define _SIMC_EL2NSYNC 38
|
||||
#define _SIMC_EL3HLT 39
|
||||
#define _SIMC_EL3RST 40
|
||||
#define _SIMC_ELNRNG 41
|
||||
#define _SIMC_EUNATCH 42
|
||||
#define _SIMC_ENOCSI 43
|
||||
#define _SIMC_EL2HLT 44
|
||||
#define _SIMC_EDEADLK 45
|
||||
#define _SIMC_ENOLCK 46
|
||||
#define _SIMC_EBADE 50
|
||||
#define _SIMC_EBADR 51
|
||||
#define _SIMC_EXFULL 52
|
||||
#define _SIMC_ENOANO 53
|
||||
#define _SIMC_EBADRQC 54
|
||||
#define _SIMC_EBADSLT 55
|
||||
#define _SIMC_EDEADLOCK 56
|
||||
#define _SIMC_EBFONT 57
|
||||
#define _SIMC_ENOSTR 60
|
||||
#define _SIMC_ENODATA 61
|
||||
#define _SIMC_ETIME 62
|
||||
#define _SIMC_ENOSR 63
|
||||
#define _SIMC_ENONET 64
|
||||
#define _SIMC_ENOPKG 65
|
||||
#define _SIMC_EREMOTE 66
|
||||
#define _SIMC_ENOLINK 67
|
||||
#define _SIMC_EADV 68
|
||||
#define _SIMC_ESRMNT 69
|
||||
#define _SIMC_ECOMM 70
|
||||
#define _SIMC_EPROTO 71
|
||||
#define _SIMC_EMULTIHOP 74
|
||||
#define _SIMC_ELBIN 75
|
||||
#define _SIMC_EDOTDOT 76
|
||||
#define _SIMC_EBADMSG 77
|
||||
#define _SIMC_EFTYPE 79
|
||||
#define _SIMC_ENOTUNIQ 80
|
||||
#define _SIMC_EBADFD 81
|
||||
#define _SIMC_EREMCHG 82
|
||||
#define _SIMC_ELIBACC 83
|
||||
#define _SIMC_ELIBBAD 84
|
||||
#define _SIMC_ELIBSCN 85
|
||||
#define _SIMC_ELIBMAX 86
|
||||
#define _SIMC_ELIBEXEC 87
|
||||
#define _SIMC_ENOSYS 88
|
||||
#define _SIMC_ENMFILE 89
|
||||
#define _SIMC_ENOTEMPTY 90
|
||||
#define _SIMC_ENAMETOOLONG 91
|
||||
#define _SIMC_ELOOP 92
|
||||
#define _SIMC_EOPNOTSUPP 95
|
||||
#define _SIMC_EPFNOSUPPORT 96
|
||||
#define _SIMC_ECONNRESET 104
|
||||
#define _SIMC_ENOBUFS 105
|
||||
#define _SIMC_EAFNOSUPPORT 106
|
||||
#define _SIMC_EPROTOTYPE 107
|
||||
#define _SIMC_ENOTSOCK 108
|
||||
#define _SIMC_ENOPROTOOPT 109
|
||||
#define _SIMC_ESHUTDOWN 110
|
||||
#define _SIMC_ECONNREFUSED 111
|
||||
#define _SIMC_EADDRINUSE 112
|
||||
#define _SIMC_ECONNABORTED 113
|
||||
#define _SIMC_ENETUNREACH 114
|
||||
#define _SIMC_ENETDOWN 115
|
||||
#define _SIMC_ETIMEDOUT 116
|
||||
#define _SIMC_EHOSTDOWN 117
|
||||
#define _SIMC_EHOSTUNREACH 118
|
||||
#define _SIMC_EINPROGRESS 119
|
||||
#define _SIMC_EALREADY 120
|
||||
#define _SIMC_EDESTADDRREQ 121
|
||||
#define _SIMC_EMSGSIZE 122
|
||||
#define _SIMC_EPROTONOSUPPORT 123
|
||||
#define _SIMC_ESOCKTNOSUPPORT 124
|
||||
#define _SIMC_EADDRNOTAVAIL 125
|
||||
#define _SIMC_ENETRESET 126
|
||||
#define _SIMC_EISCONN 127
|
||||
#define _SIMC_ENOTCONN 128
|
||||
#define _SIMC_ETOOMANYREFS 129
|
||||
#define _SIMC_EPROCLIM 130
|
||||
#define _SIMC_EUSERS 131
|
||||
#define _SIMC_EDQUOT 132
|
||||
#define _SIMC_ESTALE 133
|
||||
#define _SIMC_ENOTSUP 134
|
||||
#define _SIMC_ENOMEDIUM 135
|
||||
#define _SIMC_ENOSHARE 136
|
||||
#define _SIMC_ECASECLASH 137
|
||||
#define _SIMC_EILSEQ 138
|
||||
#define _SIMC_EOVERFLOW 139
|
||||
|
||||
#endif /* ! _SIMCALL_ERRNO_H */
|
@ -1,21 +0,0 @@
|
||||
/* File control operations for Xtensa ISS semihosting. */
|
||||
|
||||
/* Copyright (c) 2003 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
These coded instructions, statements, and computer programs are the
|
||||
copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
third parties in any manner, medium, or form, in whole or in part, without
|
||||
the prior written consent of Tensilica Inc. */
|
||||
|
||||
#ifndef _SIMCALL_FCNTL_H
|
||||
#define _SIMCALL_FCNTL_H
|
||||
|
||||
#define _SIMC_O_APPEND 0x0008
|
||||
#define _SIMC_O_NONBLOCK 0x0080
|
||||
#define _SIMC_O_CREAT 0x0100
|
||||
#define _SIMC_O_TRUNC 0x0200
|
||||
#define _SIMC_O_EXCL 0x0400
|
||||
#define _SIMC_O_TEXT 0x4000
|
||||
#define _SIMC_O_BINARY 0x8000
|
||||
|
||||
#endif /* ! _SIMCALL_FCNTL_H */
|
@ -1,189 +0,0 @@
|
||||
/*
|
||||
* simcall.h - Simulator call numbers
|
||||
*
|
||||
* Software that runs on a simulated Xtensa processor using
|
||||
* the instruction set simulator (ISS) can invoke simulator
|
||||
* services using the SIMCALL instruction. The a2 register
|
||||
* is set prior to executing SIMCALL to a "simcall number",
|
||||
* indicating which service to invoke. This file defines the
|
||||
* simcall numbers defined and/or supported by the Xtensa ISS.
|
||||
*
|
||||
* IMPORTANT NOTE: These numbers are highly subject to change!
|
||||
*
|
||||
* Copyright (c) 2002-2007 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
* They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
* third parties in any manner, medium, or form, in whole or in part, without
|
||||
* the prior written consent of Tensilica Inc.
|
||||
*/
|
||||
|
||||
#ifndef SIMCALL_INCLUDED
|
||||
#define SIMCALL_INCLUDED
|
||||
|
||||
/*
|
||||
* System call like services offered by the simulator host.
|
||||
* These are modeled after the Linux 2.4 kernel system calls
|
||||
* for Xtensa processors. However not all system calls and
|
||||
* not all functionality of a given system call are implemented,
|
||||
* or necessarily have well defined or equivalent semantics in
|
||||
* the context of a simulation (as opposed to a Unix kernel).
|
||||
*
|
||||
* These services behave largely as if they had been invoked
|
||||
* as a task in the simulator host's operating system
|
||||
* (eg. files accessed are those of the simulator host).
|
||||
* However, these SIMCALLs model a virtual operating system
|
||||
* so that various definitions, bit assignments etc
|
||||
* (eg. open mode bits, errno values, etc) are independent
|
||||
* of the host operating system used to run the simulation.
|
||||
* Rather these definitions are specific to the Xtensa ISS.
|
||||
* This way Xtensa ISA code written to use these SIMCALLs
|
||||
* can (in principle) be simulated on any host.
|
||||
*
|
||||
* Up to 6 parameters are passed in registers a3 to a8
|
||||
* (note the 6th parameter isn't passed on the stack,
|
||||
* unlike windowed function calling conventions).
|
||||
* The return value is in a2. A negative value in the
|
||||
* range -4096 to -1 indicates a negated error code to be
|
||||
* reported in errno with a return value of -1, otherwise
|
||||
* the value in a2 is returned as is.
|
||||
*/
|
||||
|
||||
/* These #defines need to match what's in Xtensa/OS/vxworks/xtiss/simcalls.c */
|
||||
|
||||
#define SYS_nop 0 /* n/a - setup; used to flush register windows */
|
||||
#define SYS_exit 1 /*x*/
|
||||
#define SYS_fork 2
|
||||
#define SYS_read 3 /*x*/
|
||||
#define SYS_write 4 /*x*/
|
||||
#define SYS_open 5 /*x*/
|
||||
#define SYS_close 6 /*x*/
|
||||
#define SYS_rename 7 /*x 38 - waitpid */
|
||||
#define SYS_creat 8 /*x*/
|
||||
#define SYS_link 9 /*x (not implemented on WIN32) */
|
||||
#define SYS_unlink 10 /*x*/
|
||||
#define SYS_execv 11 /* n/a - execve */
|
||||
#define SYS_execve 12 /* 11 - chdir */
|
||||
#define SYS_pipe 13 /* 42 - time */
|
||||
#define SYS_stat 14 /* 106 - mknod */
|
||||
#define SYS_chmod 15
|
||||
#define SYS_chown 16 /* 202 - lchown */
|
||||
#define SYS_utime 17 /* 30 - break */
|
||||
#define SYS_wait 18 /* n/a - oldstat */
|
||||
#define SYS_lseek 19 /*x*/
|
||||
#define SYS_getpid 20
|
||||
#define SYS_isatty 21 /* n/a - mount */
|
||||
#define SYS_fstat 22 /* 108 - oldumount */
|
||||
#define SYS_time 23 /* 13 - setuid */
|
||||
#define SYS_gettimeofday 24 /*x 78 - getuid (not implemented on WIN32) */
|
||||
#define SYS_times 25 /*X 43 - stime (Xtensa-specific implementation) */
|
||||
#define SYS_socket 26
|
||||
#define SYS_sendto 27
|
||||
#define SYS_recvfrom 28
|
||||
#define SYS_select_one 29 /* not compitible select, one file descriptor at the time */
|
||||
#define SYS_bind 30
|
||||
#define SYS_ioctl 31
|
||||
|
||||
/*
|
||||
* Other...
|
||||
*/
|
||||
#define SYS_iss_argc 1000 /* returns value of argc */
|
||||
#define SYS_iss_argv_size 1001 /* bytes needed for argv & arg strings */
|
||||
#define SYS_iss_set_argv 1002 /* saves argv & arg strings at given addr */
|
||||
|
||||
#define SYS_memset 1004 /* fill a range of memory (fast) */
|
||||
|
||||
/*
|
||||
* SIMCALLs for the ferret memory debugger. All are invoked by
|
||||
* libferret.a ... ( Xtensa/Target-Libs/ferret )
|
||||
*/
|
||||
#define SYS_ferret 1010
|
||||
#define SYS_malloc 1011
|
||||
#define SYS_free 1012
|
||||
#define SYS_more_heap 1013
|
||||
#define SYS_no_heap 1014
|
||||
#define SYS_enter_ferret 1015
|
||||
#define SYS_leave_ferret 1016
|
||||
|
||||
/*
|
||||
* SIMCALLs for ISS client commands
|
||||
*/
|
||||
#define SYS_profile_enable 1020
|
||||
#define SYS_profile_disable 1021
|
||||
#define SYS_trace_level 1022
|
||||
#define SYS_client_command 1023
|
||||
|
||||
/*
|
||||
* SIMCALL for simulation mode switching
|
||||
*/
|
||||
#define SYS_sim_mode_switch 1030
|
||||
|
||||
/*
|
||||
* SIMCALLs for XTMP/XTSC event notify and core stall
|
||||
*/
|
||||
#define SYS_event_fire 1040
|
||||
#define SYS_event_stall 1041
|
||||
|
||||
/*
|
||||
* SIMCALLs for callbacks registered in XTMP/XTSC
|
||||
*/
|
||||
#define SYS_callback_first 100
|
||||
#define SYS_callback_last 999
|
||||
|
||||
/*
|
||||
* User defined simcall
|
||||
*/
|
||||
#define SYS_user_simcall 100
|
||||
|
||||
#define SYS_xmpa_errinfo 200
|
||||
#define SYS_xmpa_proc_status 201
|
||||
#define SYS_xmpa_proc_start 202
|
||||
#define SYS_xmpa_proc_stop 203
|
||||
#define SYS_xmpa_proc_mem_read 204
|
||||
#define SYS_xmpa_proc_mem_write 205
|
||||
#define SYS_xmpa_proc_mem_fill 206
|
||||
#define SYS_xmpa_proc_reg_read 207
|
||||
#define SYS_xmpa_proc_reg_write 208
|
||||
|
||||
|
||||
/*
|
||||
* Extra SIMCALLs for GDB:
|
||||
*/
|
||||
#define SYS_gdb_break -1 /* invoked by XTOS on user exceptions if EPC points
|
||||
to a break.n/break, regardless of cause! */
|
||||
#define SYS_xmon_out -2 /* invoked by XMON: ... */
|
||||
#define SYS_xmon_in -3 /* invoked by XMON: ... */
|
||||
#define SYS_xmon_flush -4 /* invoked by XMON: ... */
|
||||
#define SYS_gdb_abort -5 /* invoked by XTOS in _xtos_panic() */
|
||||
#define SYS_gdb_illegal_inst -6 /* invoked by XTOS for illegal instructions (too deeply) */
|
||||
#define SYS_xmon_init -7 /* invoked by XMON: ... */
|
||||
#define SYS_gdb_enter_sktloop -8 /* invoked by XTOS on debug exceptions */
|
||||
#define SYS_unhandled_kernel_exc -9 /* invoked by XTOS for unhandled kernel exceptions */
|
||||
#define SYS_unhandled_user_exc -10 /* invoked by XTOS for unhandled user exceptions */
|
||||
#define SYS_unhandled_double_exc -11 /* invoked by XTOS for unhandled double exceptions */
|
||||
#define SYS_unhandled_highpri_interrupt -12 /* invoked by XTOS for unhandled high-priority interrupts */
|
||||
#define SYS_xmon_close -13 /* invoked by XMON: ... */
|
||||
|
||||
/*
|
||||
* SIMCALLs for vxWorks xtiss BSP:
|
||||
*/
|
||||
#define SYS_setup_ppp_pipes -83
|
||||
#define SYS_log_msg -84
|
||||
|
||||
/*
|
||||
* SYS_select_one specifiers
|
||||
*/
|
||||
#define XTISS_SELECT_ONE_READ 1
|
||||
#define XTISS_SELECT_ONE_WRITE 2
|
||||
#define XTISS_SELECT_ONE_EXCEPT 3
|
||||
|
||||
/*
|
||||
* SIMCALL for client calling arbitrary code in a client plug in.
|
||||
* see clients/xcc_instr to see how this works.
|
||||
*/
|
||||
|
||||
#define SYS_client 0xC0DECAFE
|
||||
|
||||
|
||||
|
||||
#endif /* !SIMCALL_INCLUDED */
|
@ -1,96 +0,0 @@
|
||||
/* Definitions for the xt_DFP_assist TIE package */
|
||||
|
||||
/*
|
||||
* Customer ID=11657; Build=0x5fe96; Copyright (c) 2004-2010 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
* They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
* third parties in any manner, medium, or form, in whole or in part, without
|
||||
* the prior written consent of Tensilica Inc.
|
||||
*/
|
||||
|
||||
/* Do not modify. This is automatically generated.*/
|
||||
|
||||
#ifndef _XTENSA_xt_DFP_assist_HEADER
|
||||
#define _XTENSA_xt_DFP_assist_HEADER
|
||||
|
||||
#ifdef __XTENSA__
|
||||
#ifdef __XCC__
|
||||
|
||||
#include <xtensa/tie/xt_core.h>
|
||||
|
||||
/*
|
||||
* The following prototypes describe intrinsic functions
|
||||
* corresponding to TIE instructions. Some TIE instructions
|
||||
* may produce multiple results (designated as "out" operands
|
||||
* in the iclass section) or may have operands used as both
|
||||
* inputs and outputs (designated as "inout"). However, the C
|
||||
* and C++ languages do not provide syntax that can express
|
||||
* the in/out/inout constraints of TIE intrinsics.
|
||||
* Nevertheless, the compiler understands these constraints
|
||||
* and will check that the intrinsic functions are used
|
||||
* correctly. To improve the readability of these prototypes,
|
||||
* the "out" and "inout" parameters are marked accordingly
|
||||
* with comments.
|
||||
*/
|
||||
|
||||
extern void _TIE_xt_DFP_assist_F64ITER(unsigned arr /*inout*/, unsigned ars, unsigned art, immediate oper, immediate noshift);
|
||||
extern unsigned _TIE_xt_DFP_assist_F64RND(unsigned ars, unsigned art, immediate mode);
|
||||
extern void _TIE_xt_DFP_assist_F64ADDC(unsigned art /*inout*/, unsigned ars, immediate immZ, immediate immC);
|
||||
extern void _TIE_xt_DFP_assist_F64SUBC(unsigned art /*inout*/, unsigned ars, immediate immZ, immediate immC);
|
||||
extern unsigned _TIE_xt_DFP_assist_F64SIG(unsigned ars);
|
||||
extern unsigned _TIE_xt_DFP_assist_F64CMPL(unsigned ars, unsigned art);
|
||||
extern unsigned _TIE_xt_DFP_assist_F64CMPH(unsigned ars, unsigned art, immediate oper);
|
||||
extern unsigned _TIE_xt_DFP_assist_F64NORM(unsigned ars, unsigned art, immediate mode);
|
||||
extern unsigned _TIE_xt_DFP_assist_F64SEXP(unsigned ars, unsigned art);
|
||||
extern unsigned _TIE_xt_DFP_assist_RF64R(immediate hilo);
|
||||
extern void _TIE_xt_DFP_assist_WF64R(unsigned ars, unsigned art, immediate hilo);
|
||||
extern unsigned _TIE_xt_DFP_assist_RUR_F64R_LO(void);
|
||||
extern unsigned _TIE_xt_DFP_assist_RUR_F64R_HI(void);
|
||||
extern void _TIE_xt_DFP_assist_WUR_F64R_LO(unsigned art);
|
||||
extern void _TIE_xt_DFP_assist_WUR_F64R_HI(unsigned art);
|
||||
extern unsigned _TIE_xt_DFP_assist_RUR_F64S(void);
|
||||
extern void _TIE_xt_DFP_assist_WUR_F64S(unsigned art);
|
||||
#define F64ITER _TIE_xt_DFP_assist_F64ITER
|
||||
#define F64RND _TIE_xt_DFP_assist_F64RND
|
||||
#define F64ADDC _TIE_xt_DFP_assist_F64ADDC
|
||||
#define F64SUBC _TIE_xt_DFP_assist_F64SUBC
|
||||
#define F64SIG _TIE_xt_DFP_assist_F64SIG
|
||||
#define F64CMPL _TIE_xt_DFP_assist_F64CMPL
|
||||
#define F64CMPH _TIE_xt_DFP_assist_F64CMPH
|
||||
#define F64NORM _TIE_xt_DFP_assist_F64NORM
|
||||
#define F64SEXP _TIE_xt_DFP_assist_F64SEXP
|
||||
#define RF64R _TIE_xt_DFP_assist_RF64R
|
||||
#define WF64R _TIE_xt_DFP_assist_WF64R
|
||||
#define RUR_F64R_LO _TIE_xt_DFP_assist_RUR_F64R_LO
|
||||
#define RF64R_LO _TIE_xt_DFP_assist_RUR_F64R_LO
|
||||
#define RUR234 _TIE_xt_DFP_assist_RUR_F64R_LO
|
||||
#define RUR_F64R_HI _TIE_xt_DFP_assist_RUR_F64R_HI
|
||||
#define RF64R_HI _TIE_xt_DFP_assist_RUR_F64R_HI
|
||||
#define RUR235 _TIE_xt_DFP_assist_RUR_F64R_HI
|
||||
#define WUR_F64R_LO _TIE_xt_DFP_assist_WUR_F64R_LO
|
||||
#define WF64R_LO _TIE_xt_DFP_assist_WUR_F64R_LO
|
||||
#define WUR234 _TIE_xt_DFP_assist_WUR_F64R_LO
|
||||
#define WUR_F64R_HI _TIE_xt_DFP_assist_WUR_F64R_HI
|
||||
#define WF64R_HI _TIE_xt_DFP_assist_WUR_F64R_HI
|
||||
#define WUR235 _TIE_xt_DFP_assist_WUR_F64R_HI
|
||||
#define RUR_F64S _TIE_xt_DFP_assist_RUR_F64S
|
||||
#define RF64S _TIE_xt_DFP_assist_RUR_F64S
|
||||
#define RUR236 _TIE_xt_DFP_assist_RUR_F64S
|
||||
#define WUR_F64S _TIE_xt_DFP_assist_WUR_F64S
|
||||
#define WF64S _TIE_xt_DFP_assist_WUR_F64S
|
||||
#define WUR236 _TIE_xt_DFP_assist_WUR_F64S
|
||||
|
||||
#ifndef RUR
|
||||
#define RUR(NUM) RUR##NUM()
|
||||
#endif
|
||||
|
||||
#ifndef WUR
|
||||
#define WUR(VAL, NUM) WUR##NUM(VAL)
|
||||
#endif
|
||||
|
||||
#endif /* __XCC__ */
|
||||
|
||||
#endif /* __XTENSA__ */
|
||||
|
||||
#endif /* !_XTENSA_xt_DFP_assist_HEADER */
|
@ -1,197 +0,0 @@
|
||||
/* Definitions for the xt_FP TIE package */
|
||||
|
||||
/*
|
||||
* Customer ID=11657; Build=0x5fe96; Copyright (c) 2004-2010 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
* They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
* third parties in any manner, medium, or form, in whole or in part, without
|
||||
* the prior written consent of Tensilica Inc.
|
||||
*/
|
||||
|
||||
/* Do not modify. This is automatically generated.*/
|
||||
|
||||
#ifndef _XTENSA_xt_FP_HEADER
|
||||
#define _XTENSA_xt_FP_HEADER
|
||||
|
||||
#ifdef __XTENSA__
|
||||
#ifdef __XCC__
|
||||
|
||||
#include <xtensa/tie/xt_core.h>
|
||||
#include <xtensa/tie/xt_booleans.h>
|
||||
typedef float _TIE_xt_FP_xtfloat;
|
||||
typedef _TIE_xt_FP_xtfloat xtfloat;
|
||||
|
||||
/*
|
||||
* The following prototypes describe intrinsic functions
|
||||
* corresponding to TIE instructions. Some TIE instructions
|
||||
* may produce multiple results (designated as "out" operands
|
||||
* in the iclass section) or may have operands used as both
|
||||
* inputs and outputs (designated as "inout"). However, the C
|
||||
* and C++ languages do not provide syntax that can express
|
||||
* the in/out/inout constraints of TIE intrinsics.
|
||||
* Nevertheless, the compiler understands these constraints
|
||||
* and will check that the intrinsic functions are used
|
||||
* correctly. To improve the readability of these prototypes,
|
||||
* the "out" and "inout" parameters are marked accordingly
|
||||
* with comments.
|
||||
*/
|
||||
|
||||
extern unsigned _TIE_xt_FP_RUR_FCR(void);
|
||||
extern void _TIE_xt_FP_WUR_FCR(unsigned v);
|
||||
extern unsigned _TIE_xt_FP_RUR_FSR(void);
|
||||
extern void _TIE_xt_FP_WUR_FSR(unsigned v);
|
||||
extern xtfloat _TIE_xt_FP_xtfloat_loadi(const xtfloat * p, immediate imm8x4);
|
||||
extern void _TIE_xt_FP_xtfloat_storei(xtfloat t, xtfloat * p, immediate imm8x4);
|
||||
extern void _TIE_xt_FP_xtfloat_loadip(xtfloat t /*out*/, const xtfloat * p /*inout*/, immediate imm8x4);
|
||||
extern void _TIE_xt_FP_xtfloat_storeip(xtfloat t, xtfloat * p /*inout*/, immediate imm8x4);
|
||||
extern xtfloat _TIE_xt_FP_xtfloat_loadx(const xtfloat * p, int imm8x4);
|
||||
extern void _TIE_xt_FP_xtfloat_storex(xtfloat t, xtfloat * p, int imm8x4);
|
||||
extern void _TIE_xt_FP_xtfloat_loadxp(xtfloat t /*out*/, const xtfloat * p /*inout*/, int imm8x4);
|
||||
extern void _TIE_xt_FP_xtfloat_storexp(xtfloat t, xtfloat * p /*inout*/, int imm8x4);
|
||||
extern xtfloat _TIE_xt_FP_xtfloat_move(xtfloat r);
|
||||
extern int _TIE_xt_FP_ROUND_S(xtfloat s, immediate t);
|
||||
extern int _TIE_xt_FP_TRUNC_S(xtfloat s, immediate t);
|
||||
extern unsigned _TIE_xt_FP_UTRUNC_S(xtfloat s, immediate t);
|
||||
extern int _TIE_xt_FP_FLOOR_S(xtfloat s, immediate t);
|
||||
extern int _TIE_xt_FP_CEIL_S(xtfloat s, immediate t);
|
||||
extern xtfloat _TIE_xt_FP_LSI(const xtfloat * p, immediate imm8x4);
|
||||
extern void _TIE_xt_FP_SSI(xtfloat t, xtfloat * p, immediate imm8x4);
|
||||
extern void _TIE_xt_FP_LSIP(xtfloat t /*out*/, const xtfloat * p /*inout*/, immediate imm8x4);
|
||||
extern void _TIE_xt_FP_SSIP(xtfloat t, xtfloat * p /*inout*/, immediate imm8x4);
|
||||
extern xtfloat _TIE_xt_FP_LSX(const xtfloat * p, int imm8x4);
|
||||
extern void _TIE_xt_FP_SSX(xtfloat t, xtfloat * p, int imm8x4);
|
||||
extern void _TIE_xt_FP_LSXP(xtfloat t /*out*/, const xtfloat * p /*inout*/, int imm8x4);
|
||||
extern void _TIE_xt_FP_SSXP(xtfloat t, xtfloat * p /*inout*/, int imm8x4);
|
||||
extern xtfloat _TIE_xt_FP_ABS_S(xtfloat s);
|
||||
extern xtfloat _TIE_xt_FP_NEG_S(xtfloat s);
|
||||
extern xtfloat _TIE_xt_FP_MOV_S(xtfloat s);
|
||||
extern void _TIE_xt_FP_MOVEQZ_S(xtfloat r /*inout*/, xtfloat s, int t);
|
||||
extern void _TIE_xt_FP_MOVNEZ_S(xtfloat r /*inout*/, xtfloat s, int t);
|
||||
extern void _TIE_xt_FP_MOVLTZ_S(xtfloat r /*inout*/, xtfloat s, int t);
|
||||
extern void _TIE_xt_FP_MOVGEZ_S(xtfloat r /*inout*/, xtfloat s, int t);
|
||||
extern void _TIE_xt_FP_MOVF_S(xtfloat r /*inout*/, xtfloat s, xtbool t);
|
||||
extern void _TIE_xt_FP_MOVT_S(xtfloat r /*inout*/, xtfloat s, xtbool t);
|
||||
extern unsigned _TIE_xt_FP_RFR(xtfloat s);
|
||||
extern xtfloat _TIE_xt_FP_WFR(unsigned s);
|
||||
extern xtfloat _TIE_xt_FP_FLOAT_S(int s, immediate t);
|
||||
extern xtfloat _TIE_xt_FP_UFLOAT_S(unsigned s, immediate t);
|
||||
extern xtbool _TIE_xt_FP_OEQ_S(xtfloat s, xtfloat t);
|
||||
extern xtbool _TIE_xt_FP_OLE_S(xtfloat s, xtfloat t);
|
||||
extern xtbool _TIE_xt_FP_OLT_S(xtfloat s, xtfloat t);
|
||||
extern xtbool _TIE_xt_FP_UEQ_S(xtfloat s, xtfloat t);
|
||||
extern xtbool _TIE_xt_FP_ULE_S(xtfloat s, xtfloat t);
|
||||
extern xtbool _TIE_xt_FP_ULT_S(xtfloat s, xtfloat t);
|
||||
extern xtbool _TIE_xt_FP_UN_S(xtfloat s, xtfloat t);
|
||||
extern xtfloat _TIE_xt_FP_ADD_S(xtfloat s, xtfloat t);
|
||||
extern xtfloat _TIE_xt_FP_SUB_S(xtfloat s, xtfloat t);
|
||||
extern xtfloat _TIE_xt_FP_MUL_S(xtfloat s, xtfloat t);
|
||||
extern void _TIE_xt_FP_MADD_S(xtfloat r /*inout*/, xtfloat s, xtfloat t);
|
||||
extern void _TIE_xt_FP_MSUB_S(xtfloat r /*inout*/, xtfloat s, xtfloat t);
|
||||
extern xtfloat _TIE_xt_FP_RECIP0_S(xtfloat s);
|
||||
extern xtfloat _TIE_xt_FP_DIV0_S(xtfloat s);
|
||||
extern xtfloat _TIE_xt_FP_NEXP01_S(xtfloat s);
|
||||
extern xtfloat _TIE_xt_FP_CONST_S(immediate s);
|
||||
extern void _TIE_xt_FP_MKDADJ_S(xtfloat r /*inout*/, xtfloat s);
|
||||
extern xtfloat _TIE_xt_FP_MKSADJ_S(xtfloat s);
|
||||
extern void _TIE_xt_FP_ADDEXPM_S(xtfloat r /*inout*/, xtfloat s);
|
||||
extern void _TIE_xt_FP_ADDEXP_S(xtfloat r /*inout*/, xtfloat s);
|
||||
extern void _TIE_xt_FP_DIVN_S(xtfloat r /*inout*/, xtfloat s, xtfloat t);
|
||||
extern xtfloat _TIE_xt_FP_RSQRT0_S(xtfloat s);
|
||||
extern xtfloat _TIE_xt_FP_SQRT0_S(xtfloat s);
|
||||
extern void _TIE_xt_FP_MADDN_S(xtfloat r /*inout*/, xtfloat s, xtfloat t);
|
||||
extern xtfloat _TIE_xt_FP_DIV_S(xtfloat s, xtfloat t);
|
||||
extern xtfloat _TIE_xt_FP_SQRT_S(xtfloat s);
|
||||
extern xtfloat _TIE_xt_FP_RECIP_S(xtfloat s);
|
||||
extern xtfloat _TIE_xt_FP_RSQRT_S(xtfloat s);
|
||||
extern xtfloat _TIE_xt_FP_FSQRT_S(xtfloat s);
|
||||
#define XT_RUR_FCR _TIE_xt_FP_RUR_FCR
|
||||
#define RFCR _TIE_xt_FP_RUR_FCR
|
||||
#define RUR232 _TIE_xt_FP_RUR_FCR
|
||||
#define XT_WUR_FCR _TIE_xt_FP_WUR_FCR
|
||||
#define WFCR _TIE_xt_FP_WUR_FCR
|
||||
#define WUR232 _TIE_xt_FP_WUR_FCR
|
||||
#define XT_RUR_FSR _TIE_xt_FP_RUR_FSR
|
||||
#define RFSR _TIE_xt_FP_RUR_FSR
|
||||
#define RUR233 _TIE_xt_FP_RUR_FSR
|
||||
#define XT_WUR_FSR _TIE_xt_FP_WUR_FSR
|
||||
#define WFSR _TIE_xt_FP_WUR_FSR
|
||||
#define WUR233 _TIE_xt_FP_WUR_FSR
|
||||
#define XT_xtfloat_loadi _TIE_xt_FP_xtfloat_loadi
|
||||
#define XT_xtfloat_storei _TIE_xt_FP_xtfloat_storei
|
||||
#define XT_xtfloat_loadip _TIE_xt_FP_xtfloat_loadip
|
||||
#define XT_xtfloat_storeip _TIE_xt_FP_xtfloat_storeip
|
||||
#define XT_xtfloat_loadx _TIE_xt_FP_xtfloat_loadx
|
||||
#define XT_xtfloat_storex _TIE_xt_FP_xtfloat_storex
|
||||
#define XT_xtfloat_loadxp _TIE_xt_FP_xtfloat_loadxp
|
||||
#define XT_xtfloat_storexp _TIE_xt_FP_xtfloat_storexp
|
||||
#define XT_xtfloat_move _TIE_xt_FP_xtfloat_move
|
||||
#define XT_ROUND_S _TIE_xt_FP_ROUND_S
|
||||
#define XT_TRUNC_S _TIE_xt_FP_TRUNC_S
|
||||
#define XT_UTRUNC_S _TIE_xt_FP_UTRUNC_S
|
||||
#define XT_FLOOR_S _TIE_xt_FP_FLOOR_S
|
||||
#define XT_CEIL_S _TIE_xt_FP_CEIL_S
|
||||
#define XT_LSI _TIE_xt_FP_LSI
|
||||
#define XT_SSI _TIE_xt_FP_SSI
|
||||
#define XT_LSIP _TIE_xt_FP_LSIP
|
||||
#define XT_SSIP _TIE_xt_FP_SSIP
|
||||
#define XT_LSX _TIE_xt_FP_LSX
|
||||
#define XT_SSX _TIE_xt_FP_SSX
|
||||
#define XT_LSXP _TIE_xt_FP_LSXP
|
||||
#define XT_SSXP _TIE_xt_FP_SSXP
|
||||
#define XT_ABS_S _TIE_xt_FP_ABS_S
|
||||
#define XT_NEG_S _TIE_xt_FP_NEG_S
|
||||
#define XT_MOV_S _TIE_xt_FP_MOV_S
|
||||
#define XT_MOVEQZ_S _TIE_xt_FP_MOVEQZ_S
|
||||
#define XT_MOVNEZ_S _TIE_xt_FP_MOVNEZ_S
|
||||
#define XT_MOVLTZ_S _TIE_xt_FP_MOVLTZ_S
|
||||
#define XT_MOVGEZ_S _TIE_xt_FP_MOVGEZ_S
|
||||
#define XT_MOVF_S _TIE_xt_FP_MOVF_S
|
||||
#define XT_MOVT_S _TIE_xt_FP_MOVT_S
|
||||
#define XT_RFR _TIE_xt_FP_RFR
|
||||
#define XT_WFR _TIE_xt_FP_WFR
|
||||
#define XT_FLOAT_S _TIE_xt_FP_FLOAT_S
|
||||
#define XT_UFLOAT_S _TIE_xt_FP_UFLOAT_S
|
||||
#define XT_OEQ_S _TIE_xt_FP_OEQ_S
|
||||
#define XT_OLE_S _TIE_xt_FP_OLE_S
|
||||
#define XT_OLT_S _TIE_xt_FP_OLT_S
|
||||
#define XT_UEQ_S _TIE_xt_FP_UEQ_S
|
||||
#define XT_ULE_S _TIE_xt_FP_ULE_S
|
||||
#define XT_ULT_S _TIE_xt_FP_ULT_S
|
||||
#define XT_UN_S _TIE_xt_FP_UN_S
|
||||
#define XT_ADD_S _TIE_xt_FP_ADD_S
|
||||
#define XT_SUB_S _TIE_xt_FP_SUB_S
|
||||
#define XT_MUL_S _TIE_xt_FP_MUL_S
|
||||
#define XT_MADD_S _TIE_xt_FP_MADD_S
|
||||
#define XT_MSUB_S _TIE_xt_FP_MSUB_S
|
||||
#define XT_RECIP0_S _TIE_xt_FP_RECIP0_S
|
||||
#define XT_DIV0_S _TIE_xt_FP_DIV0_S
|
||||
#define XT_NEXP01_S _TIE_xt_FP_NEXP01_S
|
||||
#define XT_CONST_S _TIE_xt_FP_CONST_S
|
||||
#define XT_MKDADJ_S _TIE_xt_FP_MKDADJ_S
|
||||
#define XT_MKSADJ_S _TIE_xt_FP_MKSADJ_S
|
||||
#define XT_ADDEXPM_S _TIE_xt_FP_ADDEXPM_S
|
||||
#define XT_ADDEXP_S _TIE_xt_FP_ADDEXP_S
|
||||
#define XT_DIVN_S _TIE_xt_FP_DIVN_S
|
||||
#define XT_RSQRT0_S _TIE_xt_FP_RSQRT0_S
|
||||
#define XT_SQRT0_S _TIE_xt_FP_SQRT0_S
|
||||
#define XT_MADDN_S _TIE_xt_FP_MADDN_S
|
||||
#define XT_DIV_S _TIE_xt_FP_DIV_S
|
||||
#define XT_SQRT_S _TIE_xt_FP_SQRT_S
|
||||
#define XT_RECIP_S _TIE_xt_FP_RECIP_S
|
||||
#define XT_RSQRT_S _TIE_xt_FP_RSQRT_S
|
||||
#define XT_FSQRT_S _TIE_xt_FP_FSQRT_S
|
||||
|
||||
#ifndef RUR
|
||||
#define RUR(NUM) RUR##NUM()
|
||||
#endif
|
||||
|
||||
#ifndef WUR
|
||||
#define WUR(VAL, NUM) WUR##NUM(VAL)
|
||||
#endif
|
||||
|
||||
#endif /* __XCC__ */
|
||||
|
||||
#endif /* __XTENSA__ */
|
||||
|
||||
#endif /* !_XTENSA_xt_FP_HEADER */
|
@ -1,239 +0,0 @@
|
||||
/* Definitions for the xt_MAC16 TIE package */
|
||||
|
||||
/*
|
||||
* Customer ID=11657; Build=0x5fe96; Copyright (c) 2004-2010 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
* They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
* third parties in any manner, medium, or form, in whole or in part, without
|
||||
* the prior written consent of Tensilica Inc.
|
||||
*/
|
||||
|
||||
/* Do not modify. This is automatically generated.*/
|
||||
|
||||
#ifndef _XTENSA_xt_MAC16_HEADER
|
||||
#define _XTENSA_xt_MAC16_HEADER
|
||||
|
||||
#ifdef __XTENSA__
|
||||
#ifdef __XCC__
|
||||
|
||||
#include <xtensa/tie/xt_core.h>
|
||||
#include <xtensa/tie/xt_mul.h>
|
||||
|
||||
/*
|
||||
* The following prototypes describe intrinsic functions
|
||||
* corresponding to TIE instructions. Some TIE instructions
|
||||
* may produce multiple results (designated as "out" operands
|
||||
* in the iclass section) or may have operands used as both
|
||||
* inputs and outputs (designated as "inout"). However, the C
|
||||
* and C++ languages do not provide syntax that can express
|
||||
* the in/out/inout constraints of TIE intrinsics.
|
||||
* Nevertheless, the compiler understands these constraints
|
||||
* and will check that the intrinsic functions are used
|
||||
* correctly. To improve the readability of these prototypes,
|
||||
* the "out" and "inout" parameters are marked accordingly
|
||||
* with comments.
|
||||
*/
|
||||
|
||||
extern void _TIE_xt_MAC16_UMUL_AA_HH(unsigned ars, unsigned art);
|
||||
extern void _TIE_xt_MAC16_UMUL_AA_LH(unsigned ars, unsigned art);
|
||||
extern void _TIE_xt_MAC16_UMUL_AA_HL(unsigned ars, unsigned art);
|
||||
extern void _TIE_xt_MAC16_UMUL_AA_LL(unsigned ars, unsigned art);
|
||||
extern void _TIE_xt_MAC16_MUL_AA_HH(unsigned ars, unsigned art);
|
||||
extern void _TIE_xt_MAC16_MUL_AA_LH(unsigned ars, unsigned art);
|
||||
extern void _TIE_xt_MAC16_MUL_AA_HL(unsigned ars, unsigned art);
|
||||
extern void _TIE_xt_MAC16_MUL_AA_LL(unsigned ars, unsigned art);
|
||||
extern void _TIE_xt_MAC16_MUL_AD_HH(unsigned ars, immediate my);
|
||||
extern void _TIE_xt_MAC16_MUL_AD_LH(unsigned ars, immediate my);
|
||||
extern void _TIE_xt_MAC16_MUL_AD_HL(unsigned ars, immediate my);
|
||||
extern void _TIE_xt_MAC16_MUL_AD_LL(unsigned ars, immediate my);
|
||||
extern void _TIE_xt_MAC16_MUL_DA_HH(immediate mx, unsigned art);
|
||||
extern void _TIE_xt_MAC16_MUL_DA_LH(immediate mx, unsigned art);
|
||||
extern void _TIE_xt_MAC16_MUL_DA_HL(immediate mx, unsigned art);
|
||||
extern void _TIE_xt_MAC16_MUL_DA_LL(immediate mx, unsigned art);
|
||||
extern void _TIE_xt_MAC16_MUL_DD_HH(immediate mx, immediate my);
|
||||
extern void _TIE_xt_MAC16_MUL_DD_LH(immediate mx, immediate my);
|
||||
extern void _TIE_xt_MAC16_MUL_DD_HL(immediate mx, immediate my);
|
||||
extern void _TIE_xt_MAC16_MUL_DD_LL(immediate mx, immediate my);
|
||||
extern void _TIE_xt_MAC16_MULS_AA_HH(unsigned ars, unsigned art);
|
||||
extern void _TIE_xt_MAC16_MULS_AA_LH(unsigned ars, unsigned art);
|
||||
extern void _TIE_xt_MAC16_MULS_AA_HL(unsigned ars, unsigned art);
|
||||
extern void _TIE_xt_MAC16_MULS_AA_LL(unsigned ars, unsigned art);
|
||||
extern void _TIE_xt_MAC16_MULA_AA_HH(unsigned ars, unsigned art);
|
||||
extern void _TIE_xt_MAC16_MULA_AA_LH(unsigned ars, unsigned art);
|
||||
extern void _TIE_xt_MAC16_MULA_AA_HL(unsigned ars, unsigned art);
|
||||
extern void _TIE_xt_MAC16_MULA_AA_LL(unsigned ars, unsigned art);
|
||||
extern void _TIE_xt_MAC16_MULS_AD_HH(unsigned ars, immediate my);
|
||||
extern void _TIE_xt_MAC16_MULS_AD_LH(unsigned ars, immediate my);
|
||||
extern void _TIE_xt_MAC16_MULS_AD_HL(unsigned ars, immediate my);
|
||||
extern void _TIE_xt_MAC16_MULS_AD_LL(unsigned ars, immediate my);
|
||||
extern void _TIE_xt_MAC16_MULA_AD_HH(unsigned ars, immediate my);
|
||||
extern void _TIE_xt_MAC16_MULA_AD_LH(unsigned ars, immediate my);
|
||||
extern void _TIE_xt_MAC16_MULA_AD_HL(unsigned ars, immediate my);
|
||||
extern void _TIE_xt_MAC16_MULA_AD_LL(unsigned ars, immediate my);
|
||||
extern void _TIE_xt_MAC16_MULS_DA_HH(immediate mx, unsigned art);
|
||||
extern void _TIE_xt_MAC16_MULS_DA_LH(immediate mx, unsigned art);
|
||||
extern void _TIE_xt_MAC16_MULS_DA_HL(immediate mx, unsigned art);
|
||||
extern void _TIE_xt_MAC16_MULS_DA_LL(immediate mx, unsigned art);
|
||||
extern void _TIE_xt_MAC16_MULA_DA_HH(immediate mx, unsigned art);
|
||||
extern void _TIE_xt_MAC16_MULA_DA_LH(immediate mx, unsigned art);
|
||||
extern void _TIE_xt_MAC16_MULA_DA_HL(immediate mx, unsigned art);
|
||||
extern void _TIE_xt_MAC16_MULA_DA_LL(immediate mx, unsigned art);
|
||||
extern void _TIE_xt_MAC16_MULS_DD_HH(immediate mx, immediate my);
|
||||
extern void _TIE_xt_MAC16_MULS_DD_LH(immediate mx, immediate my);
|
||||
extern void _TIE_xt_MAC16_MULS_DD_HL(immediate mx, immediate my);
|
||||
extern void _TIE_xt_MAC16_MULS_DD_LL(immediate mx, immediate my);
|
||||
extern void _TIE_xt_MAC16_MULA_DD_HH(immediate mx, immediate my);
|
||||
extern void _TIE_xt_MAC16_MULA_DD_LH(immediate mx, immediate my);
|
||||
extern void _TIE_xt_MAC16_MULA_DD_HL(immediate mx, immediate my);
|
||||
extern void _TIE_xt_MAC16_MULA_DD_LL(immediate mx, immediate my);
|
||||
extern unsigned _TIE_xt_MAC16_RSR_M0(void);
|
||||
extern void _TIE_xt_MAC16_WSR_M0(unsigned art);
|
||||
extern void _TIE_xt_MAC16_XSR_M0(unsigned art /*inout*/);
|
||||
extern unsigned _TIE_xt_MAC16_RSR_M1(void);
|
||||
extern void _TIE_xt_MAC16_WSR_M1(unsigned art);
|
||||
extern void _TIE_xt_MAC16_XSR_M1(unsigned art /*inout*/);
|
||||
extern unsigned _TIE_xt_MAC16_RSR_M2(void);
|
||||
extern void _TIE_xt_MAC16_WSR_M2(unsigned art);
|
||||
extern void _TIE_xt_MAC16_XSR_M2(unsigned art /*inout*/);
|
||||
extern unsigned _TIE_xt_MAC16_RSR_M3(void);
|
||||
extern void _TIE_xt_MAC16_WSR_M3(unsigned art);
|
||||
extern void _TIE_xt_MAC16_XSR_M3(unsigned art /*inout*/);
|
||||
extern unsigned _TIE_xt_MAC16_RSR_ACCLO(void);
|
||||
extern void _TIE_xt_MAC16_WSR_ACCLO(unsigned art);
|
||||
extern void _TIE_xt_MAC16_XSR_ACCLO(unsigned art /*inout*/);
|
||||
extern unsigned _TIE_xt_MAC16_RSR_ACCHI(void);
|
||||
extern void _TIE_xt_MAC16_WSR_ACCHI(unsigned art);
|
||||
extern void _TIE_xt_MAC16_XSR_ACCHI(unsigned art /*inout*/);
|
||||
extern void _TIE_xt_MAC16_MULA_DA_LL_LDDEC(immediate w, const short * s /*inout*/, immediate x, int t);
|
||||
extern void _TIE_xt_MAC16_MULA_DA_LL_LDINC(immediate w, const short * s /*inout*/, immediate x, int t);
|
||||
extern void _TIE_xt_MAC16_MULA_DA_HL_LDDEC(immediate w, const short * s /*inout*/, immediate x, int t);
|
||||
extern void _TIE_xt_MAC16_MULA_DA_HL_LDINC(immediate w, const short * s /*inout*/, immediate x, int t);
|
||||
extern void _TIE_xt_MAC16_MULA_DA_LH_LDDEC(immediate w, const short * s /*inout*/, immediate x, int t);
|
||||
extern void _TIE_xt_MAC16_MULA_DA_LH_LDINC(immediate w, const short * s /*inout*/, immediate x, int t);
|
||||
extern void _TIE_xt_MAC16_MULA_DA_HH_LDDEC(immediate w, const short * s /*inout*/, immediate x, int t);
|
||||
extern void _TIE_xt_MAC16_MULA_DA_HH_LDINC(immediate w, const short * s /*inout*/, immediate x, int t);
|
||||
extern void _TIE_xt_MAC16_MULA_DD_LL_LDDEC(immediate w, const short * s /*inout*/, immediate x, immediate y);
|
||||
extern void _TIE_xt_MAC16_MULA_DD_LL_LDINC(immediate w, const short * s /*inout*/, immediate x, immediate y);
|
||||
extern void _TIE_xt_MAC16_MULA_DD_HL_LDDEC(immediate w, const short * s /*inout*/, immediate x, immediate y);
|
||||
extern void _TIE_xt_MAC16_MULA_DD_HL_LDINC(immediate w, const short * s /*inout*/, immediate x, immediate y);
|
||||
extern void _TIE_xt_MAC16_MULA_DD_LH_LDDEC(immediate w, const short * s /*inout*/, immediate x, immediate y);
|
||||
extern void _TIE_xt_MAC16_MULA_DD_LH_LDINC(immediate w, const short * s /*inout*/, immediate x, immediate y);
|
||||
extern void _TIE_xt_MAC16_MULA_DD_HH_LDDEC(immediate w, const short * s /*inout*/, immediate x, immediate y);
|
||||
extern void _TIE_xt_MAC16_MULA_DD_HH_LDINC(immediate w, const short * s /*inout*/, immediate x, immediate y);
|
||||
extern void _TIE_xt_MAC16_LDDEC(immediate w, const short * p /*inout*/);
|
||||
extern void _TIE_xt_MAC16_ULDDEC(immediate w, const unsigned short * p /*inout*/);
|
||||
extern void _TIE_xt_MAC16_SLDDEC(immediate w, const short * p /*inout*/);
|
||||
extern void _TIE_xt_MAC16_LDINC(immediate w, const short * p /*inout*/);
|
||||
extern void _TIE_xt_MAC16_ULDINC(immediate w, const unsigned short * p /*inout*/);
|
||||
extern void _TIE_xt_MAC16_SLDINC(immediate w, const short * p /*inout*/);
|
||||
extern int _TIE_xt_MAC16_RSR16(void);
|
||||
extern void _TIE_xt_MAC16_WSR16(int t);
|
||||
extern void _TIE_xt_MAC16_XSR16(int t /*inout*/);
|
||||
extern int _TIE_xt_MAC16_RSR17(void);
|
||||
extern void _TIE_xt_MAC16_WSR17(int t);
|
||||
extern void _TIE_xt_MAC16_XSR17(int t /*inout*/);
|
||||
#define XT_UMUL_AA_HH _TIE_xt_MAC16_UMUL_AA_HH
|
||||
#define XT_UMUL_AA_LH _TIE_xt_MAC16_UMUL_AA_LH
|
||||
#define XT_UMUL_AA_HL _TIE_xt_MAC16_UMUL_AA_HL
|
||||
#define XT_UMUL_AA_LL _TIE_xt_MAC16_UMUL_AA_LL
|
||||
#define XT_MUL_AA_HH _TIE_xt_MAC16_MUL_AA_HH
|
||||
#define XT_MUL_AA_LH _TIE_xt_MAC16_MUL_AA_LH
|
||||
#define XT_MUL_AA_HL _TIE_xt_MAC16_MUL_AA_HL
|
||||
#define XT_MUL_AA_LL _TIE_xt_MAC16_MUL_AA_LL
|
||||
#define XT_MUL_AD_HH _TIE_xt_MAC16_MUL_AD_HH
|
||||
#define XT_MUL_AD_LH _TIE_xt_MAC16_MUL_AD_LH
|
||||
#define XT_MUL_AD_HL _TIE_xt_MAC16_MUL_AD_HL
|
||||
#define XT_MUL_AD_LL _TIE_xt_MAC16_MUL_AD_LL
|
||||
#define XT_MUL_DA_HH _TIE_xt_MAC16_MUL_DA_HH
|
||||
#define XT_MUL_DA_LH _TIE_xt_MAC16_MUL_DA_LH
|
||||
#define XT_MUL_DA_HL _TIE_xt_MAC16_MUL_DA_HL
|
||||
#define XT_MUL_DA_LL _TIE_xt_MAC16_MUL_DA_LL
|
||||
#define XT_MUL_DD_HH _TIE_xt_MAC16_MUL_DD_HH
|
||||
#define XT_MUL_DD_LH _TIE_xt_MAC16_MUL_DD_LH
|
||||
#define XT_MUL_DD_HL _TIE_xt_MAC16_MUL_DD_HL
|
||||
#define XT_MUL_DD_LL _TIE_xt_MAC16_MUL_DD_LL
|
||||
#define XT_MULS_AA_HH _TIE_xt_MAC16_MULS_AA_HH
|
||||
#define XT_MULS_AA_LH _TIE_xt_MAC16_MULS_AA_LH
|
||||
#define XT_MULS_AA_HL _TIE_xt_MAC16_MULS_AA_HL
|
||||
#define XT_MULS_AA_LL _TIE_xt_MAC16_MULS_AA_LL
|
||||
#define XT_MULA_AA_HH _TIE_xt_MAC16_MULA_AA_HH
|
||||
#define XT_MULA_AA_LH _TIE_xt_MAC16_MULA_AA_LH
|
||||
#define XT_MULA_AA_HL _TIE_xt_MAC16_MULA_AA_HL
|
||||
#define XT_MULA_AA_LL _TIE_xt_MAC16_MULA_AA_LL
|
||||
#define XT_MULS_AD_HH _TIE_xt_MAC16_MULS_AD_HH
|
||||
#define XT_MULS_AD_LH _TIE_xt_MAC16_MULS_AD_LH
|
||||
#define XT_MULS_AD_HL _TIE_xt_MAC16_MULS_AD_HL
|
||||
#define XT_MULS_AD_LL _TIE_xt_MAC16_MULS_AD_LL
|
||||
#define XT_MULA_AD_HH _TIE_xt_MAC16_MULA_AD_HH
|
||||
#define XT_MULA_AD_LH _TIE_xt_MAC16_MULA_AD_LH
|
||||
#define XT_MULA_AD_HL _TIE_xt_MAC16_MULA_AD_HL
|
||||
#define XT_MULA_AD_LL _TIE_xt_MAC16_MULA_AD_LL
|
||||
#define XT_MULS_DA_HH _TIE_xt_MAC16_MULS_DA_HH
|
||||
#define XT_MULS_DA_LH _TIE_xt_MAC16_MULS_DA_LH
|
||||
#define XT_MULS_DA_HL _TIE_xt_MAC16_MULS_DA_HL
|
||||
#define XT_MULS_DA_LL _TIE_xt_MAC16_MULS_DA_LL
|
||||
#define XT_MULA_DA_HH _TIE_xt_MAC16_MULA_DA_HH
|
||||
#define XT_MULA_DA_LH _TIE_xt_MAC16_MULA_DA_LH
|
||||
#define XT_MULA_DA_HL _TIE_xt_MAC16_MULA_DA_HL
|
||||
#define XT_MULA_DA_LL _TIE_xt_MAC16_MULA_DA_LL
|
||||
#define XT_MULS_DD_HH _TIE_xt_MAC16_MULS_DD_HH
|
||||
#define XT_MULS_DD_LH _TIE_xt_MAC16_MULS_DD_LH
|
||||
#define XT_MULS_DD_HL _TIE_xt_MAC16_MULS_DD_HL
|
||||
#define XT_MULS_DD_LL _TIE_xt_MAC16_MULS_DD_LL
|
||||
#define XT_MULA_DD_HH _TIE_xt_MAC16_MULA_DD_HH
|
||||
#define XT_MULA_DD_LH _TIE_xt_MAC16_MULA_DD_LH
|
||||
#define XT_MULA_DD_HL _TIE_xt_MAC16_MULA_DD_HL
|
||||
#define XT_MULA_DD_LL _TIE_xt_MAC16_MULA_DD_LL
|
||||
#define XT_RSR_M0 _TIE_xt_MAC16_RSR_M0
|
||||
#define XT_WSR_M0 _TIE_xt_MAC16_WSR_M0
|
||||
#define XT_XSR_M0 _TIE_xt_MAC16_XSR_M0
|
||||
#define XT_RSR_M1 _TIE_xt_MAC16_RSR_M1
|
||||
#define XT_WSR_M1 _TIE_xt_MAC16_WSR_M1
|
||||
#define XT_XSR_M1 _TIE_xt_MAC16_XSR_M1
|
||||
#define XT_RSR_M2 _TIE_xt_MAC16_RSR_M2
|
||||
#define XT_WSR_M2 _TIE_xt_MAC16_WSR_M2
|
||||
#define XT_XSR_M2 _TIE_xt_MAC16_XSR_M2
|
||||
#define XT_RSR_M3 _TIE_xt_MAC16_RSR_M3
|
||||
#define XT_WSR_M3 _TIE_xt_MAC16_WSR_M3
|
||||
#define XT_XSR_M3 _TIE_xt_MAC16_XSR_M3
|
||||
#define XT_RSR_ACCLO _TIE_xt_MAC16_RSR_ACCLO
|
||||
#define XT_WSR_ACCLO _TIE_xt_MAC16_WSR_ACCLO
|
||||
#define XT_XSR_ACCLO _TIE_xt_MAC16_XSR_ACCLO
|
||||
#define XT_RSR_ACCHI _TIE_xt_MAC16_RSR_ACCHI
|
||||
#define XT_WSR_ACCHI _TIE_xt_MAC16_WSR_ACCHI
|
||||
#define XT_XSR_ACCHI _TIE_xt_MAC16_XSR_ACCHI
|
||||
#define XT_MULA_DA_LL_LDDEC _TIE_xt_MAC16_MULA_DA_LL_LDDEC
|
||||
#define XT_MULA_DA_LL_LDINC _TIE_xt_MAC16_MULA_DA_LL_LDINC
|
||||
#define XT_MULA_DA_HL_LDDEC _TIE_xt_MAC16_MULA_DA_HL_LDDEC
|
||||
#define XT_MULA_DA_HL_LDINC _TIE_xt_MAC16_MULA_DA_HL_LDINC
|
||||
#define XT_MULA_DA_LH_LDDEC _TIE_xt_MAC16_MULA_DA_LH_LDDEC
|
||||
#define XT_MULA_DA_LH_LDINC _TIE_xt_MAC16_MULA_DA_LH_LDINC
|
||||
#define XT_MULA_DA_HH_LDDEC _TIE_xt_MAC16_MULA_DA_HH_LDDEC
|
||||
#define XT_MULA_DA_HH_LDINC _TIE_xt_MAC16_MULA_DA_HH_LDINC
|
||||
#define XT_MULA_DD_LL_LDDEC _TIE_xt_MAC16_MULA_DD_LL_LDDEC
|
||||
#define XT_MULA_DD_LL_LDINC _TIE_xt_MAC16_MULA_DD_LL_LDINC
|
||||
#define XT_MULA_DD_HL_LDDEC _TIE_xt_MAC16_MULA_DD_HL_LDDEC
|
||||
#define XT_MULA_DD_HL_LDINC _TIE_xt_MAC16_MULA_DD_HL_LDINC
|
||||
#define XT_MULA_DD_LH_LDDEC _TIE_xt_MAC16_MULA_DD_LH_LDDEC
|
||||
#define XT_MULA_DD_LH_LDINC _TIE_xt_MAC16_MULA_DD_LH_LDINC
|
||||
#define XT_MULA_DD_HH_LDDEC _TIE_xt_MAC16_MULA_DD_HH_LDDEC
|
||||
#define XT_MULA_DD_HH_LDINC _TIE_xt_MAC16_MULA_DD_HH_LDINC
|
||||
#define XT_LDDEC _TIE_xt_MAC16_LDDEC
|
||||
#define XT_ULDDEC _TIE_xt_MAC16_ULDDEC
|
||||
#define XT_SLDDEC _TIE_xt_MAC16_SLDDEC
|
||||
#define XT_LDINC _TIE_xt_MAC16_LDINC
|
||||
#define XT_ULDINC _TIE_xt_MAC16_ULDINC
|
||||
#define XT_SLDINC _TIE_xt_MAC16_SLDINC
|
||||
#define XT_RSR16 _TIE_xt_MAC16_RSR16
|
||||
#define XT_WSR16 _TIE_xt_MAC16_WSR16
|
||||
#define XT_XSR16 _TIE_xt_MAC16_XSR16
|
||||
#define XT_RSR17 _TIE_xt_MAC16_RSR17
|
||||
#define XT_WSR17 _TIE_xt_MAC16_WSR17
|
||||
#define XT_XSR17 _TIE_xt_MAC16_XSR17
|
||||
|
||||
#endif /* __XCC__ */
|
||||
|
||||
#endif /* __XTENSA__ */
|
||||
|
||||
#endif /* !_XTENSA_xt_MAC16_HEADER */
|
@ -1,24 +0,0 @@
|
||||
/* Definitions for the 32-bit Integer Multiply Option. */
|
||||
|
||||
/*
|
||||
* Customer ID=11657; Build=0x5fe96; Copyright (c) 2009 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
* They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
* third parties in any manner, medium, or form, in whole or in part, without
|
||||
* the prior written consent of Tensilica Inc.
|
||||
*/
|
||||
|
||||
/* NOTE: This file exists only for backward compatibility with RB-200X.x
|
||||
and earlier Xtensa releases. Starting with RC-2009.0 you should use
|
||||
<xtensa/tie/xt_mul.h>. */
|
||||
|
||||
#ifndef _XTENSA_xt_MUL32_HEADER
|
||||
#define _XTENSA_xt_MUL32_HEADER
|
||||
|
||||
#ifdef __XTENSA__
|
||||
|
||||
#include <xtensa/tie/xt_mul.h>
|
||||
|
||||
#endif /* __XTENSA__ */
|
||||
#endif /* !_XTENSA_xt_MUL32_HEADER */
|
@ -1,69 +0,0 @@
|
||||
/* Definitions for the xt_booleans TIE package */
|
||||
|
||||
/*
|
||||
* Customer ID=11657; Build=0x5fe96; Copyright (c) 2004-2010 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
* They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
* third parties in any manner, medium, or form, in whole or in part, without
|
||||
* the prior written consent of Tensilica Inc.
|
||||
*/
|
||||
|
||||
/* Do not modify. This is automatically generated.*/
|
||||
|
||||
#ifndef _XTENSA_xt_booleans_HEADER
|
||||
#define _XTENSA_xt_booleans_HEADER
|
||||
|
||||
#ifdef __XTENSA__
|
||||
#ifdef __XCC__
|
||||
|
||||
#include <xtensa/tie/xt_core.h>
|
||||
typedef _TIE_xtbool xtbool;
|
||||
typedef _TIE_xtbool2 xtbool2;
|
||||
typedef _TIE_xtbool4 xtbool4;
|
||||
typedef _TIE_xtbool8 xtbool8;
|
||||
typedef _TIE_xtbool16 xtbool16;
|
||||
|
||||
/*
|
||||
* The following prototypes describe intrinsic functions
|
||||
* corresponding to TIE instructions. Some TIE instructions
|
||||
* may produce multiple results (designated as "out" operands
|
||||
* in the iclass section) or may have operands used as both
|
||||
* inputs and outputs (designated as "inout"). However, the C
|
||||
* and C++ languages do not provide syntax that can express
|
||||
* the in/out/inout constraints of TIE intrinsics.
|
||||
* Nevertheless, the compiler understands these constraints
|
||||
* and will check that the intrinsic functions are used
|
||||
* correctly. To improve the readability of these prototypes,
|
||||
* the "out" and "inout" parameters are marked accordingly
|
||||
* with comments.
|
||||
*/
|
||||
|
||||
extern xtbool _TIE_xt_booleans_XORB(xtbool bs, xtbool bt);
|
||||
extern xtbool _TIE_xt_booleans_ORBC(xtbool bs, xtbool bt);
|
||||
extern xtbool _TIE_xt_booleans_ORB(xtbool bs, xtbool bt);
|
||||
extern xtbool _TIE_xt_booleans_ANDBC(xtbool bs, xtbool bt);
|
||||
extern xtbool _TIE_xt_booleans_ANDB(xtbool bs, xtbool bt);
|
||||
extern xtbool _TIE_xt_booleans_ALL4(xtbool4 bs4);
|
||||
extern xtbool _TIE_xt_booleans_ANY4(xtbool4 bs4);
|
||||
extern xtbool _TIE_xt_booleans_ALL8(xtbool8 bs8);
|
||||
extern xtbool _TIE_xt_booleans_ANY8(xtbool8 bs8);
|
||||
extern void _TIE_xt_booleans_MOVT(unsigned arr /*inout*/, unsigned ars, xtbool bt);
|
||||
extern void _TIE_xt_booleans_MOVF(unsigned arr /*inout*/, unsigned ars, xtbool bt);
|
||||
#define XT_XORB _TIE_xt_booleans_XORB
|
||||
#define XT_ORBC _TIE_xt_booleans_ORBC
|
||||
#define XT_ORB _TIE_xt_booleans_ORB
|
||||
#define XT_ANDBC _TIE_xt_booleans_ANDBC
|
||||
#define XT_ANDB _TIE_xt_booleans_ANDB
|
||||
#define XT_ALL4 _TIE_xt_booleans_ALL4
|
||||
#define XT_ANY4 _TIE_xt_booleans_ANY4
|
||||
#define XT_ALL8 _TIE_xt_booleans_ALL8
|
||||
#define XT_ANY8 _TIE_xt_booleans_ANY8
|
||||
#define XT_MOVT _TIE_xt_booleans_MOVT
|
||||
#define XT_MOVF _TIE_xt_booleans_MOVF
|
||||
|
||||
#endif /* __XCC__ */
|
||||
|
||||
#endif /* __XTENSA__ */
|
||||
|
||||
#endif /* !_XTENSA_xt_booleans_HEADER */
|
@ -1,48 +0,0 @@
|
||||
/* Definitions for the xt_coprocessors TIE package */
|
||||
|
||||
/*
|
||||
* Customer ID=11657; Build=0x5fe96; Copyright (c) 2004-2010 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
* They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
* third parties in any manner, medium, or form, in whole or in part, without
|
||||
* the prior written consent of Tensilica Inc.
|
||||
*/
|
||||
|
||||
/* Do not modify. This is automatically generated.*/
|
||||
|
||||
#ifndef _XTENSA_xt_coprocessors_HEADER
|
||||
#define _XTENSA_xt_coprocessors_HEADER
|
||||
|
||||
#ifdef __XTENSA__
|
||||
#ifdef __XCC__
|
||||
|
||||
#include <xtensa/tie/xt_core.h>
|
||||
|
||||
/*
|
||||
* The following prototypes describe intrinsic functions
|
||||
* corresponding to TIE instructions. Some TIE instructions
|
||||
* may produce multiple results (designated as "out" operands
|
||||
* in the iclass section) or may have operands used as both
|
||||
* inputs and outputs (designated as "inout"). However, the C
|
||||
* and C++ languages do not provide syntax that can express
|
||||
* the in/out/inout constraints of TIE intrinsics.
|
||||
* Nevertheless, the compiler understands these constraints
|
||||
* and will check that the intrinsic functions are used
|
||||
* correctly. To improve the readability of these prototypes,
|
||||
* the "out" and "inout" parameters are marked accordingly
|
||||
* with comments.
|
||||
*/
|
||||
|
||||
extern unsigned _TIE_xt_coprocessors_RSR_CPENABLE(void);
|
||||
extern void _TIE_xt_coprocessors_WSR_CPENABLE(unsigned art);
|
||||
extern void _TIE_xt_coprocessors_XSR_CPENABLE(unsigned art /*inout*/);
|
||||
#define XT_RSR_CPENABLE _TIE_xt_coprocessors_RSR_CPENABLE
|
||||
#define XT_WSR_CPENABLE _TIE_xt_coprocessors_WSR_CPENABLE
|
||||
#define XT_XSR_CPENABLE _TIE_xt_coprocessors_XSR_CPENABLE
|
||||
|
||||
#endif /* __XCC__ */
|
||||
|
||||
#endif /* __XTENSA__ */
|
||||
|
||||
#endif /* !_XTENSA_xt_coprocessors_HEADER */
|
@ -1,395 +0,0 @@
|
||||
/* Definitions for the xt_core TIE package */
|
||||
|
||||
/*
|
||||
* Customer ID=11657; Build=0x5fe96; Copyright (c) 2004-2010 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
* They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
* third parties in any manner, medium, or form, in whole or in part, without
|
||||
* the prior written consent of Tensilica Inc.
|
||||
*/
|
||||
|
||||
/* Do not modify. This is automatically generated.*/
|
||||
|
||||
#ifndef _XTENSA_xt_core_HEADER
|
||||
#define _XTENSA_xt_core_HEADER
|
||||
|
||||
#ifdef __XTENSA__
|
||||
#ifdef __XCC__
|
||||
|
||||
|
||||
/*
|
||||
* The following prototypes describe intrinsic functions
|
||||
* corresponding to TIE instructions. Some TIE instructions
|
||||
* may produce multiple results (designated as "out" operands
|
||||
* in the iclass section) or may have operands used as both
|
||||
* inputs and outputs (designated as "inout"). However, the C
|
||||
* and C++ languages do not provide syntax that can express
|
||||
* the in/out/inout constraints of TIE intrinsics.
|
||||
* Nevertheless, the compiler understands these constraints
|
||||
* and will check that the intrinsic functions are used
|
||||
* correctly. To improve the readability of these prototypes,
|
||||
* the "out" and "inout" parameters are marked accordingly
|
||||
* with comments.
|
||||
*/
|
||||
|
||||
extern void _TIE_xt_core_ILL(void);
|
||||
extern void _TIE_xt_core_NOP(void);
|
||||
extern void _TIE_xt_core_SIMCALL(void);
|
||||
extern void _TIE_xt_core_MEMW(void);
|
||||
extern void _TIE_xt_core_EXTW(void);
|
||||
extern void _TIE_xt_core_ISYNC(void);
|
||||
extern void _TIE_xt_core_DSYNC(void);
|
||||
extern void _TIE_xt_core_ESYNC(void);
|
||||
extern void _TIE_xt_core_RSYNC(void);
|
||||
extern unsigned _TIE_xt_core_RSR_LBEG(void);
|
||||
extern void _TIE_xt_core_WSR_LBEG(unsigned art);
|
||||
extern void _TIE_xt_core_XSR_LBEG(unsigned art /*inout*/);
|
||||
extern unsigned _TIE_xt_core_RSR_CONFIGID0(void);
|
||||
extern void _TIE_xt_core_WSR_CONFIGID0(unsigned art);
|
||||
extern unsigned _TIE_xt_core_RSR_CONFIGID1(void);
|
||||
extern unsigned _TIE_xt_core_RUR_THREADPTR(void);
|
||||
extern void _TIE_xt_core_WUR_THREADPTR(unsigned v);
|
||||
extern unsigned _TIE_xt_core_uint32_loadi(const unsigned * p, immediate o);
|
||||
extern void _TIE_xt_core_uint32_storei(unsigned c, unsigned * p, immediate o);
|
||||
extern unsigned _TIE_xt_core_uint32_move(unsigned b);
|
||||
extern int _TIE_xt_core_ADDI(int s, immediate i);
|
||||
extern int _TIE_xt_core_OR(int s, int t);
|
||||
extern int _TIE_xt_core_L32I(const int * p, immediate i);
|
||||
extern void _TIE_xt_core_S32I(int r, int * p, immediate i);
|
||||
extern void _TIE_xt_core_S32NB(int r, int * p, immediate i);
|
||||
extern unsigned char _TIE_xt_core_L8UI(const unsigned char * p, immediate i);
|
||||
extern void _TIE_xt_core_S8I(signed char r, signed char * p, immediate i);
|
||||
extern unsigned short _TIE_xt_core_L16UI(const unsigned short * p, immediate i);
|
||||
extern short _TIE_xt_core_L16SI(const short * p, immediate i);
|
||||
extern void _TIE_xt_core_S16I(short r, short * p, immediate i);
|
||||
extern int _TIE_xt_core_ADDMI(int s, immediate i);
|
||||
extern int _TIE_xt_core_ADD(int s, int t);
|
||||
extern int _TIE_xt_core_ADDX2(int s, int t);
|
||||
extern int _TIE_xt_core_ADDX4(int s, int t);
|
||||
extern int _TIE_xt_core_ADDX8(int s, int t);
|
||||
extern int _TIE_xt_core_SUB(int s, int t);
|
||||
extern int _TIE_xt_core_SUBX2(int s, int t);
|
||||
extern int _TIE_xt_core_SUBX4(int s, int t);
|
||||
extern int _TIE_xt_core_SUBX8(int s, int t);
|
||||
extern int _TIE_xt_core_AND(int s, int t);
|
||||
extern int _TIE_xt_core_XOR(int s, int t);
|
||||
extern unsigned _TIE_xt_core_EXTUI(unsigned t, immediate i, immediate o);
|
||||
extern int _TIE_xt_core_MOVI(immediate i);
|
||||
extern void _TIE_xt_core_MOVEQZ(int r /*inout*/, int s, int t);
|
||||
extern void _TIE_xt_core_MOVNEZ(int r /*inout*/, int s, int t);
|
||||
extern void _TIE_xt_core_MOVLTZ(int r /*inout*/, int s, int t);
|
||||
extern void _TIE_xt_core_MOVGEZ(int r /*inout*/, int s, int t);
|
||||
extern int _TIE_xt_core_NEG(int t);
|
||||
extern int _TIE_xt_core_ABS(int t);
|
||||
extern void _TIE_xt_core_SSR(int s);
|
||||
extern void _TIE_xt_core_SSL(int s);
|
||||
extern void _TIE_xt_core_SSA8L(int s);
|
||||
extern void _TIE_xt_core_SSA8B(int s);
|
||||
extern void _TIE_xt_core_SSAI(immediate i);
|
||||
extern int _TIE_xt_core_SLL(int s);
|
||||
extern int _TIE_xt_core_SRC(int s, int t);
|
||||
extern unsigned _TIE_xt_core_SRL(unsigned t);
|
||||
extern int _TIE_xt_core_SRA(int t);
|
||||
extern int _TIE_xt_core_SLLI(int s, immediate i);
|
||||
extern int _TIE_xt_core_SRAI(int t, immediate i);
|
||||
extern unsigned _TIE_xt_core_SRLI(unsigned t, immediate i);
|
||||
extern int _TIE_xt_core_SSAI_SRC(int src1, int src2, immediate amount);
|
||||
extern int _TIE_xt_core_SSR_SRC(int src1, int src2, int amount);
|
||||
extern int _TIE_xt_core_WSR_SAR_SRC(int src1, int src2, int amount);
|
||||
extern int _TIE_xt_core_SSR_SRA(int src, int amount);
|
||||
extern unsigned _TIE_xt_core_SSR_SRL(unsigned src, int amount);
|
||||
extern int _TIE_xt_core_SSL_SLL(int src, int amount);
|
||||
extern int _TIE_xt_core_RSIL(immediate t);
|
||||
extern int _TIE_xt_core_RSR_LEND(void);
|
||||
extern void _TIE_xt_core_WSR_LEND(int t);
|
||||
extern void _TIE_xt_core_XSR_LEND(int t /*inout*/);
|
||||
extern int _TIE_xt_core_RSR_LCOUNT(void);
|
||||
extern void _TIE_xt_core_WSR_LCOUNT(int t);
|
||||
extern void _TIE_xt_core_XSR_LCOUNT(int t /*inout*/);
|
||||
extern unsigned _TIE_xt_core_RSR_SAR(void);
|
||||
extern void _TIE_xt_core_WSR_SAR(unsigned t);
|
||||
extern void _TIE_xt_core_XSR_SAR(unsigned t /*inout*/);
|
||||
extern unsigned _TIE_xt_core_RSR_MEMCTL(void);
|
||||
extern void _TIE_xt_core_WSR_MEMCTL(unsigned t);
|
||||
extern void _TIE_xt_core_XSR_MEMCTL(unsigned t /*inout*/);
|
||||
extern unsigned _TIE_xt_core_RSR_LITBASE(void);
|
||||
extern void _TIE_xt_core_WSR_LITBASE(unsigned t);
|
||||
extern void _TIE_xt_core_XSR_LITBASE(unsigned t /*inout*/);
|
||||
extern unsigned _TIE_xt_core_RSR_PS(void);
|
||||
extern void _TIE_xt_core_WSR_PS(unsigned t);
|
||||
extern void _TIE_xt_core_XSR_PS(unsigned t /*inout*/);
|
||||
extern unsigned _TIE_xt_core_RSR_EPC1(void);
|
||||
extern void _TIE_xt_core_WSR_EPC1(unsigned t);
|
||||
extern void _TIE_xt_core_XSR_EPC1(unsigned t /*inout*/);
|
||||
extern unsigned _TIE_xt_core_RSR_EXCSAVE1(void);
|
||||
extern void _TIE_xt_core_WSR_EXCSAVE1(unsigned t);
|
||||
extern void _TIE_xt_core_XSR_EXCSAVE1(unsigned t /*inout*/);
|
||||
extern unsigned _TIE_xt_core_RSR_EPC2(void);
|
||||
extern void _TIE_xt_core_WSR_EPC2(unsigned t);
|
||||
extern void _TIE_xt_core_XSR_EPC2(unsigned t /*inout*/);
|
||||
extern unsigned _TIE_xt_core_RSR_EXCSAVE2(void);
|
||||
extern void _TIE_xt_core_WSR_EXCSAVE2(unsigned t);
|
||||
extern void _TIE_xt_core_XSR_EXCSAVE2(unsigned t /*inout*/);
|
||||
extern unsigned _TIE_xt_core_RSR_EPC3(void);
|
||||
extern void _TIE_xt_core_WSR_EPC3(unsigned t);
|
||||
extern void _TIE_xt_core_XSR_EPC3(unsigned t /*inout*/);
|
||||
extern unsigned _TIE_xt_core_RSR_EXCSAVE3(void);
|
||||
extern void _TIE_xt_core_WSR_EXCSAVE3(unsigned t);
|
||||
extern void _TIE_xt_core_XSR_EXCSAVE3(unsigned t /*inout*/);
|
||||
extern unsigned _TIE_xt_core_RSR_EPC4(void);
|
||||
extern void _TIE_xt_core_WSR_EPC4(unsigned t);
|
||||
extern void _TIE_xt_core_XSR_EPC4(unsigned t /*inout*/);
|
||||
extern unsigned _TIE_xt_core_RSR_EXCSAVE4(void);
|
||||
extern void _TIE_xt_core_WSR_EXCSAVE4(unsigned t);
|
||||
extern void _TIE_xt_core_XSR_EXCSAVE4(unsigned t /*inout*/);
|
||||
extern unsigned _TIE_xt_core_RSR_EPC5(void);
|
||||
extern void _TIE_xt_core_WSR_EPC5(unsigned t);
|
||||
extern void _TIE_xt_core_XSR_EPC5(unsigned t /*inout*/);
|
||||
extern unsigned _TIE_xt_core_RSR_EXCSAVE5(void);
|
||||
extern void _TIE_xt_core_WSR_EXCSAVE5(unsigned t);
|
||||
extern void _TIE_xt_core_XSR_EXCSAVE5(unsigned t /*inout*/);
|
||||
extern unsigned _TIE_xt_core_RSR_EPC6(void);
|
||||
extern void _TIE_xt_core_WSR_EPC6(unsigned t);
|
||||
extern void _TIE_xt_core_XSR_EPC6(unsigned t /*inout*/);
|
||||
extern unsigned _TIE_xt_core_RSR_EXCSAVE6(void);
|
||||
extern void _TIE_xt_core_WSR_EXCSAVE6(unsigned t);
|
||||
extern void _TIE_xt_core_XSR_EXCSAVE6(unsigned t /*inout*/);
|
||||
extern unsigned _TIE_xt_core_RSR_EPC7(void);
|
||||
extern void _TIE_xt_core_WSR_EPC7(unsigned t);
|
||||
extern void _TIE_xt_core_XSR_EPC7(unsigned t /*inout*/);
|
||||
extern unsigned _TIE_xt_core_RSR_EXCSAVE7(void);
|
||||
extern void _TIE_xt_core_WSR_EXCSAVE7(unsigned t);
|
||||
extern void _TIE_xt_core_XSR_EXCSAVE7(unsigned t /*inout*/);
|
||||
extern unsigned _TIE_xt_core_RSR_VECBASE(void);
|
||||
extern void _TIE_xt_core_WSR_VECBASE(unsigned t);
|
||||
extern void _TIE_xt_core_XSR_VECBASE(unsigned t /*inout*/);
|
||||
extern unsigned _TIE_xt_core_RSR_EPS2(void);
|
||||
extern void _TIE_xt_core_WSR_EPS2(unsigned t);
|
||||
extern void _TIE_xt_core_XSR_EPS2(unsigned t /*inout*/);
|
||||
extern unsigned _TIE_xt_core_RSR_EPS3(void);
|
||||
extern void _TIE_xt_core_WSR_EPS3(unsigned t);
|
||||
extern void _TIE_xt_core_XSR_EPS3(unsigned t /*inout*/);
|
||||
extern unsigned _TIE_xt_core_RSR_EPS4(void);
|
||||
extern void _TIE_xt_core_WSR_EPS4(unsigned t);
|
||||
extern void _TIE_xt_core_XSR_EPS4(unsigned t /*inout*/);
|
||||
extern unsigned _TIE_xt_core_RSR_EPS5(void);
|
||||
extern void _TIE_xt_core_WSR_EPS5(unsigned t);
|
||||
extern void _TIE_xt_core_XSR_EPS5(unsigned t /*inout*/);
|
||||
extern unsigned _TIE_xt_core_RSR_EPS6(void);
|
||||
extern void _TIE_xt_core_WSR_EPS6(unsigned t);
|
||||
extern void _TIE_xt_core_XSR_EPS6(unsigned t /*inout*/);
|
||||
extern unsigned _TIE_xt_core_RSR_EPS7(void);
|
||||
extern void _TIE_xt_core_WSR_EPS7(unsigned t);
|
||||
extern void _TIE_xt_core_XSR_EPS7(unsigned t /*inout*/);
|
||||
extern unsigned _TIE_xt_core_RSR_EXCCAUSE(void);
|
||||
extern void _TIE_xt_core_WSR_EXCCAUSE(unsigned t);
|
||||
extern void _TIE_xt_core_XSR_EXCCAUSE(unsigned t /*inout*/);
|
||||
extern unsigned _TIE_xt_core_RSR_EXCVADDR(void);
|
||||
extern void _TIE_xt_core_WSR_EXCVADDR(unsigned t);
|
||||
extern void _TIE_xt_core_XSR_EXCVADDR(unsigned t /*inout*/);
|
||||
extern unsigned _TIE_xt_core_RSR_DEPC(void);
|
||||
extern void _TIE_xt_core_WSR_DEPC(unsigned t);
|
||||
extern void _TIE_xt_core_XSR_DEPC(unsigned t /*inout*/);
|
||||
extern unsigned _TIE_xt_core_RSR_MISC0(void);
|
||||
extern void _TIE_xt_core_WSR_MISC0(unsigned t);
|
||||
extern void _TIE_xt_core_XSR_MISC0(unsigned t /*inout*/);
|
||||
extern unsigned _TIE_xt_core_RSR_MISC1(void);
|
||||
extern void _TIE_xt_core_WSR_MISC1(unsigned t);
|
||||
extern void _TIE_xt_core_XSR_MISC1(unsigned t /*inout*/);
|
||||
extern unsigned _TIE_xt_core_RSR_MISC2(void);
|
||||
extern void _TIE_xt_core_WSR_MISC2(unsigned t);
|
||||
extern void _TIE_xt_core_XSR_MISC2(unsigned t /*inout*/);
|
||||
extern unsigned _TIE_xt_core_RSR_MISC3(void);
|
||||
extern void _TIE_xt_core_WSR_MISC3(unsigned t);
|
||||
extern void _TIE_xt_core_XSR_MISC3(unsigned t /*inout*/);
|
||||
extern int _TIE_xt_core_RSR_PRID(void);
|
||||
#define XT_ILL _TIE_xt_core_ILL
|
||||
#define XT_NOP _TIE_xt_core_NOP
|
||||
#define XT_SIMCALL _TIE_xt_core_SIMCALL
|
||||
#define XT_MEMW _TIE_xt_core_MEMW
|
||||
#define XT_EXTW _TIE_xt_core_EXTW
|
||||
#define XT_ISYNC _TIE_xt_core_ISYNC
|
||||
#define XT_DSYNC _TIE_xt_core_DSYNC
|
||||
#define XT_ESYNC _TIE_xt_core_ESYNC
|
||||
#define XT_RSYNC _TIE_xt_core_RSYNC
|
||||
#define XT_RSR_LBEG _TIE_xt_core_RSR_LBEG
|
||||
#define XT_WSR_LBEG _TIE_xt_core_WSR_LBEG
|
||||
#define XT_XSR_LBEG _TIE_xt_core_XSR_LBEG
|
||||
#define XT_RSR_CONFIGID0 _TIE_xt_core_RSR_CONFIGID0
|
||||
#define XT_WSR_CONFIGID0 _TIE_xt_core_WSR_CONFIGID0
|
||||
#define XT_RSR_CONFIGID1 _TIE_xt_core_RSR_CONFIGID1
|
||||
#define XT_RUR_THREADPTR _TIE_xt_core_RUR_THREADPTR
|
||||
#define RTHREADPTR _TIE_xt_core_RUR_THREADPTR
|
||||
#define RUR231 _TIE_xt_core_RUR_THREADPTR
|
||||
#define XT_WUR_THREADPTR _TIE_xt_core_WUR_THREADPTR
|
||||
#define WTHREADPTR _TIE_xt_core_WUR_THREADPTR
|
||||
#define WUR231 _TIE_xt_core_WUR_THREADPTR
|
||||
#define XT_uint32_loadi _TIE_xt_core_uint32_loadi
|
||||
#define XT_uint32_storei _TIE_xt_core_uint32_storei
|
||||
#define XT_uint32_move _TIE_xt_core_uint32_move
|
||||
#define XT_ADDI _TIE_xt_core_ADDI
|
||||
#define XT_OR _TIE_xt_core_OR
|
||||
#define XT_L32I _TIE_xt_core_L32I
|
||||
#define XT_S32I _TIE_xt_core_S32I
|
||||
#define XT_S32NB _TIE_xt_core_S32NB
|
||||
#define XT_L8UI _TIE_xt_core_L8UI
|
||||
#define XT_S8I _TIE_xt_core_S8I
|
||||
#define XT_L16UI _TIE_xt_core_L16UI
|
||||
#define XT_L16SI _TIE_xt_core_L16SI
|
||||
#define XT_S16I _TIE_xt_core_S16I
|
||||
#define XT_ADDMI _TIE_xt_core_ADDMI
|
||||
#define XT_ADD _TIE_xt_core_ADD
|
||||
#define XT_ADDX2 _TIE_xt_core_ADDX2
|
||||
#define XT_ADDX4 _TIE_xt_core_ADDX4
|
||||
#define XT_ADDX8 _TIE_xt_core_ADDX8
|
||||
#define XT_SUB _TIE_xt_core_SUB
|
||||
#define XT_SUBX2 _TIE_xt_core_SUBX2
|
||||
#define XT_SUBX4 _TIE_xt_core_SUBX4
|
||||
#define XT_SUBX8 _TIE_xt_core_SUBX8
|
||||
#define XT_AND _TIE_xt_core_AND
|
||||
#define XT_XOR _TIE_xt_core_XOR
|
||||
#define XT_EXTUI _TIE_xt_core_EXTUI
|
||||
#define XT_MOVI _TIE_xt_core_MOVI
|
||||
#define XT_MOVEQZ _TIE_xt_core_MOVEQZ
|
||||
#define XT_MOVNEZ _TIE_xt_core_MOVNEZ
|
||||
#define XT_MOVLTZ _TIE_xt_core_MOVLTZ
|
||||
#define XT_MOVGEZ _TIE_xt_core_MOVGEZ
|
||||
#define XT_NEG _TIE_xt_core_NEG
|
||||
#define XT_ABS _TIE_xt_core_ABS
|
||||
#define XT_SSR _TIE_xt_core_SSR
|
||||
#define XT_SSL _TIE_xt_core_SSL
|
||||
#define XT_SSA8L _TIE_xt_core_SSA8L
|
||||
#define XT_SSA8B _TIE_xt_core_SSA8B
|
||||
#define XT_SSAI _TIE_xt_core_SSAI
|
||||
#define XT_SLL _TIE_xt_core_SLL
|
||||
#define XT_SRC _TIE_xt_core_SRC
|
||||
#define XT_SRL _TIE_xt_core_SRL
|
||||
#define XT_SRA _TIE_xt_core_SRA
|
||||
#define XT_SLLI _TIE_xt_core_SLLI
|
||||
#define XT_SRAI _TIE_xt_core_SRAI
|
||||
#define XT_SRLI _TIE_xt_core_SRLI
|
||||
#define XT_SSAI_SRC _TIE_xt_core_SSAI_SRC
|
||||
#define XT_SSR_SRC _TIE_xt_core_SSR_SRC
|
||||
#define XT_WSR_SAR_SRC _TIE_xt_core_WSR_SAR_SRC
|
||||
#define XT_SSR_SRA _TIE_xt_core_SSR_SRA
|
||||
#define XT_SSR_SRL _TIE_xt_core_SSR_SRL
|
||||
#define XT_SSL_SLL _TIE_xt_core_SSL_SLL
|
||||
#define XT_RSIL _TIE_xt_core_RSIL
|
||||
#define XT_RSR_LEND _TIE_xt_core_RSR_LEND
|
||||
#define XT_WSR_LEND _TIE_xt_core_WSR_LEND
|
||||
#define XT_XSR_LEND _TIE_xt_core_XSR_LEND
|
||||
#define XT_RSR_LCOUNT _TIE_xt_core_RSR_LCOUNT
|
||||
#define XT_WSR_LCOUNT _TIE_xt_core_WSR_LCOUNT
|
||||
#define XT_XSR_LCOUNT _TIE_xt_core_XSR_LCOUNT
|
||||
#define XT_RSR_SAR _TIE_xt_core_RSR_SAR
|
||||
#define XT_WSR_SAR _TIE_xt_core_WSR_SAR
|
||||
#define XT_XSR_SAR _TIE_xt_core_XSR_SAR
|
||||
#define XT_RSR_MEMCTL _TIE_xt_core_RSR_MEMCTL
|
||||
#define XT_WSR_MEMCTL _TIE_xt_core_WSR_MEMCTL
|
||||
#define XT_XSR_MEMCTL _TIE_xt_core_XSR_MEMCTL
|
||||
#define XT_RSR_LITBASE _TIE_xt_core_RSR_LITBASE
|
||||
#define XT_WSR_LITBASE _TIE_xt_core_WSR_LITBASE
|
||||
#define XT_XSR_LITBASE _TIE_xt_core_XSR_LITBASE
|
||||
#define XT_RSR_PS _TIE_xt_core_RSR_PS
|
||||
#define XT_WSR_PS _TIE_xt_core_WSR_PS
|
||||
#define XT_XSR_PS _TIE_xt_core_XSR_PS
|
||||
#define XT_RSR_EPC1 _TIE_xt_core_RSR_EPC1
|
||||
#define XT_WSR_EPC1 _TIE_xt_core_WSR_EPC1
|
||||
#define XT_XSR_EPC1 _TIE_xt_core_XSR_EPC1
|
||||
#define XT_RSR_EXCSAVE1 _TIE_xt_core_RSR_EXCSAVE1
|
||||
#define XT_WSR_EXCSAVE1 _TIE_xt_core_WSR_EXCSAVE1
|
||||
#define XT_XSR_EXCSAVE1 _TIE_xt_core_XSR_EXCSAVE1
|
||||
#define XT_RSR_EPC2 _TIE_xt_core_RSR_EPC2
|
||||
#define XT_WSR_EPC2 _TIE_xt_core_WSR_EPC2
|
||||
#define XT_XSR_EPC2 _TIE_xt_core_XSR_EPC2
|
||||
#define XT_RSR_EXCSAVE2 _TIE_xt_core_RSR_EXCSAVE2
|
||||
#define XT_WSR_EXCSAVE2 _TIE_xt_core_WSR_EXCSAVE2
|
||||
#define XT_XSR_EXCSAVE2 _TIE_xt_core_XSR_EXCSAVE2
|
||||
#define XT_RSR_EPC3 _TIE_xt_core_RSR_EPC3
|
||||
#define XT_WSR_EPC3 _TIE_xt_core_WSR_EPC3
|
||||
#define XT_XSR_EPC3 _TIE_xt_core_XSR_EPC3
|
||||
#define XT_RSR_EXCSAVE3 _TIE_xt_core_RSR_EXCSAVE3
|
||||
#define XT_WSR_EXCSAVE3 _TIE_xt_core_WSR_EXCSAVE3
|
||||
#define XT_XSR_EXCSAVE3 _TIE_xt_core_XSR_EXCSAVE3
|
||||
#define XT_RSR_EPC4 _TIE_xt_core_RSR_EPC4
|
||||
#define XT_WSR_EPC4 _TIE_xt_core_WSR_EPC4
|
||||
#define XT_XSR_EPC4 _TIE_xt_core_XSR_EPC4
|
||||
#define XT_RSR_EXCSAVE4 _TIE_xt_core_RSR_EXCSAVE4
|
||||
#define XT_WSR_EXCSAVE4 _TIE_xt_core_WSR_EXCSAVE4
|
||||
#define XT_XSR_EXCSAVE4 _TIE_xt_core_XSR_EXCSAVE4
|
||||
#define XT_RSR_EPC5 _TIE_xt_core_RSR_EPC5
|
||||
#define XT_WSR_EPC5 _TIE_xt_core_WSR_EPC5
|
||||
#define XT_XSR_EPC5 _TIE_xt_core_XSR_EPC5
|
||||
#define XT_RSR_EXCSAVE5 _TIE_xt_core_RSR_EXCSAVE5
|
||||
#define XT_WSR_EXCSAVE5 _TIE_xt_core_WSR_EXCSAVE5
|
||||
#define XT_XSR_EXCSAVE5 _TIE_xt_core_XSR_EXCSAVE5
|
||||
#define XT_RSR_EPC6 _TIE_xt_core_RSR_EPC6
|
||||
#define XT_WSR_EPC6 _TIE_xt_core_WSR_EPC6
|
||||
#define XT_XSR_EPC6 _TIE_xt_core_XSR_EPC6
|
||||
#define XT_RSR_EXCSAVE6 _TIE_xt_core_RSR_EXCSAVE6
|
||||
#define XT_WSR_EXCSAVE6 _TIE_xt_core_WSR_EXCSAVE6
|
||||
#define XT_XSR_EXCSAVE6 _TIE_xt_core_XSR_EXCSAVE6
|
||||
#define XT_RSR_EPC7 _TIE_xt_core_RSR_EPC7
|
||||
#define XT_WSR_EPC7 _TIE_xt_core_WSR_EPC7
|
||||
#define XT_XSR_EPC7 _TIE_xt_core_XSR_EPC7
|
||||
#define XT_RSR_EXCSAVE7 _TIE_xt_core_RSR_EXCSAVE7
|
||||
#define XT_WSR_EXCSAVE7 _TIE_xt_core_WSR_EXCSAVE7
|
||||
#define XT_XSR_EXCSAVE7 _TIE_xt_core_XSR_EXCSAVE7
|
||||
#define XT_RSR_VECBASE _TIE_xt_core_RSR_VECBASE
|
||||
#define XT_WSR_VECBASE _TIE_xt_core_WSR_VECBASE
|
||||
#define XT_XSR_VECBASE _TIE_xt_core_XSR_VECBASE
|
||||
#define XT_RSR_EPS2 _TIE_xt_core_RSR_EPS2
|
||||
#define XT_WSR_EPS2 _TIE_xt_core_WSR_EPS2
|
||||
#define XT_XSR_EPS2 _TIE_xt_core_XSR_EPS2
|
||||
#define XT_RSR_EPS3 _TIE_xt_core_RSR_EPS3
|
||||
#define XT_WSR_EPS3 _TIE_xt_core_WSR_EPS3
|
||||
#define XT_XSR_EPS3 _TIE_xt_core_XSR_EPS3
|
||||
#define XT_RSR_EPS4 _TIE_xt_core_RSR_EPS4
|
||||
#define XT_WSR_EPS4 _TIE_xt_core_WSR_EPS4
|
||||
#define XT_XSR_EPS4 _TIE_xt_core_XSR_EPS4
|
||||
#define XT_RSR_EPS5 _TIE_xt_core_RSR_EPS5
|
||||
#define XT_WSR_EPS5 _TIE_xt_core_WSR_EPS5
|
||||
#define XT_XSR_EPS5 _TIE_xt_core_XSR_EPS5
|
||||
#define XT_RSR_EPS6 _TIE_xt_core_RSR_EPS6
|
||||
#define XT_WSR_EPS6 _TIE_xt_core_WSR_EPS6
|
||||
#define XT_XSR_EPS6 _TIE_xt_core_XSR_EPS6
|
||||
#define XT_RSR_EPS7 _TIE_xt_core_RSR_EPS7
|
||||
#define XT_WSR_EPS7 _TIE_xt_core_WSR_EPS7
|
||||
#define XT_XSR_EPS7 _TIE_xt_core_XSR_EPS7
|
||||
#define XT_RSR_EXCCAUSE _TIE_xt_core_RSR_EXCCAUSE
|
||||
#define XT_WSR_EXCCAUSE _TIE_xt_core_WSR_EXCCAUSE
|
||||
#define XT_XSR_EXCCAUSE _TIE_xt_core_XSR_EXCCAUSE
|
||||
#define XT_RSR_EXCVADDR _TIE_xt_core_RSR_EXCVADDR
|
||||
#define XT_WSR_EXCVADDR _TIE_xt_core_WSR_EXCVADDR
|
||||
#define XT_XSR_EXCVADDR _TIE_xt_core_XSR_EXCVADDR
|
||||
#define XT_RSR_DEPC _TIE_xt_core_RSR_DEPC
|
||||
#define XT_WSR_DEPC _TIE_xt_core_WSR_DEPC
|
||||
#define XT_XSR_DEPC _TIE_xt_core_XSR_DEPC
|
||||
#define XT_RSR_MISC0 _TIE_xt_core_RSR_MISC0
|
||||
#define XT_WSR_MISC0 _TIE_xt_core_WSR_MISC0
|
||||
#define XT_XSR_MISC0 _TIE_xt_core_XSR_MISC0
|
||||
#define XT_RSR_MISC1 _TIE_xt_core_RSR_MISC1
|
||||
#define XT_WSR_MISC1 _TIE_xt_core_WSR_MISC1
|
||||
#define XT_XSR_MISC1 _TIE_xt_core_XSR_MISC1
|
||||
#define XT_RSR_MISC2 _TIE_xt_core_RSR_MISC2
|
||||
#define XT_WSR_MISC2 _TIE_xt_core_WSR_MISC2
|
||||
#define XT_XSR_MISC2 _TIE_xt_core_XSR_MISC2
|
||||
#define XT_RSR_MISC3 _TIE_xt_core_RSR_MISC3
|
||||
#define XT_WSR_MISC3 _TIE_xt_core_WSR_MISC3
|
||||
#define XT_XSR_MISC3 _TIE_xt_core_XSR_MISC3
|
||||
#define XT_RSR_PRID _TIE_xt_core_RSR_PRID
|
||||
|
||||
#ifndef RUR
|
||||
#define RUR(NUM) RUR##NUM()
|
||||
#endif
|
||||
|
||||
#ifndef WUR
|
||||
#define WUR(VAL, NUM) WUR##NUM(VAL)
|
||||
#endif
|
||||
|
||||
#endif /* __XCC__ */
|
||||
|
||||
#endif /* __XTENSA__ */
|
||||
|
||||
#endif /* !_XTENSA_xt_core_HEADER */
|
@ -1,116 +0,0 @@
|
||||
/* Definitions for the xt_debug TIE package */
|
||||
|
||||
/*
|
||||
* Customer ID=11657; Build=0x5fe96; Copyright (c) 2004-2010 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
* They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
* third parties in any manner, medium, or form, in whole or in part, without
|
||||
* the prior written consent of Tensilica Inc.
|
||||
*/
|
||||
|
||||
/* Do not modify. This is automatically generated.*/
|
||||
|
||||
#ifndef _XTENSA_xt_debug_HEADER
|
||||
#define _XTENSA_xt_debug_HEADER
|
||||
|
||||
#ifdef __XTENSA__
|
||||
#ifdef __XCC__
|
||||
|
||||
#include <xtensa/tie/xt_core.h>
|
||||
|
||||
/*
|
||||
* The following prototypes describe intrinsic functions
|
||||
* corresponding to TIE instructions. Some TIE instructions
|
||||
* may produce multiple results (designated as "out" operands
|
||||
* in the iclass section) or may have operands used as both
|
||||
* inputs and outputs (designated as "inout"). However, the C
|
||||
* and C++ languages do not provide syntax that can express
|
||||
* the in/out/inout constraints of TIE intrinsics.
|
||||
* Nevertheless, the compiler understands these constraints
|
||||
* and will check that the intrinsic functions are used
|
||||
* correctly. To improve the readability of these prototypes,
|
||||
* the "out" and "inout" parameters are marked accordingly
|
||||
* with comments.
|
||||
*/
|
||||
|
||||
extern void _TIE_xt_debug_BREAK(immediate imms, immediate immt);
|
||||
extern void _TIE_xt_debug_BREAK_N(immediate imms);
|
||||
extern unsigned _TIE_xt_debug_RSR_DBREAKA0(void);
|
||||
extern void _TIE_xt_debug_WSR_DBREAKA0(unsigned art);
|
||||
extern void _TIE_xt_debug_XSR_DBREAKA0(unsigned art /*inout*/);
|
||||
extern unsigned _TIE_xt_debug_RSR_DBREAKC0(void);
|
||||
extern void _TIE_xt_debug_WSR_DBREAKC0(unsigned art);
|
||||
extern void _TIE_xt_debug_XSR_DBREAKC0(unsigned art /*inout*/);
|
||||
extern unsigned _TIE_xt_debug_RSR_DBREAKA1(void);
|
||||
extern void _TIE_xt_debug_WSR_DBREAKA1(unsigned art);
|
||||
extern void _TIE_xt_debug_XSR_DBREAKA1(unsigned art /*inout*/);
|
||||
extern unsigned _TIE_xt_debug_RSR_DBREAKC1(void);
|
||||
extern void _TIE_xt_debug_WSR_DBREAKC1(unsigned art);
|
||||
extern void _TIE_xt_debug_XSR_DBREAKC1(unsigned art /*inout*/);
|
||||
extern unsigned _TIE_xt_debug_RSR_IBREAKA0(void);
|
||||
extern void _TIE_xt_debug_WSR_IBREAKA0(unsigned art);
|
||||
extern void _TIE_xt_debug_XSR_IBREAKA0(unsigned art /*inout*/);
|
||||
extern unsigned _TIE_xt_debug_RSR_IBREAKA1(void);
|
||||
extern void _TIE_xt_debug_WSR_IBREAKA1(unsigned art);
|
||||
extern void _TIE_xt_debug_XSR_IBREAKA1(unsigned art /*inout*/);
|
||||
extern unsigned _TIE_xt_debug_RSR_IBREAKENABLE(void);
|
||||
extern void _TIE_xt_debug_WSR_IBREAKENABLE(unsigned art);
|
||||
extern void _TIE_xt_debug_XSR_IBREAKENABLE(unsigned art /*inout*/);
|
||||
extern unsigned _TIE_xt_debug_RSR_DEBUGCAUSE(void);
|
||||
extern void _TIE_xt_debug_WSR_DEBUGCAUSE(unsigned art);
|
||||
extern void _TIE_xt_debug_XSR_DEBUGCAUSE(unsigned art /*inout*/);
|
||||
extern unsigned _TIE_xt_debug_RSR_ICOUNT(void);
|
||||
extern void _TIE_xt_debug_WSR_ICOUNT(unsigned art);
|
||||
extern void _TIE_xt_debug_XSR_ICOUNT(unsigned art /*inout*/);
|
||||
extern unsigned _TIE_xt_debug_RSR_ICOUNTLEVEL(void);
|
||||
extern void _TIE_xt_debug_WSR_ICOUNTLEVEL(unsigned art);
|
||||
extern void _TIE_xt_debug_XSR_ICOUNTLEVEL(unsigned art /*inout*/);
|
||||
extern unsigned _TIE_xt_debug_RSR_DDR(void);
|
||||
extern void _TIE_xt_debug_WSR_DDR(unsigned art);
|
||||
extern void _TIE_xt_debug_XSR_DDR(unsigned art /*inout*/);
|
||||
extern void _TIE_xt_debug_LDDR32_P(const void * ars /*inout*/);
|
||||
extern void _TIE_xt_debug_SDDR32_P(void * ars /*inout*/);
|
||||
#define XT_BREAK _TIE_xt_debug_BREAK
|
||||
#define XT_BREAK_N _TIE_xt_debug_BREAK_N
|
||||
#define XT_RSR_DBREAKA0 _TIE_xt_debug_RSR_DBREAKA0
|
||||
#define XT_WSR_DBREAKA0 _TIE_xt_debug_WSR_DBREAKA0
|
||||
#define XT_XSR_DBREAKA0 _TIE_xt_debug_XSR_DBREAKA0
|
||||
#define XT_RSR_DBREAKC0 _TIE_xt_debug_RSR_DBREAKC0
|
||||
#define XT_WSR_DBREAKC0 _TIE_xt_debug_WSR_DBREAKC0
|
||||
#define XT_XSR_DBREAKC0 _TIE_xt_debug_XSR_DBREAKC0
|
||||
#define XT_RSR_DBREAKA1 _TIE_xt_debug_RSR_DBREAKA1
|
||||
#define XT_WSR_DBREAKA1 _TIE_xt_debug_WSR_DBREAKA1
|
||||
#define XT_XSR_DBREAKA1 _TIE_xt_debug_XSR_DBREAKA1
|
||||
#define XT_RSR_DBREAKC1 _TIE_xt_debug_RSR_DBREAKC1
|
||||
#define XT_WSR_DBREAKC1 _TIE_xt_debug_WSR_DBREAKC1
|
||||
#define XT_XSR_DBREAKC1 _TIE_xt_debug_XSR_DBREAKC1
|
||||
#define XT_RSR_IBREAKA0 _TIE_xt_debug_RSR_IBREAKA0
|
||||
#define XT_WSR_IBREAKA0 _TIE_xt_debug_WSR_IBREAKA0
|
||||
#define XT_XSR_IBREAKA0 _TIE_xt_debug_XSR_IBREAKA0
|
||||
#define XT_RSR_IBREAKA1 _TIE_xt_debug_RSR_IBREAKA1
|
||||
#define XT_WSR_IBREAKA1 _TIE_xt_debug_WSR_IBREAKA1
|
||||
#define XT_XSR_IBREAKA1 _TIE_xt_debug_XSR_IBREAKA1
|
||||
#define XT_RSR_IBREAKENABLE _TIE_xt_debug_RSR_IBREAKENABLE
|
||||
#define XT_WSR_IBREAKENABLE _TIE_xt_debug_WSR_IBREAKENABLE
|
||||
#define XT_XSR_IBREAKENABLE _TIE_xt_debug_XSR_IBREAKENABLE
|
||||
#define XT_RSR_DEBUGCAUSE _TIE_xt_debug_RSR_DEBUGCAUSE
|
||||
#define XT_WSR_DEBUGCAUSE _TIE_xt_debug_WSR_DEBUGCAUSE
|
||||
#define XT_XSR_DEBUGCAUSE _TIE_xt_debug_XSR_DEBUGCAUSE
|
||||
#define XT_RSR_ICOUNT _TIE_xt_debug_RSR_ICOUNT
|
||||
#define XT_WSR_ICOUNT _TIE_xt_debug_WSR_ICOUNT
|
||||
#define XT_XSR_ICOUNT _TIE_xt_debug_XSR_ICOUNT
|
||||
#define XT_RSR_ICOUNTLEVEL _TIE_xt_debug_RSR_ICOUNTLEVEL
|
||||
#define XT_WSR_ICOUNTLEVEL _TIE_xt_debug_WSR_ICOUNTLEVEL
|
||||
#define XT_XSR_ICOUNTLEVEL _TIE_xt_debug_XSR_ICOUNTLEVEL
|
||||
#define XT_RSR_DDR _TIE_xt_debug_RSR_DDR
|
||||
#define XT_WSR_DDR _TIE_xt_debug_WSR_DDR
|
||||
#define XT_XSR_DDR _TIE_xt_debug_XSR_DDR
|
||||
#define XT_LDDR32_P _TIE_xt_debug_LDDR32_P
|
||||
#define XT_SDDR32_P _TIE_xt_debug_SDDR32_P
|
||||
|
||||
#endif /* __XCC__ */
|
||||
|
||||
#endif /* __XTENSA__ */
|
||||
|
||||
#endif /* !_XTENSA_xt_debug_HEADER */
|
@ -1,58 +0,0 @@
|
||||
/* Definitions for the xt_density TIE package */
|
||||
|
||||
/*
|
||||
* Customer ID=11657; Build=0x5fe96; Copyright (c) 2004-2010 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
* They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
* third parties in any manner, medium, or form, in whole or in part, without
|
||||
* the prior written consent of Tensilica Inc.
|
||||
*/
|
||||
|
||||
/* Do not modify. This is automatically generated.*/
|
||||
|
||||
#ifndef _XTENSA_xt_density_HEADER
|
||||
#define _XTENSA_xt_density_HEADER
|
||||
|
||||
#ifdef __XTENSA__
|
||||
#ifdef __XCC__
|
||||
|
||||
#include <xtensa/tie/xt_core.h>
|
||||
|
||||
/*
|
||||
* The following prototypes describe intrinsic functions
|
||||
* corresponding to TIE instructions. Some TIE instructions
|
||||
* may produce multiple results (designated as "out" operands
|
||||
* in the iclass section) or may have operands used as both
|
||||
* inputs and outputs (designated as "inout"). However, the C
|
||||
* and C++ languages do not provide syntax that can express
|
||||
* the in/out/inout constraints of TIE intrinsics.
|
||||
* Nevertheless, the compiler understands these constraints
|
||||
* and will check that the intrinsic functions are used
|
||||
* correctly. To improve the readability of these prototypes,
|
||||
* the "out" and "inout" parameters are marked accordingly
|
||||
* with comments.
|
||||
*/
|
||||
|
||||
extern void _TIE_xt_density_ILL_N(void);
|
||||
extern void _TIE_xt_density_NOP_N(void);
|
||||
extern int _TIE_xt_density_L32I_N(const int * p, immediate i);
|
||||
extern void _TIE_xt_density_S32I_N(int t, int * p, immediate i);
|
||||
extern int _TIE_xt_density_ADD_N(int s, int t);
|
||||
extern int _TIE_xt_density_ADDI_N(int s, immediate i);
|
||||
extern int _TIE_xt_density_MOV_N(int s);
|
||||
extern int _TIE_xt_density_MOVI_N(immediate i);
|
||||
#define XT_ILL_N _TIE_xt_density_ILL_N
|
||||
#define XT_NOP_N _TIE_xt_density_NOP_N
|
||||
#define XT_L32I_N _TIE_xt_density_L32I_N
|
||||
#define XT_S32I_N _TIE_xt_density_S32I_N
|
||||
#define XT_ADD_N _TIE_xt_density_ADD_N
|
||||
#define XT_ADDI_N _TIE_xt_density_ADDI_N
|
||||
#define XT_MOV_N _TIE_xt_density_MOV_N
|
||||
#define XT_MOVI_N _TIE_xt_density_MOVI_N
|
||||
|
||||
#endif /* __XCC__ */
|
||||
|
||||
#endif /* __XTENSA__ */
|
||||
|
||||
#endif /* !_XTENSA_xt_density_HEADER */
|
@ -1,45 +0,0 @@
|
||||
/* Definitions for the xt_exceptions TIE package */
|
||||
|
||||
/*
|
||||
* Customer ID=11657; Build=0x5fe96; Copyright (c) 2004-2010 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
* They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
* third parties in any manner, medium, or form, in whole or in part, without
|
||||
* the prior written consent of Tensilica Inc.
|
||||
*/
|
||||
|
||||
/* Do not modify. This is automatically generated.*/
|
||||
|
||||
#ifndef _XTENSA_xt_exceptions_HEADER
|
||||
#define _XTENSA_xt_exceptions_HEADER
|
||||
|
||||
#ifdef __XTENSA__
|
||||
#ifdef __XCC__
|
||||
|
||||
|
||||
/*
|
||||
* The following prototypes describe intrinsic functions
|
||||
* corresponding to TIE instructions. Some TIE instructions
|
||||
* may produce multiple results (designated as "out" operands
|
||||
* in the iclass section) or may have operands used as both
|
||||
* inputs and outputs (designated as "inout"). However, the C
|
||||
* and C++ languages do not provide syntax that can express
|
||||
* the in/out/inout constraints of TIE intrinsics.
|
||||
* Nevertheless, the compiler understands these constraints
|
||||
* and will check that the intrinsic functions are used
|
||||
* correctly. To improve the readability of these prototypes,
|
||||
* the "out" and "inout" parameters are marked accordingly
|
||||
* with comments.
|
||||
*/
|
||||
|
||||
extern void _TIE_xt_exceptions_EXCW(void);
|
||||
extern void _TIE_xt_exceptions_SYSCALL(void);
|
||||
#define XT_EXCW _TIE_xt_exceptions_EXCW
|
||||
#define XT_SYSCALL _TIE_xt_exceptions_SYSCALL
|
||||
|
||||
#endif /* __XCC__ */
|
||||
|
||||
#endif /* __XTENSA__ */
|
||||
|
||||
#endif /* !_XTENSA_xt_exceptions_HEADER */
|
@ -1,46 +0,0 @@
|
||||
/* Definitions for the xt_externalregisters TIE package */
|
||||
|
||||
/*
|
||||
* Customer ID=11657; Build=0x5fe96; Copyright (c) 2004-2010 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
* They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
* third parties in any manner, medium, or form, in whole or in part, without
|
||||
* the prior written consent of Tensilica Inc.
|
||||
*/
|
||||
|
||||
/* Do not modify. This is automatically generated.*/
|
||||
|
||||
#ifndef _XTENSA_xt_externalregisters_HEADER
|
||||
#define _XTENSA_xt_externalregisters_HEADER
|
||||
|
||||
#ifdef __XTENSA__
|
||||
#ifdef __XCC__
|
||||
|
||||
#include <xtensa/tie/xt_core.h>
|
||||
|
||||
/*
|
||||
* The following prototypes describe intrinsic functions
|
||||
* corresponding to TIE instructions. Some TIE instructions
|
||||
* may produce multiple results (designated as "out" operands
|
||||
* in the iclass section) or may have operands used as both
|
||||
* inputs and outputs (designated as "inout"). However, the C
|
||||
* and C++ languages do not provide syntax that can express
|
||||
* the in/out/inout constraints of TIE intrinsics.
|
||||
* Nevertheless, the compiler understands these constraints
|
||||
* and will check that the intrinsic functions are used
|
||||
* correctly. To improve the readability of these prototypes,
|
||||
* the "out" and "inout" parameters are marked accordingly
|
||||
* with comments.
|
||||
*/
|
||||
|
||||
extern unsigned _TIE_xt_externalregisters_RER(unsigned ars);
|
||||
extern void _TIE_xt_externalregisters_WER(unsigned art, unsigned ars);
|
||||
#define XT_RER _TIE_xt_externalregisters_RER
|
||||
#define XT_WER _TIE_xt_externalregisters_WER
|
||||
|
||||
#endif /* __XCC__ */
|
||||
|
||||
#endif /* __XTENSA__ */
|
||||
|
||||
#endif /* !_XTENSA_xt_externalregisters_HEADER */
|
@ -1,50 +0,0 @@
|
||||
/* Definitions for the xt_integerdivide TIE package */
|
||||
|
||||
/*
|
||||
* Customer ID=11657; Build=0x5fe96; Copyright (c) 2004-2010 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
* They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
* third parties in any manner, medium, or form, in whole or in part, without
|
||||
* the prior written consent of Tensilica Inc.
|
||||
*/
|
||||
|
||||
/* Do not modify. This is automatically generated.*/
|
||||
|
||||
#ifndef _XTENSA_xt_integerdivide_HEADER
|
||||
#define _XTENSA_xt_integerdivide_HEADER
|
||||
|
||||
#ifdef __XTENSA__
|
||||
#ifdef __XCC__
|
||||
|
||||
#include <xtensa/tie/xt_core.h>
|
||||
|
||||
/*
|
||||
* The following prototypes describe intrinsic functions
|
||||
* corresponding to TIE instructions. Some TIE instructions
|
||||
* may produce multiple results (designated as "out" operands
|
||||
* in the iclass section) or may have operands used as both
|
||||
* inputs and outputs (designated as "inout"). However, the C
|
||||
* and C++ languages do not provide syntax that can express
|
||||
* the in/out/inout constraints of TIE intrinsics.
|
||||
* Nevertheless, the compiler understands these constraints
|
||||
* and will check that the intrinsic functions are used
|
||||
* correctly. To improve the readability of these prototypes,
|
||||
* the "out" and "inout" parameters are marked accordingly
|
||||
* with comments.
|
||||
*/
|
||||
|
||||
extern unsigned _TIE_xt_integerdivide_REMS(unsigned ars, unsigned art);
|
||||
extern unsigned _TIE_xt_integerdivide_REMU(unsigned ars, unsigned art);
|
||||
extern unsigned _TIE_xt_integerdivide_QUOS(unsigned ars, unsigned art);
|
||||
extern unsigned _TIE_xt_integerdivide_QUOU(unsigned ars, unsigned art);
|
||||
#define XT_REMS _TIE_xt_integerdivide_REMS
|
||||
#define XT_REMU _TIE_xt_integerdivide_REMU
|
||||
#define XT_QUOS _TIE_xt_integerdivide_QUOS
|
||||
#define XT_QUOU _TIE_xt_integerdivide_QUOU
|
||||
|
||||
#endif /* __XCC__ */
|
||||
|
||||
#endif /* __XTENSA__ */
|
||||
|
||||
#endif /* !_XTENSA_xt_integerdivide_HEADER */
|
@ -1,56 +0,0 @@
|
||||
/* Definitions for the xt_interrupt TIE package */
|
||||
|
||||
/*
|
||||
* Customer ID=11657; Build=0x5fe96; Copyright (c) 2004-2010 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
* They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
* third parties in any manner, medium, or form, in whole or in part, without
|
||||
* the prior written consent of Tensilica Inc.
|
||||
*/
|
||||
|
||||
/* Do not modify. This is automatically generated.*/
|
||||
|
||||
#ifndef _XTENSA_xt_interrupt_HEADER
|
||||
#define _XTENSA_xt_interrupt_HEADER
|
||||
|
||||
#ifdef __XTENSA__
|
||||
#ifdef __XCC__
|
||||
|
||||
#include <xtensa/tie/xt_core.h>
|
||||
|
||||
/*
|
||||
* The following prototypes describe intrinsic functions
|
||||
* corresponding to TIE instructions. Some TIE instructions
|
||||
* may produce multiple results (designated as "out" operands
|
||||
* in the iclass section) or may have operands used as both
|
||||
* inputs and outputs (designated as "inout"). However, the C
|
||||
* and C++ languages do not provide syntax that can express
|
||||
* the in/out/inout constraints of TIE intrinsics.
|
||||
* Nevertheless, the compiler understands these constraints
|
||||
* and will check that the intrinsic functions are used
|
||||
* correctly. To improve the readability of these prototypes,
|
||||
* the "out" and "inout" parameters are marked accordingly
|
||||
* with comments.
|
||||
*/
|
||||
|
||||
extern void _TIE_xt_interrupt_WAITI(immediate s);
|
||||
extern unsigned _TIE_xt_interrupt_RSR_INTERRUPT(void);
|
||||
extern void _TIE_xt_interrupt_WSR_INTSET(unsigned art);
|
||||
extern void _TIE_xt_interrupt_WSR_INTCLEAR(unsigned art);
|
||||
extern unsigned _TIE_xt_interrupt_RSR_INTENABLE(void);
|
||||
extern void _TIE_xt_interrupt_WSR_INTENABLE(unsigned art);
|
||||
extern void _TIE_xt_interrupt_XSR_INTENABLE(unsigned art /*inout*/);
|
||||
#define XT_WAITI _TIE_xt_interrupt_WAITI
|
||||
#define XT_RSR_INTERRUPT _TIE_xt_interrupt_RSR_INTERRUPT
|
||||
#define XT_WSR_INTSET _TIE_xt_interrupt_WSR_INTSET
|
||||
#define XT_WSR_INTCLEAR _TIE_xt_interrupt_WSR_INTCLEAR
|
||||
#define XT_RSR_INTENABLE _TIE_xt_interrupt_RSR_INTENABLE
|
||||
#define XT_WSR_INTENABLE _TIE_xt_interrupt_WSR_INTENABLE
|
||||
#define XT_XSR_INTENABLE _TIE_xt_interrupt_XSR_INTENABLE
|
||||
|
||||
#endif /* __XCC__ */
|
||||
|
||||
#endif /* __XTENSA__ */
|
||||
|
||||
#endif /* !_XTENSA_xt_interrupt_HEADER */
|
@ -1,66 +0,0 @@
|
||||
/* Definitions for the xt_ioports TIE package */
|
||||
|
||||
/*
|
||||
* Customer ID=11657; Build=0x5fe96; Copyright (c) 2004-2010 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
* They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
* third parties in any manner, medium, or form, in whole or in part, without
|
||||
* the prior written consent of Tensilica Inc.
|
||||
*/
|
||||
|
||||
/* Do not modify. This is automatically generated.*/
|
||||
|
||||
#ifndef _XTENSA_xt_ioports_HEADER
|
||||
#define _XTENSA_xt_ioports_HEADER
|
||||
|
||||
#ifdef __XTENSA__
|
||||
#ifdef __XCC__
|
||||
|
||||
#include <xtensa/tie/xt_core.h>
|
||||
|
||||
/*
|
||||
* The following prototypes describe intrinsic functions
|
||||
* corresponding to TIE instructions. Some TIE instructions
|
||||
* may produce multiple results (designated as "out" operands
|
||||
* in the iclass section) or may have operands used as both
|
||||
* inputs and outputs (designated as "inout"). However, the C
|
||||
* and C++ languages do not provide syntax that can express
|
||||
* the in/out/inout constraints of TIE intrinsics.
|
||||
* Nevertheless, the compiler understands these constraints
|
||||
* and will check that the intrinsic functions are used
|
||||
* correctly. To improve the readability of these prototypes,
|
||||
* the "out" and "inout" parameters are marked accordingly
|
||||
* with comments.
|
||||
*/
|
||||
|
||||
extern unsigned _TIE_xt_ioports_READ_IMPWIRE(void);
|
||||
extern void _TIE_xt_ioports_SETB_EXPSTATE(immediate bitindex);
|
||||
extern void _TIE_xt_ioports_CLRB_EXPSTATE(immediate bitindex);
|
||||
extern void _TIE_xt_ioports_WRMSK_EXPSTATE(unsigned art, unsigned ars);
|
||||
extern unsigned _TIE_xt_ioports_RUR_EXPSTATE(void);
|
||||
extern void _TIE_xt_ioports_WUR_EXPSTATE(unsigned v);
|
||||
#define READ_IMPWIRE _TIE_xt_ioports_READ_IMPWIRE
|
||||
#define SETB_EXPSTATE _TIE_xt_ioports_SETB_EXPSTATE
|
||||
#define CLRB_EXPSTATE _TIE_xt_ioports_CLRB_EXPSTATE
|
||||
#define WRMSK_EXPSTATE _TIE_xt_ioports_WRMSK_EXPSTATE
|
||||
#define RUR_EXPSTATE _TIE_xt_ioports_RUR_EXPSTATE
|
||||
#define REXPSTATE _TIE_xt_ioports_RUR_EXPSTATE
|
||||
#define RUR230 _TIE_xt_ioports_RUR_EXPSTATE
|
||||
#define WUR_EXPSTATE _TIE_xt_ioports_WUR_EXPSTATE
|
||||
#define WEXPSTATE _TIE_xt_ioports_WUR_EXPSTATE
|
||||
#define WUR230 _TIE_xt_ioports_WUR_EXPSTATE
|
||||
|
||||
#ifndef RUR
|
||||
#define RUR(NUM) RUR##NUM()
|
||||
#endif
|
||||
|
||||
#ifndef WUR
|
||||
#define WUR(VAL, NUM) WUR##NUM(VAL)
|
||||
#endif
|
||||
|
||||
#endif /* __XCC__ */
|
||||
|
||||
#endif /* __XTENSA__ */
|
||||
|
||||
#endif /* !_XTENSA_xt_ioports_HEADER */
|
@ -1,58 +0,0 @@
|
||||
/* Definitions for the xt_misc TIE package */
|
||||
|
||||
/*
|
||||
* Customer ID=11657; Build=0x5fe96; Copyright (c) 2004-2010 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
* They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
* third parties in any manner, medium, or form, in whole or in part, without
|
||||
* the prior written consent of Tensilica Inc.
|
||||
*/
|
||||
|
||||
/* Do not modify. This is automatically generated.*/
|
||||
|
||||
#ifndef _XTENSA_xt_misc_HEADER
|
||||
#define _XTENSA_xt_misc_HEADER
|
||||
|
||||
#ifdef __XTENSA__
|
||||
#ifdef __XCC__
|
||||
|
||||
#include <xtensa/tie/xt_core.h>
|
||||
|
||||
/*
|
||||
* The following prototypes describe intrinsic functions
|
||||
* corresponding to TIE instructions. Some TIE instructions
|
||||
* may produce multiple results (designated as "out" operands
|
||||
* in the iclass section) or may have operands used as both
|
||||
* inputs and outputs (designated as "inout"). However, the C
|
||||
* and C++ languages do not provide syntax that can express
|
||||
* the in/out/inout constraints of TIE intrinsics.
|
||||
* Nevertheless, the compiler understands these constraints
|
||||
* and will check that the intrinsic functions are used
|
||||
* correctly. To improve the readability of these prototypes,
|
||||
* the "out" and "inout" parameters are marked accordingly
|
||||
* with comments.
|
||||
*/
|
||||
|
||||
extern int _TIE_xt_misc_CLAMPS(int s, immediate i);
|
||||
extern int _TIE_xt_misc_MIN(int s, int t);
|
||||
extern int _TIE_xt_misc_MAX(int s, int t);
|
||||
extern unsigned _TIE_xt_misc_MINU(unsigned s, unsigned t);
|
||||
extern unsigned _TIE_xt_misc_MAXU(unsigned s, unsigned t);
|
||||
extern int _TIE_xt_misc_NSA(int s);
|
||||
extern unsigned _TIE_xt_misc_NSAU(unsigned s);
|
||||
extern int _TIE_xt_misc_SEXT(int s, immediate i);
|
||||
#define XT_CLAMPS _TIE_xt_misc_CLAMPS
|
||||
#define XT_MIN _TIE_xt_misc_MIN
|
||||
#define XT_MAX _TIE_xt_misc_MAX
|
||||
#define XT_MINU _TIE_xt_misc_MINU
|
||||
#define XT_MAXU _TIE_xt_misc_MAXU
|
||||
#define XT_NSA _TIE_xt_misc_NSA
|
||||
#define XT_NSAU _TIE_xt_misc_NSAU
|
||||
#define XT_SEXT _TIE_xt_misc_SEXT
|
||||
|
||||
#endif /* __XCC__ */
|
||||
|
||||
#endif /* __XTENSA__ */
|
||||
|
||||
#endif /* !_XTENSA_xt_misc_HEADER */
|
@ -1,62 +0,0 @@
|
||||
/* Definitions for the xt_mmu TIE package */
|
||||
|
||||
/*
|
||||
* Customer ID=11657; Build=0x5fe96; Copyright (c) 2004-2010 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
* They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
* third parties in any manner, medium, or form, in whole or in part, without
|
||||
* the prior written consent of Tensilica Inc.
|
||||
*/
|
||||
|
||||
/* Do not modify. This is automatically generated.*/
|
||||
|
||||
#ifndef _XTENSA_xt_mmu_HEADER
|
||||
#define _XTENSA_xt_mmu_HEADER
|
||||
|
||||
#ifdef __XTENSA__
|
||||
#ifdef __XCC__
|
||||
|
||||
#include <xtensa/tie/xt_core.h>
|
||||
|
||||
/*
|
||||
* The following prototypes describe intrinsic functions
|
||||
* corresponding to TIE instructions. Some TIE instructions
|
||||
* may produce multiple results (designated as "out" operands
|
||||
* in the iclass section) or may have operands used as both
|
||||
* inputs and outputs (designated as "inout"). However, the C
|
||||
* and C++ languages do not provide syntax that can express
|
||||
* the in/out/inout constraints of TIE intrinsics.
|
||||
* Nevertheless, the compiler understands these constraints
|
||||
* and will check that the intrinsic functions are used
|
||||
* correctly. To improve the readability of these prototypes,
|
||||
* the "out" and "inout" parameters are marked accordingly
|
||||
* with comments.
|
||||
*/
|
||||
|
||||
extern void _TIE_xt_mmu_IDTLB(unsigned ars);
|
||||
extern unsigned _TIE_xt_mmu_RDTLB1(unsigned ars);
|
||||
extern unsigned _TIE_xt_mmu_RDTLB0(unsigned ars);
|
||||
extern unsigned _TIE_xt_mmu_PDTLB(unsigned ars);
|
||||
extern void _TIE_xt_mmu_WDTLB(unsigned art, unsigned ars);
|
||||
extern void _TIE_xt_mmu_IITLB(unsigned ars);
|
||||
extern unsigned _TIE_xt_mmu_RITLB1(unsigned ars);
|
||||
extern unsigned _TIE_xt_mmu_RITLB0(unsigned ars);
|
||||
extern unsigned _TIE_xt_mmu_PITLB(unsigned ars);
|
||||
extern void _TIE_xt_mmu_WITLB(unsigned art, unsigned ars);
|
||||
#define XT_IDTLB _TIE_xt_mmu_IDTLB
|
||||
#define XT_RDTLB1 _TIE_xt_mmu_RDTLB1
|
||||
#define XT_RDTLB0 _TIE_xt_mmu_RDTLB0
|
||||
#define XT_PDTLB _TIE_xt_mmu_PDTLB
|
||||
#define XT_WDTLB _TIE_xt_mmu_WDTLB
|
||||
#define XT_IITLB _TIE_xt_mmu_IITLB
|
||||
#define XT_RITLB1 _TIE_xt_mmu_RITLB1
|
||||
#define XT_RITLB0 _TIE_xt_mmu_RITLB0
|
||||
#define XT_PITLB _TIE_xt_mmu_PITLB
|
||||
#define XT_WITLB _TIE_xt_mmu_WITLB
|
||||
|
||||
#endif /* __XCC__ */
|
||||
|
||||
#endif /* __XTENSA__ */
|
||||
|
||||
#endif /* !_XTENSA_xt_mmu_HEADER */
|
@ -1,52 +0,0 @@
|
||||
/* Definitions for the xt_mul TIE package */
|
||||
|
||||
/*
|
||||
* Customer ID=11657; Build=0x5fe96; Copyright (c) 2004-2010 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
* They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
* third parties in any manner, medium, or form, in whole or in part, without
|
||||
* the prior written consent of Tensilica Inc.
|
||||
*/
|
||||
|
||||
/* Do not modify. This is automatically generated.*/
|
||||
|
||||
#ifndef _XTENSA_xt_mul_HEADER
|
||||
#define _XTENSA_xt_mul_HEADER
|
||||
|
||||
#ifdef __XTENSA__
|
||||
#ifdef __XCC__
|
||||
|
||||
#include <xtensa/tie/xt_core.h>
|
||||
|
||||
/*
|
||||
* The following prototypes describe intrinsic functions
|
||||
* corresponding to TIE instructions. Some TIE instructions
|
||||
* may produce multiple results (designated as "out" operands
|
||||
* in the iclass section) or may have operands used as both
|
||||
* inputs and outputs (designated as "inout"). However, the C
|
||||
* and C++ languages do not provide syntax that can express
|
||||
* the in/out/inout constraints of TIE intrinsics.
|
||||
* Nevertheless, the compiler understands these constraints
|
||||
* and will check that the intrinsic functions are used
|
||||
* correctly. To improve the readability of these prototypes,
|
||||
* the "out" and "inout" parameters are marked accordingly
|
||||
* with comments.
|
||||
*/
|
||||
|
||||
extern int _TIE_xt_mul_MUL16S(short s, short t);
|
||||
extern unsigned _TIE_xt_mul_MUL16U(unsigned short s, unsigned short t);
|
||||
extern int _TIE_xt_mul_MULL(int s, int t);
|
||||
extern unsigned _TIE_xt_mul_MULUH(unsigned s, unsigned t);
|
||||
extern int _TIE_xt_mul_MULSH(int s, int t);
|
||||
#define XT_MUL16S _TIE_xt_mul_MUL16S
|
||||
#define XT_MUL16U _TIE_xt_mul_MUL16U
|
||||
#define XT_MULL _TIE_xt_mul_MULL
|
||||
#define XT_MULUH _TIE_xt_mul_MULUH
|
||||
#define XT_MULSH _TIE_xt_mul_MULSH
|
||||
|
||||
#endif /* __XCC__ */
|
||||
|
||||
#endif /* __XTENSA__ */
|
||||
|
||||
#endif /* !_XTENSA_xt_mul_HEADER */
|
@ -1,64 +0,0 @@
|
||||
/* Definitions for the xt_regwin TIE package */
|
||||
|
||||
/*
|
||||
* Customer ID=11657; Build=0x5fe96; Copyright (c) 2004-2010 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
* They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
* third parties in any manner, medium, or form, in whole or in part, without
|
||||
* the prior written consent of Tensilica Inc.
|
||||
*/
|
||||
|
||||
/* Do not modify. This is automatically generated.*/
|
||||
|
||||
#ifndef _XTENSA_xt_regwin_HEADER
|
||||
#define _XTENSA_xt_regwin_HEADER
|
||||
|
||||
#ifdef __XTENSA__
|
||||
#ifdef __XCC__
|
||||
|
||||
#include <xtensa/tie/xt_core.h>
|
||||
|
||||
/*
|
||||
* The following prototypes describe intrinsic functions
|
||||
* corresponding to TIE instructions. Some TIE instructions
|
||||
* may produce multiple results (designated as "out" operands
|
||||
* in the iclass section) or may have operands used as both
|
||||
* inputs and outputs (designated as "inout"). However, the C
|
||||
* and C++ languages do not provide syntax that can express
|
||||
* the in/out/inout constraints of TIE intrinsics.
|
||||
* Nevertheless, the compiler understands these constraints
|
||||
* and will check that the intrinsic functions are used
|
||||
* correctly. To improve the readability of these prototypes,
|
||||
* the "out" and "inout" parameters are marked accordingly
|
||||
* with comments.
|
||||
*/
|
||||
|
||||
extern void _TIE_xt_regwin_ENTRY(unsigned ars /*inout*/, immediate uimm12x8);
|
||||
extern void _TIE_xt_regwin_ROTW(immediate simm4);
|
||||
extern int _TIE_xt_regwin_MOVSP(int s);
|
||||
extern int _TIE_xt_regwin_L32E(const int * s, immediate o);
|
||||
extern void _TIE_xt_regwin_S32E(int t, int * s, immediate o);
|
||||
extern unsigned _TIE_xt_regwin_RSR_WINDOWBASE(void);
|
||||
extern void _TIE_xt_regwin_WSR_WINDOWBASE(unsigned t);
|
||||
extern void _TIE_xt_regwin_XSR_WINDOWBASE(unsigned t /*inout*/);
|
||||
extern unsigned _TIE_xt_regwin_RSR_WINDOWSTART(void);
|
||||
extern void _TIE_xt_regwin_WSR_WINDOWSTART(unsigned t);
|
||||
extern void _TIE_xt_regwin_XSR_WINDOWSTART(unsigned t /*inout*/);
|
||||
#define XT_ENTRY _TIE_xt_regwin_ENTRY
|
||||
#define XT_ROTW _TIE_xt_regwin_ROTW
|
||||
#define XT_MOVSP _TIE_xt_regwin_MOVSP
|
||||
#define XT_L32E _TIE_xt_regwin_L32E
|
||||
#define XT_S32E _TIE_xt_regwin_S32E
|
||||
#define XT_RSR_WINDOWBASE _TIE_xt_regwin_RSR_WINDOWBASE
|
||||
#define XT_WSR_WINDOWBASE _TIE_xt_regwin_WSR_WINDOWBASE
|
||||
#define XT_XSR_WINDOWBASE _TIE_xt_regwin_XSR_WINDOWBASE
|
||||
#define XT_RSR_WINDOWSTART _TIE_xt_regwin_RSR_WINDOWSTART
|
||||
#define XT_WSR_WINDOWSTART _TIE_xt_regwin_WSR_WINDOWSTART
|
||||
#define XT_XSR_WINDOWSTART _TIE_xt_regwin_XSR_WINDOWSTART
|
||||
|
||||
#endif /* __XCC__ */
|
||||
|
||||
#endif /* __XTENSA__ */
|
||||
|
||||
#endif /* !_XTENSA_xt_regwin_HEADER */
|
@ -1,22 +0,0 @@
|
||||
|
||||
/*
|
||||
* Customer ID=11657; Build=0x5fe96; Copyright (c) 2004-2010 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
* They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
* third parties in any manner, medium, or form, in whole or in part, without
|
||||
* the prior written consent of Tensilica Inc.
|
||||
*/
|
||||
|
||||
/* Do not modify. This is automatically generated.*/
|
||||
|
||||
#ifndef _XTENSA_xt_scmpr_h_HEADER
|
||||
#define _XTENSA_xt_scmpr_h_HEADER
|
||||
|
||||
|
||||
/* Header includes start */
|
||||
|
||||
|
||||
/* Header includes end */
|
||||
|
||||
#endif /* !_XTENSA_xt_scmpr_h_HEADER */
|
@ -1,60 +0,0 @@
|
||||
/* Definitions for the xt_sync TIE package */
|
||||
|
||||
/*
|
||||
* Customer ID=11657; Build=0x5fe96; Copyright (c) 2004-2010 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
* They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
* third parties in any manner, medium, or form, in whole or in part, without
|
||||
* the prior written consent of Tensilica Inc.
|
||||
*/
|
||||
|
||||
/* Do not modify. This is automatically generated.*/
|
||||
|
||||
#ifndef _XTENSA_xt_sync_HEADER
|
||||
#define _XTENSA_xt_sync_HEADER
|
||||
|
||||
#ifdef __XTENSA__
|
||||
#ifdef __XCC__
|
||||
|
||||
#include <xtensa/tie/xt_core.h>
|
||||
|
||||
/*
|
||||
* The following prototypes describe intrinsic functions
|
||||
* corresponding to TIE instructions. Some TIE instructions
|
||||
* may produce multiple results (designated as "out" operands
|
||||
* in the iclass section) or may have operands used as both
|
||||
* inputs and outputs (designated as "inout"). However, the C
|
||||
* and C++ languages do not provide syntax that can express
|
||||
* the in/out/inout constraints of TIE intrinsics.
|
||||
* Nevertheless, the compiler understands these constraints
|
||||
* and will check that the intrinsic functions are used
|
||||
* correctly. To improve the readability of these prototypes,
|
||||
* the "out" and "inout" parameters are marked accordingly
|
||||
* with comments.
|
||||
*/
|
||||
|
||||
extern unsigned _TIE_xt_sync_RSR_SCOMPARE1(void);
|
||||
extern void _TIE_xt_sync_WSR_SCOMPARE1(unsigned art);
|
||||
extern void _TIE_xt_sync_XSR_SCOMPARE1(unsigned art /*inout*/);
|
||||
extern unsigned _TIE_xt_sync_RSR_ATOMCTL(void);
|
||||
extern void _TIE_xt_sync_WSR_ATOMCTL(unsigned art);
|
||||
extern void _TIE_xt_sync_XSR_ATOMCTL(unsigned art /*inout*/);
|
||||
extern unsigned _TIE_xt_sync_L32AI(const unsigned * p, immediate o);
|
||||
extern void _TIE_xt_sync_S32RI(unsigned c, unsigned * p, immediate o);
|
||||
extern void _TIE_xt_sync_S32C1I(unsigned c /*inout*/, const unsigned * p, immediate o);
|
||||
#define XT_RSR_SCOMPARE1 _TIE_xt_sync_RSR_SCOMPARE1
|
||||
#define XT_WSR_SCOMPARE1 _TIE_xt_sync_WSR_SCOMPARE1
|
||||
#define XT_XSR_SCOMPARE1 _TIE_xt_sync_XSR_SCOMPARE1
|
||||
#define XT_RSR_ATOMCTL _TIE_xt_sync_RSR_ATOMCTL
|
||||
#define XT_WSR_ATOMCTL _TIE_xt_sync_WSR_ATOMCTL
|
||||
#define XT_XSR_ATOMCTL _TIE_xt_sync_XSR_ATOMCTL
|
||||
#define XT_L32AI _TIE_xt_sync_L32AI
|
||||
#define XT_S32RI _TIE_xt_sync_S32RI
|
||||
#define XT_S32C1I _TIE_xt_sync_S32C1I
|
||||
|
||||
#endif /* __XCC__ */
|
||||
|
||||
#endif /* __XTENSA__ */
|
||||
|
||||
#endif /* !_XTENSA_xt_sync_HEADER */
|
@ -1,66 +0,0 @@
|
||||
/* Definitions for the xt_timer TIE package */
|
||||
|
||||
/*
|
||||
* Customer ID=11657; Build=0x5fe96; Copyright (c) 2004-2010 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
* They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
* third parties in any manner, medium, or form, in whole or in part, without
|
||||
* the prior written consent of Tensilica Inc.
|
||||
*/
|
||||
|
||||
/* Do not modify. This is automatically generated.*/
|
||||
|
||||
#ifndef _XTENSA_xt_timer_HEADER
|
||||
#define _XTENSA_xt_timer_HEADER
|
||||
|
||||
#ifdef __XTENSA__
|
||||
#ifdef __XCC__
|
||||
|
||||
#include <xtensa/tie/xt_core.h>
|
||||
|
||||
/*
|
||||
* The following prototypes describe intrinsic functions
|
||||
* corresponding to TIE instructions. Some TIE instructions
|
||||
* may produce multiple results (designated as "out" operands
|
||||
* in the iclass section) or may have operands used as both
|
||||
* inputs and outputs (designated as "inout"). However, the C
|
||||
* and C++ languages do not provide syntax that can express
|
||||
* the in/out/inout constraints of TIE intrinsics.
|
||||
* Nevertheless, the compiler understands these constraints
|
||||
* and will check that the intrinsic functions are used
|
||||
* correctly. To improve the readability of these prototypes,
|
||||
* the "out" and "inout" parameters are marked accordingly
|
||||
* with comments.
|
||||
*/
|
||||
|
||||
extern unsigned _TIE_xt_timer_RSR_CCOUNT(void);
|
||||
extern void _TIE_xt_timer_WSR_CCOUNT(unsigned art);
|
||||
extern void _TIE_xt_timer_XSR_CCOUNT(unsigned art /*inout*/);
|
||||
extern unsigned _TIE_xt_timer_RSR_CCOMPARE0(void);
|
||||
extern void _TIE_xt_timer_WSR_CCOMPARE0(unsigned art);
|
||||
extern void _TIE_xt_timer_XSR_CCOMPARE0(unsigned art /*inout*/);
|
||||
extern unsigned _TIE_xt_timer_RSR_CCOMPARE1(void);
|
||||
extern void _TIE_xt_timer_WSR_CCOMPARE1(unsigned art);
|
||||
extern void _TIE_xt_timer_XSR_CCOMPARE1(unsigned art /*inout*/);
|
||||
extern unsigned _TIE_xt_timer_RSR_CCOMPARE2(void);
|
||||
extern void _TIE_xt_timer_WSR_CCOMPARE2(unsigned art);
|
||||
extern void _TIE_xt_timer_XSR_CCOMPARE2(unsigned art /*inout*/);
|
||||
#define XT_RSR_CCOUNT _TIE_xt_timer_RSR_CCOUNT
|
||||
#define XT_WSR_CCOUNT _TIE_xt_timer_WSR_CCOUNT
|
||||
#define XT_XSR_CCOUNT _TIE_xt_timer_XSR_CCOUNT
|
||||
#define XT_RSR_CCOMPARE0 _TIE_xt_timer_RSR_CCOMPARE0
|
||||
#define XT_WSR_CCOMPARE0 _TIE_xt_timer_WSR_CCOMPARE0
|
||||
#define XT_XSR_CCOMPARE0 _TIE_xt_timer_XSR_CCOMPARE0
|
||||
#define XT_RSR_CCOMPARE1 _TIE_xt_timer_RSR_CCOMPARE1
|
||||
#define XT_WSR_CCOMPARE1 _TIE_xt_timer_WSR_CCOMPARE1
|
||||
#define XT_XSR_CCOMPARE1 _TIE_xt_timer_XSR_CCOMPARE1
|
||||
#define XT_RSR_CCOMPARE2 _TIE_xt_timer_RSR_CCOMPARE2
|
||||
#define XT_WSR_CCOMPARE2 _TIE_xt_timer_WSR_CCOMPARE2
|
||||
#define XT_XSR_CCOMPARE2 _TIE_xt_timer_XSR_CCOMPARE2
|
||||
|
||||
#endif /* __XCC__ */
|
||||
|
||||
#endif /* __XTENSA__ */
|
||||
|
||||
#endif /* !_XTENSA_xt_timer_HEADER */
|
@ -1,44 +0,0 @@
|
||||
/* Definitions for the xt_trace TIE package */
|
||||
|
||||
/*
|
||||
* Customer ID=11657; Build=0x5fe96; Copyright (c) 2004-2010 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
* They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
* third parties in any manner, medium, or form, in whole or in part, without
|
||||
* the prior written consent of Tensilica Inc.
|
||||
*/
|
||||
|
||||
/* Do not modify. This is automatically generated.*/
|
||||
|
||||
#ifndef _XTENSA_xt_trace_HEADER
|
||||
#define _XTENSA_xt_trace_HEADER
|
||||
|
||||
#ifdef __XTENSA__
|
||||
#ifdef __XCC__
|
||||
|
||||
#include <xtensa/tie/xt_core.h>
|
||||
|
||||
/*
|
||||
* The following prototypes describe intrinsic functions
|
||||
* corresponding to TIE instructions. Some TIE instructions
|
||||
* may produce multiple results (designated as "out" operands
|
||||
* in the iclass section) or may have operands used as both
|
||||
* inputs and outputs (designated as "inout"). However, the C
|
||||
* and C++ languages do not provide syntax that can express
|
||||
* the in/out/inout constraints of TIE intrinsics.
|
||||
* Nevertheless, the compiler understands these constraints
|
||||
* and will check that the intrinsic functions are used
|
||||
* correctly. To improve the readability of these prototypes,
|
||||
* the "out" and "inout" parameters are marked accordingly
|
||||
* with comments.
|
||||
*/
|
||||
|
||||
extern void _TIE_xt_trace_WSR_MMID(unsigned art);
|
||||
#define XT_WSR_MMID _TIE_xt_trace_WSR_MMID
|
||||
|
||||
#endif /* __XCC__ */
|
||||
|
||||
#endif /* __XTENSA__ */
|
||||
|
||||
#endif /* !_XTENSA_xt_trace_HEADER */
|
@ -1,93 +0,0 @@
|
||||
/* Misc TRAX API function definitions.
|
||||
|
||||
Copyright (c) 2007-2012 Tensilica Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
|
||||
#ifndef _TRAX_API_H_
|
||||
#define _TRAX_API_H_
|
||||
|
||||
#include <xtensa-isa.h>
|
||||
#include <xtensa-params.h>
|
||||
#include "tpack.h"
|
||||
#include "traxreg.h"
|
||||
|
||||
#include "xdm-regs.h"
|
||||
|
||||
/* Flags for trax_stop(): */
|
||||
#define TRAX_STOP_HALT 0x0001 /* halt immediately, don't wait for post-stop-trigger capture */
|
||||
#define TRAX_STOP_QUIET 0x0002 /* don't display informative messages */
|
||||
|
||||
|
||||
/*
|
||||
* Describes a TRAX channel (based on tpack).
|
||||
*/
|
||||
typedef struct {
|
||||
tpack_channel chan; /* channel structure header */
|
||||
/* Per TRAX unit information: */
|
||||
int trax_version; /* TRAX_ID_VER(id), one of TRAX_VER_xxx macros */
|
||||
unsigned long trax_tram_size; /* size of trace RAM in bytes */
|
||||
int trax_erratum10; /* set if TRAX 1.0 erratum workarounds needed */
|
||||
int trax_erratum20; /* set if TRAX 2.0 erratum workaround needed (PR 22161)*/
|
||||
int trax_erratum20_size;
|
||||
int trax_has_busy; /* has trace-busy feature */
|
||||
int trax_has_atb; /* has ATB feature */
|
||||
/*FIXME: add various features: coresight regs (don't call it that), APB, ATB, TRAM, ... */
|
||||
} trax_channel;
|
||||
|
||||
|
||||
/* Prototypes: */
|
||||
|
||||
/* TRAX Protocol API: */
|
||||
extern int trax_read_register(tpack_channel *tchan, int regno, unsigned *value);
|
||||
extern int trax_write_register(tpack_channel *tchan, int regno, unsigned value);
|
||||
extern int trax_read_memory(tpack_channel *tchan, int address, int size, unsigned char *pdata);
|
||||
extern int trax_fill_memory(tpack_channel *tchan, int address, int size, tpack_u32 pattern);
|
||||
extern int trax_enumerate_devices(tpack_channel *tchan, int * buf, int * size);
|
||||
|
||||
/* TRAX Network API: */
|
||||
extern unsigned long trax_ram_size(tpack_channel *traxchan);
|
||||
extern unsigned long trax_ram_size_addr(tpack_channel *traxchan);
|
||||
extern int trax_create_tracefile(tpack_channel *traxchan, int size, unsigned char * data,
|
||||
char *filename, int hflags, const char *toolver);
|
||||
extern int trax_memaccess_safe(tpack_channel *traxchan, const char *what);
|
||||
extern int trax_start(tpack_channel *traxchan, int flags);
|
||||
extern int trax_stop(tpack_channel *traxchan, int flags);
|
||||
extern int trax_halt(tpack_channel *traxchan, int flags);
|
||||
extern int trax_save(tpack_channel *traxchan, char *filename, int flags, const char *toolver, int erratum);
|
||||
|
||||
/* TRAX Misc API (no network dependencies): */
|
||||
int trax_fixed_hw(unsigned * regs);
|
||||
extern int trax_display_id(unsigned id, const char *prefix);
|
||||
extern int trax_display_summary(unsigned id,
|
||||
unsigned status,
|
||||
unsigned control,
|
||||
unsigned address,
|
||||
unsigned delay,
|
||||
unsigned trigger,
|
||||
unsigned match,
|
||||
unsigned startaddr,
|
||||
unsigned endaddr,
|
||||
const char *prefix);
|
||||
|
||||
/* Other: */
|
||||
|
||||
#endif /* _TRAX_API_H_ */
|
||||
|
@ -1,144 +0,0 @@
|
||||
/* Definitions for Xtensa processor config info needed for TRAX.
|
||||
|
||||
Copyright (c) 2005-2011 Tensilica Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
|
||||
#ifndef TRAX_CORE_CONFIG_H
|
||||
#define TRAX_CORE_CONFIG_H
|
||||
|
||||
#include "xtensa-params.h"
|
||||
|
||||
/*
|
||||
* Vector Enumerations.
|
||||
*/
|
||||
|
||||
/* These must match the LX2.0 and later traceport spec: */
|
||||
#define VEC_NO_VECTOR 0
|
||||
#define VEC_FIRST VEC_RESET /* first valid vector */
|
||||
#define VEC_RESET 1
|
||||
#define VEC_DEBUG 2
|
||||
#define VEC_NMI 3
|
||||
#define VEC_USER 4
|
||||
#define VEC_KERNEL 5
|
||||
#define VEC_DOUBLE 6
|
||||
#define VEC_MEMERR 7
|
||||
#define VEC_RESERVED8 8
|
||||
#define VEC_RESERVED9 9
|
||||
#define VEC_WINO4 10
|
||||
#define VEC_WINU4 11
|
||||
#define VEC_WINO8 12
|
||||
#define VEC_WINU8 13
|
||||
#define VEC_WINO12 14
|
||||
#define VEC_WINU12 15
|
||||
#define VEC_INTLEVEL2 16
|
||||
#define VEC_INTLEVEL3 17
|
||||
#define VEC_INTLEVEL4 18
|
||||
#define VEC_INTLEVEL5 19
|
||||
#define VEC_INTLEVEL6 20
|
||||
/* These are internal, i.e. don't appear like this on traceport: */
|
||||
#define VEC_DEBUG_OCD 21
|
||||
#define VEC_UNKNOWN 22
|
||||
/* Enumerations 23 through 31 are also reserved, but putting */
|
||||
/* placeholders here seems wasteful and unnecessary. */
|
||||
#define VEC_COUNT 23
|
||||
|
||||
/* Other branch (change-of-PC-flow) type encodings;
|
||||
* if PC changes due to an exception or interrupt vector,
|
||||
* one of the VEC_* values above is used, otherwise
|
||||
* (or if it's unknown whether it's due to an exception/interrupt)
|
||||
* one of the following is used: */
|
||||
|
||||
#define BRANCH_IS_VEC(n) ((n) < VEC_COUNT) /* is known to be except/interrupt? */
|
||||
#define BRANCH_OR_VEC 24 /* unknown type of branch (branch/exception/interrupt/etc) */
|
||||
#define BRANCH_UNKNOWN 25 /* unknown type of branch (anything but except/interrupt) */
|
||||
#define BRANCH_UNKNOWN_ERR 26 /* like BRANCH_UNKNOWN with known error (non-branch instr) */
|
||||
#define BRANCH_LOOPBACK 28 /* zero-overhead loopback (from LEND to LBEG) */
|
||||
#define BRANCH_CONDTAKEN 29 /* conditional branch taken (or LOOP{NEZ,GTZ} loop skip) */
|
||||
#define BRANCH_JUMP 30 /* jump (unconditional branch, i.e. J or JX) */
|
||||
#define BRANCH_IS_CALL(n) (((n) & ~3) == 32) /* is a function call? */
|
||||
#define BRANCH_CALL0 32 /* non-windowed function call (CALL0, CALLX0) */
|
||||
#define BRANCH_CALL4 33 /* windowed function call (CALL4, CALLX4) */
|
||||
#define BRANCH_CALL8 34 /* windowed function call (CALL8, CALLX8) */
|
||||
#define BRANCH_CALL12 35 /* windowed function call (CALL12, CALLX12) */
|
||||
#define BRANCH_IS_RETURN(n) ((n) >= 36) /* is any kind of return? */
|
||||
#define BRANCH_IS_CALLRETURN(n) (((n) & ~1) == 36) /* is a function return? */
|
||||
#define BRANCH_RET 36 /* non-windowed function return (RET or RET.N) */
|
||||
#define BRANCH_RETW 37 /* windowed function return (RETW or RETW.N) */
|
||||
#define BRANCH_IS_EIRETURN(n) ((n) >= 38) /* is an except/inter. return? */
|
||||
#define BRANCH_RFE 38 /* RFE or RFUE */
|
||||
#define BRANCH_RFDE 39 /* RFDE */
|
||||
#define BRANCH_RFWO 40 /* RFWO */
|
||||
#define BRANCH_RFWU 41 /* RFWU */
|
||||
#define BRANCH_RFI_2 42 /* RFI 2 */
|
||||
#define BRANCH_RFI_3 43 /* RFI 3 */
|
||||
#define BRANCH_RFI_4 44 /* RFI 4 */
|
||||
#define BRANCH_RFI_5 45 /* RFI 5 */
|
||||
#define BRANCH_RFI_6 46 /* RFI 6 */
|
||||
#define BRANCH_RFI_NMI 47 /* RFI NMILEVEL */
|
||||
#define BRANCH_RFI_DEBUG 48 /* RFI DEBUGLEVEL */
|
||||
#define BRANCH_RFME 49 /* RFME */
|
||||
#define BRANCH_COUNT 50 /* (number of defined BRANCH_xxx values) */
|
||||
|
||||
|
||||
|
||||
typedef struct {
|
||||
unsigned vaddr;
|
||||
unsigned vaddr2; /* for static vectors only (reloc vectors option) */
|
||||
int is_configured;
|
||||
} trax_vector_t;
|
||||
|
||||
|
||||
/*
|
||||
* This structure describes those portion of a Tensilica processor's
|
||||
* configuration that are useful for trace.
|
||||
*/
|
||||
typedef struct {
|
||||
char ** isa_dlls;
|
||||
char * core_name; /* (XPG core name, not necessarily same as XTENSA_CORE) */
|
||||
int big_endian; /* 0 = little-endian, 1 = big-endian */
|
||||
int has_loops; /* 1 = zero overhead loops configured */
|
||||
int has_autorefill; /* 1 = TLB autorefill (MMU) configured */
|
||||
unsigned max_instr_size; /* in bytes (eg. 3, 4, 8, ...) */
|
||||
unsigned int_level_max; /* number of interrupt levels configured (without NMI) */
|
||||
int debug_level; /* debug intlevel, 0 if debug not configured */
|
||||
int nmi_level; /* NMI intlevel, 0 if NMI not configured */
|
||||
unsigned targethw_min; /* min. targeted hardware version (XTENSA_HWVERSION_<rel>) */
|
||||
unsigned targethw_max; /* max. targeted hardware version (XTENSA_HWVERSION_<rel>) */
|
||||
int reloc_vectors; /* 0 = fixed vectors, 1 = relocatable vectors */
|
||||
int statvec_select; /* 0 = stat vec base 0, 1 = stat vec base 1 (SW default) */
|
||||
int vecbase_align; /* number of bits to align VECBASE (32 - bits in VECBASE) */
|
||||
unsigned statvec_base0; /* static vector base 0 */
|
||||
unsigned statvec_base1; /* static vector base 1 */
|
||||
unsigned vecbase_reset; /* reset value of VECBASE */
|
||||
trax_vector_t vectors[VEC_COUNT]; /* all vectors... */
|
||||
} trax_core_config_t;
|
||||
|
||||
|
||||
/* Globals: */
|
||||
//extern const char * const trax_vector_short_names[/*VEC_COUNT*/]; // nobody uses this one
|
||||
extern const char * const trax_vector_names[/*VEC_COUNT*/];
|
||||
|
||||
/* Prototypes: */
|
||||
extern int trax_read_params (trax_core_config_t *c, xtensa_params p);
|
||||
extern int trax_vector_from_address(trax_core_config_t *config, unsigned long vaddr, unsigned long *vecbases);
|
||||
|
||||
#endif /* TRAX_CORE_CONFIG_H */
|
||||
|
@ -1,91 +0,0 @@
|
||||
/* This file contains functions that are hidden from the user. These are
|
||||
* protocol specific functions used to read and write TRAX registers
|
||||
* and the trace memory
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2012-2013 Tensilica Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
#ifndef _TRAX_PROTO_H
|
||||
#define _TRAX_PROTO_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Function to read register
|
||||
*
|
||||
* regno : The register number to be read (not ERI addressed)
|
||||
* data : Location where the read value is kept
|
||||
*
|
||||
* returns : 0 if successful, -1 if unsuccessful
|
||||
*/
|
||||
int trax_read_register_eri (int regno, unsigned *data);
|
||||
|
||||
/* Function to write a value into a register
|
||||
*
|
||||
* regno : The register number to be written (not ERI addressed)
|
||||
* value : The value to be written at that register location
|
||||
*
|
||||
* returns : 0 if successful, -1 if unsuccessful
|
||||
*/
|
||||
int trax_write_register_eri (int regno, unsigned value);
|
||||
|
||||
/* Function to read memory
|
||||
*
|
||||
* address : Address of the TraceRAM memory, each location has a word
|
||||
* len : Amount of memory in bytes, to be read
|
||||
* data : buffer in which the read memory is stored
|
||||
* final_address: Next address to be read in the following call to this
|
||||
* function (trace save mechanism)
|
||||
*
|
||||
* returns : 0 if successful, -1 if unsuccessful
|
||||
*/
|
||||
int trax_read_memory_eri (unsigned address, int len, int *data,
|
||||
unsigned *final_address);
|
||||
|
||||
/* Function to write a value to the memory address
|
||||
*
|
||||
* address : Address of the TraceRAM memory
|
||||
* value : The value to be written inside that location
|
||||
*
|
||||
* returns : 0 if successful, -1 if unsuccessful
|
||||
*/
|
||||
int trax_write_memory_eri (int address, unsigned value);
|
||||
|
||||
/* Function to write to a subfield of the register.
|
||||
* Called by set and show parameter functions.
|
||||
*
|
||||
* regno : Register number
|
||||
* regmask : Mask in order to toggle appropriate bits
|
||||
* value : Value to be written in the masked location
|
||||
*
|
||||
* returns : 0 if successful, -1 if unsuccessful
|
||||
*/
|
||||
int trax_write_register_field_eri (int regno, unsigned regmask,
|
||||
unsigned value);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
@ -1,63 +0,0 @@
|
||||
/* This file contains utility functions that can be used for polling TRAX
|
||||
* or executing higher level save functionality
|
||||
* It assumes that print subroutines and file I/O routines are available
|
||||
* on the system
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2012-2013 Tensilica Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef _TRAX_UTIL_H
|
||||
#define _TRAX_UTIL_H
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* User can use this function if he wants to generate a tracefile output.
|
||||
* Internally it calls trax_get_trace in a loop until it realizes that
|
||||
* the entire trace has been read.
|
||||
*
|
||||
* context : pointer to structure which contains information about the
|
||||
* current TRAX session
|
||||
* filename : user specified output trace file name. If the file does not
|
||||
* exist, it would create the new file, else would append to it
|
||||
*
|
||||
* returns : 0 if successful, -1 if unsuccessful
|
||||
*/
|
||||
int trax_save (trax_context *context, char *filename);
|
||||
|
||||
/* Displays a brief machine readable status.
|
||||
*
|
||||
* context : pointer to structure which contains information about the
|
||||
* current TRAX session
|
||||
* returns : 0 if successful, -1 if unsuccessful
|
||||
*/
|
||||
int trax_poll (trax_context *context);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
@ -1,409 +0,0 @@
|
||||
/* Header file for TRAX control Library */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2012-2013 Tensilica Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef _TRAX_H
|
||||
#define _TRAX_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define TRAX_STOP_HALT 0x0001
|
||||
#define TRAX_STOP_QUIET 0x0002
|
||||
|
||||
/* Flag values to indicate if the user wanted to reverse the pcstop
|
||||
* parameters */
|
||||
#define TRAX_PCSTOP_REVERSE 0x0001
|
||||
#define TRAX_PCSTOP_NO_REVERSE 0x0000
|
||||
|
||||
/* Indicating whether postsize should be in terms of bytes, instructions
|
||||
* or percentage of trace size captured */
|
||||
#define TRAX_POSTSIZE_BYTES 0x0000
|
||||
#define TRAX_POSTSIZE_INSTR 0x0001
|
||||
#define TRAX_POSTSIZE_PERCENT 0x0002
|
||||
|
||||
/* Size of the header inside the trace file */
|
||||
#define TRAX_HEADER_SIZE 256
|
||||
|
||||
/* Minimum size between start and end addresses */
|
||||
#define TRAX_MIN_TRACEMEM 64
|
||||
|
||||
/* For basic debugging */
|
||||
#define DEBUG 0
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
#define ffs(i) __builtin_ffs(i)
|
||||
|
||||
/* Data structures */
|
||||
|
||||
/* Represents the context of the TRAX unit and the current TRAX session.
|
||||
* To be used by set and show function calls to set and show appropriate
|
||||
* parameters of appropriate TRAX unit.
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
int trax_version; /* TRAX PC version information */
|
||||
unsigned long trax_tram_size; /* If trace RAM is present,size of it */
|
||||
int hflags; /* Flags that can be used to debug,
|
||||
print info, etc. */
|
||||
int address_read_last; /* During saving of the trace, this
|
||||
indicates the address from which
|
||||
the current trace reading must
|
||||
resume */
|
||||
unsigned long bytes_read; /* bytes read uptil now */
|
||||
unsigned long total_memlen; /* Total bytes to be read based on the
|
||||
trace collected in the trace RAM */
|
||||
bool get_trace_started; /* indicates that the first chunk of
|
||||
bytes (which include the header) has
|
||||
been read */
|
||||
} trax_context;
|
||||
|
||||
|
||||
/* -----------------------TRAX Initialization ------------------------------*/
|
||||
|
||||
/* Initializing the trax context. Reads registers and sets values for version,
|
||||
* trace RAM size, total memory length, etc. Most of the other values are
|
||||
* initialized to their default case.
|
||||
*
|
||||
* context : pointer to structure which contains information about the
|
||||
* current TRAX session
|
||||
*
|
||||
* returns : 0 if successful, -1 if unsuccessful, -2 if ram_size if
|
||||
* incorrect
|
||||
*/
|
||||
int trax_context_init_eri (trax_context *context);
|
||||
|
||||
/* -----------------Starting/Stopping TRAX session -------------------------*/
|
||||
|
||||
/* Start tracing with current parameter setting. If tracing is already in
|
||||
* progress, an error is reported. Otherwise, tracing starts and any unsaved
|
||||
* contents of the TraceRAM is discarded
|
||||
*
|
||||
* context : pointer to structure which contains information about the
|
||||
* current TRAX session
|
||||
* returns : 0 if successful, 1 if trace is already active,
|
||||
* -1 if unsuccessful
|
||||
*/
|
||||
int trax_start (trax_context *context);
|
||||
|
||||
/* This command initiates a stop trigger or halts a trace session based of the
|
||||
* value of the flag parameter passed. In case stop trigger is initiated, any
|
||||
* selected post-stop-trigger capture proceeds normally.
|
||||
* If trace capture was not in progress, or a stop was already triggered, the
|
||||
* return value indicates appropriately.
|
||||
*
|
||||
* context : pointer to structure which contains information about the
|
||||
* current TRAX session
|
||||
* flags : To differentiate between stopping trace without any
|
||||
* post-size-trigger capture (trax_halt) or with that.
|
||||
* A zero value would stop the trace based on trigger and a
|
||||
* value of one would halt it
|
||||
*
|
||||
* returns : 0 if successful, 1 if already stopped, -1 if unsuccessful
|
||||
*/
|
||||
int trax_stop_halt (trax_context *context, int flags);
|
||||
|
||||
/* Resets the TRAX parameters to their default values which would internally
|
||||
* involve resetting the TRAX registers. To invoke another trace session or
|
||||
* reset the current tracing mechanism, this function needs to be called as
|
||||
* it resets parameters of the context that deal with tracing information
|
||||
*
|
||||
* context : pointer to structure which contains information about the
|
||||
* current TRAX session
|
||||
*
|
||||
* returns : 0 if successful, -1 if unsuccessful
|
||||
*/
|
||||
int trax_reset (trax_context *context);
|
||||
|
||||
/* ---------------Set/Get several TRAX parameters --------------------------*/
|
||||
|
||||
/* Sets the start address and end address (word aligned) of the trace in the
|
||||
* TraceRAM. Care must be taken to ensure that the difference between the
|
||||
* start and the end addresses is atleast TRAX_MIN_TRACEMEM bytes. If not,
|
||||
* the values are reset to default, which is 0 for startaddr and
|
||||
* traceRAM_words -1 for endaddr
|
||||
*
|
||||
* context : pointer to structure which contains information about the
|
||||
* current TRAX session
|
||||
* startaddr : value to which the start address must be set. Can be
|
||||
* any value between 0 - (traceRAM_words - 1)
|
||||
* endaddr : value to which the end address must be set. Can be any value
|
||||
* between 0 - (traceRAM_words - 1)
|
||||
*
|
||||
* returns : 0 if successful, -1 if unsuccessful, -2 if the difference
|
||||
* between the start and end addresses is less than
|
||||
* TRAX_MIN_TRACEMEM bytes or if they are passed incorrect
|
||||
* values, -3 if memory shared option is not configured, in
|
||||
* which case, start and end addresses are set to default
|
||||
* values instead of those passed by the user
|
||||
*/
|
||||
int trax_set_ram_boundaries (trax_context *context, unsigned startaddr,
|
||||
unsigned endaddr);
|
||||
|
||||
/* Shows the start address and end address(word aligned) of the trace in the
|
||||
* TraceRAM. If incorrect, the startaddress and the endaddress values are
|
||||
* set to default, i.e. 0 for startaddr and traceRAM_words - 1 for endaddr
|
||||
*
|
||||
* context : pointer to structure which contains information about the
|
||||
* current TRAX session
|
||||
* startaddr : pointer to value which will contain the start address
|
||||
* endaddr : pointer to value which will contain the end address
|
||||
*
|
||||
* returns : 0 if successful, -1 if unsuccessful
|
||||
*
|
||||
*/
|
||||
int trax_get_ram_boundaries (trax_context *context, unsigned *startaddr,
|
||||
unsigned *endaddr);
|
||||
|
||||
/* Selects stop trigger via cross-trigger input
|
||||
*
|
||||
* context : pointer to structure which contains information about the
|
||||
* current TRAX session
|
||||
* value : 0 = off (reset value), 1 = on
|
||||
*
|
||||
* returns : 0 if successful, -1 if unsuccessful
|
||||
*/
|
||||
int trax_set_ctistop (trax_context *context, unsigned value);
|
||||
|
||||
/* Shows if stop-trigger via cross-trigger input is off or on
|
||||
*
|
||||
* context : pointer to structure which contains information about the
|
||||
* current TRAX session
|
||||
* returns : 0 if off, 1 if on, -1 if unsuccessful
|
||||
*/
|
||||
int trax_get_ctistop (trax_context *context);
|
||||
|
||||
/* Selects stop trigger via processor-trigger input
|
||||
*
|
||||
* context : pointer to structure which contains information about the
|
||||
* current TRAX session
|
||||
* value : 0 = off (reset value), 1 = on
|
||||
*
|
||||
* returns : 0 if successful, -1 if unsuccessful
|
||||
*/
|
||||
int trax_set_ptistop (trax_context *context, unsigned value);
|
||||
|
||||
/* Shows if stop trigger visa processor-trigger input is off or on
|
||||
*
|
||||
* context : pointer to structure which contains information about the
|
||||
* current TRAX session
|
||||
* returns : 0 if off, 1 if on, -1 if unsuccessful
|
||||
*/
|
||||
int trax_get_ptistop (trax_context *context);
|
||||
|
||||
/* Reports cross trigger output state
|
||||
*
|
||||
* context : pointer to structure which contains information about the
|
||||
* current TRAX session
|
||||
* returns : 0 if CTO bit is reset, 1 if CTO bit is set
|
||||
*/
|
||||
int trax_get_cto (trax_context *context);
|
||||
|
||||
/* Reports processor trigger output state
|
||||
*
|
||||
* context : pointer to structure which contains information about the
|
||||
* current TRAX session
|
||||
* returns : 0 if PTO bit is reset, 1 if PTO bit is set
|
||||
*/
|
||||
int trax_get_pto (trax_context *context);
|
||||
|
||||
/* Selects condition that asserts cross trigger output
|
||||
*
|
||||
* context : pointer to structure which contains information about the
|
||||
* current TRAX session
|
||||
* option : 0 = off(reset value)/1 = ontrig/2 = onhalt
|
||||
*
|
||||
* returns : 0 if successful, -1 if unsuccessful
|
||||
*/
|
||||
int trax_set_ctowhen (trax_context *context, int option);
|
||||
|
||||
/* Shows condition that asserted cross trigger output. It can be
|
||||
* any of: ontrig or onhalt or even off
|
||||
*
|
||||
* context : pointer to structure which contains information about the
|
||||
* current TRAX session
|
||||
*
|
||||
* returns : 0 if off, 1 if ontrig, 2 if onhalt, -1 if unsuccessful
|
||||
*/
|
||||
int trax_get_ctowhen (trax_context *context);
|
||||
|
||||
/* Selects condition that asserts processor trigger output
|
||||
*
|
||||
* context : pointer to structure which contains information about the
|
||||
* current TRAX session
|
||||
* option : 0 = off(reset value)/1 = ontrig/2 = onhalt
|
||||
*
|
||||
* returns : 0 if successful, -1 if unsuccessful
|
||||
*/
|
||||
int trax_set_ptowhen (trax_context *context, int option);
|
||||
|
||||
|
||||
/* Shows condition that asserted processor trigger output. It can be
|
||||
* any of: ontrig or onhalt or even off
|
||||
*
|
||||
* context : pointer to structure which contains information about the
|
||||
* current TRAX session
|
||||
* returns : 0 if off, 1 if ontrig, 2 if onhalt, -1 if unsuccessful
|
||||
*/
|
||||
int trax_get_ptowhen (trax_context *context);
|
||||
|
||||
/* Selects the trace synchronization message period.
|
||||
* If ATEN enabled, we cannot allow syncper to be off, set it to reset value.
|
||||
* Also, if no trace RAM, and ATEN enabled, set syncper to be reset value
|
||||
* i.e. 256. A value of 1 i.e. on indicates that internally the message
|
||||
* frequency is set to an optimal value. This option should be preferred
|
||||
* if the user is not sure what message frequency option to set for the
|
||||
* trace session.
|
||||
*
|
||||
* context : pointer to structure which contains information about the
|
||||
* current TRAX session
|
||||
* option : 0 = off, 1 = on, -1 = auto, 8, 16, 32, 64, 128,
|
||||
* 256 (reset value)
|
||||
*
|
||||
* returns : 0 if successful, -1 if unsuccessful, -2 if incorrect
|
||||
* arguments
|
||||
*/
|
||||
int trax_set_syncper (trax_context *context, int option);
|
||||
|
||||
/* Shows trace synchronization message period. Can be one of:
|
||||
* off, on, auto, 8, 16, 32, 64, 128, 256 (reset value)
|
||||
*
|
||||
* context : pointer to structure which contains information about the
|
||||
* current TRAX session
|
||||
* returns : value of sync period, 0 if off, -1 if unsuccessful
|
||||
*/
|
||||
int trax_get_syncper (trax_context *context);
|
||||
|
||||
/* Selects stop trigger via PC match. Specifies the address or
|
||||
* address range to match against program counter. Trace stops when the
|
||||
* processor executes an instruction matching the specified address
|
||||
* or range.
|
||||
*
|
||||
* context : pointer to structure which contains information about the
|
||||
* current TRAX session
|
||||
* index : indicates the number of stop trigger (currently there is
|
||||
* only one i.e. index = 0)
|
||||
* startaddress : start range of the address at which the stop trigger
|
||||
* should be activated
|
||||
* enaddress : end range of the address at which the stop trigger should
|
||||
* be activated
|
||||
* flags : If non-zero, this inverts the range. i.e. trace stops
|
||||
* when the processor executes an instruction that does not
|
||||
* match the specified address or range
|
||||
*
|
||||
* returns : 0 if successful, -1 if unsuccessful, -2 if incorrect
|
||||
* arguments (unaligned)
|
||||
*
|
||||
* Note : For the current version of TRAX library, the endaddress and
|
||||
* startaddress can differ by at most 31 bytes and the total
|
||||
* range i.e. (endaddress - startaddress + 1) has to be a power
|
||||
* of two
|
||||
*/
|
||||
int trax_set_pcstop (trax_context *context, int index, unsigned long startaddress,
|
||||
unsigned long endaddress, int flags);
|
||||
|
||||
/* Shows the stop trigger via PC match
|
||||
*
|
||||
* context : pointer to structure which contains information about the
|
||||
* current TRAX session
|
||||
* index : container of information about the number of stop triggers
|
||||
* startaddress : container of start range of stop trigger
|
||||
* endaddress : container of end range of stop trigger
|
||||
* flags : container of information whcih indicates whether the
|
||||
* pc stop range is inverted or not.
|
||||
*
|
||||
* returns : 0 if successful, -1 if unsuccessful
|
||||
*/
|
||||
int trax_get_pcstop (trax_context *context, int *index,
|
||||
unsigned long *startaddress,
|
||||
unsigned long *endaddress, int *flags);
|
||||
|
||||
/* This function is used to set the amount of trace to be captured past
|
||||
* the stop trigger.
|
||||
*
|
||||
* context : pointer to structure which contains information about the
|
||||
* current TRAX session
|
||||
* count_unit : contains the count of units (instructions or bytes) to be
|
||||
* captured post trigger. If 0, it implies that this is off
|
||||
* unit : unit of measuring the count. 0 is bytes, 1 is instructions
|
||||
* 2 is percentage of trace
|
||||
*
|
||||
* returns : 0 if successful, -1 if unsuccessful, -2 if incorrect
|
||||
* arguments
|
||||
*
|
||||
*/
|
||||
int trax_set_postsize (trax_context *context, int count_unit, int unit);
|
||||
|
||||
/* This function shows the amount of TraceRAM in terms of the number of
|
||||
* instructions or bytes, captured post the stop trigger
|
||||
*
|
||||
* context : pointer to structure which contains information about the
|
||||
* current TRAX session
|
||||
* count_unit : will contain the count of units(instructions or bytes) post
|
||||
* trigger
|
||||
* unit : will contain information about the events that are counted
|
||||
* 0 implies that the traceRAM words consumed are counted and
|
||||
* 1 implies that the target processor instructions executed and
|
||||
* excpetions/interrupts taken are counted
|
||||
*
|
||||
* returns : 0 if postsize was got successfully, -1 if unsuccessful
|
||||
*/
|
||||
int trax_get_postsize (trax_context *context, int *count_unit, int *unit);
|
||||
|
||||
/* -------------------------- TRAX save routines ---------------------------*/
|
||||
|
||||
/* This function should be called by the user to return a chunk of
|
||||
* bytes in buf. It can be a lower layer function of save, or can be
|
||||
* called by the user explicitly. If bytes_actually_read contains a 0
|
||||
* after a call to this function has been made, it implies that the entire
|
||||
* trace has been read successfully.
|
||||
*
|
||||
* context : pointer to structure which contains information about
|
||||
* the current TRAX session
|
||||
* buf : Buffer that is allocated by the user, all the trace
|
||||
* data read would be put in this buffer, which can then
|
||||
* be used to generate a tracefile.
|
||||
* The first TRAX_HEADER_SIZE of the buffer will always
|
||||
* contain the header information.
|
||||
* bytes_to_be_read : Indicates the bytes the user wants to read. The first
|
||||
* invocation would need this parameter to be
|
||||
* TRAX_HEADER_SIZE at least.
|
||||
*
|
||||
* returns : bytes actually read during the call to this function.
|
||||
* 0 implies that all the bytes in the trace have been
|
||||
* read, -1 if unsuccessful read/write of
|
||||
* registers or memory, -2 if trace was active while
|
||||
* this function was called, -3 if user enters
|
||||
* bytes_to_be_read < TRAX_HEADER_SIZE in the first
|
||||
* pass
|
||||
*/
|
||||
int trax_get_trace (trax_context *context, void *buf,
|
||||
int bytes_to_be_read);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _TRAX_H */
|
@ -1,62 +0,0 @@
|
||||
/* TRAX file header definition.
|
||||
|
||||
Copyright (c) 2007-2012 Tensilica Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
|
||||
|
||||
#define TRAX_FHEAD_MAGIC "TRAXdmp"
|
||||
#define TRAX_FHEAD_VERSION 1
|
||||
|
||||
/* Header flags: */
|
||||
#define TRAX_FHEADF_OCD_ENABLED 0x00000001 /* set if OCD was enabled while capturing trace */
|
||||
#define TRAX_FHEADF_TESTDUMP 0x00000002 /* set if is a test file
|
||||
(from 'memsave' instead of 'save') */
|
||||
#define TRAX_FHEADF_OCD_ENABLED_WHILE_EXIT 0x00000004 /* set if OCD was enabled while capturing trace and
|
||||
we were exiting the OCD mode */
|
||||
|
||||
/* Header at the start of a TRAX dump file. */
|
||||
typedef struct {
|
||||
char magic[8]; /* 00: "TRAXdmp\0" (TRAX_FHEAD_MAGIC) */
|
||||
char endianness; /* 08: 0=little-endian, 1=big-endian */
|
||||
char version; /* 09: TRAX_FHEAD_VERSION */
|
||||
char reserved0[2]; /* 0A: ... */
|
||||
unsigned filesize; /* 0C: size of the trace file, including this header */
|
||||
unsigned trace_ofs; /* 10: start of trace output, byte offset from start of header */
|
||||
unsigned trace_size; /* 14: size of trace output in bytes */
|
||||
unsigned dumptime; /* 18: date/time of capture save (secs since 1970-01-01), 0 if unknown */
|
||||
unsigned flags; /* 1C: misc flags (TRAX_FHEAD_F_xxx) */
|
||||
char username[16]; /* 20: user doing the capture/save (up to 15 chars) */
|
||||
char toolver[24]; /* 30: tool + version used for capture/save (up to 23 chars) */
|
||||
char reserved2[40]; /* 48: (reserved - could be hostname used for dump (up to 39 chars)) */
|
||||
unsigned configid[2]; /* 70: processor ConfigID values, 0 if unknown */
|
||||
unsigned ts_freq; /* 78: timestamp frequency, 0 if not specified */
|
||||
unsigned reserved3; /* 7C: (reserved) */
|
||||
unsigned id; /* 80: TRAX registers at time of save (0 if not read) */
|
||||
unsigned control;
|
||||
unsigned status;
|
||||
unsigned reserved4; /* Data register (should not be read) */
|
||||
unsigned address;
|
||||
unsigned trigger;
|
||||
unsigned match;
|
||||
unsigned delay;
|
||||
unsigned trax_regs[24]; /*100: (total size) -- dummy allocation (FIXME) */
|
||||
} trax_file_header;
|
||||
|
@ -1,69 +0,0 @@
|
||||
/*******************************************************************************
|
||||
Copyright (c) 2006-2013 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
These coded instructions, statements, and computer programs are the
|
||||
copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
third parties in any manner, medium, or form, in whole or in part, without
|
||||
the prior written consent of Tensilica Inc.
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
uart-16550-board.h Board-specific UART info on these boards:
|
||||
Avnet AV60 (XT-AV60)
|
||||
Avnet AV110 (XT-AV110)
|
||||
Avnet AV200 (XT-AV200)
|
||||
Xilinx ML605 (XT-ML605)
|
||||
Xilinx KC705 (XT-KC705)
|
||||
|
||||
Interface between board-independent driver and board-specific header.
|
||||
|
||||
This is used by a board-independent 16550 UART driver to obtain board-specific
|
||||
information about 1 instance of the 16550 UART on the board, such as the device
|
||||
register base address and spacing (a function of how the address lines are
|
||||
connected on the board) and the frequency of the UART clock. The driver does
|
||||
not refer directly to the board-specific header, which therefore is not
|
||||
constrained to use macro names consistent with other boards.
|
||||
|
||||
!! Must not contain any board-specific macro names (only UART specific). !!
|
||||
|
||||
Included at compile-time via an include path specific to the board.
|
||||
|
||||
These boards contain a single 16550 UART implemented on the FPGA.
|
||||
Their clock frequency comes from the board's core clock (not its own crystal)
|
||||
which depends on the core config so is not a constant. Obtained via the BSP.
|
||||
|
||||
*******************************************************************************/
|
||||
|
||||
#ifndef _UART_16550_BOARD_H
|
||||
#define _UART_16550_BOARD_H
|
||||
|
||||
#include <xtensa/xtbsp.h> /* BSP API */
|
||||
#include <xtensa/board.h> /* Board info */
|
||||
|
||||
|
||||
/* Base address of UART's registers. */
|
||||
#ifdef UART16550_VADDR
|
||||
#define UART_16550_REGBASE UART16550_VADDR
|
||||
#endif
|
||||
|
||||
/*
|
||||
The UART's registers are connected at word addresses on these boards.
|
||||
Each byte-wide register appears as the least-significant-byte (LSB) of the
|
||||
word regardless of the endianness of the processor.
|
||||
*/
|
||||
#define UART_16550_REGSPACING 4
|
||||
typedef unsigned uart16550_reg_t;
|
||||
|
||||
/* UART Clock Frequency in Hz */
|
||||
#define UART_16550_XTAL_FREQ xtbsp_clock_freq_hz()
|
||||
|
||||
/* UART Interrupt Number */
|
||||
#ifdef UART16550_INTNUM
|
||||
#define UART_16550_INTNUM UART16550_INTNUM
|
||||
#endif
|
||||
|
||||
|
||||
/* Include generic information shared by all boards that use this device. */
|
||||
#include <xtensa/uart-16550.h>
|
||||
|
||||
#endif /* _UART_16550_BOARD_H */
|
||||
|
@ -1,152 +0,0 @@
|
||||
/*******************************************************************************
|
||||
|
||||
Copyright (c) 2006-2007 Tensilica Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
uart-16550.h Generic definitions for National Semiconductor 16550 UART
|
||||
|
||||
This is used by board-support-packages with one or more 16550 compatible UARTs.
|
||||
A BSP provides a base address for each instance of a 16550 UART on the board.
|
||||
|
||||
Note that a 16552 DUART (Dual UART) is simply two instances of a 16550 UART.
|
||||
|
||||
*******************************************************************************/
|
||||
|
||||
#ifndef _UART_16550_H_
|
||||
#define _UART_16550_H_
|
||||
|
||||
/* C interface to UART registers. */
|
||||
struct uart_dev_s {
|
||||
union {
|
||||
uart16550_reg_t rxb; /* DLAB=0: receive buffer, read-only */
|
||||
uart16550_reg_t txb; /* DLAB=0: transmit buffer, write-only */
|
||||
uart16550_reg_t dll; /* DLAB=1: divisor, LS byte latch */
|
||||
} w0;
|
||||
union {
|
||||
uart16550_reg_t ier; /* DLAB=0: interrupt-enable register */
|
||||
uart16550_reg_t dlm; /* DLAB=1: divisor, MS byte latch */
|
||||
} w1;
|
||||
|
||||
union {
|
||||
uart16550_reg_t isr; /* DLAB=0: interrupt status register, read-only */
|
||||
uart16550_reg_t fcr; /* DLAB=0: FIFO control register, write-only */
|
||||
uart16550_reg_t afr; /* DLAB=1: alternate function register */
|
||||
} w2;
|
||||
|
||||
uart16550_reg_t lcr; /* line control-register, write-only */
|
||||
uart16550_reg_t mcr; /* modem control-regsiter, write-only */
|
||||
uart16550_reg_t lsr; /* line status register, read-only */
|
||||
uart16550_reg_t msr; /* modem status register, read-only */
|
||||
uart16550_reg_t scr; /* scratch regsiter, read/write */
|
||||
};
|
||||
|
||||
|
||||
#define _RXB(u) ((u)->w0.rxb)
|
||||
#define _TXB(u) ((u)->w0.txb)
|
||||
#define _DLL(u) ((u)->w0.dll)
|
||||
#define _IER(u) ((u)->w1.ier)
|
||||
#define _DLM(u) ((u)->w1.dlm)
|
||||
#define _ISR(u) ((u)->w2.isr)
|
||||
#define _FCR(u) ((u)->w2.fcr)
|
||||
#define _AFR(u) ((u)->w2.afr)
|
||||
#define _LCR(u) ((u)->lcr)
|
||||
#define _MCR(u) ((u)->mcr)
|
||||
#define _LSR(u) ((u)->lsr)
|
||||
#define _MSR(u) ((u)->msr)
|
||||
#define _SCR(u) ((u)->scr)
|
||||
|
||||
typedef volatile struct uart_dev_s uart_dev_t;
|
||||
|
||||
/* IER bits */
|
||||
#define RCVR_DATA_REG_INTENABLE 0x01
|
||||
#define XMIT_HOLD_REG_INTENABLE 0x02
|
||||
#define RCVR_STATUS_INTENABLE 0x04
|
||||
#define MODEM_STATUS_INTENABLE 0x08
|
||||
|
||||
/* FCR bits */
|
||||
#define _FIFO_ENABLE 0x01
|
||||
#define RCVR_FIFO_RESET 0x02
|
||||
#define XMIT_FIFO_RESET 0x04
|
||||
#define DMA_MODE_SELECT 0x08
|
||||
#define RCVR_TRIGGER_LSB 0x40
|
||||
#define RCVR_TRIGGER_MSB 0x80
|
||||
|
||||
/* AFR bits */
|
||||
#define AFR_CONC_WRITE 0x01
|
||||
#define AFR_BAUDOUT_SEL 0x02
|
||||
#define AFR_RXRDY_SEL 0x04
|
||||
|
||||
/* ISR bits */
|
||||
#define INT_STATUS(r) ((r)&1)
|
||||
#define INT_PRIORITY(r) (((r)>>1)&0x7)
|
||||
|
||||
/* LCR bits */
|
||||
#define WORD_LENGTH(n) (((n)-5)&0x3)
|
||||
#define STOP_BIT_ENABLE 0x04
|
||||
#define PARITY_ENABLE 0x08
|
||||
#define EVEN_PARITY 0x10
|
||||
#define FORCE_PARITY 0x20
|
||||
#define XMIT_BREAK 0x40
|
||||
#define DLAB_ENABLE 0x80
|
||||
|
||||
/* MCR bits */
|
||||
#define _DTR 0x01
|
||||
#define _RTS 0x02
|
||||
#define _OP1 0x04
|
||||
#define _OP2 0x08
|
||||
#define LOOP_BACK 0x10
|
||||
|
||||
/* LSR Bits */
|
||||
#define RCVR_DATA_READY 0x01
|
||||
#define OVERRUN_ERROR 0x02
|
||||
#define PARITY_ERROR 0x04
|
||||
#define FRAMING_ERROR 0x08
|
||||
#define BREAK_INTERRUPT 0x10
|
||||
#define XMIT_HOLD_EMPTY 0x20
|
||||
#define XMIT_EMPTY 0x40
|
||||
#define FIFO_ERROR 0x80
|
||||
#define RCVR_READY(u) (_LSR(u)&RCVR_DATA_READY)
|
||||
#define XMIT_READY(u) (_LSR(u)&XMIT_HOLD_EMPTY)
|
||||
|
||||
/* MSR bits */
|
||||
#define _RDR 0x01
|
||||
#define DELTA_DSR 0x02
|
||||
#define DELTA_RI 0x04
|
||||
#define DELTA_CD 0x08
|
||||
#define _CTS 0x10
|
||||
#define _DSR 0x20
|
||||
#define _RI 0x40
|
||||
#define _CD 0x80
|
||||
|
||||
|
||||
/* Compute 16-bit divisor for baudrate generator, with rounding: */
|
||||
#define UART_DIVISOR(clock,baud) (((clock)/16 + (baud)/2)/(baud))
|
||||
|
||||
/* Prototypes of driver functions */
|
||||
extern void uart16550_init( uart_dev_t *u, unsigned baud, unsigned ndata,
|
||||
unsigned parity, unsigned nstop );
|
||||
extern void uart16550_out( uart_dev_t *u, char c );
|
||||
extern char uart16550_in( uart_dev_t *u );
|
||||
extern unsigned uart16550_measure_sys_clk( uart_dev_t *u );
|
||||
|
||||
#endif /* _UART_16550_H_ */
|
@ -1,276 +0,0 @@
|
||||
/* Customer ID=11656; Build=0x5f626; Copyright (c) 2005-2014 by Cadence Design Systems, Inc. ALL RIGHTS RESERVED.
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* copyrighted works and confidential proprietary information of
|
||||
* Cadence Design Systems, Inc. They may not be modified, copied, reproduced,
|
||||
* distributed, or disclosed to third parties in any manner, medium, or form,
|
||||
* in whole or in part, without the prior written consent of Cadence Design
|
||||
* Systems Inc.
|
||||
*/
|
||||
#ifndef __UDMA_H__
|
||||
#define __UDMA_H__
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Size of the uDMA descriptor */
|
||||
#define UDMA_DESC_STRUCT_SIZE 32
|
||||
|
||||
/* Request attribute is a bit vector passed to the udma functions - udma_copy,
|
||||
* udma_2d_copy, udma_add_descs.
|
||||
* Bit 0 : 1 - trigger an interrupt when done, else do nothing
|
||||
* Bit 1 : 0 - retry the failed request; abort after programmer specified
|
||||
* number of retries. Defaults to abort with no retries.
|
||||
* 1 - abort the failed request (after retries) and all pending requests
|
||||
*/
|
||||
#define UDMA_DONE_INTERRUPT 0x1
|
||||
#define UDMA_ERROR_ABORT 0x0
|
||||
#define UDMA_ERROR_ABORT_ALL 0x2
|
||||
|
||||
/* Enum representing various udma error conditions, udma status, and
|
||||
* return values
|
||||
*/
|
||||
typedef enum {
|
||||
UDMA_OK = 0,
|
||||
UDMA_ERROR_QUEUE_FULL = 1,
|
||||
UDMA_ERROR_BAD_DESC = 2,
|
||||
UDMA_ERROR_DRAM_CROSSING = 3,
|
||||
UDMA_ERROR_PIF_ADDR_BUS = 4,
|
||||
UDMA_ERROR_PIF_DATA_BUS = 5,
|
||||
UDMA_REQ_PENDING = 6,
|
||||
UDMA_REQ_DONE = 7,
|
||||
UDMA_ERROR_BAD_REQUEST = 8,
|
||||
UDMA_ERROR_INVALID_ARG = 11,
|
||||
UDMA_ERROR_INIT = 12,
|
||||
UDMA_ERROR_INTERNAL = -1
|
||||
} udma_status_t;
|
||||
|
||||
#ifndef __UDMA_INTERNAL_H__
|
||||
/* Opaque structure describing a uDMA descriptor */
|
||||
struct udma_desc_struct {
|
||||
char _[UDMA_DESC_STRUCT_SIZE];
|
||||
} __attribute__ ((aligned (UDMA_DESC_STRUCT_SIZE)));
|
||||
#endif
|
||||
|
||||
typedef struct udma_desc_struct udma_desc_t;
|
||||
|
||||
/* Initialize the udma control structure, the uDMA registers with
|
||||
* the descriptor queue addresses, and the uDMA sync and error interrupt
|
||||
* handler. This function needs to be invoked prior to using the uDMA.
|
||||
*
|
||||
* xmp_udma_sync_intr : Processor interrupt number to flag udma done
|
||||
* xmp_udma_error_intr : Processor interrupt number to flag udma error
|
||||
*
|
||||
* Returns UDMA_ERROR_INIT if there was an error during initialization else
|
||||
* returns UDMA_OK.
|
||||
*/
|
||||
extern udma_status_t
|
||||
udma_init(uint32_t xmp_udma_sync_intr, uint32_t xmp_udma_error_intr);
|
||||
|
||||
/* Performs a copy of a linear block of size bytes from the src
|
||||
* to the dest address. If the call returns UDMA_OK, status is set to
|
||||
* UDMA_REQ_PENDING or UDMA_REQ_DONE. If there is a dma error, the error code,
|
||||
* which could be one of UDMA_ERROR_BAD_DESC, UDMA_ERROR_DRAM_CROSSING,
|
||||
* UDMA_ERROR_PIF_ADDR_BUS, UDMA_ERROR_PIF_DATA_BUS is returned in the status.
|
||||
* Status is set to UDMA_REQ_DONE if the dma completes normally.
|
||||
* On completion, the callback function is invoked with the callback_data
|
||||
* and status as parameters. Note, the callback is always invoked even if
|
||||
* there is a dma error.
|
||||
*
|
||||
* src : src address of the copy
|
||||
* dest : dest address of the copy
|
||||
* size : number of bytes to copy
|
||||
* callback_data : optional data to be passed to callback_func
|
||||
* callback_func : optional callback after copy is done
|
||||
* request_attr : attribute defining how to process this request
|
||||
* (see description of the request attribute in top of udma.h)
|
||||
* status : track status of the copy; this gets also passed
|
||||
* as the second argument to the callback_func
|
||||
*
|
||||
* Returns UDMA_ERROR_QUEUE_FULL if no more requests can be added, else
|
||||
* returns UDMA_OK.
|
||||
*/
|
||||
extern udma_status_t
|
||||
udma_copy(void *dest,
|
||||
void *src,
|
||||
size_t size,
|
||||
void *callback_data,
|
||||
void (*callback_func)(void *, udma_status_t *status),
|
||||
uint32_t request_attr,
|
||||
udma_status_t *status);
|
||||
|
||||
/* Performs a copy of a 2D block of data from the src to the dest
|
||||
* address. If the call returns UDMA_OK, status is set to UDMA_REQ_PENDING or
|
||||
* UDMA_REQ_DONE. If there is a dma error, the error code,
|
||||
* which could be one of UDMA_ERROR_BAD_DESC, UDMA_ERROR_DRAM_CROSSING,
|
||||
* UDMA_ERROR_PIF_ADDR_BUS, UDMA_ERROR_PIF_DATA_BUS is returned in the status.
|
||||
* Status is set to UDMA_REQ_DONE if the dma completes normally.
|
||||
* On completion, the callback function is invoked with the callback_data
|
||||
* and status as parameters. Note, the callback is always invoked even if
|
||||
* there is a dma error.
|
||||
*
|
||||
* src : src address of the copy
|
||||
* dest : dest address of the copy
|
||||
* row_size : number of bytes per row to copy
|
||||
* num_rows : number of rows to copy
|
||||
* src_pitch : src pitch
|
||||
* dest_pitch : dest pitch
|
||||
* callback_data : optional data to be passed to callback_func
|
||||
* callback_func : optional callback after copy is done
|
||||
* request_attr : attribute defining how to process this request
|
||||
* (see description of the request attribute in top of udma.h)
|
||||
* status : track status of the copy; this gets also passed
|
||||
* as the second argument to the callback_func
|
||||
*
|
||||
* Returns UDMA_ERROR_QUEUE_FULL if no more requests can be added, else
|
||||
* returns UDMA_OK.
|
||||
*/
|
||||
extern udma_status_t
|
||||
udma_2d_copy(void *dest,
|
||||
void *src,
|
||||
size_t row_size,
|
||||
uint32_t num_rows,
|
||||
uint32_t src_pitch,
|
||||
uint32_t dest_pitch,
|
||||
void *callback_data,
|
||||
void (*callback_func)(void *, udma_status_t *status),
|
||||
uint32_t request_attr,
|
||||
udma_status_t *status);
|
||||
|
||||
/* Process requests that are done. Any callbacks associated
|
||||
* with the completed requests gets invoked. If there are any errors,
|
||||
* the error request is (and any pending request based on the request attribute)
|
||||
* cancelled and the error code is returned in the status associated with
|
||||
* all such cancelled requests. Callbacks associated with the cancelled
|
||||
* requests are also invoked. If all requests terminate normally, the status
|
||||
* of the completed requests are set to UDMA_REQ_DONE.
|
||||
*
|
||||
* Returns void
|
||||
*/
|
||||
extern void
|
||||
udma_process_requests();
|
||||
|
||||
/* Sets the udma max PIF block size
|
||||
*
|
||||
* max_block_size : max block size to be set
|
||||
*
|
||||
* Returns UDMA_ERROR_INVALID_ARG if block_size is > 3, else returns UDMA_OK
|
||||
*/
|
||||
udma_status_t
|
||||
udma_set_max_block_size(uint32_t block_size);
|
||||
|
||||
/* Sets the udma max outstanding PIF requests
|
||||
*
|
||||
* max_outstanding : max outstanding PIF requests
|
||||
*
|
||||
* Returns UDMA_ERROR_INVALID_ARG if max_outstanding is not between 1 and 16
|
||||
* else returns UDMA_OK
|
||||
*/
|
||||
udma_status_t
|
||||
udma_set_max_outstanding(uint32_t max_outstanding);
|
||||
|
||||
/* Initialize a uDMA descriptor using the copy parameters. The descriptor
|
||||
* is then queued separately using udma_add_desc
|
||||
*
|
||||
* src : src address of the copy
|
||||
* dest : dest address of the copy
|
||||
* row_size : number of bytes per row to copy
|
||||
* num_rows : number of rows to copy
|
||||
* src_pitch : src pitch
|
||||
* dest_pitch : dest pitch
|
||||
* notify_with_interrupt : If 1, interrupt when dma is done with this descriptor
|
||||
* if 0, do nothing, else undefined
|
||||
*
|
||||
* Returns void
|
||||
*/
|
||||
extern void
|
||||
udma_set_desc(void *src,
|
||||
void *dest,
|
||||
size_t row_size,
|
||||
uint32_t num_rows,
|
||||
uint32_t src_pitch,
|
||||
uint32_t dest_pitch,
|
||||
uint32_t notify_with_interrupt,
|
||||
udma_desc_t *desc);
|
||||
|
||||
/* Add multiple uDMA descriptors to the descriptor queue. If the call returns
|
||||
* UDMA_OK, the status is set to UDMA_REQ_PENDING or UDMA_REQ_DONE.
|
||||
* If there is a dma error, the error code, which could be one of
|
||||
* UDMA_ERROR_BAD_DESC, UDMA_ERROR_DRAM_CROSSING, UDMA_ERROR_PIF_ADDR_BUS,
|
||||
* UDMA_ERROR_PIF_DATA_BUS is returned in the status. Status is set
|
||||
* to UDMA_REQ_DONE, if the dma completes normally.
|
||||
* On completion, the callback function is invoked with the callback_data
|
||||
* and status as parameters. Note, the callback is always invoked even if
|
||||
* there is a dma error.
|
||||
*
|
||||
* desc : descriptors to be added
|
||||
* num_desc : number of descriptors to be added
|
||||
* callback_data : optional data to be passed to callback_func
|
||||
* callback_func : optional callback after copy is done
|
||||
* request_attr : attribute defining how to process this request
|
||||
* (see description of the request attribute in top of udma.h)
|
||||
* Note, bit 0 (for enabling interrupt) is ignored in this call.
|
||||
* To interrupt on dma completion, set the
|
||||
* notify_with_interrupt parameter when creating descriptors
|
||||
* using udma_set_desc.
|
||||
* status : track status of the copy; this gets also passed
|
||||
* as the second argument to the callback_func
|
||||
*
|
||||
* Returns UDMA_ERROR_QUEUE_FULL if no more descriptors can be added,
|
||||
* UDMA_ERROR_INVALID_ARG if num_descs == 0, else return UDMA_OK
|
||||
*/
|
||||
udma_status_t
|
||||
udma_add_descs(udma_desc_t *descs,
|
||||
uint32_t num_descs,
|
||||
void *callback_data,
|
||||
void (*callback_func)(void *, udma_status_t *status),
|
||||
uint32_t request_attr,
|
||||
udma_status_t *status);
|
||||
|
||||
/* Wait for udma copy request to complete. Could spin wait or goto waiti
|
||||
* based on the sleep_wait parameter. Once the request is done, the callback
|
||||
* associated with this request and any prior completed requests are handled.
|
||||
* Error code, if any, is returned in the status s, else s is set to
|
||||
* UDMA_REQ_DONE.
|
||||
*
|
||||
* s : status to wait for
|
||||
* sleep_wait : sleep wait if true, else spin waits
|
||||
*
|
||||
* Returns void
|
||||
*/
|
||||
extern void
|
||||
udma_wait_request(volatile udma_status_t *s, uint32_t sleep_wait);
|
||||
|
||||
/* Inlined function to set the src, dest address of the descriptor
|
||||
*
|
||||
* src : src address of the uDMA
|
||||
* dest : dest address of the uDMA
|
||||
* desc : descriptor to be modified
|
||||
*
|
||||
* Returns void
|
||||
*/
|
||||
void static inline
|
||||
udma_set_desc_addrs(void *src, void *dest, udma_desc_t *desc) {
|
||||
uint32_t *d = (uint32_t *)desc;
|
||||
*d = (uintptr_t)src;
|
||||
*(d+1) = (uintptr_t)dest;
|
||||
}
|
||||
|
||||
/* Sets the number of retries for a failed dma request
|
||||
*
|
||||
* max_retries : max number of retries
|
||||
*
|
||||
* Sets the max number of retries for a failed dma request. The default is 0,
|
||||
* i.e, no retries
|
||||
*/
|
||||
void
|
||||
udma_set_max_retries(uint32_t max_retries);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __UDMA_H__ */
|
@ -1,97 +0,0 @@
|
||||
/* xmon.h - XMON definitions
|
||||
*
|
||||
* $Id: //depot/rel/Eaglenest/Xtensa/OS/xmon/xmon.h#3 $
|
||||
*
|
||||
* Copyright (c) 2001-2013 Tensilica Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef __H_XMON
|
||||
#define __H_XMON
|
||||
|
||||
/* Default GDB packet size */
|
||||
#define GDB_PKT_SIZE 4096
|
||||
|
||||
/*XMON signals */
|
||||
#define XMON_SIGINT 2 /*target was interrupted */
|
||||
#define XMON_SIGILL 4 /*illegal instruction */
|
||||
#define XMON_SIGTRAP 5 /*general exception */
|
||||
#define XMON_SIGSEGV 11 /*page faults */
|
||||
|
||||
|
||||
/* Type of log message from XMON to the application */
|
||||
typedef enum {
|
||||
XMON_LOG,
|
||||
XMON_TRACE,
|
||||
XMON_ERR,
|
||||
XMON_APP,
|
||||
XMON_GDB
|
||||
} xmon_log_t;
|
||||
|
||||
/* Return value type for xmon_proc() (see below) */
|
||||
typedef enum {
|
||||
XMON_GDB_PEND,
|
||||
XMON_GDB_PKT,
|
||||
XMON_NOT_GDB
|
||||
} xmon_gdb_pkt_t;
|
||||
|
||||
#ifdef _cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*
|
||||
* THE FOLLOWING ROUTINES ARE USED BY USER
|
||||
*/
|
||||
extern int _xmon_init(char* gdbBuf, int gdbPktSize,
|
||||
void(*xlog)(xmon_log_t type, const char* str));
|
||||
//Initialize GDB communication and logging to the main app.
|
||||
//For the logging to work, xlog function needs to be provided.
|
||||
//gdbBuf - pointer to a buffer XMON can use to comm. with GDB
|
||||
//gdbPktSize - Size of the allocated buffer for GDB communication.
|
||||
//xlog - logger handle.
|
||||
|
||||
|
||||
extern void _xmon_close(void);
|
||||
//Main application can detach from xmon at any time
|
||||
|
||||
|
||||
extern xmon_gdb_pkt_t _xmon_proc(char);
|
||||
// Give character to XMON to check if GDB message
|
||||
// Application is supposed to accumulate all the
|
||||
// character in case the recognition fails and chars
|
||||
// have to be sent to the original handler
|
||||
// Return: XMON_GDB_PEND - send me more chars
|
||||
// XMON_GDB_PKT - GDB message confirmed, C) not
|
||||
// XMON_NOT_GDB - not GDB message
|
||||
|
||||
|
||||
/*
|
||||
* THE FOLLOWING ROUTINES NEED TO BE PROVIDED BY USER
|
||||
*/
|
||||
extern int _xmon_in(); // wait for character from GDB
|
||||
extern void _xmon_out(char); // output a character to GDB
|
||||
extern int _xmon_flush(void); // flush output characters
|
||||
|
||||
#ifdef _cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
@ -1,789 +0,0 @@
|
||||
/* Customer ID=11656; Build=0x5f626; Copyright (c) 2008-2009 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
These coded instructions, statements, and computer programs are the
|
||||
copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
third parties in any manner, medium, or form, in whole or in part, without
|
||||
the prior written consent of Tensilica Inc. */
|
||||
|
||||
#ifndef _XMP_LIBRARY_H
|
||||
#define _XMP_LIBRARY_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <xtensa/config/core-isa.h>
|
||||
#include <xtensa/config/core.h>
|
||||
#include <xtensa/tie/xt_core.h>
|
||||
#if XCHAL_HAVE_RELEASE_SYNC
|
||||
#include <xtensa/tie/xt_sync.h>
|
||||
#endif
|
||||
#if XCHAL_HAVE_EXTERN_REGS
|
||||
#include <xtensa/xtensa-xer.h>
|
||||
#endif
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "xtensa/system/mpsystem.h"
|
||||
|
||||
/*
|
||||
W A R N I N G:
|
||||
|
||||
xmp library clients should treat all data structures in this file
|
||||
as opaque. They are only public to enable users to declare them
|
||||
statically.
|
||||
*/
|
||||
|
||||
|
||||
/* -------------------------------------------------------------------------
|
||||
When using XMP on cache-incoherent systems, these macros are helpful
|
||||
to ensure that you are not reading stale data, and to ensure that
|
||||
the data you write makes it all the way back to main memory.
|
||||
*/
|
||||
|
||||
#if !XCHAL_DCACHE_IS_COHERENT
|
||||
#define XMP_WRITE_BACK_ELEMENT(x) xthal_dcache_region_writeback((void *)x, sizeof(*x))
|
||||
#define XMP_INVALIDATE_ELEMENT(x) xthal_dcache_region_invalidate((void *)x, sizeof(*x))
|
||||
#define XMP_WRITE_BACK_INVALIDATE_ELEMENT(x) xthal_dcache_region_writeback_inv((void *)x, sizeof(*x))
|
||||
#define XMP_WRITE_BACK_ARRAY(x) xthal_dcache_region_writeback((void *)x, sizeof(x))
|
||||
#define XMP_INVALIDATE_ARRAY(x) xthal_dcache_region_invalidate((void *)x, sizeof(x))
|
||||
#define XMP_WRITE_BACK_INVALIDATE_ARRAY(x) xthal_dcache_region_writeback_inv((void *)x, sizeof(x))
|
||||
#define XMP_WRITE_BACK_ARRAY_ELEMENTS(x, num_elements) xthal_dcache_region_writeback((void *)x, sizeof(*x) * num_elements)
|
||||
#define XMP_INVALIDATE_ARRAY_ELEMENTS(x, num_elements) xthal_dcache_region_invalidate((void *)x, sizeof(*x) * num_elements)
|
||||
#define XMP_WRITE_BACK_INVALIDATE_ARRAY_ELEMENTS(x, num_elements) xthal_dcache_region_writeback_inv((void *)x, sizeof(*x) * num_elements)
|
||||
#else
|
||||
#define XMP_WRITE_BACK_ELEMENT(x)
|
||||
#define XMP_INVALIDATE_ELEMENT(x)
|
||||
#define XMP_WRITE_BACK_INVALIDATE_ELEMENT(x)
|
||||
#define XMP_WRITE_BACK_ARRAY(x)
|
||||
#define XMP_INVALIDATE_ARRAY(x)
|
||||
#define XMP_WRITE_BACK_INVALIDATE_ARRAY(x)
|
||||
#define XMP_WRITE_BACK_ARRAY_ELEMENTS(x, num_elements)
|
||||
#define XMP_INVALIDATE_ARRAY_ELEMENTS(x, num_elements)
|
||||
#define XMP_WRITE_BACK_INVALIDATE_ARRAY_ELEMENTS(x, num_elements)
|
||||
#endif
|
||||
|
||||
/* -------------------------------------------------------------------------
|
||||
Initialization, error codes, constants and house-keeping
|
||||
|
||||
Every core should call xmp_init with the number of cores in the
|
||||
system.
|
||||
|
||||
xmp_init should be called before you use any global synchronization
|
||||
primitive or shared data.
|
||||
|
||||
Further, before you use a dynamically allocated synchronization
|
||||
primitives, you need to both initialize it by calling the
|
||||
xmp_*_init function, and you need to have called xmp_init, which
|
||||
sets up interrupt handlers and interrupt routing.
|
||||
|
||||
The second parameter sets the interprocessor interrupt
|
||||
routing. Passing zero instructs the library to use the default
|
||||
routing, which will be suitable for most users.
|
||||
|
||||
*/
|
||||
|
||||
extern void xmp_init (int num_cores, unsigned int interrupt_routing);
|
||||
|
||||
|
||||
/* If you want finer-grained control than that provided by xmp_init,
|
||||
you can the functions below individually--however, this is more
|
||||
inconvenient and requires greater understanding of the library's
|
||||
internals. Don't use them directly unless you have a good reason.
|
||||
*/
|
||||
|
||||
extern void xmp_unpack_shared (void);
|
||||
extern void xmp_route_interrupts (unsigned int routing);
|
||||
|
||||
#if XCHAL_HAVE_MP_INTERRUPTS
|
||||
extern void xmp_enable_ipi_interrupts (void);
|
||||
|
||||
/* Turn off certain things enabled by xmp_init */
|
||||
extern void xmp_disable_ipi_interrupts (void);
|
||||
#endif
|
||||
|
||||
extern void xmp_end (void);
|
||||
|
||||
/* Only valid after xmp_init. */
|
||||
extern int xmp_num_cores (void);
|
||||
|
||||
/* How many cycles should a core wait before rechecking a
|
||||
synchronization variable? Higher values will reduce memory
|
||||
transactions, but will also result in higher latency in returning
|
||||
from synchronization.
|
||||
*/
|
||||
extern void xmp_spin_wait_set_cycles (unsigned int limit);
|
||||
|
||||
/* If you would prefer to provide your own spin wait function,
|
||||
to go to sleep, etc. Declare a function of this type, then call
|
||||
this function. */
|
||||
typedef void (*xmp_spin_wait_function_t)(void);
|
||||
extern void xmp_spin_wait_set_function (xmp_spin_wait_function_t func);
|
||||
extern void xmp_spin(void);
|
||||
|
||||
#define XMP_NO_OWNER 0x07
|
||||
#define XMP_MUTEX_DESTROYED 0xFE
|
||||
#define XMP_ERROR_FATAL 0xFD
|
||||
|
||||
#define XMP_MAX_CORES 0x4
|
||||
|
||||
|
||||
static inline unsigned int xmp_prid (void)
|
||||
{
|
||||
#if XCHAL_HAVE_PRID
|
||||
return XT_RSR_PRID() & 0xFF;
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/* -------------------------------------------------------------------------
|
||||
Tracing
|
||||
|
||||
A core must set a trace_file if it wants any synchronization
|
||||
tracing to occur. Sharing file descriptors among cores is very
|
||||
messy, so don't do it. This, unfortunately, means that two cores
|
||||
contending for a mutex are not able to trace to the same file.
|
||||
|
||||
Any object (except the atomic integer) can have tracing off or on.
|
||||
*/
|
||||
|
||||
extern void xmp_set_trace_file (FILE * file);
|
||||
extern void xmp_trace (const char * fmt, ...);
|
||||
|
||||
|
||||
/* -------------------------------------------------------------------------
|
||||
Memory Allocation Functions.
|
||||
|
||||
These do what you would expect, only from shared memory instead of
|
||||
private memory.
|
||||
*/
|
||||
|
||||
#if XCHAL_DCACHE_IS_COHERENT
|
||||
extern void * xmp_malloc (size_t size);
|
||||
extern void * xmp_calloc (size_t nmemb, size_t size);
|
||||
extern void xmp_free (void * ptr);
|
||||
#endif
|
||||
extern void * xmp_sbrk(int size);
|
||||
|
||||
/* -------------------------------------------------------------------------
|
||||
xmp_atomic_int_t
|
||||
|
||||
The most basic synchronization primitive in the xmp library.
|
||||
Atomic ints are sharable among processors, and even interrupt
|
||||
levels on the same processor. However, their semantics are fairly
|
||||
rudimentary. All other primitives are based on these, therefore,
|
||||
changing this implementation affects all other primitives.
|
||||
|
||||
*/
|
||||
|
||||
typedef unsigned int xmp_atomic_int_t;
|
||||
|
||||
static inline xmp_atomic_int_t
|
||||
xmp_coherent_l32ai(xmp_atomic_int_t * address)
|
||||
{
|
||||
XMP_INVALIDATE_ELEMENT (address);
|
||||
return XT_L32AI(address, 0);
|
||||
}
|
||||
|
||||
static inline void
|
||||
xmp_coherent_s32ri(xmp_atomic_int_t value, xmp_atomic_int_t * address)
|
||||
{
|
||||
XT_S32RI (value, address, 0);
|
||||
XMP_WRITE_BACK_ELEMENT (address);
|
||||
}
|
||||
|
||||
#define XMP_ATOMIC_INT_INITIALIZER(value) (value)
|
||||
|
||||
/* xmp_atomic_int_init - Initialize an int prior to use
|
||||
|
||||
Nonsynchronizing, Nonblocking
|
||||
|
||||
Usage:
|
||||
value - initial value
|
||||
integer - points to an uninitialized integer
|
||||
|
||||
On exit:
|
||||
initialized to given value
|
||||
|
||||
Errors: none
|
||||
*/
|
||||
|
||||
static inline void
|
||||
xmp_atomic_int_init (xmp_atomic_int_t * integer, int value)
|
||||
{
|
||||
xmp_coherent_s32ri (value, integer);
|
||||
}
|
||||
|
||||
|
||||
/* xmp_atomic_int_value - Read the value
|
||||
|
||||
Nonsynchronizing, Nonblocking
|
||||
|
||||
Usage:
|
||||
integer - points to an int
|
||||
|
||||
Returns:
|
||||
the value
|
||||
*/
|
||||
|
||||
static inline int
|
||||
xmp_atomic_int_value (xmp_atomic_int_t * integer)
|
||||
{
|
||||
return xmp_coherent_l32ai (integer);
|
||||
}
|
||||
|
||||
|
||||
/* xmp_atomic_int_conditional_increment - Conditionally increment integer
|
||||
|
||||
Synchronizing, nonblocking
|
||||
|
||||
Usage:
|
||||
integer - points to an initialized integer
|
||||
amount - how much to increment
|
||||
prev - believed value of the integer
|
||||
eg: prev = xmp_atomic_int_value (integer);
|
||||
success = xmp_atomic_int_increment (integer, 1, prev);
|
||||
|
||||
Returns: current value of integer - user should check if it matches
|
||||
the previous value of the integer. If it does, then the update
|
||||
was successful.
|
||||
|
||||
*/
|
||||
|
||||
#define USE_ASSEMBLY_IMPLEMENTATION 0
|
||||
|
||||
static inline int
|
||||
xmp_atomic_int_conditional_increment (xmp_atomic_int_t * integer, int amount, int prev)
|
||||
{
|
||||
int val;
|
||||
int saved;
|
||||
|
||||
#if USE_ASSEMBLY_IMPLEMENTATION
|
||||
/* %0 = prev
|
||||
%1 = saved
|
||||
%2 = atomic integer pointer
|
||||
%3 = amount
|
||||
*/
|
||||
|
||||
asm volatile ("wsr.scompare1 %0\n"
|
||||
"mov %1, %0\n"
|
||||
"add %0, %0, %3\n"
|
||||
"s32c1i %0, %2, 0\n"
|
||||
: "+&a" (prev), "+&a"(saved) : "a" (integer), "a" (amount));
|
||||
|
||||
return prev;
|
||||
|
||||
#else
|
||||
|
||||
XT_WSR_SCOMPARE1 (prev);
|
||||
val = prev + amount;
|
||||
saved = val;
|
||||
XT_S32C1I (val, integer, 0);
|
||||
|
||||
return val;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/* xmp_atomic_int_increment - Increment integer
|
||||
|
||||
Synchronizing, blocking
|
||||
|
||||
Usage:
|
||||
integer - points to an initialized integer
|
||||
amount - how much to increment
|
||||
|
||||
Returns: new value of integer
|
||||
|
||||
*/
|
||||
|
||||
static inline int
|
||||
xmp_atomic_int_increment (xmp_atomic_int_t * integer, int amount)
|
||||
{
|
||||
int val;
|
||||
int saved;
|
||||
#if USE_ASSEMBLY_IMPLEMENTATION
|
||||
/* %0 = val
|
||||
%1 = saved
|
||||
%2 = atomic integer pointer
|
||||
%3 = amount
|
||||
*/
|
||||
|
||||
asm volatile ("l32ai %0, %2, 0\n"
|
||||
"1:\n"
|
||||
"wsr.scompare1 %0\n"
|
||||
"mov %1, %0\n"
|
||||
"add %0, %0, %3\n"
|
||||
"s32c1i %0, %2, 0\n"
|
||||
"bne %0, %1, 1b\n"
|
||||
: "+&a" (val), "+&a"(saved) : "a" (integer), "a" (amount));
|
||||
#else
|
||||
/* Accurately naming "val" is tricky. Sometimes it will be what we
|
||||
want to be the new value, but sometimes it contains the value
|
||||
that is currently at the location. */
|
||||
|
||||
/* Load location's current value */
|
||||
val = xmp_coherent_l32ai (integer);
|
||||
|
||||
do {
|
||||
XT_WSR_SCOMPARE1 (val);
|
||||
saved = val;
|
||||
/* Change it to what we would like to store there--"new_val" */
|
||||
val = val + amount;
|
||||
/* Possibly store new_val, but reload location's current value no
|
||||
matter what. */
|
||||
XT_S32C1I (val, integer, 0);
|
||||
if (val != saved)
|
||||
xmp_spin();
|
||||
} while (val != saved);
|
||||
|
||||
#endif
|
||||
return val + amount;
|
||||
}
|
||||
|
||||
|
||||
/* xmp_atomic_int_conditional_set - Set the value of an atomic integer
|
||||
|
||||
Synchronizing, nonblocking
|
||||
|
||||
Usage:
|
||||
integer - points to an initialized integer
|
||||
from - believed value of the integer
|
||||
eg: prev = xmp_atomic_int_value (integer);
|
||||
success = xmp_atomic_int_conditional_set (integer, 1, prev);
|
||||
to - new value
|
||||
|
||||
Returns: current value of integer - user should check if it matches
|
||||
the previous value of the integer. If it does, then the update
|
||||
was successful.
|
||||
|
||||
*/
|
||||
|
||||
static inline int
|
||||
xmp_atomic_int_conditional_set (xmp_atomic_int_t * integer, int from, int to)
|
||||
{
|
||||
int val;
|
||||
|
||||
/* Don't even try to update if the integer's value isn't what we
|
||||
think it should be. This prevents acquiring this cache-line for
|
||||
writing and therefore prevents bus transactions when various
|
||||
cores contend. */
|
||||
val = xmp_coherent_l32ai(integer);
|
||||
if (val == from) {
|
||||
XT_WSR_SCOMPARE1 (from);
|
||||
val = to;
|
||||
/* Possibly store to, but reload location's current value no
|
||||
matter what. */
|
||||
XT_S32C1I (val, integer, 0);
|
||||
}
|
||||
return val;
|
||||
}
|
||||
|
||||
|
||||
/* Macros to implement trivial spin locks. These are very primitive, but
|
||||
can be useful when you don't need the higher-overhead synchronization.
|
||||
|
||||
To use an xmp_atomic_int_t as a trivial spin lock, you should
|
||||
initialize it to zero first.
|
||||
*/
|
||||
|
||||
#define XMP_SIMPLE_SPINLOCK_ACQUIRE(atomic_int_ptr) \
|
||||
{ while (xmp_atomic_int_conditional_set (atomic_int_ptr, 0, xmp_prid() + 1) != 0) \
|
||||
xmp_spin(); }
|
||||
#define XMP_SIMPLE_SPINLOCK_RELEASE(atomic_int_ptr) \
|
||||
{ while (xmp_atomic_int_conditional_set (atomic_int_ptr, xmp_prid() + 1, 0) != xmp_prid() + 1) \
|
||||
xmp_spin(); }
|
||||
|
||||
#define XMP_SIMPLE_SPINLOCK_OWNER(atomic_int_ptr) (xmp_atomic_int_value(atomic_int_ptr) - 1)
|
||||
|
||||
|
||||
/* -------------------------------------------------------------------------
|
||||
xmp_mutex_t - An even higher-level data structure to enforce
|
||||
mutual exclusion between cores. A core which waits on a mutex might
|
||||
sleep with a waiti and be interrupted by an interrupt.
|
||||
|
||||
Mutexes can be normal or recursive. For a normal mutex, a core
|
||||
attempting to acquire a mutex it already holds will result in
|
||||
deadlock. For a recursive mutex, a core will succeed in acquiring a
|
||||
mutex it already holds, and must release it as many times as it
|
||||
acquired it.
|
||||
|
||||
Mutexes are not sharable between interrupt levels--because
|
||||
ownership is tracked by core, not thread.
|
||||
|
||||
Like all xmp data structures, an object of type xmp_mutex_t
|
||||
should be treated by the programmer as opaque. They are only
|
||||
public in this header file to allow them to be declared statically.
|
||||
|
||||
For configurations with 16-byte cache lines, this has the most
|
||||
frequently used and changed data in the first line.
|
||||
|
||||
*/
|
||||
|
||||
#if XCHAL_DCACHE_IS_COHERENT
|
||||
typedef struct xmp_mutex_t {
|
||||
xmp_atomic_int_t qlock;
|
||||
unsigned int qhead;
|
||||
unsigned int qtail;
|
||||
unsigned char queue[XMP_MAX_CORES];
|
||||
unsigned short held;
|
||||
|
||||
unsigned char owner;
|
||||
unsigned char recursive : 1;
|
||||
unsigned char trace : 1;
|
||||
unsigned char system : 1;
|
||||
unsigned char unused : 5;
|
||||
const char * name;
|
||||
} xmp_mutex_t __attribute__ ((aligned (XMP_MAX_DCACHE_LINESIZE)));
|
||||
|
||||
|
||||
#define XMP_MUTEX_INITIALIZER(name) \
|
||||
{ 0, 0, -1, {XMP_NO_OWNER, XMP_NO_OWNER, XMP_NO_OWNER, XMP_NO_OWNER}, \
|
||||
0, XMP_NO_OWNER, XMP_MUTEX_FLAG_NORMAL, 0, 0, 0, name }
|
||||
|
||||
#define XMP_RECURSIVE_MUTEX_INITIALIZER(name) \
|
||||
{ 0, 0, -1, {XMP_NO_OWNER, XMP_NO_OWNER, XMP_NO_OWNER, XMP_NO_OWNER}, \
|
||||
0, XMP_NO_OWNER, XMP_MUTEX_FLAG_RECURSIVE, 0, 0, 0, name }
|
||||
|
||||
#define XMP_MUTEX_FLAG_NORMAL 0
|
||||
#define XMP_MUTEX_FLAG_RECURSIVE 1
|
||||
|
||||
#define XMP_MUTEX_ACQUIRE_FAILED -1
|
||||
#define XMP_MUTEX_ERROR_DESTROY_OWNED -2
|
||||
#define XMP_MUTEX_ERROR_NOT_OWNED -3
|
||||
#define XMP_MUTEX_ERROR_ALREADY_OWNED -4
|
||||
|
||||
/*
|
||||
xmp_mutex_init
|
||||
|
||||
Nonsynchronizing
|
||||
Nonblocking
|
||||
|
||||
Usage:
|
||||
mutex - points to an uninitialized mutex
|
||||
name - name if you want one, NULL if not.
|
||||
recursive - use recursive semantices
|
||||
|
||||
Returns
|
||||
zero on success (always succeeds)
|
||||
|
||||
*/
|
||||
|
||||
extern int xmp_mutex_init (xmp_mutex_t * mutex,
|
||||
const char * name,
|
||||
unsigned int recursive);
|
||||
|
||||
/*
|
||||
int xmp_mutex_destroy (xmp_mutex_t * mutex);
|
||||
|
||||
Synchronizing - will fail if mutex is held by anyone -- including
|
||||
current processor
|
||||
Nonblocking
|
||||
|
||||
Usage:
|
||||
mutex - points to a mutex
|
||||
|
||||
Returns
|
||||
zero on success
|
||||
non-zero if mutex is held
|
||||
*/
|
||||
|
||||
extern int xmp_mutex_destroy (xmp_mutex_t * mutex);
|
||||
|
||||
|
||||
/*
|
||||
xmp_mutex_lock -- Synchronizing
|
||||
xmp_mutex_trylock
|
||||
|
||||
Usage:
|
||||
mutex - points to a mutex
|
||||
|
||||
Returns
|
||||
zero on success
|
||||
*/
|
||||
|
||||
extern int xmp_mutex_lock (xmp_mutex_t * mutex);
|
||||
extern int xmp_mutex_trylock (xmp_mutex_t * mutex);
|
||||
|
||||
|
||||
/*
|
||||
xmp_mutex_unlock
|
||||
|
||||
Synchronizing
|
||||
Nonblocking
|
||||
|
||||
Usage:
|
||||
mutex - points to a mutex
|
||||
|
||||
Returns
|
||||
zero on success - mutex is released
|
||||
non-zero on failure - mutex is owned by another core
|
||||
- prid of processor that does own it
|
||||
note that by the time this function
|
||||
returns, the owner of the core may
|
||||
have changed.
|
||||
*/
|
||||
|
||||
extern int xmp_mutex_unlock (xmp_mutex_t * mutex);
|
||||
|
||||
|
||||
/*
|
||||
xmp_mutex_name
|
||||
|
||||
Nonsynchronizing
|
||||
Nonblocking
|
||||
|
||||
Usage:
|
||||
mutex - points to a mutex
|
||||
|
||||
Returns the name of the given mutex, which may be NULL.
|
||||
|
||||
*/
|
||||
|
||||
const char * xmp_mutex_name (const xmp_mutex_t * mutex);
|
||||
|
||||
|
||||
/*
|
||||
xmp_mutex_trace_on
|
||||
xmp_mutex_trace_off
|
||||
|
||||
Nonsynchronizing
|
||||
Nonblocking
|
||||
|
||||
Turn off and on tracing for the mutex.
|
||||
|
||||
These functions are only present in the debug version of the library.
|
||||
*/
|
||||
|
||||
extern void xmp_mutex_trace_on (xmp_mutex_t * mutex);
|
||||
extern void xmp_mutex_trace_off (xmp_mutex_t * mutex);
|
||||
|
||||
|
||||
/* -------------------------------------------------------------------------
|
||||
xmp_condition_t
|
||||
|
||||
Condition Variables following Mesa semantics.
|
||||
|
||||
Condition variables are not sharable among interrupt levels.
|
||||
|
||||
*/
|
||||
|
||||
|
||||
typedef struct xmp_condition_t {
|
||||
unsigned int qhead;
|
||||
unsigned int qtail;
|
||||
unsigned char queue[XMP_MAX_CORES];
|
||||
unsigned int waiting[XMP_MAX_CORES];
|
||||
|
||||
unsigned char trace : 1;
|
||||
unsigned char unused : 7;
|
||||
const char * name;
|
||||
} xmp_condition_t __attribute__ ((aligned (XMP_MAX_DCACHE_LINESIZE)));
|
||||
|
||||
|
||||
#define XMP_CONDITION_INITIALIZER(name) \
|
||||
{ 0, -1, {XMP_NO_OWNER, XMP_NO_OWNER, XMP_NO_OWNER, XMP_NO_OWNER}, \
|
||||
{0, 0, 0, 0}, 0, 0, name}
|
||||
|
||||
|
||||
/* xmp_condition_init - Initialize a condition variable
|
||||
|
||||
Nonsynchronizing, Nonblocking
|
||||
|
||||
Usage:
|
||||
condition - pointer to an xmp_condition_t
|
||||
|
||||
On exit:
|
||||
condition initialized
|
||||
|
||||
Errors: none
|
||||
*/
|
||||
|
||||
extern int xmp_condition_init (xmp_condition_t * condition,
|
||||
const char * name);
|
||||
extern int xmp_condition_destroy (xmp_condition_t * condition);
|
||||
|
||||
|
||||
/* xmp_condition_wait - Wait for a condition variable
|
||||
|
||||
Synchronizing, blocking
|
||||
|
||||
Usage:
|
||||
condition - pointer to an xmp_condition_t
|
||||
mutex - pointer to an xmp_mutex_t already acquired by the calling
|
||||
process
|
||||
|
||||
Errors: if the mutex isn't held by this core
|
||||
*/
|
||||
|
||||
extern int xmp_condition_wait (xmp_condition_t * condition,
|
||||
xmp_mutex_t * mutex);
|
||||
|
||||
/* xmp_condition_signal
|
||||
|
||||
- Signal the first (if any) core waiting on a condition variable
|
||||
|
||||
You must hold the mutex you passed to xmp_condition_wait before
|
||||
calling this function.
|
||||
|
||||
Synchronizing, nonblocking
|
||||
|
||||
Usage:
|
||||
condition - pointer to an xmp_condition_t
|
||||
|
||||
Errors: none
|
||||
*/
|
||||
|
||||
extern int xmp_condition_signal (xmp_condition_t * condition);
|
||||
|
||||
|
||||
/* xmp_condition_broadcast
|
||||
|
||||
- Signal all cores waiting on a condition variable
|
||||
|
||||
Synchronizing, nonblocking
|
||||
|
||||
You must hold the mutex you passed to xmp_condition_wait before
|
||||
calling this function.
|
||||
|
||||
Usage:
|
||||
condition - pointer to an xmp_condition_t
|
||||
|
||||
Errors: none
|
||||
*/
|
||||
|
||||
extern int xmp_condition_broadcast (xmp_condition_t * condition);
|
||||
|
||||
|
||||
static inline const char * xmp_condition_name (const xmp_condition_t * condition)
|
||||
{
|
||||
return condition->name;
|
||||
}
|
||||
|
||||
/*
|
||||
xmp_condition_trace_on
|
||||
xmp_condition_trace_off
|
||||
|
||||
Nonsynchronizing
|
||||
Nonblocking
|
||||
|
||||
Turn off and on statistics and tracing for the condition. For
|
||||
tracing you must also set a trace file for the core.
|
||||
|
||||
These functions are only present in the debug-version of the library.
|
||||
*/
|
||||
|
||||
extern void xmp_condition_trace_on (xmp_condition_t * condition);
|
||||
extern void xmp_condition_trace_off (xmp_condition_t * condition);
|
||||
|
||||
#endif /* XCHAL_DCACHE_IS_COHERENT */
|
||||
|
||||
/* -------------------------------------------------------------------------
|
||||
xmp_barrier_t
|
||||
|
||||
Classic barriers that stop any core from continuing until a
|
||||
specified number of cores reach that point. Once the barrier allows
|
||||
cores through, the barrier is reset and will stop cores from
|
||||
progressing again.
|
||||
|
||||
Barriers are not sharable among interrupt levels.
|
||||
|
||||
*/
|
||||
|
||||
|
||||
typedef struct xmp_barrier_t
|
||||
{
|
||||
xmp_atomic_int_t count;
|
||||
xmp_atomic_int_t state;
|
||||
xmp_atomic_int_t sleeping;
|
||||
unsigned short num_cores;
|
||||
unsigned short trace : 1;
|
||||
unsigned short system : 1;
|
||||
const char * name;
|
||||
} xmp_barrier_t __attribute__ ((aligned (XMP_MAX_DCACHE_LINESIZE)));
|
||||
|
||||
#define XMP_BARRIER_INITIALIZER(number, name) \
|
||||
{ 0, 0, 0, number, 0, 0, name }
|
||||
|
||||
|
||||
/* xmp_barrier_init - Initialize a barrier
|
||||
|
||||
Nonsynchronizing, Nonblocking
|
||||
|
||||
Usage:
|
||||
barrier - pointer to an xmp_barrier_t
|
||||
num_cores - number of cores needed to arrive at the
|
||||
barrier before any are allowed through
|
||||
On exit:
|
||||
barrier initialized
|
||||
|
||||
Always returns zero.
|
||||
|
||||
Errors: none
|
||||
*/
|
||||
|
||||
extern int xmp_barrier_init (xmp_barrier_t * barrier, int num_cores,
|
||||
const char * name);
|
||||
|
||||
|
||||
/* xmp_barrier_wait - Wait on a barrier
|
||||
|
||||
Nonsynchronizing, Nonblocking
|
||||
|
||||
Usage:
|
||||
barrier - pointer to an xmp_barrier_t
|
||||
On exit:
|
||||
Enough cores (as determined at the barrier's initialization)
|
||||
have reached the barrier.
|
||||
|
||||
Errors: none
|
||||
*/
|
||||
|
||||
extern int xmp_barrier_wait (xmp_barrier_t * barrier);
|
||||
|
||||
|
||||
static inline const char * xmp_barrier_name (const xmp_barrier_t * barrier)
|
||||
{
|
||||
return barrier->name;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
xmp_barrier_trace_on
|
||||
xmp_barrier_trace_off
|
||||
|
||||
Nonsynchronizing
|
||||
Nonblocking
|
||||
|
||||
Turn on and off tracing for the barrier. For
|
||||
tracing you must also set a trace file for the core.
|
||||
|
||||
These functions are only present in the debug-version of the library.
|
||||
*/
|
||||
|
||||
extern void xmp_barrier_trace_on (xmp_barrier_t * barrier);
|
||||
extern void xmp_barrier_trace_off (xmp_barrier_t * barrier);
|
||||
|
||||
|
||||
/* -------------------------------------------------------------------------
|
||||
Portions of the library that are internal, but belong here for
|
||||
convenience.
|
||||
*/
|
||||
|
||||
extern xmp_atomic_int_t _ResetSync;
|
||||
|
||||
static inline void
|
||||
xmp_initial_sync (int num_cores)
|
||||
{
|
||||
xmp_atomic_int_increment (&_ResetSync, 1);
|
||||
while (xmp_coherent_l32ai (&_ResetSync) != num_cores)
|
||||
xmp_spin ();
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _XMP_LIBRARY_H */
|
@ -1,524 +0,0 @@
|
||||
/** @file */
|
||||
|
||||
// xos.h - XOS API interface and data structures visible to user code.
|
||||
|
||||
// Copyright (c) 2003-2015 Cadence Design Systems, Inc.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included
|
||||
// in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
|
||||
#ifndef __XOS_H__
|
||||
#define __XOS_H__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
#include "xos_types.h"
|
||||
|
||||
#include <xtensa/config/core.h>
|
||||
#if XCHAL_HAVE_INTERRUPTS
|
||||
#include <xtensa/tie/xt_core.h>
|
||||
#include <xtensa/tie/xt_interrupt.h>
|
||||
#endif
|
||||
|
||||
#include "xos_common.h"
|
||||
#include "xos_errors.h"
|
||||
#include "xos_regaccess.h"
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Convert x into a literal string.
|
||||
//-----------------------------------------------------------------------------
|
||||
#define _XOS_STR(x) __XOS_STR(x)
|
||||
#define __XOS_STR(x) #x
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// XOS version.
|
||||
//-----------------------------------------------------------------------------
|
||||
#define XOS_VERSION_MAJOR 1
|
||||
#define XOS_VERSION_MINOR 10
|
||||
#define XOS_VERSION_STRING "1.10" ///< XOS version string.
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Runtime error handling.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Reports a fatal error and halts XOS operation, i.e. halts the system. This
|
||||
/// function will call a user-registered error handler (if one has been set)
|
||||
/// and then halt the system. The user handler may do system-specific things
|
||||
/// such as record the error reason in nonvolatile memory etc.
|
||||
///
|
||||
/// \param errcode Error code. May be any user defined value < 0.
|
||||
/// Values >=0 are reserved for use by the system.
|
||||
///
|
||||
/// \param errmsg Optional text string describing the error.
|
||||
///
|
||||
/// \return This function does not return.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
void
|
||||
xos_fatal_error(int32_t errcode, const char * errmsg);
|
||||
|
||||
|
||||
#if XOS_DEBUG
|
||||
|
||||
// Do not call directly.
|
||||
void
|
||||
xos_assert(const char * file, int32_t line);
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Check condition and fail if condition expression is false.
|
||||
/// In debug builds, an assertion failure will cause a fatal error to be
|
||||
/// reported. In non-debug builds, assertions are compiled out.
|
||||
///
|
||||
/// NOTE: Remember that any code in XOS_ASSERT() statements gets compiled out
|
||||
/// for non-debug builds.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#define XOS_ASSERT(expr) if ((expr) == 0) xos_assert(__FILE__, __LINE__)
|
||||
|
||||
#else
|
||||
|
||||
#define XOS_ASSERT(expr)
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Interrupt handler function pointer type.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
typedef void (XosIntFunc)(void * arg);
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Print handler function pointer type.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
typedef int32_t (XosPrintFunc)(void * arg, const char * fmt, ...);
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Fatal error handler function pointer type.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
typedef void (XosFatalErrFunc)(int32_t errcode, const char * errmsg);
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Exception handler function pointer type.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
typedef void (XosExcHandlerFunc)(XosExcFrame * frame);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Install a user defined exception handler for the specified exception type.
|
||||
/// This will override the default XOS exception handler. The handler is a C
|
||||
/// function that is passed one parameter -- a pointer to the exception frame.
|
||||
/// The exception frame is allocated on the stack of the thread that caused the
|
||||
/// exception, and contains saved state and exception information. For details
|
||||
/// of the exception frame see the structure XosExcFrame.
|
||||
///
|
||||
/// \param exc Exception type (number) to override. The exception
|
||||
/// numbers are enumerated in <xtensa/corebits.h>.
|
||||
///
|
||||
/// \param handler Pointer to handler function to be installed.
|
||||
/// To revert to the default handler, pass NULL.
|
||||
///
|
||||
/// \return Returns a pointer to previous handler installed, if any.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
XosExcHandlerFunc *
|
||||
xos_register_exception_handler(int32_t exc, XosExcHandlerFunc * handler);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Install a user defined fatal error handler. This function will be called if
|
||||
/// a fatal error is reported either by user code or by XOS itself. It will be
|
||||
/// passed the same arguments that are passed to xos_fatal_error().
|
||||
///
|
||||
/// The handler need not return. It should make minimal assumptions about the
|
||||
/// state of the system. In particular, it should not assume that further XOS
|
||||
/// system calls will succeed.
|
||||
///
|
||||
/// \param handler Pointer to handler function to be installed.
|
||||
///
|
||||
/// \return Returns a pointer to previous handler installed, if any.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
XosFatalErrFunc *
|
||||
xos_register_fatal_error_handler(XosFatalErrFunc * handler);
|
||||
|
||||
|
||||
#ifdef _XOS_INCLUDE_INTERNAL_
|
||||
# include "xos_internal.h"
|
||||
#endif
|
||||
|
||||
|
||||
#include "xos_thread.h"
|
||||
#include "xos_timer.h"
|
||||
#include "xos_cond.h"
|
||||
#include "xos_event.h"
|
||||
#include "xos_mutex.h"
|
||||
#include "xos_msgq.h"
|
||||
#include "xos_semaphore.h"
|
||||
#include "xos_stopwatch.h"
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Register a handler function to call when interrupt "num" occurs.
|
||||
///
|
||||
/// For level-triggered and timer interrupts, the handler function will have
|
||||
/// to clear the source of the interrupt before returning, to avoid infinitely
|
||||
/// retaking the interrupt. Edge-triggered and software interrupts are
|
||||
/// automatically cleared by the OS interrupt dispatcher (see xos_handlers.S).
|
||||
///
|
||||
/// \param num Xtensa internal interrupt number (0..31). To
|
||||
/// refer to a specific external interrupt number
|
||||
/// (BInterrupt pin), use HAL macro XCHAL_EXTINTx_NUM
|
||||
/// where 'x' is the external number.
|
||||
///
|
||||
/// \param handler Pointer to handler function.
|
||||
///
|
||||
/// \param arg Argument passed to handler.
|
||||
///
|
||||
/// \return Returns XOS_OK if successful, else error code.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
int32_t
|
||||
xos_register_interrupt_handler(int32_t num, XosIntFunc * handler, void * arg);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Unregister a handler function for interrupt "num". If no handler was
|
||||
/// installed, this function will have no effect.
|
||||
///
|
||||
/// \param num Xtensa internal interrupt number (0..31). To
|
||||
/// refer to a specific external interrupt number
|
||||
/// (BInterrupt pin), use HAL macro XCHAL_EXTINTx_NUM
|
||||
/// where 'x' is the external number.
|
||||
///
|
||||
/// \return Returns XOS_OK if successful, else error code.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
int32_t
|
||||
xos_unregister_interrupt_handler(int32_t num);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Register a high priority interrupt handler for interrupt level "level".
|
||||
///
|
||||
/// Unlike low and medium priority interrupt handlers, high priority handlers
|
||||
/// are not installed for a specific interrupt number, but for an interrupt
|
||||
/// level. The level must be above XCHAL_EXCM_LEVEL. The handler function must
|
||||
/// be written in assembly since C handlers are not supported for levels above
|
||||
/// XCHAL_EXCM_LEVEL. The handler function must preserve all registers except
|
||||
/// a0, and must return to the dispatcher via a "ret" instruction, not "rfi".
|
||||
///
|
||||
/// NOTE: This method of dispatch takes a few cycles of overhead. If you wish
|
||||
/// to save even these cycles, then you can define your own dispatch function
|
||||
/// to override the built-in dispatcher. See xos_handlers.S for more details.
|
||||
///
|
||||
/// \param level The interrupt level to be handled.
|
||||
///
|
||||
/// \param handler Pointer to handler function.
|
||||
///
|
||||
/// \return Returns XOS_OK if successful, else error code.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
int32_t
|
||||
xos_register_hp_interrupt_handler(int32_t level, void * handler);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Enable a specific interrupt, by interrupt number.
|
||||
/// The state (enabled vs. disabled) of individual interrupts is global, i.e.
|
||||
/// not associated with any specific thread. Depending on system options and
|
||||
/// implementation, this state may be stored in one of two ways:
|
||||
/// - directly in the INTENABLE register, or
|
||||
/// - in a global variable (this is generally the case when INTENABLE is used
|
||||
/// not just to control what interrupts are enabled globally, but also for
|
||||
/// software interrupt prioritization within an interrupt level, effectively
|
||||
/// providing finer grained levels; in this case XOS takes care to update
|
||||
/// INTENABLE whenever either the global enabled-state variable or the
|
||||
/// per-thread fine-grained-level variable change).
|
||||
/// Thus it is best to never access the INTENABLE register directly.
|
||||
///
|
||||
/// To modify thread-specific interrupt priority level, use one of:
|
||||
/// - xos_set_int_pri_level()
|
||||
/// - xos_restore_int_pri_level()
|
||||
/// - xos_disable_interrupts()
|
||||
/// - xos_restore_interrupts()
|
||||
///
|
||||
/// NOTE: To refer to a specific external interrupt number (BInterrupt pin),
|
||||
/// use HAL macro XCHAL_EXTINTx_NUM where 'x' is the external interrupt
|
||||
/// number. For example, to enable external interrupt 3 (BInterrupt[3]),
|
||||
/// you can use:
|
||||
///
|
||||
/// xos_interrupt_enable( XCHAL_EXTINT3_NUM );
|
||||
///
|
||||
/// \param intnum Interrupt number to enable. Must range between 0-31.
|
||||
///
|
||||
/// \return Returns nothing.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
void
|
||||
xos_interrupt_enable(uint32_t intnum);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Disable a specific individual interrupt, by interrupt number.
|
||||
///
|
||||
/// This is the counterpart to xos_interrupt_enable(). See the description
|
||||
/// of xos_interrupt_enable() for further comments and notes.
|
||||
///
|
||||
/// \param intnum Interrupt number to disable. Must range between 0-31.
|
||||
///
|
||||
/// \return Returns nothing.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
void
|
||||
xos_interrupt_disable(uint32_t intnum);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Get the CPU's current interrupt priority level. Interrupts at or below this
|
||||
/// priority level are blocked.
|
||||
///
|
||||
/// \return Returns the current IPL, ranging from 0 to XCHAL_NUM_INTLEVELS.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
static inline uint32_t
|
||||
xos_get_int_pri_level(void)
|
||||
{
|
||||
#if XCHAL_HAVE_INTERRUPTS
|
||||
return XT_RSR_PS() & 0xF;
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Set the CPU's interrupt priority level to the specified level, but only if
|
||||
/// the current IPL is below the one requested. This function will never cause
|
||||
/// the interrupt priority level to be lowered from the current level.
|
||||
/// Call this function to block interrupts at or below the specified priority
|
||||
/// level.
|
||||
///
|
||||
/// When setting the IPL temporarily (such as in a critical section), call
|
||||
/// xos_set_int_pri_level(), execute the critical code section, and then call
|
||||
/// xos_restore_int_pri_level().
|
||||
///
|
||||
/// The interrupt priority level is part of the thread context, so it is saved
|
||||
/// and restored across context switches. To enable and disable individual
|
||||
/// interrupts globally, use the functions xos_interrupt_enable() and
|
||||
/// xos_interrupt_disable() instead.
|
||||
///
|
||||
/// NOTE: It is usually not required to disable interrupts at a level higher
|
||||
/// than that of the highest priority interrupt that interacts with the OS
|
||||
/// (i.e. calls into XOS such that threads may be woken / blocked /
|
||||
/// reprioritized / switched, or otherwise access XOS data structures).
|
||||
/// In XOS, that maximum level is XOS_MAX_OS_INTLEVEL, which defaults to
|
||||
/// XCHAL_EXCM_LEVEL. This may be modified by editing xos_params.h and
|
||||
/// rebuilding XOS.
|
||||
///
|
||||
/// \param level The new interrupt priority level (IPL).
|
||||
///
|
||||
/// \return Returns a value that can be used to restore the previous
|
||||
/// priority level by calling xos_restore_int_pri_level(). This
|
||||
/// value should be treated as opaque by application code, and
|
||||
/// should be passed unchanged to the restore function.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
__attribute__((always_inline))
|
||||
static inline uint32_t
|
||||
xos_set_int_pri_level(uint32_t level)
|
||||
{
|
||||
#if XCHAL_HAVE_INTERRUPTS
|
||||
#pragma no_reorder
|
||||
uint32_t ps = XT_RSR_PS();
|
||||
|
||||
if (level > (ps & 0xF)) {
|
||||
level = (ps & ~0xF) | level;
|
||||
XT_WSR_PS(level);
|
||||
XT_RSYNC();
|
||||
}
|
||||
|
||||
return ps;
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Restores the CPU to a previously saved interrupt priority level. This level
|
||||
/// must have been obtained by calling xos_set_int_pri_level().
|
||||
///
|
||||
/// \param oldval Return value from xos_set_int_pri_level().
|
||||
///
|
||||
/// \return Returns nothing.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
__attribute__((always_inline))
|
||||
static inline void
|
||||
xos_restore_int_pri_level(const uint32_t oldval)
|
||||
{
|
||||
#if XCHAL_HAVE_INTERRUPTS
|
||||
#pragma no_reorder
|
||||
XT_WSR_PS(oldval);
|
||||
XT_RSYNC();
|
||||
#else
|
||||
// Nothing
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Disable all interrupts that can interact directly with the OS. This is a
|
||||
/// convenience function, shorthand for setting the IPL to XOS_MAX_OS_INTLEVEL.
|
||||
///
|
||||
/// Returns: A value that can be used to restore the previous priority level
|
||||
/// by calling xos_restore_interrupts(). This value should be treated as
|
||||
/// opaque by application code, and should be passed unchanged to the restore
|
||||
/// function.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
static inline uint32_t
|
||||
xos_disable_interrupts(void)
|
||||
{
|
||||
return xos_set_int_pri_level(XOS_MAX_OS_INTLEVEL);
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Restore the CPU's previously saved interrupt status. This is a convenience
|
||||
/// function, the counterpart to xos_disable_interrupts().
|
||||
///
|
||||
/// \return rval Return value from xos_disable_interrupts().
|
||||
///
|
||||
/// \return Returns nothing.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
static inline void
|
||||
xos_restore_interrupts(uint32_t rval)
|
||||
{
|
||||
xos_restore_int_pri_level(rval);
|
||||
}
|
||||
|
||||
|
||||
#ifdef _XOS_INCLUDE_INTERNAL_
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Enter an OS critical section, i.e. get exclusive access to OS critical
|
||||
// state and data structures. Code that manipulates the state of OS objects
|
||||
// or modifies internal OS state must call this function first, to ensure
|
||||
// that it has exclusive access. On a single-core system, this is equivalent
|
||||
// to blocking all interrupts that can interact directly with the OS, i.e.
|
||||
// all interrupts at or below XOS_MAX_OS_INTLEVEL. In a multi-core system
|
||||
// this is likely to be implemented differently to achieve the same effect.
|
||||
//
|
||||
// Returns: A value that is to be used to restore the state of the CPU when
|
||||
// exiting the critical section. This must be treated as opaque and passed
|
||||
// unmodified to xos_critical_exit().
|
||||
//
|
||||
// NOTE: This function is meant for use in OS code, not in applications.
|
||||
//-----------------------------------------------------------------------------
|
||||
__attribute__((always_inline))
|
||||
static inline uint32_t
|
||||
xos_critical_enter(void)
|
||||
{
|
||||
#if XCHAL_HAVE_INTERRUPTS
|
||||
// This function cannot be called by high-level interrupt handlers,
|
||||
// i.e. it can never be called with intlevel > XOS_MAX_OS_INTLEVEL.
|
||||
// So, we do not need to check current intlevel because we will not
|
||||
// ever be lowering it by setting it to XOS_MAX_OS_INTLEVEL.
|
||||
// NOTE: sync after RSIL not needed.
|
||||
return XT_RSIL(XOS_MAX_OS_INTLEVEL);
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Exit an OS critical section and restore CPU state. See the documentation
|
||||
// for xos_critical_enter().
|
||||
//
|
||||
// cflags Return value from xos_critical_enter().
|
||||
// Must be treated as an opaque value.
|
||||
//
|
||||
// Returns: Nothing.
|
||||
//
|
||||
// NOTE: This function is meant for use in OS code, not in applications.
|
||||
//-----------------------------------------------------------------------------
|
||||
__attribute__((always_inline))
|
||||
static inline void
|
||||
xos_critical_exit(uint32_t cflags)
|
||||
{
|
||||
xos_restore_int_pri_level(cflags);
|
||||
}
|
||||
|
||||
#endif // _XOS_INCLUDE_INTERNAL_
|
||||
|
||||
|
||||
// This file uses things defined above
|
||||
#include "xos_syslog.h"
|
||||
|
||||
|
||||
// Misc
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Helper function to list all threads in system. Useful for debug.
|
||||
//-----------------------------------------------------------------------------
|
||||
void
|
||||
xos_display_threads(void * arg, XosPrintFunc * print_fn);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // __XOS_H__
|
||||
|
@ -1,362 +0,0 @@
|
||||
|
||||
// xos_common.h - Macros and definitions common to C and assembly code.
|
||||
|
||||
// Copyright (c) 2003-2015 Cadence Design Systems, Inc.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included
|
||||
// in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
|
||||
#ifndef __XOS_COMMON_H__
|
||||
#define __XOS_COMMON_H__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
#include <xtensa/corebits.h>
|
||||
#include <xtensa/config/system.h>
|
||||
#include <xtensa/config/tie.h>
|
||||
|
||||
#include "xos_params.h"
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Macros that help define structures for both C and assembler.
|
||||
// These are somewhat different from the XTOS version in xtruntime-frames.h.
|
||||
//-----------------------------------------------------------------------------
|
||||
#if defined(_ASMLANGUAGE) || defined(__ASSEMBLER__)
|
||||
|
||||
#define STRUCT_BEGIN .pushsection .text; .struct 0
|
||||
#define STRUCT_FIELD(ctype,size,asname,name) asname: .space size
|
||||
#define STRUCT_AFIELD(ctype,size,asname,name,n) asname: .space (size)*(n)
|
||||
#define STRUCT_END(sname) sname##Size:; .popsection
|
||||
|
||||
#else
|
||||
|
||||
#define STRUCT_BEGIN typedef struct {
|
||||
#define STRUCT_FIELD(ctype,size,asname,name) ctype name;
|
||||
#define STRUCT_AFIELD(ctype,size,asname,name,n) ctype name[n];
|
||||
#define STRUCT_END(sname) } sname;
|
||||
|
||||
#endif //_ASMLANGUAGE || __ASSEMBLER__
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Offsets relative to xos_globals.
|
||||
//-----------------------------------------------------------------------------
|
||||
#define XOS_INTLEVEL_MASK 0 // offset to the level mask
|
||||
#define XOS_INTENABLE_MASK 4 // offset to the enable mask
|
||||
#define XOS_CURR_THREADPTR 8 // offset to the current thread ptr
|
||||
#define XOS_NEXT_THREADPTR 12 // offset to the next thread ptr
|
||||
#define XOS_INTERRUPT_TABLE 16 // offset to the interrupt table
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Offsets for xos_interrupt_table[] entries.
|
||||
//-----------------------------------------------------------------------------
|
||||
#define XOS_INTTAB_HANDLER (XOS_INTERRUPT_TABLE+0) // ofs to interrupt handler
|
||||
#define XOS_INTTAB_ARG (XOS_INTERRUPT_TABLE+4) // ofs to interrupt handler arg
|
||||
#define XOS_INTTAB_PS (XOS_INTERRUPT_TABLE+8) // (hwpri) PS for interrupt level
|
||||
#define XOS_INTTAB_LEVEL (XOS_INTERRUPT_TABLE+8) // (swpri) interrupt level (1..7)
|
||||
#define XOS_INTTAB_PRI (XOS_INTERRUPT_TABLE+9) // (swpri) interrupt priority (0..255)
|
||||
#define XOS_INTTAB_PRIMASK (XOS_INTERRUPT_TABLE+12) // (swpri) mask of higher pri. interrupts
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Exception/interrupt stack frame layout for a pre-empted thread
|
||||
// tcb->resume_fn == &xos_resume_preempted_thread).
|
||||
// Pointed to by thread->esf. Located just below thread's current stack ptr.
|
||||
// Thread's a1 == thread->esf + XosExcFrameSize.
|
||||
// NOTE: exception frame size is a multiple of 16.
|
||||
//-----------------------------------------------------------------------------
|
||||
STRUCT_BEGIN
|
||||
STRUCT_AFIELD(long,4,FRAME_AREG,areg, 12) // a4-a15 (offsets 0 thru 44)
|
||||
// (a1 is computed, a0,a2-a3 are in s32e range of a1)
|
||||
//#if XCHAL_HAVE_LOOPS
|
||||
STRUCT_FIELD (long,4,FRAME_LBEG,lbeg)
|
||||
STRUCT_FIELD (long,4,FRAME_LEND,lend)
|
||||
STRUCT_FIELD (long,4,FRAME_LCOUNT,lcount)
|
||||
//#endif
|
||||
//#if XCHAL_HAVE_MAC16
|
||||
STRUCT_FIELD (long,4,FRAME_ACCLO,acclo)
|
||||
STRUCT_FIELD (char,1,FRAME_ACCHI,acchi)
|
||||
//#endif
|
||||
STRUCT_FIELD (char,1,FRAME_SAR,sar)
|
||||
STRUCT_FIELD (short,2,FRAME_PAD0,pad0) // unused
|
||||
STRUCT_FIELD (long,4,FRAME_EXCCAUSE,exccause)
|
||||
STRUCT_FIELD (long,4,FRAME_EXCVADDR,excvaddr)
|
||||
STRUCT_FIELD (long,4,FRAME_PAD1,pad1) // unused -- pad to make multiple of 16 bytes
|
||||
STRUCT_FIELD (long,4,FRAME_PAD2,pad2)
|
||||
STRUCT_FIELD (long,4,FRAME_PS,ps) // (XOS_FRAME_SIZE-44) in S32E range of end
|
||||
STRUCT_FIELD (long,4,FRAME_PC,pc) // (XOS_FRAME_SIZE-40) in S32E range of end
|
||||
STRUCT_FIELD (long,4,FRAME_A0,a0)
|
||||
STRUCT_FIELD (long,4,FRAME_A2,a2) // (XOS_FRAME_SIZE-32) in S32E range of end
|
||||
STRUCT_FIELD (long,4,FRAME_A3,a3) // (XOS_FRAME_SIZE-28) in S32E range of end
|
||||
STRUCT_FIELD (long,4,FRAME_LEVELMASK,levelmask) //
|
||||
STRUCT_FIELD (long,4,FRAME_NESTCHAIN,nestchain) // nested C function call chain ptr
|
||||
// Caller's a0-a3 save area below SP. These fields MUST be the last ones in the
|
||||
// struct so that they are guaranteed to be just under the original SP (before
|
||||
// we allocate the exception frame).
|
||||
STRUCT_AFIELD (long,4,FRAME_CWINSAVE,cwinsave, 4) // (XOS_FRAME_SIZE-16)
|
||||
STRUCT_END(XosExcFrame) // NOTE: exception frame size is 128
|
||||
|
||||
#define FRAME_AR(x) (FRAME_AREG + x*4 - 16)
|
||||
|
||||
#if defined(_ASMLANGUAGE) || defined(__ASSEMBLER__)
|
||||
#define XOS_FRAME_SIZE XosExcFrameSize
|
||||
#else
|
||||
#define XOS_FRAME_SIZE sizeof(XosExcFrame)
|
||||
#endif
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Stack frame layout for a cooperatively switched out thread
|
||||
// (tcb->resume_fn == &xos_resume_cooperative_thread).
|
||||
// Pointed to by thread->esf. This is a function frame.
|
||||
// Thread's a1 == thread->esf.
|
||||
//-----------------------------------------------------------------------------
|
||||
STRUCT_BEGIN
|
||||
STRUCT_FIELD (long,4,CFRAME_A0,a0) // return PC
|
||||
STRUCT_FIELD (long,4,CFRAME_LEVELMASK,levelmask)
|
||||
STRUCT_FIELD (long,4,CFRAME_PS,ps)
|
||||
#ifdef __XTENSA_CALL0_ABI__
|
||||
STRUCT_FIELD (long,4,CFRAME_PAD0,pad0)
|
||||
STRUCT_AFIELD(long,4,CFRAME_AREG,areg,4) // callee-saved regs a12-a15
|
||||
#endif
|
||||
STRUCT_END(XosCoopFrame)
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Offsets into thread control block (must match xos_thread.h !!)
|
||||
//-----------------------------------------------------------------------------
|
||||
#define TCB_RESUME_FN 12 // ptr to thread resume asm sequence
|
||||
#define TCB_STACK_ESF 16 // saved stack ptr (actually, ptr to ESF)
|
||||
#define TCB_TIE_SAVE 20 // ptr to TIE save area
|
||||
#define TCB_RETVALUE 24 // ptr to xos_block return value
|
||||
#define TCB_STACK_END 36 // ptr to end of stack (thread's initial stack ptr)
|
||||
#define TCB_STARTUP_ENTRY 40 // ptr to thread entry function
|
||||
#define TCB_STARTUP_ARG 44 // ptr to thread entry function's arg
|
||||
#define TCB_READY 48 // thread ready state (1 byte)
|
||||
#define TCB_CLIB_PTR 108 // thread C lib context pointer
|
||||
|
||||
#define TCB_RESUME_CCOUNT 116 // cycle count at last resume
|
||||
#define TCB_CYCLE_COUNT 120 // number of cycles consumed
|
||||
#define TCB_NORMAL_RESUMES 128 // number of cooperative/restart thread resumes
|
||||
#define TCB_PREEMPT_RESUMES 132 // number of pre-emptive thread resumes
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Coprocessor state handling:
|
||||
// The coprocessor state save area is allocated on the thread stack. The stack
|
||||
// must be sized appropriately. Threads that do not use coprocessors need not
|
||||
// allocate the storage area.
|
||||
//
|
||||
// Along with the save area for each coprocessor, two bitmasks with flags per
|
||||
// coprocessor (laid out as in the CPENABLE reg) help manage context switching
|
||||
// coprocessors as efficiently as possible:
|
||||
//
|
||||
// XT_CPENABLE
|
||||
// The contents of a non-running thread's CPENABLE register.
|
||||
// It represents the coprocessors owned (and whose state is still needed)
|
||||
// by the thread. When a thread is preempted, its CPENABLE is saved here.
|
||||
// When a thread solicits a context switch, its CPENABLE is cleared - the
|
||||
// compiler has saved the (caller-saved) coprocessor state if needed.
|
||||
// When a non-running thread loses ownership of a CP, its bit is cleared.
|
||||
// When a thread runs, it's XT_CPENABLE is loaded into the CPENABLE reg.
|
||||
// Avoids coprocessor exceptions when no change of ownership is needed.
|
||||
//
|
||||
// XT_CPSTORED
|
||||
// A bitmask with the same layout as CPENABLE, a bit per coprocessor.
|
||||
// Indicates whether the state of each coprocessor is saved in the state
|
||||
// save area. When a thread enters the kernel, only the state of coprocs
|
||||
// still enabled in CPENABLE is saved. When the coprocessor exception
|
||||
// handler assigns ownership of a coprocessor to a thread, it restores
|
||||
// the saved state only if this bit is set, and clears this bit.
|
||||
//
|
||||
// XT_CP_CS_ST
|
||||
// A bitmask with the same layout as CPENABLE, a bit per co-processor.
|
||||
// Indicates whether callee-saved state is saved in the state save area.
|
||||
// Callee-saved state is saved by itself on a solicited context switch,
|
||||
// and restored when needed by the coprocessor exception handler.
|
||||
// Unsolicited switches will cause the entire coprocessor to be saved
|
||||
// when necessary.
|
||||
//
|
||||
// XT_NCP_ASA
|
||||
// Pointer to aligned save area for non-CP state. This is always filled
|
||||
// in, even if there is no non-CP state to be saved. If there is no state
|
||||
// to be saved then no space is actually allocated and this pointer is
|
||||
// not used.
|
||||
//
|
||||
// XT_CP_ASA
|
||||
// Pointer to aligned save area for coprocessor state. This is filled in
|
||||
// only if coprocessor state is to be saved for the thread. Allows it to be
|
||||
// aligned more than the overall save area (which might be stack-aligned
|
||||
// or TCB-aligned). Especially relevant for Xtensa cores configured with a
|
||||
// very large data path that requires alignment greater than 16 bytes (ABI
|
||||
// stack alignment).
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#define ALIGNUP(n, val) (((val) + (n)-1) & -(n))
|
||||
|
||||
// Offsets of each coprocessor save area within the 'aligned save area'.
|
||||
// The non-CP TIE state save area is at offset 0, so that it does not
|
||||
// move around if some or all coprocessors are not to be saved.
|
||||
|
||||
#define XT_NCP_SA 0
|
||||
#define XT_CP0_SA ALIGNUP(XCHAL_CP0_SA_ALIGN, XT_NCP_SA + XCHAL_NCP_SA_SIZE)
|
||||
#define XT_CP1_SA ALIGNUP(XCHAL_CP1_SA_ALIGN, XT_CP0_SA + XCHAL_CP0_SA_SIZE)
|
||||
#define XT_CP2_SA ALIGNUP(XCHAL_CP2_SA_ALIGN, XT_CP1_SA + XCHAL_CP1_SA_SIZE)
|
||||
#define XT_CP3_SA ALIGNUP(XCHAL_CP3_SA_ALIGN, XT_CP2_SA + XCHAL_CP2_SA_SIZE)
|
||||
#define XT_CP4_SA ALIGNUP(XCHAL_CP4_SA_ALIGN, XT_CP3_SA + XCHAL_CP3_SA_SIZE)
|
||||
#define XT_CP5_SA ALIGNUP(XCHAL_CP5_SA_ALIGN, XT_CP4_SA + XCHAL_CP4_SA_SIZE)
|
||||
#define XT_CP6_SA ALIGNUP(XCHAL_CP6_SA_ALIGN, XT_CP5_SA + XCHAL_CP5_SA_SIZE)
|
||||
#define XT_CP7_SA ALIGNUP(XCHAL_CP7_SA_ALIGN, XT_CP6_SA + XCHAL_CP6_SA_SIZE)
|
||||
|
||||
#define XT_TOT_SA_SIZE ALIGNUP(16, XT_CP7_SA + XCHAL_CP7_SA_SIZE)
|
||||
#define XT_NCP_SA_SIZE XCHAL_NCP_SA_SIZE
|
||||
|
||||
// Offsets within the overall save area
|
||||
|
||||
#define XT_CPENABLE 0 // (2 bytes) coprocessors active for this thread
|
||||
#define XT_CPSTORED 2 // (2 bytes) coprocessors saved for this thread
|
||||
#define XT_CP_CS_ST 4 // (2 bytes) coprocessor callee-saved regs for this thread
|
||||
#define XT_NCP_ASA 8 // (4 bytes) ptr to aligned save area for nonCP state
|
||||
#define XT_CP_ASA 12 // (4 bytes) ptr to aligned save area for CP state
|
||||
|
||||
// Overall size allows for dynamic alignment, make sure multiple of 4 bytes.
|
||||
// XT_CP_SIZE - total space needed for all coprocessors + nonCP state + hdr
|
||||
// XT_NCP_SIZE - total space needed for nonCP state + hdr
|
||||
|
||||
#define XT_CP_SIZE ALIGNUP(4, (16 + XT_TOT_SA_SIZE + XCHAL_TOTAL_SA_ALIGN))
|
||||
#define XT_NCP_SIZE ALIGNUP(4, (16 + XT_NCP_SA_SIZE + XCHAL_TOTAL_SA_ALIGN))
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Stack size computation.
|
||||
//
|
||||
// XOS_STACK_MIN_SIZE
|
||||
// The minimum recommended stack size for any XOS thread. If you want to
|
||||
// use a stack size smaller than this, you will have to verify that the
|
||||
// smaller size will work under all operating conditions.
|
||||
//
|
||||
// XOS_STACK_MIN_SIZE_NO_CP
|
||||
// The minimum recommended atack size for threads that will not use any
|
||||
// coprocessor resources. No coprocessor state will be saved/restored
|
||||
// for these threads. Non-CP TIE state will still be saved/restored.
|
||||
// These threads must be created with the flag XOS_THREAD_NO_CP.
|
||||
//
|
||||
// XOS_STACK_EXTRA
|
||||
// The amount of stack space used by the system to:
|
||||
// - save coprocessor state
|
||||
// - save non-coprocessor TIE state
|
||||
// - allocate an interrupt/exception frame
|
||||
//
|
||||
// XOS_STACK_EXTRA_NO_CP
|
||||
// The amount of stack space used by the system to:
|
||||
// - save non-coprocessor TIE state
|
||||
// - allocate an interrupt/exception frame
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#define XOS_STACK_EXTRA (XOS_FRAME_SIZE + XT_CP_SIZE)
|
||||
#define XOS_STACK_EXTRA_NO_CP (XOS_FRAME_SIZE + XT_NCP_SIZE)
|
||||
|
||||
#ifdef __XTENSA_CALL0_ABI__
|
||||
#define XOS_STACK_MIN_SIZE (XOS_STACK_EXTRA + 0x180)
|
||||
#define XOS_STACK_MIN_SIZE_NO_CP (XOS_STACK_EXTRA_NO_CP + 0x180)
|
||||
#else
|
||||
#define XOS_STACK_MIN_SIZE (XOS_STACK_EXTRA + 0x200)
|
||||
#define XOS_STACK_MIN_SIZE_NO_CP (XOS_STACK_EXTRA_NO_CP + 0x200)
|
||||
#endif
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Items related to C library thread safety.
|
||||
//-----------------------------------------------------------------------------
|
||||
#if XOS_OPT_THREAD_SAFE_CLIB
|
||||
|
||||
#if XSHAL_CLIB == XTHAL_CLIB_XCLIB
|
||||
#if !defined(_ASMLANGUAGE) && !defined(__ASSEMBLER__)
|
||||
#include <sys/reent.h>
|
||||
#endif
|
||||
#define CLIB_THREAD_STRUCT struct _reent xclib_reent
|
||||
#define GLOBAL_CLIB_PTR _reent_ptr
|
||||
#elif XSHAL_CLIB == XTHAL_CLIB_NEWLIB
|
||||
#if !defined(_ASMLANGUAGE) && !defined(__ASSEMBLER__)
|
||||
#include <sys/reent.h>
|
||||
#endif
|
||||
#define CLIB_THREAD_STRUCT struct _reent newlib_reent
|
||||
#define GLOBAL_CLIB_PTR _impure_ptr
|
||||
#else
|
||||
#error The selected C runtime library is not thread safe.
|
||||
#endif
|
||||
|
||||
#endif // XOS_OPT_THREAD_SAFE_CLIB
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Check (MAX_OS_INTLEVEL,EXCM_LEVEL)
|
||||
//-----------------------------------------------------------------------------
|
||||
#if XOS_MAX_OS_INTLEVEL >= XCHAL_EXCM_LEVEL
|
||||
# define XOS_MAX_OSEXCM_LEVEL XOS_MAX_OS_INTLEVEL
|
||||
#else
|
||||
# warning "XOS_MAX_OS_INTLEVEL was set below XCHAL_EXCM_LEVEL: this was never tested"
|
||||
# define XOS_MAX_OSEXCM_LEVEL XCHAL_EXCM_LEVEL
|
||||
#endif
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Detect if in interrupt context.
|
||||
//-----------------------------------------------------------------------------
|
||||
#if XCHAL_HAVE_INTERRUPTS
|
||||
#define INTERRUPT_CONTEXT ((XT_RSR_PS() & PS_UM) == 0)
|
||||
#else
|
||||
#define INTERRUPT_CONTEXT 0
|
||||
#endif
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Xtensa tools version.
|
||||
//-----------------------------------------------------------------------------
|
||||
#if defined __XCC__
|
||||
#define XTTOOLS_VERSION (__XCC__ + __XCC_MINOR__)
|
||||
#else
|
||||
#define XTTOOLS_VERSION (0)
|
||||
#endif
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Erratum workarounds.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
// Erratum 487 fix is available in version RF.3 onwards and RG.2 onwards.
|
||||
#if ((__XCC__ == 11000) && (__XCC_MINOR__ >= 3)) || (XTTOOLS_VERSION >= 12002)
|
||||
#define HWERR_487_FIX hw_erratum_487_fix
|
||||
#else
|
||||
#define HWERR_487_FIX
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // __XOS_COMMON_H__
|
||||
|
@ -1,145 +0,0 @@
|
||||
/** @file */
|
||||
|
||||
// xos_cond.h - XOS condition variables API interface and data structures.
|
||||
|
||||
// Copyright (c) 2003-2015 Cadence Design Systems, Inc.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included
|
||||
// in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
// NOTE: Do not include this file directly in your application. Including
|
||||
// xos.h will automatically include this file.
|
||||
|
||||
#ifndef __XOS_COND_H__
|
||||
#define __XOS_COND_H__
|
||||
|
||||
#include "xos_types.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
//
|
||||
// Function pointer type for condition callbacks (defined in xos_thread.h)
|
||||
//
|
||||
// typedef int32_t (XosCondFunc)(void * arg, int32_t sig_value, XosThread * thread);
|
||||
//
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Condition object.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
typedef struct XosCond {
|
||||
XosThreadQueue queue; ///< Queue of waiters.
|
||||
#if XOS_COND_DEBUG
|
||||
uint32_t sig; // Signature indicates valid object.
|
||||
#endif
|
||||
} XosCond;
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Initialize a condition object before first use. The object must be
|
||||
/// allocated by the caller.
|
||||
///
|
||||
/// \param cond Pointer to condition object.
|
||||
///
|
||||
/// \return Returns nothing.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
void
|
||||
xos_cond_create(XosCond * cond);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Destroy a condition object. Must have been previously created by calling
|
||||
/// xos_cond_create().
|
||||
///
|
||||
/// \param cond Pointer to condition object.
|
||||
///
|
||||
/// \return Returns nothing.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
void
|
||||
xos_cond_delete(XosCond * cond);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Wait on a condition: block until the condition is satisfied. The condition
|
||||
/// is satisfied when xos_cond_signal() is called on this condition *and* the
|
||||
/// condition callback function returns non-zero. If there is no callback
|
||||
/// function, then the condition is automatically satisfied.
|
||||
///
|
||||
/// The condition structure must have been initialized before first use by
|
||||
/// calling xos_cond_create().
|
||||
///
|
||||
/// \param cond Pointer to condition object.
|
||||
///
|
||||
/// \param cond_fn Pointer to a function, called by xos_cond_signal(),
|
||||
/// that should return non-zero if this thread is to
|
||||
/// be resumed. The function is invoked as:
|
||||
/// `(*cond_fn)(cond_arg, sig_value)`.
|
||||
///
|
||||
/// \param cond_arg Argument passed to cond_fn.
|
||||
///
|
||||
/// \return Returns the value passed to xos_cond_signal().
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
int32_t
|
||||
xos_cond_wait(XosCond * cond, XosCondFunc * cond_fn, void * cond_arg);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Trigger the condition: wake all threads waiting on the condition, if their
|
||||
/// condition function evaluates to true (non-zero). If there is no condition
|
||||
/// function for a thread then it is automatically awakened.
|
||||
///
|
||||
/// The condition structure must have been initialized before first use by
|
||||
/// calling xos_cond_create().
|
||||
///
|
||||
/// \param cond Pointer to condition object.
|
||||
///
|
||||
/// \param sig_value Value passed to all waiters, returned by
|
||||
/// xos_cond_wait().
|
||||
///
|
||||
/// \return Returns the number of waiting threads that were resumed.
|
||||
///
|
||||
/// NOTE: Signaling a condition that has no waiters has no effect on it, and
|
||||
/// the signal is not remembered. Any thread that waits on it later must be
|
||||
/// woken by another call to xos_cond_signal().
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
int32_t
|
||||
xos_cond_signal(XosCond * cond, int32_t sig_value);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // __XOS_COND_H__
|
||||
|
@ -1,107 +0,0 @@
|
||||
/** @file */
|
||||
|
||||
// xos_errors.h - XOS error codes.
|
||||
|
||||
// Copyright (c) 2003-2015 Cadence Design Systems, Inc.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included
|
||||
// in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
// NOTE: Do not include this file directly in your application. Including
|
||||
// xos.h will automatically include this file.
|
||||
|
||||
|
||||
#ifndef __XOS_ERRORS_H__
|
||||
#define __XOS_ERRORS_H__
|
||||
|
||||
#include "xos_types.h"
|
||||
|
||||
|
||||
#define _XOS_ERR_FIRST (-65536)
|
||||
#define _XOS_ERR_LAST (-1)
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// List of XOS error codes. All error codes are negative integers, except for
|
||||
/// XOS_OK which is zero.
|
||||
/// XOS error codes occupy the range from -65536 up to -1.
|
||||
/// The function IS_XOS_ERRCODE() can be used to check if a value lies within
|
||||
/// the error code range.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
typedef enum xos_err_t {
|
||||
XOS_OK = 0,
|
||||
|
||||
XOS_ERR_NOT_FOUND = _XOS_ERR_FIRST, ///< Object not found
|
||||
XOS_ERR_INVALID_PARAMETER, ///< Function parameter is invalid
|
||||
XOS_ERR_LIMIT, ///< Limit exceeded
|
||||
XOS_ERR_NOT_OWNED, ///< Object not owned by caller
|
||||
XOS_ERR_MUTEX_LOCKED, ///< Mutex is already locked
|
||||
XOS_ERR_MUTEX_NOT_OWNED, ///< Mutex not owned by caller
|
||||
XOS_ERR_MUTEX_ALREADY_OWNED, ///< Mutex already owned by caller
|
||||
XOS_ERR_MUTEX_DELETE, ///< Mutex being waited on has been deleted
|
||||
XOS_ERR_COND_DELETE, ///< Condition being waited on has been deleted
|
||||
XOS_ERR_SEM_DELETE, ///< Semaphore being waited on has been deleted
|
||||
XOS_ERR_SEM_BUSY, ///< Semaphore is not available
|
||||
XOS_ERR_EVENT_DELETE, ///< Event being waited on has been deleted
|
||||
XOS_ERR_MSGQ_FULL, ///< Message queue is full
|
||||
XOS_ERR_MSGQ_EMPTY, ///< Message queue is empty
|
||||
XOS_ERR_MSGQ_DELETE, ///< Message queue being waited on has been deleted
|
||||
XOS_ERR_TIMER_DELETE, ///< Timer being waited on has been deleted
|
||||
XOS_ERR_CONTAINER_NOT_RTC, ///< Containing thread not of RTC type
|
||||
XOS_ERR_CONTAINER_NOT_SAME_PRI, ///< Containing thread not at same priority
|
||||
XOS_ERR_STACK_TOO_SMALL, ///< Thread stack is too small
|
||||
XOS_ERR_CONTAINER_ILLEGAL, ///< Illegal container thread
|
||||
XOS_ERR_ILLEGAL_OPERATION, ///< This operation is not allowed
|
||||
XOS_ERR_THREAD_EXITED, ///< The thread has already exited
|
||||
XOS_ERR_NO_TIMER, ///< No suitable timer found
|
||||
XOS_ERR_FEATURE_NOT_PRESENT, ///< This feature is disabled or not implemented
|
||||
XOS_ERR_TIMEOUT, ///< Wait timed out
|
||||
|
||||
XOS_ERR_UNHANDLED_INTERRUPT, ///< No handler for interrupt
|
||||
XOS_ERR_UNHANDLED_EXCEPTION, ///< No handler for exception
|
||||
XOS_ERR_INTERRUPT_CONTEXT, ///< Operation is illegal in interrupt context
|
||||
XOS_ERR_THREAD_BLOCKED, ///< Thread already blocked
|
||||
XOS_ERR_ASSERT_FAILED, ///< Runtime assertion failure
|
||||
XOS_ERR_CLIB_ERR, ///< Error in C library thread safety module
|
||||
XOS_ERR_INTERNAL_ERROR, ///< XOS internal error
|
||||
|
||||
XOS_ERR_LAST = _XOS_ERR_LAST,
|
||||
} xos_err_t;
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Check if a value is a valid XOS error code.
|
||||
///
|
||||
/// \param val Value to check
|
||||
///
|
||||
/// \return Returns nonzero if 'val' is in the XOS error code range.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
static inline int32_t
|
||||
IS_XOS_ERRCODE(xos_err_t val)
|
||||
{
|
||||
return ((val >= _XOS_ERR_FIRST) && (val <= _XOS_ERR_LAST));
|
||||
}
|
||||
|
||||
|
||||
#endif // __XOS_ERRORS_H__
|
||||
|
@ -1,281 +0,0 @@
|
||||
/** @file */
|
||||
|
||||
// xos_event.h - XOS Event API interface and data structures.
|
||||
|
||||
// Copyright (c) 2003-2015 Cadence Design Systems, Inc.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included
|
||||
// in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
// NOTE: Do not include this file directly in your application. Including
|
||||
// xos.h will automatically include this file.
|
||||
|
||||
#ifndef __XOS_EVENT_H__
|
||||
#define __XOS_EVENT_H__
|
||||
|
||||
#include "xos_types.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Defines.
|
||||
//-----------------------------------------------------------------------------
|
||||
#define XOS_EVENT_BITS_ALL 0xFFFFFFFF
|
||||
#define XOS_EVENT_BITS_NONE 0
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Event flags.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Event object.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
typedef struct XosEvent {
|
||||
XosThreadQueue waitq; ///< Queue of waiters.
|
||||
uint32_t bits; ///< Event bits
|
||||
uint32_t mask; ///< Specifies which bits are valid
|
||||
uint16_t flags; ///< Properties.
|
||||
uint16_t pad; ///< Padding
|
||||
#if XOS_EVENT_DEBUG
|
||||
uint32_t sig; // Valid signature indicates inited.
|
||||
#endif
|
||||
} XosEvent;
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Initialize an event object before first use.
|
||||
///
|
||||
/// \param event Pointer to event object.
|
||||
///
|
||||
/// \param mask Mask of active bits. Only these bits can be signaled.
|
||||
///
|
||||
/// \param flags Creation flags (currently ignored, should be zero).
|
||||
///
|
||||
/// \return Returns nothing.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
void
|
||||
xos_event_create(XosEvent * event, uint32_t mask, uint32_t flags);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Destroy an event object. Must have been previously created by calling
|
||||
/// xos_event_create().
|
||||
///
|
||||
/// \param event Pointer to event object.
|
||||
///
|
||||
/// \return Returns nothing.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
void
|
||||
xos_event_delete(XosEvent * event);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Set the specified bits in the specified event. Propagates the bit states
|
||||
/// to all waiting threads and wakes them if needed.
|
||||
///
|
||||
/// \param event Pointer to event object.
|
||||
///
|
||||
/// \param bits Mask of bits to set. Bits not set in the mask
|
||||
/// will not be modified by this call. To set all
|
||||
/// the bits in the event, use the constant
|
||||
/// XOS_EVENT_BITS_ALL.
|
||||
///
|
||||
/// \return Returns XOS_OK on success, else error code.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
int32_t
|
||||
xos_event_set(XosEvent * event, uint32_t bits);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Clear the specified bits in the specified event. Propagates the bit states
|
||||
/// to all waiting threads and wakes them if needed.
|
||||
///
|
||||
/// \param event Pointer to event object.
|
||||
///
|
||||
/// \param bits Mask of bits to clear. Every bit that is set in
|
||||
/// the mask will be cleared from the event. Bits
|
||||
/// not set in the mask will not be modified by this
|
||||
/// call. To clear all the bits in an event use the
|
||||
/// constant XOS_EVENT_BITS_ALL.
|
||||
///
|
||||
/// \return Returns XOS_OK on success, else error code.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
int32_t
|
||||
xos_event_clear(XosEvent * event, uint32_t bits);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Clear and set the specified bits in the specified event. The two steps are
|
||||
/// combined into one update, so this is faster than calling xos_event_clear()
|
||||
/// and xos_event_set() separately. Only one update is sent out to waiting
|
||||
/// threads.
|
||||
///
|
||||
/// \param event Pointer to event object.
|
||||
///
|
||||
/// \param clr_bits Mask of bits to clear. The clear operation
|
||||
/// happens before the set operation.
|
||||
///
|
||||
/// \param set_bits Mask of bits to set.
|
||||
///
|
||||
/// \return Returns XOS_OK on success, else error code.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
int32_t
|
||||
xos_event_clear_and_set(XosEvent * event, uint32_t clr_bits, uint32_t set_bits);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Get the current state of the event object. This is a snapshot of the state
|
||||
/// of the event at this time.
|
||||
///
|
||||
/// \param event Pointer to event object.
|
||||
///
|
||||
/// \param pstate Pointer to a uint32_t variable where the state
|
||||
/// will be returned.
|
||||
///
|
||||
/// \return Returns XOS_OK on success, else error code.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
int32_t
|
||||
xos_event_get(XosEvent * event, uint32_t * pstate);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Wait until all the specified bits in the wait mask become set in the given
|
||||
/// event object.
|
||||
///
|
||||
/// \param event Pointer to event object.
|
||||
///
|
||||
/// \param bits Mask of bits to test.
|
||||
///
|
||||
/// \return Returns XOS_OK on success, else error code.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
int32_t
|
||||
xos_event_wait_all(XosEvent * event, uint32_t bits);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Wait until all the specified bits in the wait mask become set in the given
|
||||
/// event object, or the timeout expires.
|
||||
///
|
||||
/// \param event Pointer to event object.
|
||||
///
|
||||
/// \param bits Mask of bits to test.
|
||||
///
|
||||
/// \param to_cycles Timeout in cycles. Convert from time to cycles
|
||||
/// using the helper functions provided in xos_timer.
|
||||
/// A value of zero indicates no timeout.
|
||||
///
|
||||
/// \return Returns XOS_OK on success, XOS_ERR_TIMEOUT on timeout, else
|
||||
/// error code.
|
||||
///
|
||||
/// NOTE: If XOS_OPT_WAIT_TIMEOUT is not enabled, then the timeout value is
|
||||
/// ignored, and no timeout will occur.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
int32_t
|
||||
xos_event_wait_all_timeout(XosEvent * event, uint32_t bits, uint64_t to_cycles);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Wait until any of the specified bits in the wait mask become set in the
|
||||
/// given event object.
|
||||
///
|
||||
/// \param event Pointer to event object.
|
||||
///
|
||||
/// \param bits Mask of bits to test.
|
||||
///
|
||||
/// \return Returns XOS_OK on success, else error code.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
int32_t
|
||||
xos_event_wait_any(XosEvent * event, uint32_t bits);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Wait until any of the specified bits in the wait mask become set in the
|
||||
/// event object, or the timeout expires.
|
||||
///
|
||||
/// \param event Pointer to event object.
|
||||
///
|
||||
/// \param bits Mask of bits to test.
|
||||
///
|
||||
/// \param to_cycles Timeout in cycles. Convert from time to cycles
|
||||
/// using the helper functions provided in xos_timer.
|
||||
/// A value of zero indicates no timeout.
|
||||
///
|
||||
/// \return Returns XOS_OK on success, XOS_ERR_TIMEOUT on timeout, else
|
||||
/// error code.
|
||||
///
|
||||
/// NOTE: If XOS_OPT_WAIT_TIMEOUT is not enabled, then the timeout value is
|
||||
/// ignored, and no timeout will occur.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
int32_t
|
||||
xos_event_wait_any_timeout(XosEvent * event, uint32_t bits, uint64_t to_cycles);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Atomically set a specified group of bits, then wait for another specified
|
||||
/// group of bits to become set.
|
||||
///
|
||||
/// \param event Pointer to event object.
|
||||
///
|
||||
/// \param set_bits Group of bits to set.
|
||||
///
|
||||
/// \param wait_bits Group of bits to wait on. All the bits in the
|
||||
/// group will have to get set before the wait is
|
||||
/// satisfied.
|
||||
///
|
||||
/// \return Returns XOS_OK on success, else error code.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
int32_t
|
||||
xos_event_set_and_wait(XosEvent * event, uint32_t set_bits, uint32_t wait_bits);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // __XOS_EVENT_H__
|
||||
|
@ -1,120 +0,0 @@
|
||||
|
||||
// Copyright (c) 2003-2015 Cadence Design Systems, Inc.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included
|
||||
// in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
|
||||
#ifndef __XOS_INTERNAL_H__
|
||||
#define __XOS_INTERNAL_H__
|
||||
|
||||
#if !defined(__XOS_H__) || !defined(_XOS_INCLUDE_INTERNAL_)
|
||||
#error "xos_internal.h must be included by defining _XOS_INCLUDE_INTERNAL_ before including xos.h"
|
||||
#endif
|
||||
|
||||
#include <xtensa/config/core.h>
|
||||
#include "xos_common.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
// Use this macro to suppress compiler warnings for unused variables.
|
||||
|
||||
#define UNUSED(x) (void)(x)
|
||||
|
||||
|
||||
#if XOS_DEBUG
|
||||
|
||||
#include <stdio.h>
|
||||
#include <xtensa/xtutil.h>
|
||||
# define DPRINTF printf
|
||||
|
||||
#else
|
||||
|
||||
# define DPRINTF(x...) do {} while(0)
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Internal flags for thread creation.
|
||||
//-----------------------------------------------------------------------------
|
||||
#define XOS_THREAD_FAKE 0x8000 // Don't allocate stack (init and idle threads).
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Interrupt handler table entry. This structure defines one entry in the XOS
|
||||
// interrupt handler table.
|
||||
//-----------------------------------------------------------------------------
|
||||
typedef struct XosIntEntry {
|
||||
XosIntFunc * handler; // Pointer to handler function.
|
||||
void * arg; // Argument passed to handler function.
|
||||
#if XOS_OPT_INTERRUPT_SWPRI
|
||||
unsigned char level; // Interrupt level.
|
||||
unsigned char priority; // Interrupt priority.
|
||||
short reserved; // Reserved.
|
||||
unsigned int primask; // Mask of interrupts at higher priority.
|
||||
#else
|
||||
unsigned int ps; // Value of PS when running the handler.
|
||||
#endif
|
||||
} XosIntEntry;
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Extern variables.
|
||||
//-----------------------------------------------------------------------------
|
||||
extern unsigned xos_intlevel_mask;
|
||||
extern unsigned xos_intenable_mask;
|
||||
extern XosIntEntry xos_interrupt_table[XCHAL_NUM_INTERRUPTS];
|
||||
|
||||
extern uint32_t xos_clock_freq;
|
||||
extern uint32_t xos_tick_period;
|
||||
extern uint64_t xos_system_ticks;
|
||||
extern uint64_t xos_system_cycles;
|
||||
extern uint32_t xos_num_ctx_switches;
|
||||
|
||||
|
||||
/*
|
||||
|
||||
One thing I noticed is different between my initial idea of stack
|
||||
assignments to RTC threads, when comparing to interrupts, is that I
|
||||
expected each RTC thread priority to have its own stack, whereas
|
||||
interrupts of different priorities share an interrupt stack.
|
||||
|
||||
It's not really a difference in memory usage, because when assigning
|
||||
multiple priorities to a stack, you have to add-up worst-case for
|
||||
all priorities. One possible functional difference is that with
|
||||
separate stacks per priority, it's possible to dynamically change
|
||||
the priority of an RTC thread (while it's running). Not sure how
|
||||
valuable that might be -- changing priority is useful with priority
|
||||
inheritance, to avoid priority inversion, but I don't know how often
|
||||
an RTC thread might acquire a lock (it couldn't block on acquiring a
|
||||
lock in the usual sense -- it could get queued waiting and be restarted
|
||||
when it becomes available, or use try_lock instead of lock).
|
||||
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __XOS_INTERNAL_H__ */
|
||||
|
@ -1,278 +0,0 @@
|
||||
/** @file */
|
||||
|
||||
// xos_msgq.h - XOS Message Queue API and data structures.
|
||||
|
||||
// Copyright (c) 2003-2015 Cadence Design Systems, Inc.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included
|
||||
// in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
// NOTE: Do not include this file directly in your application. Including
|
||||
// xos.h will automatically include this file.
|
||||
|
||||
|
||||
#ifndef __XOS_MSGQ_H__
|
||||
#define __XOS_MSGQ_H__
|
||||
|
||||
#include "xos_types.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// XosMsgQueue is a multi-writer multi-reader message queue implementation.
|
||||
// It is completely thread-safe and can be used by interrupt handlers.
|
||||
// Interrupt handlers are guaranteed not to block when trying to send or
|
||||
// receive a message. Messages are copied into the queue. The queue contains
|
||||
// storage for a fixed number of messages defined at queue creation time.
|
||||
// Messages must be a multiple of 4 bytes long (padded if necessary) and the
|
||||
// message buffers must be 4-byte aligned.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Message Queue flags.
|
||||
//-----------------------------------------------------------------------------
|
||||
#define XOS_MSGQ_WAIT_PRIORITY 0x0000 ///< Wake waiters in priority order (default)
|
||||
#define XOS_MSGQ_WAIT_FIFO 0x0001 ///< Wake waiters in FIFO order
|
||||
#define XOS_MSGQ_FULL 0x0002 // Queue is full
|
||||
#define XOS_MSGQ_DELETED 0x8000 // Queue is deleted
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// XosMsgQueue object.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
typedef struct XosMsgQueue {
|
||||
uint16_t flags; ///< queue flags
|
||||
uint16_t count; ///< # of messages queue can hold
|
||||
uint32_t msize; ///< message size in bytes
|
||||
uint16_t head; ///< write pointer
|
||||
uint16_t tail; ///< read pointer
|
||||
XosThreadQueue readq; ///< reader wait queue
|
||||
XosThreadQueue writeq; ///< writer wait queue
|
||||
#if XOS_MSGQ_DEBUG
|
||||
uint32_t sig; // debug signature
|
||||
#endif
|
||||
#if XOS_OPT_MSGQ_STATS
|
||||
uint32_t num_send; ///< # of messages put to queue
|
||||
uint32_t num_recv; ///< # of messages taken from queue
|
||||
uint32_t num_send_blks; ///< # of times thread blocked on send
|
||||
uint32_t num_recv_blks; ///< # of times thread blocked on recv
|
||||
#endif
|
||||
uint32_t msg[1]; ///< first word of message buffer
|
||||
} XosMsgQueue;
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Use these macros to statically or dynamically allocate a message queue.
|
||||
/// XOS_MSGQ_ALLOC allocates a static queue, while XOS_MSGQ_SIZE can be used
|
||||
/// to allocate memory via malloc() etc.
|
||||
///
|
||||
/// Static: this allocates a queue named "testq", containing 10 messages,
|
||||
/// each 16 bytes long.
|
||||
///
|
||||
/// XOS_MSGQ_ALLOC(testq, 10, 16);
|
||||
///
|
||||
/// Dynamic: this allocates a queue named "testq", containing 10 messages,
|
||||
/// each 16 bytes long.
|
||||
///
|
||||
/// XosMsgQueue * testq = malloc( XOS_MSGQ_SIZE(10, 16) );
|
||||
///
|
||||
/// \param name The queue name, i.e. the name of the pointer
|
||||
/// to the queue. Used as the queue handle in
|
||||
/// queue API calls.
|
||||
///
|
||||
/// \param num Number of messages to allocate in queue. Must be > 0.
|
||||
///
|
||||
/// \param size Message size in bytes. Must be > 0 and multiple of 4.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#define XOS_MSGQ_ALLOC(name, num, size) \
|
||||
static uint8_t name ## _buf[ sizeof(XosMsgQueue) + ((num) * (size)) ]; \
|
||||
XosMsgQueue * name = (XosMsgQueue *) name ## _buf;
|
||||
|
||||
#define XOS_MSGQ_SIZE(num, size) \
|
||||
(sizeof(XosMsgQueue) + ((num) * (size)))
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Create the message queue object. Memory for the queue must be allocated by
|
||||
/// the caller, either statically or via dynamic allocation. See the macros
|
||||
/// XOS_MSGQ_ALLOC and XOS_MSGQ_SIZE for examples.
|
||||
///
|
||||
/// \param msgq Handle (pointer) to message queue.
|
||||
///
|
||||
/// \param num Number of messages allocated in queue. Must be > 0.
|
||||
///
|
||||
/// \param size Message size in bytes. Must be > 0 and multiple of 4.
|
||||
///
|
||||
/// \param flags Queue flags:
|
||||
/// - XOS_MSGQ_WAIT_FIFO - blocked threads will be
|
||||
/// woken in FIFO order.
|
||||
/// - XOS_MSGQ_WAIT_PRIORITY - blocked threads will
|
||||
/// be woken in priority order (default).
|
||||
///
|
||||
/// \return Returns XOS_OK on success, else error code.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
int32_t
|
||||
xos_msgq_create(XosMsgQueue * msgq, uint16_t num, uint32_t size, uint16_t flags);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Destroys the specified queue. Any waiting threads are unblocked with an
|
||||
/// error return. Any messages in the queue will be lost.
|
||||
///
|
||||
/// \param msgq Pointer to message queue.
|
||||
///
|
||||
/// \return Returns XOS_OK on success, else error code.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
int32_t
|
||||
xos_msgq_delete(XosMsgQueue * msgq);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Put a message into the queue. The message contents are copied into the next
|
||||
/// available message slot. If no space is available, this function will block
|
||||
/// if called from a thread, but will return immediately if called from an
|
||||
/// interrupt handler.
|
||||
///
|
||||
/// \param msgq Pointer to message queue.
|
||||
///
|
||||
/// \param msg Pointer to message buffer.
|
||||
///
|
||||
/// \return Returns XOS_OK on success, else error code.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
int32_t
|
||||
xos_msgq_put(XosMsgQueue * msgq, const uint32_t * msg);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Put a message into the queue. The message contents are copied into the next
|
||||
/// available message slot. If no space is available, this function will block
|
||||
/// if called from a thread, but will return immediately if called from an
|
||||
/// interrupt handler. The thread will be unblocked when space frees up in the
|
||||
/// queue or the timeout expires.
|
||||
///
|
||||
/// \param msgq Pointer to message queue.
|
||||
///
|
||||
/// \param msg Pointer to message buffer.
|
||||
///
|
||||
/// \param to_cycles Timeout in cycles. Convert from time to cycles
|
||||
/// using the helper functions provided in xos_timer.
|
||||
/// A value of zero indicates no timeout.
|
||||
///
|
||||
/// \return Returns XOS_OK on success, XOS_ERR_TIMEOUT on timeout, else error code.
|
||||
///
|
||||
/// NOTE: If XOS_OPT_WAIT_TIMEOUT is not enabled, then the timeout value is
|
||||
/// ignored, and no timeout will occur.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
int32_t
|
||||
xos_msgq_put_timeout(XosMsgQueue * msgq, const uint32_t * msg, uint64_t to_cycles);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Get a message from the queue. The message contents are copied into the
|
||||
/// buffer that must be provided. If no message is available, this function
|
||||
/// will block if called from a thread, but will return immediately if called
|
||||
/// from an interrupt handler.
|
||||
///
|
||||
/// \param msgq Pointer to message queue.
|
||||
///
|
||||
/// \param msg Pointer to message buffer.
|
||||
///
|
||||
/// \return Returns XOS_OK on success, else error code.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
int32_t
|
||||
xos_msgq_get(XosMsgQueue * msgq, uint32_t * msg);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Get a message from the queue. The message contents are copied into the
|
||||
/// buffer that must be provided. If no message is available, this function
|
||||
/// will block if called from a thread, but will return immediately if called
|
||||
/// from an interrupt handler. The thread will be unblocked when a message
|
||||
/// arrives in the queue or the timeout expires.
|
||||
///
|
||||
/// \param msgq Pointer to message queue.
|
||||
///
|
||||
/// \param msg Pointer to message buffer.
|
||||
///
|
||||
/// \param to_cycles Timeout in cycles. Convert from time to cycles
|
||||
/// using the helper functions provided in xos_timer.
|
||||
/// A value of zero indicates no timeout.
|
||||
///
|
||||
/// \return Returns XOS_OK on success, XOS_ERR_TIMEOUT on timeout, else error code.
|
||||
///
|
||||
/// NOTE: If XOS_OPT_WAIT_TIMEOUT is not enabled, then the timeout value is
|
||||
/// ignored, and no timeout will occur.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
int32_t
|
||||
xos_msgq_get_timeout(XosMsgQueue * msgq, uint32_t * msg, uint64_t to_cycles);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Check if the queue is empty.
|
||||
///
|
||||
/// \param msgq Pointer to message queue.
|
||||
///
|
||||
/// \return Returns nonzero if queue is empty, zero if queue is not empty.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
int32_t
|
||||
xos_msgq_empty(XosMsgQueue * msgq);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Check if the queue is full.
|
||||
///
|
||||
/// \param msgq Pointer to message queue.
|
||||
///
|
||||
/// \return Returns nonzero if queue is full, zero if queue is not full.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
int32_t
|
||||
xos_msgq_full(XosMsgQueue * msgq);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // __XOS_MSGQ_H__
|
||||
|
@ -1,205 +0,0 @@
|
||||
/** @file */
|
||||
|
||||
// xos_mutex.h - XOS Mutex API interface and data structures.
|
||||
|
||||
// Copyright (c) 2003-2015 Cadence Design Systems, Inc.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included
|
||||
// in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
// NOTE: Do not include this file directly in your application. Including
|
||||
// xos.h will automatically include this file.
|
||||
|
||||
#ifndef __XOS_MUTEX_H__
|
||||
#define __XOS_MUTEX_H__
|
||||
|
||||
#include "xos_types.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Mutex flags.
|
||||
//-----------------------------------------------------------------------------
|
||||
#define XOS_MUTEX_WAIT_PRIORITY 0x0000 ///< Wake waiters in priority order (default)
|
||||
#define XOS_MUTEX_WAIT_FIFO 0x0001 ///< Wake waiters in FIFO order
|
||||
#define XOS_MUTEX_PRIORITY_CLG 0x0004 // Use priority ceiling
|
||||
#define XOS_MUTEX_PRIORITY_INV 0x0008 // Protect against priority inversion
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// XosMutex object.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
typedef struct XosMutex {
|
||||
XosThread * owner; ///< Owning thread (null if unlocked).
|
||||
XosThreadQueue waitq; ///< Queue of waiters.
|
||||
uint32_t flags; ///< Properties.
|
||||
uint32_t priority;
|
||||
int32_t lock_count; ///< For recursive locking.
|
||||
#if XOS_MUTEX_DEBUG
|
||||
uint32_t sig; // Valid signature indicates inited.
|
||||
#endif
|
||||
} XosMutex;
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Initialize a mutex object before first use.
|
||||
///
|
||||
/// \param mutex Pointer to mutex object.
|
||||
///
|
||||
/// \param flags Creation flags:
|
||||
/// - XOS_MUTEX_WAIT_FIFO -- Queue waiting threads
|
||||
/// in fifo order.
|
||||
/// - XOS_MUTEX_WAIT_PRIORITY -- Queue waiting threads
|
||||
/// by priority. This is the default.
|
||||
/// - XOS_MUTEX_PRIORITY_CLG -- Use specified priority
|
||||
/// value as the mutex's priority ceiling. If the
|
||||
/// owning thread has a priority lower than the mutex's
|
||||
/// priority, then the thread will have its priority
|
||||
/// raised to the higher value as long as it owns the
|
||||
/// mutex.
|
||||
/// - XOS_MUTEX_PRIORITY_INV -- Protect against priority
|
||||
/// inversion. If there is a waiting thread with a
|
||||
/// higher priority than the current owner thread,
|
||||
/// then the owner thread's priority is raised to the
|
||||
/// higher value for as long as it owns the mutex.
|
||||
///
|
||||
/// \param priority Mutex's priority ceiling. This is used only if the
|
||||
/// XOS_MUTEX_PRIORITY_CLG flag is set.
|
||||
///
|
||||
/// \return Returns XOS_OK on success, else error code.
|
||||
///
|
||||
/// NOTE: XOS_MUTEX_PRIORITY_CLG and XOS_MUTEX_PRIORITY_INV are NOT supported
|
||||
/// in the current release. They will be supported in a future release.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
int32_t
|
||||
xos_mutex_create(XosMutex * mutex, uint32_t flags, uint8_t priority);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Destroy a mutex object. Must have been previously initialized by calling
|
||||
/// xos_mutex_create().
|
||||
///
|
||||
/// \param mutex Pointer to mutex object.
|
||||
///
|
||||
/// \return Returns XOS_OK on success, else error code.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
int32_t
|
||||
xos_mutex_delete(XosMutex * mutex);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Take ownership of the mutex: block until the mutex is owned.
|
||||
/// The mutex must have been initialized.
|
||||
///
|
||||
/// \param mutex Pointer to mutex object.
|
||||
///
|
||||
/// \return Returns XOS_OK on success, else error code.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
int32_t
|
||||
xos_mutex_lock(XosMutex * mutex);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Take ownership of the mutex: block until the mutex is owned or the timeout
|
||||
/// expires. The mutex must have been initialized.
|
||||
///
|
||||
/// \param mutex Pointer to mutex object.
|
||||
///
|
||||
/// \param to_cycles Timeout in cycles. Convert from time to cycles
|
||||
/// using the helper functions provided in xos_timer.
|
||||
/// A value of zero indicates no timeout.
|
||||
///
|
||||
/// \return Returns XOS_OK on success, XOS_ERR_TIMEOUT on timeout, else error code.
|
||||
///
|
||||
/// NOTE: If XOS_OPT_WAIT_TIMEOUT is not enabled, then the timeout value is
|
||||
/// ignored, and no timeout will occur.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
int32_t
|
||||
xos_mutex_lock_timeout(XosMutex * mutex, uint64_t to_cycles);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Release ownership of the mutex. The mutex must have been initialized and
|
||||
/// must be owned by the calling thread.
|
||||
///
|
||||
/// \param mutex Pointer to mutex object.
|
||||
///
|
||||
/// \return Returns XOS_OK on success, else error code.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
int32_t
|
||||
xos_mutex_unlock(XosMutex * mutex);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Try to take ownership of the mutex, but do not block if the mutex is taken.
|
||||
/// Return immediately. The mutex must have been initialized.
|
||||
///
|
||||
/// \param mutex Pointer to mutex object.
|
||||
///
|
||||
/// \return Returns XOS_OK on success (mutex owned), else error code.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
int32_t
|
||||
xos_mutex_trylock(XosMutex * mutex);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Return the state of the mutex (locked or unlocked) but do not attempt to
|
||||
/// take ownership. The mutex must have been initialized.
|
||||
///
|
||||
/// \param mutex Pointer to mutex object.
|
||||
///
|
||||
/// \return Returns 0 if the mutex is unlocked, 1 if it is locked, -1 on error.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
static inline int32_t
|
||||
xos_mutex_test(XosMutex * mutex)
|
||||
{
|
||||
XOS_ASSERT(mutex);
|
||||
|
||||
if (mutex != XOS_NULL) {
|
||||
return (mutex->owner != XOS_NULL) ? 1 : 0;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // __XOS_MUTEX_H__
|
||||
|
@ -1,276 +0,0 @@
|
||||
/** @file */
|
||||
|
||||
// xos_params.h - user-settable compile time parameters for XOS.
|
||||
|
||||
// Copyright (c) 2003-2015 Cadence Design Systems, Inc.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included
|
||||
// in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
|
||||
#ifndef __XOS_PARAMS_H__
|
||||
#define __XOS_PARAMS_H__
|
||||
|
||||
#include <xtensa/config/core.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Number of thread priority levels. At this time XOS supports a maximum of
|
||||
/// 32 priority levels (0 - 31).
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
#ifndef XOS_NUM_PRIORITY
|
||||
#define XOS_NUM_PRIORITY 16 // Default is 16
|
||||
#endif
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Debug flags - Set to 1 to enable debug mode (and more verbose operation).
|
||||
/// Can be set individually, or define XOS_DEBUG_ALL to enable all of them.
|
||||
///
|
||||
/// - XOS_DEBUG -- Generic OS debug
|
||||
/// - XOS_COND_DEBUG -- Condition objects debug
|
||||
/// - XOS_EVENT_DEBUG -- Event objects debug
|
||||
/// - XOS_MSGQ_DEBUG -- Message queue debug
|
||||
/// - XOS_MUTEX_DEBUG -- Mutex objects debug
|
||||
/// - XOS_SEM_DEBUG -- Semaphore objects debug
|
||||
/// - XOS_THREAD_DEBUG -- Thread module debug
|
||||
/// - XOS_TIMER_DEBUG -- Timer module debug
|
||||
///
|
||||
/// WARNING: Enabling one or more of these flags will affect system performance
|
||||
/// and timing.
|
||||
///
|
||||
/// NOTE: Not all of these have been fully implemented.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
#if defined XOS_DEBUG_ALL
|
||||
|
||||
#define XOS_DEBUG 1
|
||||
#define XOS_THREAD_DEBUG 1
|
||||
#define XOS_TIMER_DEBUG 1
|
||||
#define XOS_COND_DEBUG 1
|
||||
#define XOS_MUTEX_DEBUG 1
|
||||
#define XOS_SEM_DEBUG 1
|
||||
#define XOS_EVENT_DEBUG 1
|
||||
#define XOS_MSGQ_DEBUG 1
|
||||
|
||||
#else
|
||||
|
||||
#ifndef XOS_DEBUG
|
||||
#define XOS_DEBUG 0
|
||||
#endif
|
||||
#ifndef XOS_THREAD_DEBUG
|
||||
#define XOS_THREAD_DEBUG 0
|
||||
#endif
|
||||
#ifndef XOS_TIMER_DEBUG
|
||||
#define XOS_TIMER_DEBUG 0
|
||||
#endif
|
||||
#ifndef XOS_COND_DEBUG
|
||||
#define XOS_COND_DEBUG 0
|
||||
#endif
|
||||
#ifndef XOS_MUTEX_DEBUG
|
||||
#define XOS_MUTEX_DEBUG 0
|
||||
#endif
|
||||
#ifndef XOS_SEM_DEBUG
|
||||
#define XOS_SEM_DEBUG 0
|
||||
#endif
|
||||
#ifndef XOS_EVENT_DEBUG
|
||||
#define XOS_EVENT_DEBUG 0
|
||||
#endif
|
||||
#ifndef XOS_MSGQ_DEBUG
|
||||
#define XOS_MSGQ_DEBUG 0
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Set this option to 1 to enable runtime statistics collection for XOS.
|
||||
/// NOTE: Enabling this option does have some impact on runtime performance
|
||||
/// and OS footprint.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
#ifndef XOS_OPT_STATS
|
||||
#define XOS_OPT_STATS 1
|
||||
#endif
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Set this option to 1 to enable statistics tracking for message queues.
|
||||
/// enabling this will cause message queue objects to increase in size, and add
|
||||
/// some overhead to message queue processing.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
#ifndef XOS_OPT_MSGQ_STATS
|
||||
#define XOS_OPT_MSGQ_STATS 0
|
||||
#endif
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Size of interrupt stack in bytes. Shared by all interrupt handlers. Must be
|
||||
/// sized to handle worst case nested interrupts. This is also used by the idle
|
||||
/// thread so must exist even if interrupts are not configured.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
#ifndef XOS_INT_STACK_SIZE
|
||||
#if XCHAL_HAVE_INTERRUPTS
|
||||
#define XOS_INT_STACK_SIZE 8192
|
||||
#else
|
||||
#define XOS_INT_STACK_SIZE 32
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Default maximum interrupt level at which XOS primitives may be called.
|
||||
/// It is the level at which interrupts are disabled by default.
|
||||
/// See also description of xos_set_int_pri_level().
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
#ifndef XOS_MAX_OS_INTLEVEL
|
||||
#define XOS_MAX_OS_INTLEVEL XCHAL_EXCM_LEVEL
|
||||
#endif
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Set this to 1 to enable stack checking. The stack is filled with a pattern
|
||||
/// on thread creation, and the stack is checked at certain times during system
|
||||
/// operation.
|
||||
/// WARNING: Enabling this option can have some impact on runtime performance.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
#ifndef XOS_OPT_STACK_CHECK
|
||||
#if XOS_DEBUG
|
||||
#define XOS_OPT_STACK_CHECK 1
|
||||
#else
|
||||
#define XOS_OPT_STACK_CHECK 0
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Set XOS_CLOCK_FREQ to the system clock frequency if this is known ahead of
|
||||
/// time. Otherwise, call xos_set_clock_freq() to set it at run time.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
#ifndef XOS_CLOCK_FREQ
|
||||
#define XOS_CLOCK_FREQ 1000000
|
||||
#endif
|
||||
#define XOS_DEFAULT_CLOCK_FREQ XOS_CLOCK_FREQ
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Set this option to 1 to enable software prioritization of interrupts. The
|
||||
/// priority scheme applied is that a higher interrupt number at the same level
|
||||
/// will have higher priority.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
#ifndef XOS_OPT_INTERRUPT_SWPRI
|
||||
#define XOS_OPT_INTERRUPT_SWPRI 1
|
||||
#endif
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Set this option to 1 to use the thread-safe version of the C runtime library.
|
||||
/// You may need to enable this if you call C library functions from multiple
|
||||
/// threads -- see the documentation for the relevant C library to determine if
|
||||
/// this is necessary. This option increases the size of the TCB.
|
||||
/// NOTE: At this time only the newlib and xclib libraries are supported for
|
||||
/// thread safety.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
#include <xtensa/config/system.h>
|
||||
|
||||
#ifndef XOS_OPT_THREAD_SAFE_CLIB
|
||||
|
||||
#if XSHAL_CLIB == XTHAL_CLIB_XCLIB
|
||||
#define XOS_OPT_THREAD_SAFE_CLIB 1
|
||||
#elif XSHAL_CLIB == XTHAL_CLIB_NEWLIB
|
||||
#define XOS_OPT_THREAD_SAFE_CLIB 1
|
||||
#else
|
||||
#define XOS_OPT_THREAD_SAFE_CLIB 0
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Set this option to 1 to enable the wait timeout feature. This allows waits
|
||||
/// on waitable objects to expire after a specified timeout.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
#ifndef XOS_OPT_WAIT_TIMEOUT
|
||||
#define XOS_OPT_WAIT_TIMEOUT 1
|
||||
#endif
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Set this option to 1 to enable threads waiting on timer objects. If this
|
||||
/// feature is not used, turning it off will make timer objects smaller, and
|
||||
/// reduce the time taken by timer expiry processing (by a small amount).
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
#ifndef XOS_OPT_TIMER_WAIT
|
||||
#define XOS_OPT_TIMER_WAIT 1
|
||||
#endif
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Set this option to 1 to enable time-slicing between multiple threads at the
|
||||
/// same priority. If this option is enabled then on every timer tick the timer
|
||||
/// handler will switch out the current thread if there is another ready thread
|
||||
/// at the same priority, and allow the latter thread to run. Execution will be
|
||||
/// round robin switched among all the threads at the same priority.
|
||||
///
|
||||
/// Currently the time slice interval is fixed to be one timer tick.
|
||||
///
|
||||
/// This feature is most useful if fixed duration timer ticks are used.
|
||||
/// If dynamic ticking is enabled, then time slicing will work unpredictably
|
||||
/// because the interval between ticks will vary. In some cases it may be
|
||||
/// better to turn time slicing off.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
#ifndef XOS_OPT_TIME_SLICE
|
||||
#define XOS_OPT_TIME_SLICE 1
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // __XOS_PARAMS_H__
|
||||
|
@ -1,201 +0,0 @@
|
||||
|
||||
// xos_regaccess.h - Access routines for various processor special registers.
|
||||
|
||||
// Copyright (c) 2003-2015 Cadence Design Systems, Inc.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included
|
||||
// in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
#ifndef __REGACCESS_H__
|
||||
#define __REGACCESS_H__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "xos_types.h"
|
||||
|
||||
#include <xtensa/config/core.h>
|
||||
|
||||
#if defined (__XCC__)
|
||||
#if XCHAL_HAVE_CCOUNT
|
||||
#include <xtensa/tie/xt_timer.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Read CCOUNT register.
|
||||
//-----------------------------------------------------------------------------
|
||||
static __inline__ uint32_t xos_get_ccount(void)
|
||||
{
|
||||
#if XCHAL_HAVE_CCOUNT
|
||||
|
||||
#if defined (__XCC__)
|
||||
return XT_RSR_CCOUNT();
|
||||
#else
|
||||
uint32_t ccount;
|
||||
|
||||
__asm__ __volatile__ ( "rsr %0, ccount" : "=a" (ccount) );
|
||||
return ccount;
|
||||
#endif
|
||||
|
||||
#else
|
||||
|
||||
return 0;
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Read CCOMPARE0
|
||||
//-----------------------------------------------------------------------------
|
||||
static __inline__ uint32_t xos_get_ccompare0(void)
|
||||
{
|
||||
#if XCHAL_HAVE_CCOUNT
|
||||
|
||||
#if defined (__XCC__)
|
||||
return XT_RSR_CCOMPARE0();
|
||||
#else
|
||||
uint32_t ccompare0;
|
||||
|
||||
__asm__ __volatile__ ( "rsr %0, ccompare0" : "=a" (ccompare0));
|
||||
return ccompare0;
|
||||
#endif
|
||||
|
||||
#else
|
||||
|
||||
return 0;
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Read CCOMPARE1
|
||||
//-----------------------------------------------------------------------------
|
||||
#if (XCHAL_NUM_TIMERS > 1)
|
||||
static __inline__ uint32_t xos_get_ccompare1(void)
|
||||
{
|
||||
#if defined (__XCC__)
|
||||
return XT_RSR_CCOMPARE1();
|
||||
#else
|
||||
uint32_t ccompare1;
|
||||
|
||||
__asm__ __volatile__ ( "rsr %0, ccompare1" : "=a" (ccompare1));
|
||||
return ccompare1;
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Read CCOMPARE2
|
||||
//-----------------------------------------------------------------------------
|
||||
#if (XCHAL_NUM_TIMERS > 2)
|
||||
static __inline__ uint32_t xos_get_ccompare2(void)
|
||||
{
|
||||
#if defined (__XCC__)
|
||||
return XT_RSR_CCOMPARE2();
|
||||
#else
|
||||
uint32_t ccompare2;
|
||||
|
||||
__asm__ __volatile__ ( "rsr %0, ccompare2" : "=a" (ccompare2));
|
||||
return ccompare2;
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Write CCOMPARE0
|
||||
//-----------------------------------------------------------------------------
|
||||
static __inline__ void xos_set_ccompare0(uint32_t val)
|
||||
{
|
||||
#if XCHAL_HAVE_CCOUNT
|
||||
|
||||
#if defined (__XCC__)
|
||||
XT_WSR_CCOMPARE0(val);
|
||||
XT_ISYNC();
|
||||
#else
|
||||
__asm__ __volatile__ (
|
||||
"wsr %0, ccompare0\n"
|
||||
"isync"
|
||||
:
|
||||
: "a" (val)
|
||||
);
|
||||
#endif
|
||||
|
||||
#else
|
||||
|
||||
// Empty
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Write CCOMPARE1
|
||||
//-----------------------------------------------------------------------------
|
||||
#if (XCHAL_NUM_TIMERS > 1)
|
||||
static __inline__ void xos_set_ccompare1(uint32_t val)
|
||||
{
|
||||
#if defined (__XCC__)
|
||||
XT_WSR_CCOMPARE1(val);
|
||||
XT_ISYNC();
|
||||
#else
|
||||
__asm__ __volatile__ (
|
||||
"wsr %0, ccompare1\n"
|
||||
"isync"
|
||||
:
|
||||
: "a" (val)
|
||||
);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Write CCOMPARE2
|
||||
//-----------------------------------------------------------------------------
|
||||
#if (XCHAL_NUM_TIMERS > 2)
|
||||
static __inline__ void xos_set_ccompare2(uint32_t val)
|
||||
{
|
||||
#if defined (__XCC__)
|
||||
XT_WSR_CCOMPARE2(val);
|
||||
XT_ISYNC();
|
||||
#else
|
||||
__asm__ __volatile__ (
|
||||
"wsr %0, ccompare2\n"
|
||||
"isync"
|
||||
:
|
||||
: "a" (val)
|
||||
);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // __REGACCESS_H__
|
||||
|
@ -1,190 +0,0 @@
|
||||
/** @file */
|
||||
|
||||
// xos_semaphore.h - XOS Semaphore API interface and data structures.
|
||||
|
||||
// Copyright (c) 2003-2015 Cadence Design Systems, Inc.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included
|
||||
// in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
// NOTE: Do not include this file directly in your application. Including
|
||||
// xos.h will automatically include this file.
|
||||
|
||||
#ifndef __XOS_SEMAPHORE_H__
|
||||
#define __XOS_SEMAPHORE_H__
|
||||
|
||||
#include "xos_types.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Semaphore flags.
|
||||
//-----------------------------------------------------------------------------
|
||||
#define XOS_SEM_WAIT_PRIORITY 0x0000 ///< Wake waiters in priority order (default)
|
||||
#define XOS_SEM_WAIT_FIFO 0x0001 ///< Wake waiters in FIFO order
|
||||
#define XOS_SEM_PRIORITY_INV 0x0004 // Protect against priority inversion
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// XosSem object.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
typedef struct XosSem {
|
||||
uint32_t count; ///< Current count
|
||||
XosThreadQueue waitq; ///< Queue of waiters.
|
||||
uint32_t flags; ///< Properties.
|
||||
#if XOS_SEM_DEBUG
|
||||
uint32_t sig; // Valid signature indicates inited.
|
||||
#endif
|
||||
} XosSem;
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Initialize a semaphore object before first use.
|
||||
///
|
||||
/// \param sem Pointer to semaphore object.
|
||||
///
|
||||
/// \param flags Creation flags:
|
||||
/// - XOS_SEM_WAIT_FIFO -- queue waiting threads in
|
||||
/// fifo order.
|
||||
/// - XOS_SEM_WAIT_PRIORITY -- queue waiting threads
|
||||
/// by priority. This is the default.
|
||||
/// - XOS_SEM_PRIORITY_INV -- protect against priority
|
||||
/// inversion.
|
||||
///
|
||||
/// \param initial_count Initial count for semaphore on creation.
|
||||
///
|
||||
/// \return Returns XOS_OK on success, else error code.
|
||||
///
|
||||
/// NOTE: XOS_SEM_PRIORITY_INV is NOT supported in the current release. It will
|
||||
/// be supported in a future release.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
int32_t
|
||||
xos_sem_create(XosSem * sem, uint32_t flags, uint32_t initial_count);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Destroy a semaphore object. Must have been previously created by calling
|
||||
/// xos_sem_create().
|
||||
///
|
||||
/// \param sem Pointer to semaphore object.
|
||||
///
|
||||
/// \return Returns XOS_OK on success, else error code.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
int32_t
|
||||
xos_sem_delete(XosSem * sem);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Decrement the semaphore count: block until the decrement is possible.
|
||||
/// The semaphore must have been initialized.
|
||||
///
|
||||
/// \param sem Pointer to semaphore object.
|
||||
///
|
||||
/// \return Returns XOS_OK on success, else error code.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
int32_t
|
||||
xos_sem_get(XosSem * sem);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Decrement the semaphore count: block until the decrement is possible or
|
||||
/// the timeout expires. The semaphore must have been initialized.
|
||||
///
|
||||
/// \param sem Pointer to semaphore object.
|
||||
///
|
||||
/// \param to_cycles Timeout in cycles. Convert from time to cycles
|
||||
/// using the helper functions provided in xos_timer.
|
||||
/// A value of zero indicates no timeout.
|
||||
///
|
||||
/// \return Returns XOS_OK on success, XOS_ERR_TIMEOUT on timeout, else error code.
|
||||
///
|
||||
/// NOTE: If XOS_OPT_WAIT_TIMEOUT is not enabled, then the timeout value is
|
||||
/// ignored, and no timeout will occur.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
int32_t
|
||||
xos_sem_get_timeout(XosSem * sem, uint64_t to_cycles);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Increment the semaphore count. The semaphore must have been initialized.
|
||||
/// Remember that this action may wake up a waiting thread, and if that thread
|
||||
/// is higher priority then there will be an immediate context switch.
|
||||
///
|
||||
/// \param sem Pointer to semaphore object.
|
||||
///
|
||||
/// \return Returns XOS_OK on success, else error code.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
int32_t
|
||||
xos_sem_put(XosSem * sem);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Try to decrement the semaphore, but do not block if the semaphore count is
|
||||
/// zero. Return immediately. The semaphore must have been initialized.
|
||||
///
|
||||
/// \param sem Pointer to semaphore object.
|
||||
///
|
||||
/// \return Returns XOS_OK on success (semaphore decremented), else error code.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
int32_t
|
||||
xos_sem_tryget(XosSem * sem);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Return the count of the semaphore but do not attempt to decrement it.
|
||||
/// The semaphore must have been initialized.
|
||||
///
|
||||
/// \param sem Pointer to semaphore object.
|
||||
///
|
||||
/// \return Returns semaphore count, -1 on error.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
static inline int32_t
|
||||
xos_sem_test(XosSem * sem)
|
||||
{
|
||||
XOS_ASSERT(sem);
|
||||
|
||||
return sem ? sem->count : -1;
|
||||
}
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // __XOS_SEMAPHORE_H__
|
||||
|
@ -1,175 +0,0 @@
|
||||
/** @file */
|
||||
|
||||
// xos_stopwatch.h - XOS Stopwatch objects and related API.
|
||||
|
||||
// Copyright (c) 2003-2015 Cadence Design Systems, Inc.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included
|
||||
// in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
// NOTE: Do not include this file directly in your application. Including
|
||||
// xos.h will automatically include this file.
|
||||
|
||||
|
||||
#ifndef __XOS_STOPWATCH_H__
|
||||
#define __XOS_STOPWATCH_H__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "xos_types.h"
|
||||
#include "xos_params.h"
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// A stopwatch object can be used to track elapsed time and accumulate total
|
||||
// elapsed time over multiple execution periods. The stopwatch records the
|
||||
// time whenever its start function is called, and stops recording the time
|
||||
// when the stop function is called and updates its cumulative time counter.
|
||||
// The stopwatch keeps time in cycles. This can be converted to seconds etc.
|
||||
// by using the XOS conversion calls such as xos_cycles_to_secs().
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// XosStopwatch object.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
typedef struct XosStopwatch {
|
||||
uint64_t total; ///< Total accumulated cycle count
|
||||
uint64_t start; ///< Starting system cycle count
|
||||
uint16_t active; ///< Active flag (nonzero when active)
|
||||
} XosStopwatch;
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Initialize a stopwatch object.
|
||||
///
|
||||
/// \param sw Pointer to a stopwatch object.
|
||||
///
|
||||
/// \return Returns nothing.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
static inline void
|
||||
xos_stopwatch_init(XosStopwatch * sw)
|
||||
{
|
||||
sw->total = 0;
|
||||
sw->start = 0;
|
||||
sw->active = 0;
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Start a stopwatch. Starts cycle counting.
|
||||
/// Note that this does not necessarily start counting from zero. The current
|
||||
/// run (start-to-stop interval) will just get added to the accumulated count
|
||||
/// in the stopwatch if any.
|
||||
/// To reset the accumulated count, use xos_stopwatch_clear().
|
||||
///
|
||||
/// \param sw Pointer to a stopwatch object.
|
||||
///
|
||||
/// \return Returns nothing.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
static inline void
|
||||
xos_stopwatch_start(XosStopwatch * sw)
|
||||
{
|
||||
XOS_ASSERT(!sw->active);
|
||||
sw->active = 1;
|
||||
sw->start = xos_get_system_cycles();
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Stop a stopwatch. Stops cycle counting and updates total.
|
||||
///
|
||||
/// \param sw Pointer to a stopwatch object.
|
||||
///
|
||||
/// \return Returns nothing.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
static inline void
|
||||
xos_stopwatch_stop(XosStopwatch * sw)
|
||||
{
|
||||
XOS_ASSERT(sw->active);
|
||||
sw->active = 0;
|
||||
sw->total += xos_get_system_cycles() - sw->start;
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Get stopwatch accumulated count.
|
||||
///
|
||||
/// \param sw Pointer to a stopwatch object.
|
||||
///
|
||||
/// \return Returns the accumulated count.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
static inline uint64_t
|
||||
xos_stopwatch_count(XosStopwatch * sw)
|
||||
{
|
||||
return sw->total;
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Get elapsed time since stopwatch was started. If not started, returns zero.
|
||||
///
|
||||
/// \param sw Pointer to a stopwatch object.
|
||||
///
|
||||
/// \return Returns elapsed time in cycles.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
static inline uint64_t
|
||||
xos_stopwatch_elapsed(XosStopwatch * sw)
|
||||
{
|
||||
return sw->active ? xos_get_system_cycles() - sw->start : 0;
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Clears a stopwatch. Resets the accumulated count to zero, and deactivates
|
||||
/// it if active.
|
||||
///
|
||||
/// \param sw Pointer to a stopwatch object.
|
||||
///
|
||||
/// \return Returns nothing.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
static inline void
|
||||
xos_stopwatch_clear(XosStopwatch * sw)
|
||||
{
|
||||
xos_stopwatch_init(sw);
|
||||
}
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // __XOS_STOPWATCH_H__
|
||||
|
@ -1,330 +0,0 @@
|
||||
/** @file */
|
||||
|
||||
// xos_syslog.h - XOS Event logging module.
|
||||
|
||||
// Copyright (c) 2003-2015 Cadence Design Systems, Inc.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included
|
||||
// in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
// NOTE: Do not include this file directly in your application. Including
|
||||
// xos.h will automatically include this file.
|
||||
|
||||
|
||||
#ifndef __XOS_SYSLOG_H__
|
||||
#define __XOS_SYSLOG_H__
|
||||
|
||||
#include "xos_types.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// The XOS system log is an array of fixed size entries. The size of the log
|
||||
// is determined by the application, and memory for the log must be provided
|
||||
// at init time. Every time the log function is called, an entry is made in
|
||||
// the log and the next pointer advanced. When the log is full, it will wrap
|
||||
// around and start overwriting the oldest entries.
|
||||
// Logging can be done from C/C++ code as well as assembly code, and at any
|
||||
// interrupt level, even from high level interrupt handlers.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Defines.
|
||||
//-----------------------------------------------------------------------------
|
||||
#define XOS_SYSLOG_ENABLED 0x0001
|
||||
|
||||
|
||||
///----------------------------------------------------------------------------
|
||||
///
|
||||
/// Use this macro to compute how much memory to allocate for the syslog.
|
||||
///
|
||||
///----------------------------------------------------------------------------
|
||||
#define XOS_SYSLOG_SIZE(num_entries) \
|
||||
( sizeof(XosSysLog) + ((num_entries - 1) * sizeof(XosSysLogEntry)) )
|
||||
|
||||
|
||||
///----------------------------------------------------------------------------
|
||||
///
|
||||
/// System log entry structure.
|
||||
///
|
||||
///----------------------------------------------------------------------------
|
||||
typedef struct XosSysLogEntry {
|
||||
uint32_t timestamp; ///< Timestamp in clock cycles
|
||||
uint32_t param1; ///< User defined value
|
||||
uint32_t param2; ///< User defined value
|
||||
struct XosSysLogEntry * next; ///< Link to next entry
|
||||
} XosSysLogEntry;
|
||||
|
||||
|
||||
///----------------------------------------------------------------------------
|
||||
///
|
||||
/// System log structure.
|
||||
///
|
||||
///----------------------------------------------------------------------------
|
||||
typedef struct XosSysLog {
|
||||
uint16_t flags; ///< Flags
|
||||
uint16_t size; ///< Number of entries
|
||||
XosSysLogEntry * next; ///< Next write position
|
||||
XosSysLogEntry entries[1]; ///< First entry
|
||||
} XosSysLog;
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Pointer to syslog area.
|
||||
//-----------------------------------------------------------------------------
|
||||
extern XosSysLog * xos_syslog;
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
///
|
||||
/// Initialize the syslog. Initializing the log also enables it. The system
|
||||
/// log always wraps around when full and overwrites the oldest entries.
|
||||
///
|
||||
/// \param log_mem Pointer to allocated memory for the log.
|
||||
///
|
||||
/// \param num_entries The number of entries that the log can contain.
|
||||
///
|
||||
/// \return Returns nothing.
|
||||
///
|
||||
//----------------------------------------------------------------------------
|
||||
static inline void
|
||||
xos_syslog_init(void * log_mem, uint16_t num_entries)
|
||||
{
|
||||
uint16_t i;
|
||||
|
||||
xos_syslog = (XosSysLog *) log_mem;
|
||||
xos_syslog->size = num_entries;
|
||||
xos_syslog->next = xos_syslog->entries;
|
||||
|
||||
for (i = 0; i < num_entries - 1; i++) {
|
||||
xos_syslog->entries[i].next = &(xos_syslog->entries[i+1]);
|
||||
xos_syslog->entries[i].timestamp = 0;
|
||||
}
|
||||
xos_syslog->entries[i].next = xos_syslog->entries;
|
||||
xos_syslog->entries[i].timestamp = 0;
|
||||
|
||||
xos_syslog->flags = XOS_SYSLOG_ENABLED;
|
||||
}
|
||||
|
||||
|
||||
///----------------------------------------------------------------------------
|
||||
///
|
||||
/// Reset the syslog. All entries made up to now are abandoned and the write
|
||||
/// pointer is set to the first entry location.
|
||||
///
|
||||
/// No parameters.
|
||||
///
|
||||
/// \return Returns nothing.
|
||||
///
|
||||
///----------------------------------------------------------------------------
|
||||
static inline void
|
||||
xos_syslog_clear()
|
||||
{
|
||||
#if XCHAL_HAVE_INTERRUPTS
|
||||
uint32_t ps = XT_RSIL(XCHAL_NUM_INTLEVELS);
|
||||
#endif
|
||||
|
||||
xos_syslog_init(xos_syslog, xos_syslog->size);
|
||||
#if XCHAL_HAVE_INTERRUPTS
|
||||
xos_restore_int_pri_level(ps);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
///----------------------------------------------------------------------------
|
||||
///
|
||||
/// Enable logging to the syslog. This function needs to be called only if
|
||||
/// logging had been previously disabled via xos_syslog_disable(), since
|
||||
/// initializing the syslog automatically enables it.
|
||||
///
|
||||
/// No parameters.
|
||||
///
|
||||
/// \return Returns nothing.
|
||||
///
|
||||
///----------------------------------------------------------------------------
|
||||
static inline void
|
||||
xos_syslog_enable()
|
||||
{
|
||||
#if XCHAL_HAVE_INTERRUPTS
|
||||
uint32_t ps = XT_RSIL(XCHAL_NUM_INTLEVELS);
|
||||
#endif
|
||||
|
||||
xos_syslog->flags |= XOS_SYSLOG_ENABLED;
|
||||
#if XCHAL_HAVE_INTERRUPTS
|
||||
xos_restore_int_pri_level(ps);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
///----------------------------------------------------------------------------
|
||||
///
|
||||
/// Disable logging to the syslog. It is sometimes useful to disable logging
|
||||
/// while the log is being examined or dumped.
|
||||
///
|
||||
/// No parameters.
|
||||
///
|
||||
/// \return Returns nothing.
|
||||
///
|
||||
///----------------------------------------------------------------------------
|
||||
static inline void
|
||||
xos_syslog_disable()
|
||||
{
|
||||
#if XCHAL_HAVE_INTERRUPTS
|
||||
uint32_t ps = XT_RSIL(XCHAL_NUM_INTLEVELS);
|
||||
#endif
|
||||
xos_syslog->flags &= ~XOS_SYSLOG_ENABLED;
|
||||
#if XCHAL_HAVE_INTERRUPTS
|
||||
xos_restore_int_pri_level(ps);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
///----------------------------------------------------------------------------
|
||||
///
|
||||
/// Write an entry into the syslog. This function does disable all interrupts
|
||||
/// since logging can be done from interrupt handlers as well. It will write
|
||||
/// into the log only if the log exists and is enabled.
|
||||
///
|
||||
/// \param param1 User defined value.
|
||||
///
|
||||
/// \param param2 User defined value.
|
||||
///
|
||||
/// \return Returns nothing.
|
||||
///
|
||||
///----------------------------------------------------------------------------
|
||||
static inline void
|
||||
xos_syslog_write(uint32_t param1, uint32_t param2)
|
||||
{
|
||||
if (xos_syslog != XOS_NULL) {
|
||||
#if XCHAL_HAVE_INTERRUPTS
|
||||
uint32_t ps = XT_RSIL(XCHAL_NUM_INTLEVELS);
|
||||
#endif
|
||||
|
||||
if ((xos_syslog->flags & XOS_SYSLOG_ENABLED) != 0) {
|
||||
XosSysLogEntry * next = xos_syslog->next;
|
||||
|
||||
next->timestamp = xos_get_ccount();
|
||||
next->param1 = param1;
|
||||
next->param2 = param2;
|
||||
|
||||
xos_syslog->next = next->next;
|
||||
}
|
||||
|
||||
#if XCHAL_HAVE_INTERRUPTS
|
||||
xos_restore_int_pri_level(ps);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
///----------------------------------------------------------------------------
|
||||
///
|
||||
/// Read the first (oldest) entry in the syslog. Will return an error if the
|
||||
/// log has not been created or is empty. Storage to copy the entry must be
|
||||
/// provided by the caller.
|
||||
///
|
||||
/// \param entry Pointer to storage where the entry data will be
|
||||
/// copied. This pointer must be passed to
|
||||
/// xos_syslog_get_next().
|
||||
///
|
||||
/// \return Returns XOS_OK on success, else error code.
|
||||
///
|
||||
///----------------------------------------------------------------------------
|
||||
static inline int32_t
|
||||
xos_syslog_get_first(XosSysLogEntry * entry)
|
||||
{
|
||||
if (xos_syslog == XOS_NULL) {
|
||||
return XOS_ERR_NOT_FOUND;
|
||||
}
|
||||
|
||||
if (entry != XOS_NULL) {
|
||||
#if XCHAL_HAVE_INTERRUPTS
|
||||
uint32_t ps = XT_RSIL(XCHAL_NUM_INTLEVELS);
|
||||
#endif
|
||||
XosSysLogEntry * next = xos_syslog->next;
|
||||
|
||||
// 'next' should be pointing to the next entry to be overwritten, if we
|
||||
// have wrapped. This means it is the oldest entry. However if this entry
|
||||
// has a zero timestamp then we have not wrapped, in which case we must
|
||||
// look at the first entry in the list.
|
||||
if (next->timestamp == 0) {
|
||||
next = xos_syslog->entries;
|
||||
}
|
||||
|
||||
*entry = *next;
|
||||
#if XCHAL_HAVE_INTERRUPTS
|
||||
xos_restore_int_pri_level(ps);
|
||||
#endif
|
||||
return entry->timestamp ? XOS_OK : XOS_ERR_NOT_FOUND;
|
||||
}
|
||||
|
||||
return XOS_ERR_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
|
||||
///----------------------------------------------------------------------------
|
||||
///
|
||||
/// Get the next sequential entry from the syslog. This function must be called
|
||||
/// only after xos_syslog_get_first() has been called.
|
||||
///
|
||||
/// \param entry Pointer to storage where entry data will be copied.
|
||||
/// Must be the same pointer that was passed in the call
|
||||
/// to xos_syslog_get_first(), as it is used to keep track
|
||||
/// of the current position.
|
||||
///
|
||||
/// \return Returns XOS_OK on success, else error code.
|
||||
///
|
||||
///----------------------------------------------------------------------------
|
||||
static inline int32_t
|
||||
xos_syslog_get_next(XosSysLogEntry * entry)
|
||||
{
|
||||
if (entry != XOS_NULL) {
|
||||
#if XCHAL_HAVE_INTERRUPTS
|
||||
uint32_t ps = XT_RSIL(XCHAL_NUM_INTLEVELS);
|
||||
#endif
|
||||
XosSysLogEntry * next = entry->next;
|
||||
int32_t ret = XOS_OK;
|
||||
|
||||
// Make sure we're not pointing past the last entry.
|
||||
if ((next != XOS_NULL) && (next != xos_syslog->next) && (next->timestamp != 0)) {
|
||||
*entry = *next;
|
||||
}
|
||||
else {
|
||||
ret = XOS_ERR_NOT_FOUND;
|
||||
}
|
||||
#if XCHAL_HAVE_INTERRUPTS
|
||||
xos_restore_int_pri_level(ps);
|
||||
#endif
|
||||
return ret;
|
||||
}
|
||||
|
||||
return XOS_ERR_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // __XOS_SYSLOG_H__
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,592 +0,0 @@
|
||||
/** @file */
|
||||
|
||||
// xos_timer.h - XOS Timer API interface and data structures.
|
||||
|
||||
// Copyright (c) 2003-2015 Cadence Design Systems, Inc.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included
|
||||
// in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
// NOTE: Do not include this file directly in your application. Including
|
||||
// xos.h will automatically include this file.
|
||||
|
||||
|
||||
#ifndef __XOS_TIMER_H__
|
||||
#define __XOS_TIMER_H__
|
||||
|
||||
#include "xos_types.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Function pointer type for timer callbacks.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
typedef void (XosTimerFunc)(void * arg);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Timer event structure. Used to track pending timer events.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
typedef struct XosTimer {
|
||||
struct XosTimer * next; ///< Pointer to next event in list.
|
||||
uint64_t when; ///< Time (clock cycles) at which to trigger.
|
||||
uint64_t delta; ///< Delta for next re-trigger, 0 if none.
|
||||
XosTimerFunc * fn; ///< Function to call when timer expires.
|
||||
void * arg; ///< Argument to pass to called function.
|
||||
bool active; ///< Set if active (in some list of events).
|
||||
#if XOS_OPT_TIMER_WAIT
|
||||
XosThreadQueue waitq; ///< Queue of threads waiting on this timer.
|
||||
#endif
|
||||
#if XOS_TIMER_DEBUG
|
||||
uint32_t signature;
|
||||
#endif
|
||||
} XosTimer;
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Extern declarations.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
// System clock frequency in cycles per second.
|
||||
extern uint32_t xos_clock_freq;
|
||||
|
||||
|
||||
///@{
|
||||
//-----------------------------------------------------------------------------
|
||||
// Functions to convert from clock cycles to time units and vice versa.
|
||||
//
|
||||
// Note that these are integer conversions so for example a cycle count of less
|
||||
// than one second will convert to zero seconds.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
/// Converts CPU cycles to time in seconds.
|
||||
///
|
||||
/// \param cycles Number of CPU cycles.
|
||||
///
|
||||
/// \return Equivalent number of seconds (truncated to integer).
|
||||
static inline uint64_t
|
||||
xos_cycles_to_secs(uint64_t cycles)
|
||||
{
|
||||
return cycles / xos_clock_freq;
|
||||
}
|
||||
|
||||
/// Converts CPU cycles to time in milliseconds.
|
||||
///
|
||||
/// \param cycles Number of CPU cycles.
|
||||
///
|
||||
/// \return Equivalent number of milliseconds (truncated to integer).
|
||||
static inline uint64_t
|
||||
xos_cycles_to_msecs(uint64_t cycles)
|
||||
{
|
||||
return (cycles * 1000) / xos_clock_freq;
|
||||
}
|
||||
|
||||
/// Converts CPU cycles to time in microseconds.
|
||||
///
|
||||
/// \param cycles Number of CPU cycles.
|
||||
///
|
||||
/// \return Equivalent number of microseconds (truncated to integer).
|
||||
static inline uint64_t
|
||||
xos_cycles_to_usecs(uint64_t cycles)
|
||||
{
|
||||
return (cycles * 1000000) / xos_clock_freq;
|
||||
}
|
||||
|
||||
/// Converts time in seconds to CPU cycle count.
|
||||
///
|
||||
/// \param secs Number of seconds.
|
||||
///
|
||||
/// \return Equivalent number of CPU cycles.
|
||||
static inline uint64_t
|
||||
xos_secs_to_cycles(uint64_t secs)
|
||||
{
|
||||
return secs * xos_clock_freq;
|
||||
}
|
||||
|
||||
/// Converts time in milliseconds to CPU cycle count.
|
||||
///
|
||||
/// \param msecs Number of milliseconds.
|
||||
///
|
||||
/// \return Equivalent number of CPU cycles.
|
||||
static inline uint64_t
|
||||
xos_msecs_to_cycles(uint64_t msecs)
|
||||
{
|
||||
return (msecs * xos_clock_freq) / 1000;
|
||||
}
|
||||
|
||||
/// Converts time in microseconds to CPU cycle count.
|
||||
///
|
||||
/// \param usecs Number of microseconds.
|
||||
///
|
||||
/// \return Equivalent number of CPU cycles.
|
||||
static inline uint64_t
|
||||
xos_usecs_to_cycles(uint64_t usecs)
|
||||
{
|
||||
return (usecs * xos_clock_freq) / 1000000;
|
||||
}
|
||||
///@}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Set system clock frequency. This is expected to be set only once, and only
|
||||
/// if the clock frequency is not known at compile time.
|
||||
///
|
||||
/// \param freq Frequency in cycles per second.
|
||||
///
|
||||
/// \return Returns nothing.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
static inline void
|
||||
xos_set_clock_freq(uint32_t freq)
|
||||
{
|
||||
xos_clock_freq = freq;
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Get current system clock frequency.
|
||||
///
|
||||
/// \return Returns current system clock frequency in cycles per second.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
static inline uint32_t
|
||||
xos_get_clock_freq()
|
||||
{
|
||||
return xos_clock_freq;
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Initialize timer support and start the system timer.
|
||||
/// This function must be called before calling any other timer function.
|
||||
///
|
||||
/// NOTE: The smaller the tick period, the more precisely delays can be
|
||||
/// specified using timers. However, we also need to make the tick period
|
||||
/// large enough to allow time both to execute the tick timer interrupt handler
|
||||
/// and for the application to make reasonable forward progress. If tick_period
|
||||
/// is too small, the timer interrupt may re-trigger before the timer interrupt
|
||||
/// handler has returned to the application, thus keeping the processor busy in
|
||||
/// constantly executing the timer interrupt handler without leaving any cycles
|
||||
/// for the application. Or, the application might get some cycles but only a
|
||||
/// fraction of what is spent in the timer interrupt handler, thus severely
|
||||
/// impacting application performance.
|
||||
///
|
||||
/// The exact number of cycles needed to execute the timer interrupt handler
|
||||
/// is not specified here. It depends on many factors (e.g. use of caches,
|
||||
/// various processor configuration options, etc) and can vary by orders of
|
||||
/// magnitude. Also note that the time to execute this handler is variable:
|
||||
/// when timers expire upon a given tick timer interrupt, their respective
|
||||
/// timer handler functions are called from within the interrupt handler.
|
||||
///
|
||||
/// \param timer_num Which Xtensa timer to use (0..2). This timer
|
||||
/// must exist and be configured at level 1 or at a
|
||||
/// medium-priority interrupt level (<=EXCM_LEVEL).
|
||||
/// If 'timer_num' is -1, then this function will
|
||||
/// automatically choose the highest priority timer
|
||||
/// that is suitable for use. This value will be
|
||||
/// passed to xos_system_timer_select().
|
||||
///
|
||||
/// \param tick_period Number of clock (CCOUNT) cycles between ticks.
|
||||
/// Must range between 0 and UINT32_MAX.
|
||||
/// Zero is used to specify dynamic tick (tickless)
|
||||
/// mode.
|
||||
///
|
||||
/// \return Returns XOS_OK on success, else error code.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
int32_t
|
||||
xos_start_system_timer(int32_t timer_num, uint32_t tick_period);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Get the timer number of the system timer. Useful mainly when XOS has been
|
||||
/// allowed to choose its own timer via xos_start_system_timer(). Not valid if
|
||||
/// called before the system timer has been started.
|
||||
///
|
||||
/// \return Returns one of XOS_SYS_TIMER_0, XOS_SYS_TIMER_1, XOS_SYS_TIMER_2
|
||||
/// or XOS_SYS_TIMER_EXTERNAL, or XOS_SYS_TIMER_NONE.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
int32_t
|
||||
xos_get_system_timer_num(void);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Initialize timer object.
|
||||
///
|
||||
/// \param timer Pointer to timer event structure.
|
||||
///
|
||||
/// \return Returns nothing.
|
||||
///
|
||||
/// NOTE: This function should not be called on a timer object once it has
|
||||
/// been activated.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
void xos_timer_init(XosTimer * timer);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Flags for xos_timer_start().
|
||||
//-----------------------------------------------------------------------------
|
||||
#define XOS_TIMER_DELTA 0x0000
|
||||
#define XOS_TIMER_PERIODIC 0x0001
|
||||
#define XOS_TIMER_ABSOLUTE 0x0002
|
||||
#define XOS_TIMER_FROM_NOW 0x0000
|
||||
#define XOS_TIMER_FROM_LAST 0x0010
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Start the timer, and when the timer expires, call the specified function
|
||||
/// (invoke (*fn)(arg)). If the timer is periodic, it will be automatically
|
||||
/// restarted when it expires.
|
||||
///
|
||||
/// The specified timer event structure must have been initialized before
|
||||
/// first use by calling xos_timer_init().
|
||||
///
|
||||
/// The callback function will be called in an interrupt context. Hence it is
|
||||
/// NOT safe to use any coprocessors in the function, including the FPU. If a
|
||||
/// coprocessor must be used, then its state must be saved and restored across
|
||||
/// its use.
|
||||
///
|
||||
/// NOTE: If you are using the timer only to wait on (via xos_timer_wait())
|
||||
/// then it is not necessary to specify a callback function. You should pass
|
||||
/// NULL for the callback function and zero for the callback argument.
|
||||
///
|
||||
/// \param timer Pointer to timer event structure. Must have been
|
||||
/// initialized. May be active or not.
|
||||
///
|
||||
/// \param when When to call the function (see flags).
|
||||
///
|
||||
/// \param flags Set of option flags XOS_TIMER_* \n
|
||||
/// The following flags are mutually exclusive:
|
||||
/// - XOS_TIMER_DELTA -- when is number of cycles from
|
||||
/// [see below] (default)
|
||||
/// - XOS_TIMER_PERIODIC -- when is number of cycles
|
||||
/// from [see below], and timer continually
|
||||
/// re-triggers at that interval
|
||||
/// - XOS_TIMER_ABSOLUTE -- when is absolute value of
|
||||
/// cycle count \n
|
||||
/// \n
|
||||
/// The following flags are mutually exclusive:
|
||||
/// - XOS_TIMER_FROM_NOW -- *DELTA and *PERIODIC are
|
||||
/// relative to now (default)
|
||||
/// - XOS_TIMER_FROM_LAST -- *DELTA and *PERIODIC are
|
||||
/// relative to the timer event's last specified expiry
|
||||
/// time (usually in the future if active, in the past
|
||||
/// if not, absolute 0 if was never activated).
|
||||
///
|
||||
/// \param func Function to call (called in timer interrupt context).
|
||||
/// This argument is optional. Specify NULL if no function
|
||||
/// is to be called.
|
||||
///
|
||||
/// \param arg Argument passed to callback function. Only relevant if
|
||||
/// 'func' is not NULL.
|
||||
///
|
||||
/// \return Returns XOS_OK on success, else error code.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
int32_t
|
||||
xos_timer_start(XosTimer * timer,
|
||||
uint64_t when,
|
||||
uint32_t flags,
|
||||
XosTimerFunc * func,
|
||||
void * arg);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Stop the timer and remove it from the list of active timers. Has no effect
|
||||
/// if the timer is not active. Any waiting threads are woken up.
|
||||
///
|
||||
/// The timer structure must have been initialized at least once, else its
|
||||
/// contents are undefined and can lead to unpredictable results.
|
||||
///
|
||||
/// \param timer Pointer to timer object.
|
||||
///
|
||||
/// \return Returns XOS_OK on success, else error code.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
int32_t
|
||||
xos_timer_stop(XosTimer * timer);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Reset and restart the timer.
|
||||
///
|
||||
/// The timer is reset to go off at time "when" from now. If the timer was not
|
||||
/// active, it will be activated. If the timer was active, it will be restarted.
|
||||
/// If the timer is periodic, the period will be set to "when".
|
||||
/// The timer object must have been initialized at some point before this call.
|
||||
///
|
||||
/// \param timer Pointer to timer object.
|
||||
///
|
||||
/// \param when Number of cycles from now that the timer will expire.
|
||||
///
|
||||
/// \return Returns XOS_OK on success, else error code.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
int32_t
|
||||
xos_timer_restart(XosTimer * timer, uint64_t when);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Check if the timer is active. The timer is active if it has been started
|
||||
/// and not yet expired or canceled.
|
||||
///
|
||||
/// \param timer Pointer to timer object.
|
||||
///
|
||||
/// \return Returns non-zero if the timer is active, else zero.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
static inline int32_t
|
||||
xos_timer_is_active(XosTimer * timer)
|
||||
{
|
||||
return timer ? timer->active : 0;
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Get the repeat period for a periodic timer. For a one-shot timer this will
|
||||
/// return zero. The period is reported in system clock cycles.
|
||||
///
|
||||
/// \param timer Pointer to timer object.
|
||||
///
|
||||
/// \return Returns period in cycles, or zero for non-periodic timers.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
static inline uint64_t
|
||||
xos_timer_get_period(XosTimer * timer)
|
||||
{
|
||||
return timer ? timer->delta : 0;
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Set the repeat period for a periodic timer. The period must be specified
|
||||
/// in system clock cycles.
|
||||
///
|
||||
/// If the timer is active, the change in period does not take effect until
|
||||
/// the timer expires at least once after this call.
|
||||
/// Note that setting a period of zero will effectively turn a periodic timer
|
||||
/// into a one-shot timer. Similarly, a one-shot timer can be turned into a
|
||||
/// periodic timer.
|
||||
///
|
||||
/// \param timer Pointer to timer object.
|
||||
///
|
||||
/// \param period Repeat period in system clock cycles.
|
||||
///
|
||||
/// \return Returns XOS_OK on success, else error code.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
int32_t
|
||||
xos_timer_set_period(XosTimer * timer, uint64_t period);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Get the current system cycle count. This accounts for the periodic rollover
|
||||
/// of the 32-bit CCOUNT cycle counter and returns a 64-bit value.
|
||||
///
|
||||
/// \return Returns the current system cycle count.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
static inline uint64_t
|
||||
xos_get_system_cycles(void)
|
||||
{
|
||||
extern uint64_t xos_system_cycles;
|
||||
extern uint32_t xos_last_ccount;
|
||||
|
||||
// xos_last_ccount was updated when xos_system_cycles was last updated.
|
||||
// We need to add in the number of cycles elapsed since then.
|
||||
return xos_system_cycles + (xos_get_ccount() - xos_last_ccount);
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Put calling thread to sleep for at least the specified number of cycles.
|
||||
/// The actual number of cycles spent sleeping may be larger depending upon
|
||||
/// the granularity of the system timer. Once the specified time has elapsed
|
||||
/// the thread will be woken and made ready.
|
||||
///
|
||||
/// \param cycles Number of system clock cycles to sleep.
|
||||
///
|
||||
/// \return Returns XOS_OK on success, else error code.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
int32_t
|
||||
xos_thread_sleep(uint64_t cycles);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Put calling thread to sleep for at least the specified number of msec.
|
||||
/// The actual amount of time spent sleeping may be larger depending upon
|
||||
/// the granularity of the system timer. Once the specified time has elapsed
|
||||
/// the thread will be woken and made ready.
|
||||
///
|
||||
/// \return msecs The number of milliseconds to sleep.
|
||||
///
|
||||
/// \return Returns XOS_OK on success, else error code.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
static inline int32_t
|
||||
xos_thread_sleep_msec(uint64_t msecs)
|
||||
{
|
||||
return xos_thread_sleep(xos_msecs_to_cycles(msecs));
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Put calling thread to sleep for at least the specified number of usec.
|
||||
/// The actual amount of time spent sleeping may be larger depending upon
|
||||
/// the granularity of the system timer. Once the specified time has elapsed
|
||||
/// the thread will be woken and made ready.
|
||||
///
|
||||
/// \return usecs The number of microseconds to sleep.
|
||||
///
|
||||
/// \return Returns XOS_OK on success, else error code.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
static inline int32_t
|
||||
xos_thread_sleep_usec(uint64_t usecs)
|
||||
{
|
||||
return xos_thread_sleep(xos_usecs_to_cycles(usecs));
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Wait on a timer until it expires or is cancelled. The calling thread will
|
||||
/// be blocked. The timer must be active.
|
||||
/// NOTE: This operation is only available if XOS_OPT_TIMER_WAIT is set
|
||||
/// to 1 in the configuration options.
|
||||
///
|
||||
/// \param timer Pointer to timer object.
|
||||
///
|
||||
/// \return Returns XOS_OK on normal timeout, else an error code.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
int32_t
|
||||
xos_timer_wait(XosTimer * timer);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// System timer control interface.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Defines for system timer ID.
|
||||
//-----------------------------------------------------------------------------
|
||||
#define XOS_SYS_TIMER_0 0 ///< Internal timer 0
|
||||
#define XOS_SYS_TIMER_1 1 ///< Internal timer 1
|
||||
#define XOS_SYS_TIMER_2 2 ///< Internal timer 2
|
||||
#define XOS_SYS_TIMER_EXTERNAL -2 ///< External timer
|
||||
#define XOS_SYS_TIMER_NONE -1 ///< No system timer selected
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// This function handles XOS timer tick processing. It must be called by the
|
||||
/// timer interrupt handler on every timer interrupt. This function computes
|
||||
/// the time to the next tick and sets it up by calling xos_system_timer_set().
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
void
|
||||
xos_tick_handler(void);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Selects the timer to use. The selection may be one of the internal timers
|
||||
/// or an external timer. The default implementation selects an internal timer.
|
||||
/// This function can be overridden to provide custom timer processing or to
|
||||
/// support an external timer.
|
||||
///
|
||||
/// \param timer_num The internal timer number to select (0-2) or
|
||||
/// -1 to auto-select a timer. This parameter can
|
||||
/// be ignored by custom implementations that use
|
||||
/// an external timer.
|
||||
///
|
||||
/// \param psel Pointer to a location where the selected timer
|
||||
/// ID must be returned. The timer ID must be one
|
||||
/// of XOS_SYS_TIMER_0, XOS_SYS_TIMER_1, XOS_SYS_TIMER_2
|
||||
/// or XOS_SYS_TIMER_EXTERNAL.
|
||||
///
|
||||
/// \return Returns XOS_OK on success, else error code.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
int32_t
|
||||
xos_system_timer_select(int32_t timer_num, int32_t *psel);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Starts the system timer and sets up the first interrupt. This function can
|
||||
/// be overridden to provide custom timer processing or to support an external
|
||||
/// timer.
|
||||
///
|
||||
/// \param cycles The number of CPU cycles from now when the
|
||||
/// first interrupt must occur.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
void
|
||||
xos_system_timer_init(uint32_t cycles);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// Sets the next trigger value of the system timer. The parameter 'cycles' is
|
||||
/// the number of CPU cycles from now when the interrupt must occur.
|
||||
/// This function can be overridden to provide custom timer processing or to
|
||||
/// support an external timer.
|
||||
///
|
||||
/// \param cycles The number of CPU cycles from now when the
|
||||
/// next interrupt must occur.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
void
|
||||
xos_system_timer_set(uint32_t cycles);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // __XOS_TIMER_H__
|
||||
|
@ -1,75 +0,0 @@
|
||||
/** @file */
|
||||
// xos_types.h - XOS type definitions.
|
||||
|
||||
// Copyright (c) 2003-2015 Cadence Design Systems, Inc.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included
|
||||
// in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
// NOTE: Do not include this file directly in your application. Including
|
||||
// xos.h will automatically include this file.
|
||||
|
||||
|
||||
#ifndef __XOS_TYPES_H__
|
||||
#define __XOS_TYPES_H__
|
||||
|
||||
#if !defined(_ASMLANGUAGE) && !defined(__ASSEMBLER__)
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// The following are defined here because of the variations in the C libraries
|
||||
// that we need to work with.
|
||||
// - Not all of them have stdbool.h
|
||||
// - Not all of them define NULL as (void *)0
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// XOS define for NULL value. This makes the NULL value independent of the
|
||||
/// C library (not all of them define NULL the same way).
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
#define XOS_NULL ((void *)0)
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///
|
||||
/// XOS definition of 'bool' type. Some C libraries do not support stdbool.h.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
#ifndef bool
|
||||
#define bool int8_t
|
||||
#define false 0 ///< XOS definition of 'false'
|
||||
#define true 1 ///< XOS definition of 'true'
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // !defined(_ASMLANGUAGE) && !defined(__ASSEMBLER__)
|
||||
|
||||
#endif // __XOS_TYPES_H__
|
||||
|
@ -1,183 +0,0 @@
|
||||
/*
|
||||
* Customer ID=11656; Build=0x5f626; Copyright (c) 2012 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef __XT_PERFMON_H__
|
||||
#define __XT_PERFMON_H__
|
||||
|
||||
#include <xtensa/config/core.h>
|
||||
#include <xtensa/xt_perf_consts.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef int counter_id_t;
|
||||
|
||||
/* xt_perf_init
|
||||
|
||||
Initialize the performance monitor library. Ordinarily, this
|
||||
function is called automatically via the .init section. If your
|
||||
environment does not support the .init section, you will need to
|
||||
call this function from your code.
|
||||
*/
|
||||
|
||||
extern void xt_perf_init(void);
|
||||
|
||||
/* xt_perf_enable
|
||||
|
||||
Turn on the performance monitor. Ordinarily, counting is off by
|
||||
default. If you turn off performance monitor using xt_perf_disable or
|
||||
by call to a function that disables performance monitor, you can turn
|
||||
it on again via this function.
|
||||
*/
|
||||
|
||||
extern void xt_perf_enable(void);
|
||||
|
||||
/* xt_perf_disable
|
||||
|
||||
Turn off the performance monitor. If you want to suspend counting
|
||||
events for a portion of your code, use this function and then call
|
||||
xt_perf_enable when you want to start again.
|
||||
*/
|
||||
|
||||
extern void xt_perf_disable(void);
|
||||
|
||||
/* xt_perf_clear
|
||||
|
||||
Disable performance monitor and clear all initialized hardware counters.
|
||||
All counter ids are invalid after call to this function and all hardware
|
||||
counters available for initialization.
|
||||
*/
|
||||
|
||||
extern void xt_perf_clear (void);
|
||||
|
||||
/* xt_perf_counters_num
|
||||
|
||||
Returns number of free hardware performance counters. After call to xt_perf_clear
|
||||
all counters are free and available for initialization. With each successful
|
||||
xt_perf_init_counter/xt_perf_init_event call this number is decreasing until
|
||||
no free counters available.
|
||||
*/
|
||||
|
||||
extern int xt_perf_counters_num (void);
|
||||
|
||||
/* xt_perf_init_counter32
|
||||
|
||||
Setup 32 bit performance counter. This function disables performance monitor
|
||||
if it was enabled.
|
||||
|
||||
Returns zero based counter id on success or negative value if failed.
|
||||
This function may fail if there is insufficient number of free hardware
|
||||
counters or function arguments are invalid.
|
||||
|
||||
The counter id returned on success can be used with xt_perf_reset_counter
|
||||
and xt_perf_counter32 functions.
|
||||
|
||||
<selector> - events group, one of XTPERF_CNT constants defined in
|
||||
xt_perf_consts.h;
|
||||
<mask> - events mask for selected group. Mask bit fields for each
|
||||
selector defined with XTPERF_MASK prefix in xt_perf_consts.h;
|
||||
<trace_level> - specifies interrupt levels at which to count events;
|
||||
if trace_level is greater or equal to zero events are
|
||||
counted only at interrupt levels below or equal to
|
||||
trace_level; if trace_level is negative events are
|
||||
counted only at (-trace_level) interrupt level or higher.
|
||||
*/
|
||||
|
||||
|
||||
extern counter_id_t xt_perf_init_counter32 ( unsigned int selector,
|
||||
unsigned int mask,
|
||||
int trace_level);
|
||||
|
||||
/* xt_perf_init_counter64
|
||||
|
||||
Setup 64 bit performance counter. Library emulates 64 bit counters by handling
|
||||
profiling interrupt and recording overflows of 32 bit hardware counters.
|
||||
This function disables performance monitor if it was enabled.
|
||||
|
||||
Returns zero based counter id on success or negative value if failed.
|
||||
This function may fail if there is insufficient number of free hardware
|
||||
counters or function arguments are invalid.
|
||||
|
||||
The counter id returned on success can be used with xt_perf_reset_counter
|
||||
and xt_perf_counter64 functions.
|
||||
|
||||
<selector> - events group, one of XTPERF_CNT constants defined in
|
||||
xt_perf_consts.h;
|
||||
<mask> - events mask for selected group. Mask bit fields for each
|
||||
selector defined with XTPERF_MASK prefix in xt_perf_consts.h;
|
||||
<trace_level> - specifies interrupt levels at which to count events;
|
||||
if trace_level is greater or equal to zero events are
|
||||
counted only at interrupt levels below or equal to
|
||||
trace_level; if trace_level is negative events are
|
||||
counted only at (-trace_level) interrupt level or higher.
|
||||
*/
|
||||
|
||||
extern counter_id_t xt_perf_init_counter64 ( unsigned int selector,
|
||||
unsigned int mask,
|
||||
int trace_level);
|
||||
|
||||
/* xt_perf_reset_counter
|
||||
|
||||
Reset counter value to 0.
|
||||
Returns zero on success or non zero if failed.
|
||||
*/
|
||||
|
||||
extern int xt_perf_reset_counter (counter_id_t counter_id);
|
||||
|
||||
/* xt_perf_counter32
|
||||
|
||||
Read 32 bit counter value.
|
||||
|
||||
Returns zero if counter id is not valid.
|
||||
*/
|
||||
|
||||
extern unsigned int xt_perf_counter32 (counter_id_t counter_id);
|
||||
|
||||
/* xt_perf_counter64
|
||||
|
||||
Read 64 bit counter value.
|
||||
|
||||
Counter must be initialized using xt_perf_init_counter64 function.
|
||||
|
||||
Returns zero if counter id is not valid.
|
||||
*/
|
||||
|
||||
extern unsigned long long xt_perf_counter64 (counter_id_t counter_id);
|
||||
|
||||
/* xt_perf_overflow32
|
||||
|
||||
Read overflow flag of 32 bit counter. This flag is dropped when
|
||||
counter initialized or reset. Once counter overflows and wraps
|
||||
around the flag is set and stays set until counter reset.
|
||||
|
||||
Returns negative value if counter id is invalid, zero if counter
|
||||
not overflowed, positive if in overflowed state.
|
||||
*/
|
||||
|
||||
extern int xt_perf_overflow32 (counter_id_t counter_id);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __XT_PERFMON_H__ */
|
@ -1,233 +0,0 @@
|
||||
/*
|
||||
* Customer ID=11656; Build=0x5f626; Copyright (c) 2005-2012 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
* They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
* third parties in any manner, medium, or form, in whole or in part, without
|
||||
* the prior written consent of Tensilica Inc.
|
||||
*/
|
||||
|
||||
#ifndef __XT_PROFILER_H__
|
||||
#define __XT_PROFILER_H__
|
||||
|
||||
#include <xtensa/config/core.h>
|
||||
|
||||
#if XCHAL_NUM_PERF_COUNTERS
|
||||
/* Performance monitor counters constants */
|
||||
#include <xtensa/xt_perf_consts.h>
|
||||
|
||||
#endif /* XCHAL_NUM_PERF_COUNTERS */
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* This file defines an interface that allows a program being profiled
|
||||
to control when and how it is profiled, whether it is running under
|
||||
the instruction set simulator or under the hardware profiler.
|
||||
|
||||
Both ISS and HWP implement this interface, although in different
|
||||
ways. Both also do the right thing if you don't call any of these
|
||||
functions.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
xt_profile_init
|
||||
|
||||
ISS: a no op.
|
||||
|
||||
HWP: Initialize the profiler. Ordinarily, this function is called
|
||||
automatically via the .init section. If your environment does not
|
||||
support the .init section, you will need to call this function
|
||||
by hand.
|
||||
*/
|
||||
extern void xt_profile_init(void);
|
||||
|
||||
/*
|
||||
xt_profile_add_memory
|
||||
|
||||
ISS: a no op.
|
||||
|
||||
HWP:
|
||||
Makes "buf_size" bytes at "buf" available to the hardware profiler.
|
||||
This buffer should be initialized to zeros prior to this call.
|
||||
|
||||
The hardware profiler has already estimated the amount of memory it needs,
|
||||
but under certain circumstances may still run out of memory. If so, you can
|
||||
provide more memory with this routine.
|
||||
|
||||
*/
|
||||
extern void xt_profile_add_memory(void * buf, unsigned int buf_size);
|
||||
|
||||
|
||||
/* xt_profile_enable
|
||||
|
||||
Turn on the profiler. Ordinarily, profiling is on by default.
|
||||
If you turn off profiling using xt_profile_disable, You can turn
|
||||
it on again via this function.
|
||||
*/
|
||||
extern void xt_profile_enable(void);
|
||||
|
||||
/* xt_profile_disable
|
||||
|
||||
Turn off the profiler. If you don't want to profile a portion of your code,
|
||||
use this function and then xt_profile_enable when you want to start again.
|
||||
*/
|
||||
extern void xt_profile_disable(void);
|
||||
|
||||
/* xt_profile_save_and_reset
|
||||
|
||||
Save and reset the profiler's data.
|
||||
If there were errors, either during profiling or while attempting to
|
||||
write the data, no data will be written and this function will
|
||||
return non-zero.
|
||||
|
||||
*/
|
||||
extern int xt_profile_save_and_reset(void);
|
||||
|
||||
/* xt_profile_get_frequency
|
||||
|
||||
ISS: always returns 1.
|
||||
|
||||
HWP:
|
||||
Returns the number of cycles between samples for timer based profiler.
|
||||
In performance counters based profiler always returns 1.
|
||||
*/
|
||||
extern unsigned int xt_profile_get_frequency(void);
|
||||
|
||||
/* xt_profile_set_frequency
|
||||
|
||||
ISS: a no op.
|
||||
|
||||
HWP:
|
||||
Set the number of cycles between samples for timer based profiler.
|
||||
Ignored in performance counters based profiler.
|
||||
|
||||
sample frequency is the number of cycles to wait between samples. It should
|
||||
be a multiple of 1024.
|
||||
|
||||
If you set the sample frequency to a different value than was passed in xt_profile_init,
|
||||
then the labels in the output will reflect the later frequency, even though some samples may
|
||||
have been taken at the earlier frequency. Typically this does not make a significant difference
|
||||
in the results if this function is called early enough.
|
||||
*/
|
||||
extern void xt_profile_set_frequency(unsigned int sample_frequency);
|
||||
|
||||
/* xt_profile_num_errors
|
||||
|
||||
ISS: always returns 0
|
||||
|
||||
HWP:
|
||||
Returns the number of errors that occured while taking samples. Typically these
|
||||
are out of memory errors and you need to pass a bigger buffer to
|
||||
xt_profile_add_memory
|
||||
*/
|
||||
extern int xt_profile_num_errors(void);
|
||||
|
||||
|
||||
#if XCHAL_NUM_PERF_COUNTERS
|
||||
|
||||
|
||||
/* xt_profile_randomize
|
||||
|
||||
ISS: not available
|
||||
|
||||
HWP: Available in performance monitor based profiler.
|
||||
|
||||
Turns on or off sampling period randomization mode. Period randomization
|
||||
helps to avoid aliasing problems when code being profiled is highly periodic.
|
||||
Profiler maintains same average sampling period but individual sampling
|
||||
steps may vary.
|
||||
Period randomization is turned off by default.
|
||||
|
||||
<value> - non zero turns randomization on,
|
||||
zero turns randomization off.
|
||||
*/
|
||||
|
||||
extern void xt_profile_randomization(int value);
|
||||
|
||||
/* xt_profile_config_clear
|
||||
|
||||
ISS: not available
|
||||
|
||||
HWP: Available in performance monitor based profiler.
|
||||
|
||||
Stops profiling if it was enabled and clears performance counters
|
||||
parameters. Accumulated profile data stays in memory and will be
|
||||
saved when xt_profile_save_and_reset is called or at program exit.
|
||||
Number of configured performance counters is zero after this
|
||||
function call.
|
||||
*/
|
||||
|
||||
extern void xt_profile_config_clear(void);
|
||||
|
||||
|
||||
/* xt_profile_config_num
|
||||
|
||||
ISS: not available
|
||||
|
||||
HWP: Available in performance monitor based profiler.
|
||||
|
||||
Returns number of free performance counters.
|
||||
*/
|
||||
|
||||
extern int xt_profile_config_num(void);
|
||||
|
||||
|
||||
/* xt_profile_config_counter error codes
|
||||
*/
|
||||
|
||||
#define XTPROF_ERR_OUT_OF_MEM -1
|
||||
#define XTPROF_ERR_INVALID_ARGS -2
|
||||
#define XTPROF_ERR_NOT_ENOUGH_COUNTERS -3
|
||||
#define XTPROF_ERR_DEFUNCT -4
|
||||
|
||||
/* xt_profile_config_counter
|
||||
|
||||
ISS: not available
|
||||
|
||||
HWP: Available in performance monitor based profiler.
|
||||
|
||||
Allocating and initializing one or more performance counter for sampling.
|
||||
Even though event may require multiple performance counters allocated the
|
||||
profile data for event is merged and dumped into single gmon file.
|
||||
This function disables profiling if it was enabled.
|
||||
|
||||
Returns 0 on success, non zero if failed:
|
||||
XTPROF_ERR_OUT_OF_MEM - memory allocation failed;
|
||||
XTPROF_ERR_INVALID_ARGS - invalid function parameters;
|
||||
XTPROF_ERR_NOT_ENOUGH_COUNTERS - not enough free performance counters available;
|
||||
XTPROF_ERR_DEFUNCT - profiling is disabled because of previous errors
|
||||
(xt_profile_num_errors() is non zero)
|
||||
|
||||
<selector> - events group, one of XTPERF_CNT constants defined in xt_perf_consts.h
|
||||
<mask> - events mask for selected group. Mask bit fields for each
|
||||
selector defined with XTPERF_MASK prefix in xt_perf_consts.h
|
||||
<trace_level> - specifies interrupt levels at which to take samples;
|
||||
if trace_level is greater or equal to zero samples are
|
||||
taken only at interrupt levels below or equal to
|
||||
trace_level; if trace_level is negative samples are taken
|
||||
only at (-trace_level) interrupt level or higher.
|
||||
<period> - sampling period; 1 - record every event, 2 - record every
|
||||
other event and so on;
|
||||
Please note - there is overhead associated with events recording,
|
||||
high frequency events may produce incorrect profile when period
|
||||
is too small.
|
||||
*/
|
||||
|
||||
extern int xt_profile_config_counter ( unsigned int selector,
|
||||
unsigned int mask,
|
||||
int trace_level,
|
||||
unsigned int period);
|
||||
|
||||
|
||||
|
||||
#endif /* XCHAL_NUM_PERF_COUNTERS */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __XT_PROFILER_H__ */
|
@ -1,86 +0,0 @@
|
||||
/*
|
||||
* Customer ID=11656; Build=0x5f626; Copyright (c) 2009-2013 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* copyrighted works and confidential proprietary information of
|
||||
* Tensilica Inc. They may be adapted and modified by bona fide
|
||||
* purchasers for internal use, but neither the original nor any
|
||||
* adapted or modified version may be disclosed or distributed to
|
||||
* third parties in any manner, medium, or form, in whole or in part,
|
||||
* without the prior written consent of Tensilica Inc.
|
||||
*
|
||||
* This software and its derivatives are to be executed solely on
|
||||
* products incorporating a Tensilica processor.
|
||||
*/
|
||||
|
||||
// Utility routines for returning pass/fail status in HW simulations
|
||||
|
||||
#ifndef XT_REF_TESTBENCH_H
|
||||
#define XT_REF_TESTBENCH_H 1
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
// Exit routines for HW simulation
|
||||
extern int diag_pass();
|
||||
extern int diag_fail();
|
||||
|
||||
// Set exit status for HW simulation
|
||||
int set_diag_status(int stat);
|
||||
|
||||
// Setup for user power toggling
|
||||
extern int setup_power_toggle();
|
||||
|
||||
// Return exit status location
|
||||
extern unsigned int* testbench_exit_location();
|
||||
// Return power toggle location
|
||||
extern unsigned int* testbench_power_toggle_location();
|
||||
|
||||
|
||||
// Change exit status location
|
||||
// You must also change the plusarg "+DVMagicExit" sent to the HW simulator
|
||||
// or change the argument "--exit_location" sent to the ISS
|
||||
extern unsigned int* set_testbench_exit_location(unsigned int*);
|
||||
// Change power toggle location
|
||||
// You must also change the plusarg "+DVPowerLoc" sent to the HW simulator
|
||||
extern unsigned int* set_testbench_power_toggle_location(unsigned int*);
|
||||
|
||||
// Exit routines with status message
|
||||
//
|
||||
static inline
|
||||
int pass(const char *msg)
|
||||
{
|
||||
return diag_pass();
|
||||
}
|
||||
|
||||
static inline
|
||||
int fail(const char *msg)
|
||||
{
|
||||
return diag_fail();
|
||||
}
|
||||
|
||||
#define POWER_TOGGLE_ON 1
|
||||
#define POWER_TOGGLE_OFF 0
|
||||
|
||||
// Routine to turn on and off power toggle
|
||||
// Does a magic write that Monitors.v intercepts and appropriately turns
|
||||
// SAIF dumping on and offf
|
||||
//
|
||||
extern volatile unsigned int *_reftb_power_toggle;
|
||||
|
||||
__attribute__ ((always_inline))
|
||||
static inline
|
||||
int set_power_toggle(int val)
|
||||
{
|
||||
#ifdef __XTENSA__
|
||||
*_reftb_power_toggle = val;
|
||||
#endif
|
||||
return val;
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // XT_REF_TESTBENCH_H
|
||||
|
@ -1,313 +0,0 @@
|
||||
/* Copyright (c) 2007-2013 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
/ These coded instructions, statements, and computer programs are the
|
||||
/ copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
/ They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
/ third parties in any manner, medium, or form, in whole or in part, without
|
||||
/ the prior written consent of Tensilica Inc.
|
||||
*/
|
||||
|
||||
/* xtav110.h - Xtensa Avnet LX110 (XT-AV110) board specific definitions */
|
||||
|
||||
#ifndef _INC_XTAV110_H_
|
||||
#define _INC_XTAV110_H_
|
||||
|
||||
#include <xtensa/config/core.h>
|
||||
#include <xtensa/config/system.h>
|
||||
|
||||
#define XTBOARD_NAME "XT-AV110"
|
||||
|
||||
|
||||
/*
|
||||
* Default assignment of XTAV110 devices to external interrupts.
|
||||
*/
|
||||
|
||||
/* Ethernet interrupt: */
|
||||
#ifdef XCHAL_EXTINT1_NUM
|
||||
#define ETHERNET_INTNUM XCHAL_EXTINT1_NUM
|
||||
#define ETHERNET_INTLEVEL XCHAL_EXTINT1_LEVEL
|
||||
#define ETHERNET_INTMASK XCHAL_EXTINT1_MASK
|
||||
#else
|
||||
#define ETHERNET_INTMASK 0
|
||||
#endif
|
||||
|
||||
/* UART interrupt: */
|
||||
#ifdef XCHAL_EXTINT0_NUM
|
||||
#define UART16550_INTNUM XCHAL_EXTINT0_NUM
|
||||
#define UART16550_INTLEVEL XCHAL_EXTINT0_LEVEL
|
||||
#define UART16550_INTMASK XCHAL_EXTINT0_MASK
|
||||
#else
|
||||
#define UART16550_INTMASK 0
|
||||
#endif
|
||||
|
||||
/* Audio output interrupt (I2S transmitter FIFO): */
|
||||
#ifdef XCHAL_EXTINT2_NUM
|
||||
#define AUDIO_I2S_OUT_INTNUM XCHAL_EXTINT2_NUM
|
||||
#define AUDIO_I2S_OUT_INTLEVEL XCHAL_EXTINT2_LEVEL
|
||||
#define AUDIO_I2S_OUT_INTMASK XCHAL_EXTINT2_MASK
|
||||
#else
|
||||
#define AUDIO_I2S_OUT_INTMASK 0
|
||||
#endif
|
||||
|
||||
/* Audio input interrupt (I2S receiver FIFO): */
|
||||
#ifdef XCHAL_EXTINT3_NUM
|
||||
#define AUDIO_I2S_IN_INTNUM XCHAL_EXTINT3_NUM
|
||||
#define AUDIO_I2S_IN_INTLEVEL XCHAL_EXTINT3_LEVEL
|
||||
#define AUDIO_I2S_IN_INTMASK XCHAL_EXTINT3_MASK
|
||||
#else
|
||||
#define AUDIO_I2S_IN_INTMASK 0
|
||||
#endif
|
||||
|
||||
/* I2C interrupt */
|
||||
#ifdef XCHAL_EXTINT4_NUM
|
||||
#define I2C_INTNUM XCHAL_EXTINT4_NUM
|
||||
#define I2C_INTLEVEL XCHAL_EXTINT4_LEVEL
|
||||
#define I2C_INTMASK XCHAL_EXTINT4_MASK
|
||||
#else
|
||||
#define I2C_INTMASK 0
|
||||
#endif
|
||||
|
||||
/* USB interrupt */
|
||||
#ifdef XCHAL_EXTINT5_NUM
|
||||
#define USB_INTNUM XCHAL_EXTINT5_NUM
|
||||
#define USB_INTLEVEL XCHAL_EXTINT5_LEVEL
|
||||
#define USB_INTMASK XCHAL_EXTINT5_MASK
|
||||
#else
|
||||
#define USB_INTMASK 0
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Device addresses.
|
||||
*
|
||||
* Note: for endianness-independence, use 32-bit loads and stores for all
|
||||
* register accesses to Ethernet, UART and LED devices. Undefined bits
|
||||
* may need to be masked out if needed when reading if the actual register
|
||||
* size is smaller than 32 bits.
|
||||
*
|
||||
* Note: XTAV110 bus byte lanes are defined in terms of msbyte and lsbyte
|
||||
* relative to the processor. So 32-bit registers are accessed consistently
|
||||
* from both big and little endian processors. However, this means byte
|
||||
* sequences are not consistent between big and little endian processors.
|
||||
* This is fine for RAM, and for ROM if ROM is created for a specific
|
||||
* processor (and thus has correct byte sequences). However this may be
|
||||
* unexpected for Flash, which might contain a file-system that one wants
|
||||
* to use for multiple processor configurations (eg. the Flash might contain
|
||||
* the Ethernet card's address, endianness-independent application data, etc).
|
||||
* That is, byte sequences written in Flash by a core of a given endianness
|
||||
* will be byte-swapped when seen by a core of the other endianness.
|
||||
* Someone implementing an endianness-independent Flash file system will
|
||||
* likely handle this byte-swapping issue in the Flash driver software.
|
||||
*/
|
||||
|
||||
#define XTBOARD_FLASH_MAXSIZE 0x1000000 /* 16 MB */
|
||||
|
||||
#ifdef XSHAL_IOBLOCK_BYPASS_PADDR
|
||||
|
||||
/* Flash Memory: */
|
||||
# define XTBOARD_FLASH_PADDR (XSHAL_IOBLOCK_BYPASS_PADDR+0x08000000)
|
||||
|
||||
/* FPGA registers: */
|
||||
# define XTBOARD_FPGAREGS_PADDR (XSHAL_IOBLOCK_BYPASS_PADDR+0x0D020000)
|
||||
|
||||
/* Ethernet controller/transceiver SONIC SN83934: */
|
||||
# define ETHERNET_PADDR (XSHAL_IOBLOCK_BYPASS_PADDR+0x0D030000)
|
||||
|
||||
|
||||
/* UART National-Semi PC16550D: */
|
||||
# define UART16550_PADDR (XSHAL_IOBLOCK_BYPASS_PADDR+0x0D050000)
|
||||
|
||||
/* I2S transmitter */
|
||||
# define AUDIO_I2S_OUT_PADDR (XSHAL_IOBLOCK_BYPASS_PADDR+0x0D080000)
|
||||
|
||||
/* I2S receiver */
|
||||
# define AUDIO_I2S_IN_PADDR (XSHAL_IOBLOCK_BYPASS_PADDR+0x0D088000)
|
||||
|
||||
/* I2C master */
|
||||
# define I2C_PADDR (XSHAL_IOBLOCK_BYPASS_PADDR+0x0D090000)
|
||||
|
||||
/* SPI controller */
|
||||
# define SPI_PADDR (XSHAL_IOBLOCK_BYPASS_PADDR+0x0D0A0000)
|
||||
|
||||
/* Display controller Sunplus SPLC780D, 4bit mode,
|
||||
* LCD Display MYTech MOC-16216B-B: */
|
||||
# define SPLC780D_4BIT_PADDR (XSHAL_IOBLOCK_BYPASS_PADDR+0x0D0C0000)
|
||||
|
||||
/* USB Controller */
|
||||
# define USB_PADDR (XSHAL_IOBLOCK_BYPASS_PADDR+0x0D0D0000)
|
||||
|
||||
/* Ethernet buffer: */
|
||||
# define ETHERNET_BUFFER_PADDR (XSHAL_IOBLOCK_BYPASS_PADDR+0x0D800000)
|
||||
|
||||
#endif /* XSHAL_IOBLOCK_BYPASS_PADDR */
|
||||
|
||||
/* These devices might be accessed cached: */
|
||||
#ifdef XSHAL_IOBLOCK_CACHED_PADDR
|
||||
# define XTBOARD_FLASH_CACHED_PADDR (XSHAL_IOBLOCK_CACHED_PADDR+0x08000000)
|
||||
# define ETHERNET_BUFFER_CACHED_PADDR (XSHAL_IOBLOCK_CACHED_PADDR+0x0D800000)
|
||||
#endif /* XSHAL_IOBLOCK_CACHED_PADDR */
|
||||
|
||||
|
||||
/*** Same thing over again, this time with virtual addresses: ***/
|
||||
|
||||
#ifdef XSHAL_IOBLOCK_BYPASS_VADDR
|
||||
|
||||
/* Flash Memory: */
|
||||
# define XTBOARD_FLASH_VADDR (XSHAL_IOBLOCK_BYPASS_VADDR+0x08000000)
|
||||
|
||||
/* FPGA registers: */
|
||||
# define XTBOARD_FPGAREGS_VADDR (XSHAL_IOBLOCK_BYPASS_VADDR+0x0D020000)
|
||||
|
||||
/* Ethernet controller/transceiver SONIC SN83934: */
|
||||
# define ETHERNET_VADDR (XSHAL_IOBLOCK_BYPASS_VADDR+0x0D030000)
|
||||
|
||||
|
||||
/* UART National-Semi PC16550D: */
|
||||
# define UART16550_VADDR (XSHAL_IOBLOCK_BYPASS_VADDR+0x0D050000)
|
||||
|
||||
/* I2S transmitter */
|
||||
# define AUDIO_I2S_OUT_VADDR (XSHAL_IOBLOCK_BYPASS_VADDR+0x0D080000)
|
||||
|
||||
/* I2S receiver */
|
||||
# define AUDIO_I2S_IN_VADDR (XSHAL_IOBLOCK_BYPASS_VADDR+0x0D088000)
|
||||
|
||||
/* I2C master */
|
||||
# define I2C_VADDR (XSHAL_IOBLOCK_BYPASS_VADDR+0x0D090000)
|
||||
|
||||
/* SPI controller */
|
||||
# define SPI_VADDR (XSHAL_IOBLOCK_BYPASS_VADDR+0x0D0A0000)
|
||||
|
||||
/* Display controller Sunplus SPLC780D, 4bit mode,
|
||||
* LCD Display MYTech MOC-16216B-B: */
|
||||
# define SPLC780D_4BIT_VADDR (XSHAL_IOBLOCK_BYPASS_VADDR+0x0D0C0000)
|
||||
|
||||
/* USB Controller */
|
||||
# define USB_VADDR (XSHAL_IOBLOCK_BYPASS_VADDR+0x0D0D0000)
|
||||
|
||||
/* Ethernet buffer: */
|
||||
# define ETHERNET_BUFFER_VADDR (XSHAL_IOBLOCK_BYPASS_VADDR+0x0D800000)
|
||||
|
||||
#endif /* XSHAL_IOBLOCK_BYPASS_VADDR */
|
||||
|
||||
/* These devices might be accessed cached: */
|
||||
#ifdef XSHAL_IOBLOCK_CACHED_VADDR
|
||||
# define XTBOARD_FLASH_CACHED_VADDR (XSHAL_IOBLOCK_CACHED_VADDR+0x08000000)
|
||||
# define ETHERNET_BUFFER_CACHED_VADDR (XSHAL_IOBLOCK_CACHED_VADDR+0x0D800000)
|
||||
#endif /* XSHAL_IOBLOCK_CACHED_VADDR */
|
||||
|
||||
|
||||
/* System ROM: */
|
||||
#define XTBOARD_ROM_SIZE XSHAL_ROM_SIZE
|
||||
#ifdef XSHAL_ROM_VADDR
|
||||
#define XTBOARD_ROM_VADDR XSHAL_ROM_VADDR
|
||||
#endif
|
||||
#ifdef XSHAL_ROM_PADDR
|
||||
#define XTBOARD_ROM_PADDR XSHAL_ROM_PADDR
|
||||
#endif
|
||||
|
||||
/* System RAM: */
|
||||
#define XTBOARD_RAM_SIZE XSHAL_RAM_SIZE
|
||||
#ifdef XSHAL_RAM_VADDR
|
||||
#define XTBOARD_RAM_VADDR XSHAL_RAM_VADDR
|
||||
#endif
|
||||
#ifdef XSHAL_RAM_PADDR
|
||||
#define XTBOARD_RAM_PADDR XSHAL_RAM_PADDR
|
||||
#endif
|
||||
#define XTBOARD_RAM_BYPASS_VADDR XSHAL_RAM_BYPASS_VADDR
|
||||
#define XTBOARD_RAM_BYPASS_PADDR XSHAL_RAM_BYPASS_PADDR
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Things that depend on device addresses.
|
||||
*/
|
||||
|
||||
|
||||
#define XTBOARD_CACHEATTR_WRITEBACK XSHAL_XT2000_CACHEATTR_WRITEBACK
|
||||
#define XTBOARD_CACHEATTR_WRITEALLOC XSHAL_XT2000_CACHEATTR_WRITEALLOC
|
||||
#define XTBOARD_CACHEATTR_WRITETHRU XSHAL_XT2000_CACHEATTR_WRITETHRU
|
||||
#define XTBOARD_CACHEATTR_BYPASS XSHAL_XT2000_CACHEATTR_BYPASS
|
||||
#define XTBOARD_CACHEATTR_DEFAULT XSHAL_XT2000_CACHEATTR_DEFAULT
|
||||
|
||||
#define XTBOARD_BUSINT_PIPE_REGIONS XSHAL_XT2000_PIPE_REGIONS
|
||||
#define XTBOARD_BUSINT_SDRAM_REGIONS XSHAL_XT2000_SDRAM_REGIONS
|
||||
|
||||
|
||||
/*
|
||||
* FPGA registers.
|
||||
* All these registers are normally accessed using 32-bit loads/stores.
|
||||
*/
|
||||
|
||||
/* Register offsets: */
|
||||
#define XTBOARD_DATECD_OFS 0x00 /* date code (read-only) */
|
||||
#define XTBOARD_CLKFRQ_OFS 0x04 /* clock frequency Hz (read-only) */
|
||||
#define XTBOARD_SYSLED_OFS 0x08 /* LEDs */
|
||||
#define XTBOARD_DIPSW_OFS 0x0C /* DIP switch bits (read-only) */
|
||||
#define XTBOARD_SWRST_OFS 0x10 /* software reset */
|
||||
|
||||
/* Physical register addresses: */
|
||||
#ifdef XTBOARD_FPGAREGS_PADDR
|
||||
#define XTBOARD_DATECD_PADDR (XTBOARD_FPGAREGS_PADDR+XTBOARD_DATECD_OFS)
|
||||
#define XTBOARD_CLKFRQ_PADDR (XTBOARD_FPGAREGS_PADDR+XTBOARD_CLKFRQ_OFS)
|
||||
#define XTBOARD_SYSLED_PADDR (XTBOARD_FPGAREGS_PADDR+XTBOARD_SYSLED_OFS)
|
||||
#define XTBOARD_DIPSW_PADDR (XTBOARD_FPGAREGS_PADDR+XTBOARD_DIPSW_OFS)
|
||||
#define XTBOARD_SWRST_PADDR (XTBOARD_FPGAREGS_PADDR+XTBOARD_SWRST_OFS)
|
||||
#endif
|
||||
|
||||
/* Virtual register addresses: */
|
||||
#ifdef XTBOARD_FPGAREGS_VADDR
|
||||
#define XTBOARD_DATECD_VADDR (XTBOARD_FPGAREGS_VADDR+XTBOARD_DATECD_OFS)
|
||||
#define XTBOARD_CLKFRQ_VADDR (XTBOARD_FPGAREGS_VADDR+XTBOARD_CLKFRQ_OFS)
|
||||
#define XTBOARD_SYSLED_VADDR (XTBOARD_FPGAREGS_VADDR+XTBOARD_SYSLED_OFS)
|
||||
#define XTBOARD_DIPSW_VADDR (XTBOARD_FPGAREGS_VADDR+XTBOARD_DIPSW_OFS)
|
||||
#define XTBOARD_SWRST_VADDR (XTBOARD_FPGAREGS_VADDR+XTBOARD_SWRST_OFS)
|
||||
/* Register access (for C code): */
|
||||
#define XTBOARD_DATECD_REG (*(volatile unsigned*) XTBOARD_DATECD_VADDR)
|
||||
#define XTBOARD_CLKFRQ_REG (*(volatile unsigned*) XTBOARD_CLKFRQ_VADDR)
|
||||
#define XTBOARD_SYSLED_REG (*(volatile unsigned*) XTBOARD_SYSLED_VADDR)
|
||||
#define XTBOARD_DIPSW_REG (*(volatile unsigned*) XTBOARD_DIPSW_VADDR)
|
||||
#define XTBOARD_SWRST_REG (*(volatile unsigned*) XTBOARD_SWRST_VADDR)
|
||||
#endif
|
||||
|
||||
/* DATECD (date code; when core was built) bit fields: */
|
||||
/* BCD-coded month (01..12): */
|
||||
#define XTBOARD_DATECD_MONTH_SHIFT 24
|
||||
#define XTBOARD_DATECD_MONTH_BITS 8
|
||||
#define XTBOARD_DATECD_MONTH_MASK 0xFF000000
|
||||
/* BCD-coded day (01..31): */
|
||||
#define XTBOARD_DATECD_DAY_SHIFT 16
|
||||
#define XTBOARD_DATECD_DAY_BITS 8
|
||||
#define XTBOARD_DATECD_DAY_MASK 0x00FF0000
|
||||
/* BCD-coded year (2001..9999): */
|
||||
#define XTBOARD_DATECD_YEAR_SHIFT 0
|
||||
#define XTBOARD_DATECD_YEAR_BITS 16
|
||||
#define XTBOARD_DATECD_YEAR_MASK 0x0000FFFF
|
||||
|
||||
/* SYSLED (system LED) bit fields: */
|
||||
|
||||
/* LED control bits (off=0, on=1): */
|
||||
#define XTBOARD_SYSLED_USER_SHIFT 0
|
||||
#define XTBOARD_SYSLED_USER_BITS 2
|
||||
#define XTBOARD_SYSLED_USER_MASK 0x00000003
|
||||
|
||||
/* DIP Switch SW5 (left=sw1=lsb=bit0, right=sw4=msb=bit3; off=0, on=1): */
|
||||
/* DIP switch bit fields (bit2/sw3 is reserved and presently unused): */
|
||||
#define XTBOARD_DIPSW_USER_SHIFT 0 /* labeled 1-2 (1=lsb) */
|
||||
#define XTBOARD_DIPSW_USER_BITS 2
|
||||
#define XTBOARD_DIPSW_USER_MASK 0x00000003
|
||||
#define XTBOARD_DIPSW_BOOT_SHIFT 3 /* labeled 8 (msb) */
|
||||
#define XTBOARD_DIPSW_BOOT_BITS 1
|
||||
#define XTBOARD_DIPSW_BOOT_MASK 0x00000008
|
||||
/* Boot settings: bit3/sw4, off=0, on=1 (this switch controls hardware): */
|
||||
#define XTBOARD_DIPSW_BOOT_RAM (0<<XTBOARD_DIPSW_BOOT_SHIFT) /* off */
|
||||
#define XTBOARD_DIPSW_BOOT_FLASH (1<<XTBOARD_DIPSW_BOOT_SHIFT) /* on */
|
||||
|
||||
/* SWRST (software reset; allows s/w to generate power-on equivalent reset): */
|
||||
/* Software reset bits: */
|
||||
#define XTBOARD_SWRST_SWR_SHIFT 0
|
||||
#define XTBOARD_SWRST_SWR_BITS 16
|
||||
#define XTBOARD_SWRST_SWR_MASK 0x0000FFFF
|
||||
/* Software reset value -- writing this value resets the board: */
|
||||
#define XTBOARD_SWRST_RESETVALUE 0x0000DEAD
|
||||
|
||||
|
||||
#endif /*_INC_XTAV110_H_*/
|
||||
|
@ -1,13 +0,0 @@
|
||||
/*
|
||||
* board.h - Include board-specific definitions
|
||||
*
|
||||
* Copyright (c) 2010 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
* They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
* third parties in any manner, medium, or form, in whole or in part, without
|
||||
* the prior written consent of Tensilica Inc.
|
||||
*/
|
||||
|
||||
#include <xtensa/xtav110.h>
|
||||
|
@ -1,280 +0,0 @@
|
||||
/* Copyright (c) 2007-2013 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
/ These coded instructions, statements, and computer programs are the
|
||||
/ copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
/ They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
/ third parties in any manner, medium, or form, in whole or in part, without
|
||||
/ the prior written consent of Tensilica Inc.
|
||||
*/
|
||||
|
||||
/* xtav200.h - Xtensa Avnet LX200 (XT-AV200) board specific definitions */
|
||||
|
||||
#ifndef _INC_XTAV200_H_
|
||||
#define _INC_XTAV200_H_
|
||||
|
||||
#include <xtensa/config/core.h>
|
||||
#include <xtensa/config/system.h>
|
||||
|
||||
#define XTBOARD_NAME "XT-AV200"
|
||||
|
||||
|
||||
/*
|
||||
* Default assignment of XTAV200 devices to external interrupts.
|
||||
*/
|
||||
|
||||
/* Ethernet interrupt: */
|
||||
#ifdef XCHAL_EXTINT1_NUM
|
||||
#define ETHERNET_INTNUM XCHAL_EXTINT1_NUM
|
||||
#define ETHERNET_INTLEVEL XCHAL_EXTINT1_LEVEL
|
||||
#define ETHERNET_INTMASK XCHAL_EXTINT1_MASK
|
||||
#else
|
||||
#define ETHERNET_INTMASK 0
|
||||
#endif
|
||||
|
||||
/* UART interrupt: */
|
||||
#ifdef XCHAL_EXTINT0_NUM
|
||||
#define UART16550_INTNUM XCHAL_EXTINT0_NUM
|
||||
#define UART16550_INTLEVEL XCHAL_EXTINT0_LEVEL
|
||||
#define UART16550_INTMASK XCHAL_EXTINT0_MASK
|
||||
#else
|
||||
#define UART16550_INTMASK 0
|
||||
#endif
|
||||
|
||||
/* Audio output interrupt (I2S FIFO underrun): */
|
||||
#ifdef XCHAL_EXTINT2_NUM
|
||||
#define AUDIO_INTNUM XCHAL_EXTINT2_NUM
|
||||
#define AUDIO_INTLEVEL XCHAL_EXTINT2_LEVEL
|
||||
#define AUDIO_INTMASK XCHAL_EXTINT2_MASK
|
||||
#else
|
||||
#define AUDIO_INTMASK 0
|
||||
#endif
|
||||
|
||||
/* Audio output (I2S FIFO level) interrupt: */
|
||||
#ifdef XCHAL_EXTINT3_NUM
|
||||
#define AUDIO_I2SLVL_INTNUM XCHAL_EXTINT3_NUM
|
||||
#define AUDIO_I2SLVL_INTLEVEL XCHAL_EXTINT3_LEVEL
|
||||
#define AUDIO_I2SLVL_INTMASK XCHAL_EXTINT3_MASK
|
||||
#else
|
||||
#define AUDIO_I2SLVL_INTMASK 0
|
||||
#endif
|
||||
|
||||
/* Audio input (ADC FIFO level) interrupt: */
|
||||
#ifdef XCHAL_EXTINT4_NUM
|
||||
#define AUDIO_ADCLVL_INTNUM XCHAL_EXTINT4_NUM
|
||||
#define AUDIO_ADCLVL_INTLEVEL XCHAL_EXTINT4_LEVEL
|
||||
#define AUDIO_ADCLVL_INTMASK XCHAL_EXTINT4_MASK
|
||||
#else
|
||||
#define AUDIO_ADCLVL_INTMASK 0
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Device addresses.
|
||||
*
|
||||
* Note: for endianness-independence, use 32-bit loads and stores for all
|
||||
* register accesses to Ethernet, UART and LED devices. Undefined bits
|
||||
* may need to be masked out if needed when reading if the actual register
|
||||
* size is smaller than 32 bits.
|
||||
*
|
||||
* Note: XTAV200 bus byte lanes are defined in terms of msbyte and lsbyte
|
||||
* relative to the processor. So 32-bit registers are accessed consistently
|
||||
* from both big and little endian processors. However, this means byte
|
||||
* sequences are not consistent between big and little endian processors.
|
||||
* This is fine for RAM, and for ROM if ROM is created for a specific
|
||||
* processor (and thus has correct byte sequences). However this may be
|
||||
* unexpected for Flash, which might contain a file-system that one wants
|
||||
* to use for multiple processor configurations (eg. the Flash might contain
|
||||
* the Ethernet card's address, endianness-independent application data, etc).
|
||||
* That is, byte sequences written in Flash by a core of a given endianness
|
||||
* will be byte-swapped when seen by a core of the other endianness.
|
||||
* Someone implementing an endianness-independent Flash file system will
|
||||
* likely handle this byte-swapping issue in the Flash driver software.
|
||||
*/
|
||||
|
||||
#define XTBOARD_FLASH_MAXSIZE 0x1000000 /* 16 MB */
|
||||
|
||||
#ifdef XSHAL_IOBLOCK_BYPASS_PADDR
|
||||
|
||||
/* Flash Memory: */
|
||||
# define XTBOARD_FLASH_PADDR (XSHAL_IOBLOCK_BYPASS_PADDR+0x08000000)
|
||||
|
||||
/* FPGA registers: */
|
||||
# define XTBOARD_FPGAREGS_PADDR (XSHAL_IOBLOCK_BYPASS_PADDR+0x0D020000)
|
||||
|
||||
/* Ethernet controller/transceiver SONIC SN83934: */
|
||||
# define ETHERNET_PADDR (XSHAL_IOBLOCK_BYPASS_PADDR+0x0D030000)
|
||||
|
||||
/* UART National-Semi PC16550D: */
|
||||
# define UART16550_PADDR (XSHAL_IOBLOCK_BYPASS_PADDR+0x0D050000)
|
||||
|
||||
/* TI 320AIC23/28-TSSOP Stereo Audio Codec: */
|
||||
# define AUDIO_PADDR (XSHAL_IOBLOCK_BYPASS_PADDR+0x0D070000)
|
||||
|
||||
/* Boot 128K Sram address: */
|
||||
# define BOOT_SRAM_PADDR (XSHAL_IOBLOCK_BYPASS_PADDR+0x0D400000)
|
||||
|
||||
/* Ethernet buffer: */
|
||||
# define ETHERNET_BUFFER_PADDR (XSHAL_IOBLOCK_BYPASS_PADDR+0x0D800000)
|
||||
|
||||
#endif /* XSHAL_IOBLOCK_BYPASS_PADDR */
|
||||
|
||||
/* These devices might be accessed cached: */
|
||||
#ifdef XSHAL_IOBLOCK_CACHED_PADDR
|
||||
# define XTBOARD_FLASH_CACHED_PADDR (XSHAL_IOBLOCK_CACHED_PADDR+0x08000000)
|
||||
# define ETHERNET_BUFFER_CACHED_PADDR (XSHAL_IOBLOCK_CACHED_PADDR+0x0D800000)
|
||||
# define BOOT_SRAM_CACHED_PADDR (XSHAL_IOBLOCK_CACHED_PADDR+0x0D400000)
|
||||
#endif /* XSHAL_IOBLOCK_CACHED_PADDR */
|
||||
|
||||
|
||||
/*** Same thing over again, this time with virtual addresses: ***/
|
||||
|
||||
#ifdef XSHAL_IOBLOCK_BYPASS_VADDR
|
||||
|
||||
/* Flash Memory: */
|
||||
# define XTBOARD_FLASH_VADDR (XSHAL_IOBLOCK_BYPASS_VADDR+0x08000000)
|
||||
|
||||
/* FPGA registers: */
|
||||
# define XTBOARD_FPGAREGS_VADDR (XSHAL_IOBLOCK_BYPASS_VADDR+0x0D020000)
|
||||
|
||||
/* Ethernet controller/transceiver SONIC SN83934: */
|
||||
# define ETHERNET_VADDR (XSHAL_IOBLOCK_BYPASS_VADDR+0x0D030000)
|
||||
|
||||
/* UART National-Semi PC16550D: */
|
||||
# define UART16550_VADDR (XSHAL_IOBLOCK_BYPASS_VADDR+0x0D050000)
|
||||
|
||||
/* TI 320AIC23/28-TSSOP Stereo Audio Codec: */
|
||||
# define AUDIO_VADDR (XSHAL_IOBLOCK_BYPASS_VADDR+0x0D070000)
|
||||
|
||||
/* 128K Sram address: */
|
||||
# define BOOT_SRAM_VADDR (XSHAL_IOBLOCK_BYPASS_VADDR+0x0D400000)
|
||||
|
||||
/* Ethernet buffer: */
|
||||
# define ETHERNET_BUFFER_VADDR (XSHAL_IOBLOCK_BYPASS_VADDR+0x0D800000)
|
||||
|
||||
#endif /* XSHAL_IOBLOCK_BYPASS_VADDR */
|
||||
|
||||
/* These devices might be accessed cached: */
|
||||
#ifdef XSHAL_IOBLOCK_CACHED_VADDR
|
||||
# define XTBOARD_FLASH_CACHED_VADDR (XSHAL_IOBLOCK_CACHED_VADDR+0x08000000)
|
||||
# define AUDIO_CACHED_VADDR (XSHAL_IOBLOCK_CACHED_VADDR+0x0D070000)
|
||||
# define ETHERNET_BUFFER_CACHED_VADDR (XSHAL_IOBLOCK_CACHED_VADDR+0x0D800000)
|
||||
# define BOOT_SRAM_CACHED_VADDR (XSHAL_IOBLOCK_CACHED_VADDR+0x0D400000)
|
||||
#endif /* XSHAL_IOBLOCK_CACHED_VADDR */
|
||||
|
||||
|
||||
/* System ROM: */
|
||||
#define XTBOARD_ROM_SIZE XSHAL_ROM_SIZE
|
||||
#ifdef XSHAL_ROM_VADDR
|
||||
#define XTBOARD_ROM_VADDR XSHAL_ROM_VADDR
|
||||
#endif
|
||||
#ifdef XSHAL_ROM_PADDR
|
||||
#define XTBOARD_ROM_PADDR XSHAL_ROM_PADDR
|
||||
#endif
|
||||
|
||||
/* System RAM: */
|
||||
#define XTBOARD_RAM_SIZE XSHAL_RAM_SIZE
|
||||
#ifdef XSHAL_RAM_VADDR
|
||||
#define XTBOARD_RAM_VADDR XSHAL_RAM_VADDR
|
||||
#endif
|
||||
#ifdef XSHAL_RAM_PADDR
|
||||
#define XTBOARD_RAM_PADDR XSHAL_RAM_PADDR
|
||||
#endif
|
||||
#define XTBOARD_RAM_BYPASS_VADDR XSHAL_RAM_BYPASS_VADDR
|
||||
#define XTBOARD_RAM_BYPASS_PADDR XSHAL_RAM_BYPASS_PADDR
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Things that depend on device addresses.
|
||||
*/
|
||||
|
||||
|
||||
#define XTBOARD_CACHEATTR_WRITEBACK XSHAL_XT2000_CACHEATTR_WRITEBACK
|
||||
#define XTBOARD_CACHEATTR_WRITEALLOC XSHAL_XT2000_CACHEATTR_WRITEALLOC
|
||||
#define XTBOARD_CACHEATTR_WRITETHRU XSHAL_XT2000_CACHEATTR_WRITETHRU
|
||||
#define XTBOARD_CACHEATTR_BYPASS XSHAL_XT2000_CACHEATTR_BYPASS
|
||||
#define XTBOARD_CACHEATTR_DEFAULT XSHAL_XT2000_CACHEATTR_DEFAULT
|
||||
|
||||
#define XTBOARD_BUSINT_PIPE_REGIONS XSHAL_XT2000_PIPE_REGIONS
|
||||
#define XTBOARD_BUSINT_SDRAM_REGIONS XSHAL_XT2000_SDRAM_REGIONS
|
||||
|
||||
|
||||
/*
|
||||
* FPGA registers.
|
||||
* All these registers are normally accessed using 32-bit loads/stores.
|
||||
*/
|
||||
|
||||
/* Register offsets: */
|
||||
#define XTBOARD_DATECD_OFS 0x00 /* date code (read-only) */
|
||||
#define XTBOARD_CLKFRQ_OFS 0x04 /* clock frequency Hz (read-only) */
|
||||
#define XTBOARD_SYSLED_OFS 0x08 /* LEDs */
|
||||
#define XTBOARD_DIPSW_OFS 0x0C /* DIP switch bits (read-only) */
|
||||
#define XTBOARD_SWRST_OFS 0x10 /* software reset */
|
||||
|
||||
/* Physical register addresses: */
|
||||
#ifdef XTBOARD_FPGAREGS_PADDR
|
||||
#define XTBOARD_DATECD_PADDR (XTBOARD_FPGAREGS_PADDR+XTBOARD_DATECD_OFS)
|
||||
#define XTBOARD_CLKFRQ_PADDR (XTBOARD_FPGAREGS_PADDR+XTBOARD_CLKFRQ_OFS)
|
||||
#define XTBOARD_SYSLED_PADDR (XTBOARD_FPGAREGS_PADDR+XTBOARD_SYSLED_OFS)
|
||||
#define XTBOARD_DIPSW_PADDR (XTBOARD_FPGAREGS_PADDR+XTBOARD_DIPSW_OFS)
|
||||
#define XTBOARD_SWRST_PADDR (XTBOARD_FPGAREGS_PADDR+XTBOARD_SWRST_OFS)
|
||||
#endif
|
||||
|
||||
/* Virtual register addresses: */
|
||||
#ifdef XTBOARD_FPGAREGS_VADDR
|
||||
#define XTBOARD_DATECD_VADDR (XTBOARD_FPGAREGS_VADDR+XTBOARD_DATECD_OFS)
|
||||
#define XTBOARD_CLKFRQ_VADDR (XTBOARD_FPGAREGS_VADDR+XTBOARD_CLKFRQ_OFS)
|
||||
#define XTBOARD_SYSLED_VADDR (XTBOARD_FPGAREGS_VADDR+XTBOARD_SYSLED_OFS)
|
||||
#define XTBOARD_DIPSW_VADDR (XTBOARD_FPGAREGS_VADDR+XTBOARD_DIPSW_OFS)
|
||||
#define XTBOARD_SWRST_VADDR (XTBOARD_FPGAREGS_VADDR+XTBOARD_SWRST_OFS)
|
||||
/* Register access (for C code): */
|
||||
#define XTBOARD_DATECD_REG (*(volatile unsigned*) XTBOARD_DATECD_VADDR)
|
||||
#define XTBOARD_CLKFRQ_REG (*(volatile unsigned*) XTBOARD_CLKFRQ_VADDR)
|
||||
#define XTBOARD_SYSLED_REG (*(volatile unsigned*) XTBOARD_SYSLED_VADDR)
|
||||
#define XTBOARD_DIPSW_REG (*(volatile unsigned*) XTBOARD_DIPSW_VADDR)
|
||||
#define XTBOARD_SWRST_REG (*(volatile unsigned*) XTBOARD_SWRST_VADDR)
|
||||
#endif
|
||||
|
||||
/* DATECD (date code; when core was built) bit fields: */
|
||||
/* BCD-coded month (01..12): */
|
||||
#define XTBOARD_DATECD_MONTH_SHIFT 24
|
||||
#define XTBOARD_DATECD_MONTH_BITS 8
|
||||
#define XTBOARD_DATECD_MONTH_MASK 0xFF000000
|
||||
/* BCD-coded day (01..31): */
|
||||
#define XTBOARD_DATECD_DAY_SHIFT 16
|
||||
#define XTBOARD_DATECD_DAY_BITS 8
|
||||
#define XTBOARD_DATECD_DAY_MASK 0x00FF0000
|
||||
/* BCD-coded year (2001..9999): */
|
||||
#define XTBOARD_DATECD_YEAR_SHIFT 0
|
||||
#define XTBOARD_DATECD_YEAR_BITS 16
|
||||
#define XTBOARD_DATECD_YEAR_MASK 0x0000FFFF
|
||||
|
||||
/* SYSLED (system LED) bit fields: */
|
||||
|
||||
/* LED control bits (off=0, on=1): */
|
||||
#define XTBOARD_SYSLED_USER_SHIFT 0
|
||||
#define XTBOARD_SYSLED_USER_BITS 4
|
||||
#define XTBOARD_SYSLED_USER_MASK 0x0000000F
|
||||
|
||||
/* DIP Switch (left=sw1=lsb=bit0, right=sw8=msb=bit7; off=0, on=1): */
|
||||
/* DIP switch bit fields (bit6/sw7 is reserved and presently unused): */
|
||||
#define XTBOARD_DIPSW_USER_SHIFT 0 /* labeled 1-6 (1=lsb) */
|
||||
#define XTBOARD_DIPSW_USER_BITS 6
|
||||
#define XTBOARD_DIPSW_USER_MASK 0x0000003F
|
||||
#define XTBOARD_DIPSW_BOOT_SHIFT 7 /* labeled 8 (msb) */
|
||||
#define XTBOARD_DIPSW_BOOT_BITS 1
|
||||
#define XTBOARD_DIPSW_BOOT_MASK 0x00000080
|
||||
/* Boot settings: bit7/sw8, off=0, on=1 (this switch controls hardware): */
|
||||
#define XTBOARD_DIPSW_BOOT_RAM (0<<XTBOARD_DIPSW_BOOT_SHIFT) /* off */
|
||||
#define XTBOARD_DIPSW_BOOT_FLASH (1<<XTBOARD_DIPSW_BOOT_SHIFT) /* on */
|
||||
|
||||
/* SWRST (software reset; allows s/w to generate power-on equivalent reset): */
|
||||
/* Software reset bits: */
|
||||
#define XTBOARD_SWRST_SWR_SHIFT 0
|
||||
#define XTBOARD_SWRST_SWR_BITS 16
|
||||
#define XTBOARD_SWRST_SWR_MASK 0x0000FFFF
|
||||
/* Software reset value -- writing this value resets the board: */
|
||||
#define XTBOARD_SWRST_RESETVALUE 0x0000DEAD
|
||||
|
||||
|
||||
#endif /*_INC_XTAV200_H_*/
|
||||
|
@ -1,13 +0,0 @@
|
||||
/*
|
||||
* board.h - Include board-specific definitions
|
||||
*
|
||||
* Copyright (c) 2008 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
* They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
* third parties in any manner, medium, or form, in whole or in part, without
|
||||
* the prior written consent of Tensilica Inc.
|
||||
*/
|
||||
|
||||
#include <xtensa/xtav200.h>
|
||||
|
@ -1,241 +0,0 @@
|
||||
/* Copyright (c) 2002-2013 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
/ These coded instructions, statements, and computer programs are the
|
||||
/ copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
/ They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
/ third parties in any manner, medium, or form, in whole or in part, without
|
||||
/ the prior written consent of Tensilica Inc.
|
||||
*/
|
||||
|
||||
/* xtav60.h - Xtensa Avnet LX60 (XT-AV60) board specific definitions */
|
||||
|
||||
#ifndef _INC_XTAV60_H_
|
||||
#define _INC_XTAV60_H_
|
||||
|
||||
#include <xtensa/config/core.h>
|
||||
#include <xtensa/config/system.h>
|
||||
|
||||
#define XTBOARD_NAME "XT-AV60"
|
||||
|
||||
|
||||
/*
|
||||
* Default assignment of XTAV60 devices to external interrupts.
|
||||
*/
|
||||
|
||||
/* Ethernet interrupt: */
|
||||
#ifdef XCHAL_EXTINT1_NUM
|
||||
#define ETHERNET_INTNUM XCHAL_EXTINT1_NUM
|
||||
#define ETHERNET_INTLEVEL XCHAL_EXTINT1_LEVEL
|
||||
#define ETHERNET_INTMASK XCHAL_EXTINT1_MASK
|
||||
#else
|
||||
#define ETHERNET_INTMASK 0
|
||||
#endif
|
||||
|
||||
/* UART interrupt: */
|
||||
#ifdef XCHAL_EXTINT0_NUM
|
||||
#define UART16550_INTNUM XCHAL_EXTINT0_NUM
|
||||
#define UART16550_INTLEVEL XCHAL_EXTINT0_LEVEL
|
||||
#define UART16550_INTMASK XCHAL_EXTINT0_MASK
|
||||
#else
|
||||
#define UART16550_INTMASK 0
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Device addresses.
|
||||
*
|
||||
* Note: for endianness-independence, use 32-bit loads and stores for all
|
||||
* register accesses to Ethernet, UART and LED devices. Undefined bits
|
||||
* may need to be masked out if needed when reading if the actual register
|
||||
* size is smaller than 32 bits.
|
||||
*
|
||||
* Note: XTAV60 bus byte lanes are defined in terms of msbyte and lsbyte
|
||||
* relative to the processor. So 32-bit registers are accessed consistently
|
||||
* from both big and little endian processors. However, this means byte
|
||||
* sequences are not consistent between big and little endian processors.
|
||||
* This is fine for RAM, and for ROM if ROM is created for a specific
|
||||
* processor (and thus has correct byte sequences). However this may be
|
||||
* unexpected for Flash, which might contain a file-system that one wants
|
||||
* to use for multiple processor configurations (eg. the Flash might contain
|
||||
* the Ethernet card's address, endianness-independent application data, etc).
|
||||
* That is, byte sequences written in Flash by a core of a given endianness
|
||||
* will be byte-swapped when seen by a core of the other endianness.
|
||||
* Someone implementing an endianness-independent Flash file system will
|
||||
* likely handle this byte-swapping issue in the Flash driver software.
|
||||
*/
|
||||
|
||||
#define XTBOARD_FLASH_MAXSIZE 0x400000 /* 4 MB */
|
||||
|
||||
#ifdef XSHAL_IOBLOCK_BYPASS_PADDR
|
||||
|
||||
/* Flash Memory: */
|
||||
# define XTBOARD_FLASH_PADDR (XSHAL_IOBLOCK_BYPASS_PADDR+0x08000000)
|
||||
|
||||
/* FPGA registers: */
|
||||
# define XTBOARD_FPGAREGS_PADDR (XSHAL_IOBLOCK_BYPASS_PADDR+0x0D020000)
|
||||
|
||||
/* Ethernet controller/transceiver SONIC SN83934: */
|
||||
# define ETHERNET_PADDR (XSHAL_IOBLOCK_BYPASS_PADDR+0x0D030000)
|
||||
# define ETHERNET_CONTROLLER_PADDR ETHERNET_PADDR /* legacy macro */
|
||||
|
||||
/* Display controller Sunplus SPLC780D, LCD Display MYTech MOC-16216B-B: */
|
||||
# define SPLC780D_PADDR (XSHAL_IOBLOCK_BYPASS_PADDR+0x0D040000)
|
||||
|
||||
/* UART National-Semi PC16550D: */
|
||||
# define UART16550_PADDR (XSHAL_IOBLOCK_BYPASS_PADDR+0x0D050000)
|
||||
|
||||
/* Boot 128K Sram address: */
|
||||
# define BOOT_SRAM_PADDR (XSHAL_IOBLOCK_BYPASS_PADDR+0x0D400000)
|
||||
|
||||
/* Ethernet buffer: */
|
||||
# define ETHERNET_BUFFER_PADDR (XSHAL_IOBLOCK_BYPASS_PADDR+0x0D800000)
|
||||
|
||||
#endif /* XSHAL_IOBLOCK_BYPASS_PADDR */
|
||||
|
||||
/* These devices might be accessed cached: */
|
||||
#ifdef XSHAL_IOBLOCK_CACHED_PADDR
|
||||
# define XTBOARD_FLASH_CACHED_PADDR (XSHAL_IOBLOCK_CACHED_PADDR+0x08000000)
|
||||
# define ETHERNET_BUFFER_CACHED_PADDR (XSHAL_IOBLOCK_CACHED_PADDR+0x0D800000)
|
||||
# define BOOT_SRAM_CACHED_PADDR (XSHAL_IOBLOCK_CACHED_PADDR+0x0D400000)
|
||||
#endif /* XSHAL_IOBLOCK_CACHED_PADDR */
|
||||
|
||||
|
||||
/*** Same thing over again, this time with virtual addresses: ***/
|
||||
|
||||
#ifdef XSHAL_IOBLOCK_BYPASS_VADDR
|
||||
|
||||
/* Flash Memory: */
|
||||
# define XTBOARD_FLASH_VADDR (XSHAL_IOBLOCK_BYPASS_VADDR+0x08000000)
|
||||
|
||||
/* FPGA registers: */
|
||||
# define XTBOARD_FPGAREGS_VADDR (XSHAL_IOBLOCK_BYPASS_VADDR+0x0D020000)
|
||||
|
||||
/* Ethernet controller/transceiver SONIC SN83934: */
|
||||
# define ETHERNET_VADDR (XSHAL_IOBLOCK_BYPASS_VADDR+0x0D030000)
|
||||
|
||||
/* Display controller Sunplus SPLC780D, LCD Display MYTech MOC-16216B-B: */
|
||||
# define SPLC780D_VADDR (XSHAL_IOBLOCK_BYPASS_VADDR+0x0D040000)
|
||||
|
||||
/* UART National-Semi PC16550D: */
|
||||
# define UART16550_VADDR (XSHAL_IOBLOCK_BYPASS_VADDR+0x0D050000)
|
||||
|
||||
/* 128K Sram address: */
|
||||
# define BOOT_SRAM_VADDR (XSHAL_IOBLOCK_BYPASS_VADDR+0x0D400000)
|
||||
|
||||
/* Ethernet buffer: */
|
||||
# define ETHERNET_BUFFER_VADDR (XSHAL_IOBLOCK_BYPASS_VADDR+0x0D800000)
|
||||
|
||||
#endif /* XSHAL_IOBLOCK_BYPASS_VADDR */
|
||||
|
||||
/* These devices might be accessed cached: */
|
||||
#ifdef XSHAL_IOBLOCK_CACHED_VADDR
|
||||
# define XTBOARD_FLASH_CACHED_VADDR (XSHAL_IOBLOCK_CACHED_VADDR+0x08000000)
|
||||
# define ETHERNET_BUFFER_CACHED_VADDR (XSHAL_IOBLOCK_CACHED_VADDR+0x0D800000)
|
||||
# define BOOT_SRAM_CACHED_VADDR (XSHAL_IOBLOCK_CACHED_VADDR+0x0D400000)
|
||||
#endif /* XSHAL_IOBLOCK_CACHED_VADDR */
|
||||
|
||||
|
||||
/* System ROM: */
|
||||
#define XTBOARD_ROM_SIZE XSHAL_ROM_SIZE
|
||||
#ifdef XSHAL_ROM_VADDR
|
||||
#define XTBOARD_ROM_VADDR XSHAL_ROM_VADDR
|
||||
#endif
|
||||
#ifdef XSHAL_ROM_PADDR
|
||||
#define XTBOARD_ROM_PADDR XSHAL_ROM_PADDR
|
||||
#endif
|
||||
|
||||
/* System RAM: */
|
||||
#define XTBOARD_RAM_SIZE XSHAL_RAM_SIZE
|
||||
#ifdef XSHAL_RAM_VADDR
|
||||
#define XTBOARD_RAM_VADDR XSHAL_RAM_VADDR
|
||||
#endif
|
||||
#ifdef XSHAL_RAM_PADDR
|
||||
#define XTBOARD_RAM_PADDR XSHAL_RAM_PADDR
|
||||
#endif
|
||||
#define XTBOARD_RAM_BYPASS_VADDR XSHAL_RAM_BYPASS_VADDR
|
||||
#define XTBOARD_RAM_BYPASS_PADDR XSHAL_RAM_BYPASS_PADDR
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Things that depend on device addresses.
|
||||
*/
|
||||
|
||||
|
||||
#define XTBOARD_CACHEATTR_WRITEBACK XSHAL_XT2000_CACHEATTR_WRITEBACK
|
||||
#define XTBOARD_CACHEATTR_WRITEALLOC XSHAL_XT2000_CACHEATTR_WRITEALLOC
|
||||
#define XTBOARD_CACHEATTR_WRITETHRU XSHAL_XT2000_CACHEATTR_WRITETHRU
|
||||
#define XTBOARD_CACHEATTR_BYPASS XSHAL_XT2000_CACHEATTR_BYPASS
|
||||
#define XTBOARD_CACHEATTR_DEFAULT XSHAL_XT2000_CACHEATTR_DEFAULT
|
||||
|
||||
#define XTBOARD_BUSINT_PIPE_REGIONS XSHAL_XT2000_PIPE_REGIONS
|
||||
#define XTBOARD_BUSINT_SDRAM_REGIONS XSHAL_XT2000_SDRAM_REGIONS
|
||||
|
||||
|
||||
/*
|
||||
* FPGA registers.
|
||||
* All these registers are normally accessed using 32-bit loads/stores.
|
||||
*/
|
||||
|
||||
/* Register offsets: */
|
||||
#define XTBOARD_DATECD_OFS 0x00 /* date code (read-only) */
|
||||
#define XTBOARD_CLKFRQ_OFS 0x04 /* clock frequency Hz (read-only) */
|
||||
#define XTBOARD_DIPSW_OFS 0x0C /* DIP switch bits (read-only) */
|
||||
#define XTBOARD_SWRST_OFS 0x10 /* software reset */
|
||||
|
||||
/* Physical register addresses: */
|
||||
#ifdef XTBOARD_FPGAREGS_PADDR
|
||||
#define XTBOARD_DATECD_PADDR (XTBOARD_FPGAREGS_PADDR+XTBOARD_DATECD_OFS)
|
||||
#define XTBOARD_CLKFRQ_PADDR (XTBOARD_FPGAREGS_PADDR+XTBOARD_CLKFRQ_OFS)
|
||||
#define XTBOARD_DIPSW_PADDR (XTBOARD_FPGAREGS_PADDR+XTBOARD_DIPSW_OFS)
|
||||
#define XTBOARD_SWRST_PADDR (XTBOARD_FPGAREGS_PADDR+XTBOARD_SWRST_OFS)
|
||||
#endif
|
||||
|
||||
/* Virtual register addresses: */
|
||||
#ifdef XTBOARD_FPGAREGS_VADDR
|
||||
#define XTBOARD_DATECD_VADDR (XTBOARD_FPGAREGS_VADDR+XTBOARD_DATECD_OFS)
|
||||
#define XTBOARD_CLKFRQ_VADDR (XTBOARD_FPGAREGS_VADDR+XTBOARD_CLKFRQ_OFS)
|
||||
#define XTBOARD_DIPSW_VADDR (XTBOARD_FPGAREGS_VADDR+XTBOARD_DIPSW_OFS)
|
||||
#define XTBOARD_SWRST_VADDR (XTBOARD_FPGAREGS_VADDR+XTBOARD_SWRST_OFS)
|
||||
/* Register access (for C code): */
|
||||
#define XTBOARD_DATECD_REG (*(volatile unsigned*) XTBOARD_DATECD_VADDR)
|
||||
#define XTBOARD_CLKFRQ_REG (*(volatile unsigned*) XTBOARD_CLKFRQ_VADDR)
|
||||
#define XTBOARD_DIPSW_REG (*(volatile unsigned*) XTBOARD_DIPSW_VADDR)
|
||||
#define XTBOARD_SWRST_REG (*(volatile unsigned*) XTBOARD_SWRST_VADDR)
|
||||
#endif
|
||||
|
||||
/* DATECD (date code; when core was built) bit fields: */
|
||||
/* BCD-coded month (01..12): */
|
||||
#define XTBOARD_DATECD_MONTH_SHIFT 24
|
||||
#define XTBOARD_DATECD_MONTH_BITS 8
|
||||
#define XTBOARD_DATECD_MONTH_MASK 0xFF000000
|
||||
/* BCD-coded day (01..31): */
|
||||
#define XTBOARD_DATECD_DAY_SHIFT 16
|
||||
#define XTBOARD_DATECD_DAY_BITS 8
|
||||
#define XTBOARD_DATECD_DAY_MASK 0x00FF0000
|
||||
/* BCD-coded year (2001..9999): */
|
||||
#define XTBOARD_DATECD_YEAR_SHIFT 0
|
||||
#define XTBOARD_DATECD_YEAR_BITS 16
|
||||
#define XTBOARD_DATECD_YEAR_MASK 0x0000FFFF
|
||||
|
||||
/* DIP Switch (left=sw1=lsb=bit0, right=sw8=msb=bit7; off=0, on=1): */
|
||||
/* DIP switch bit fields (bit6/sw7 is reserved and presently unused): */
|
||||
#define XTBOARD_DIPSW_USER_SHIFT 0 /* labeled 1-6 (1=lsb) */
|
||||
#define XTBOARD_DIPSW_USER_BITS 6
|
||||
#define XTBOARD_DIPSW_USER_MASK 0x0000003F
|
||||
#define XTBOARD_DIPSW_BOOT_SHIFT 7 /* labeled 8 (msb) */
|
||||
#define XTBOARD_DIPSW_BOOT_BITS 1
|
||||
#define XTBOARD_DIPSW_BOOT_MASK 0x00000080
|
||||
/* Boot settings: bit7/sw8, off=0, on=1 (this switch controls hardware): */
|
||||
#define XTBOARD_DIPSW_BOOT_RAM (0<<XTBOARD_DIPSW_BOOT_SHIFT) /* off */
|
||||
#define XTBOARD_DIPSW_BOOT_FLASH (1<<XTBOARD_DIPSW_BOOT_SHIFT) /* on */
|
||||
|
||||
/* SWRST (software reset; allows s/w to generate power-on equivalent reset): */
|
||||
/* Software reset bits: */
|
||||
#define XTBOARD_SWRST_SWR_SHIFT 0
|
||||
#define XTBOARD_SWRST_SWR_BITS 16
|
||||
#define XTBOARD_SWRST_SWR_MASK 0x0000FFFF
|
||||
/* Software reset value -- writing this value resets the board: */
|
||||
#define XTBOARD_SWRST_RESETVALUE 0x0000DEAD
|
||||
|
||||
|
||||
#endif /*_INC_XTAV60_H_*/
|
||||
|
@ -1,13 +0,0 @@
|
||||
/*
|
||||
* board.h - Include board-specific definitions
|
||||
*
|
||||
* Copyright (c) 2008 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
* They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
* third parties in any manner, medium, or form, in whole or in part, without
|
||||
* the prior written consent of Tensilica Inc.
|
||||
*/
|
||||
|
||||
#include <xtensa/xtav60.h>
|
||||
|
@ -1,60 +0,0 @@
|
||||
/*******************************************************************************
|
||||
|
||||
Copyright (c) 2006-2007 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
These coded instructions, statements, and computer programs are the
|
||||
copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
third parties in any manner, medium, or form, in whole or in part, without
|
||||
the prior written consent of Tensilica Inc.
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
lcd-splc780d-board.h Board-specific LCD info on Avnet AV60 (XT-AV60) board.
|
||||
|
||||
Interface between board-independent driver and board-specific header.
|
||||
|
||||
This is used by a board-independent SPLC780D LCD controller driver to obtain
|
||||
board-specific information about LCD displays on the board, such as the
|
||||
controller register base address and spacing (a function of how the address
|
||||
lines are connected on the board) and length of the visible window of the
|
||||
display (a function of the LCD panel the controller drives). The driver does
|
||||
not refer directly to the board-specific header, which therefore is not
|
||||
constrained to use macro names consistent with other boards.
|
||||
|
||||
!! Must not contain any board-specific macro names (only controller specific) !!
|
||||
|
||||
Included at compile-time via an include path specific to the board.
|
||||
|
||||
The XT-AV60 board contains a single MYTech MOC-16216B-B display driven by
|
||||
a Sunplus SPLC870D controller.
|
||||
|
||||
*******************************************************************************/
|
||||
|
||||
#ifndef _LCD_SPLC780D_BOARD_H
|
||||
#define _LCD_SPLC780D_BOARD_H
|
||||
|
||||
#include <xtensa/xtav60.h> /* Board info */
|
||||
|
||||
|
||||
/* Base address of the controller's registers. */
|
||||
#ifdef SPLC780D_VADDR
|
||||
#define SPLC780D_REGBASE SPLC780D_VADDR
|
||||
#endif
|
||||
|
||||
/*
|
||||
The controller's registers are connected at word addresses on the XT-AV60.
|
||||
Each byte-wide register appears as the least-significant-byte (LSB) of the
|
||||
word regardless of the endianness of the processor (so if using word accesses
|
||||
then endianness doesn't matter).
|
||||
*/
|
||||
#define SPLC780D_REGSPACING 4
|
||||
typedef unsigned splc780d_reg_t;
|
||||
|
||||
/* Include generic information shared by all boards that use this device. */
|
||||
#include <xtensa/lcd-splc780d.h>
|
||||
|
||||
|
||||
/* Display limits of the LCD panel. */
|
||||
#define DISPLAY_VISIBLE_LEN 16 /* length (chars) of visible window */
|
||||
|
||||
#endif /* _LCD_SPLC780D_BOARD_H */
|
||||
|
@ -1,269 +0,0 @@
|
||||
/*******************************************************************************
|
||||
|
||||
Copyright (c) 2006-2009 Tensilica Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
xtbsp.h Xtensa Board Support Package API
|
||||
|
||||
This API defines a minimal set of board-support functions that every supported
|
||||
Xtensa board is expected to provide in the board-support-package (BSP) library
|
||||
associated with the board-specific LSP. Only basic board functions are provided
|
||||
in this board-independent API. API functions not applicable to a board must be
|
||||
stubbed in its BSP library. More complex operations must use a board-specific
|
||||
interface. Functions are grouped by type of peripheral device.
|
||||
|
||||
*******************************************************************************/
|
||||
|
||||
#ifndef _XTBSP_H_
|
||||
#define _XTBSP_H_
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
BOARD INITIALIZATION.
|
||||
The board with all its devices is initialized by xtbsp_board_init().
|
||||
Individual devices represented by this API can be reinitialized at any
|
||||
time by calling their inidividual device init functions (grouped with
|
||||
other device functions). This might be useful to (say) change the baud
|
||||
rate of the UART.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
Initialize the board. Must call before any other API function.
|
||||
Iniitializes BSP, board in general, and all devices on the board.
|
||||
*/
|
||||
extern void xtbsp_board_init(void);
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
BOARD CHARACTERISTICS and CONVENIENCE FUNCTIONS.
|
||||
Board support functions not associated with a particular peripheral device.
|
||||
*/
|
||||
|
||||
/*
|
||||
Return a short string representing the type of board.
|
||||
If the board has a display, the string must fit on a single line.
|
||||
*/
|
||||
extern const char * xtbsp_board_name(void);
|
||||
|
||||
/*
|
||||
Hardware reset the entire board (if possible). Does not return if successful.
|
||||
If this function returns, it is stubbed out or not possible with this board.
|
||||
*/
|
||||
extern void xtbsp_board_reset(void);
|
||||
|
||||
/*
|
||||
Return the clock frequency in Hertz. May be constant or computed.
|
||||
*/
|
||||
extern unsigned xtbsp_clock_freq_hz(void);
|
||||
|
||||
/*
|
||||
Return the clock period in picoseconds. May be constant or computed.
|
||||
*/
|
||||
extern unsigned xtbsp_clock_period_ps(void);
|
||||
|
||||
/*
|
||||
Spin (at least) a number of cycles per the processor's CCOUNT register.
|
||||
Unlike a s/w delay loop, the duration is not affected by compiler
|
||||
optimization or interrupts completed within the delay period.
|
||||
If the processor doesn't have CCOUNT, a s/w delay loop is used to obtain
|
||||
a rough approximation of the cycle count.
|
||||
*/
|
||||
extern void xtbsp_delay_cycles(unsigned cycles);
|
||||
|
||||
/*
|
||||
Spin at least a number of nanoseconds (approximate and err in the high side).
|
||||
BSP implementation should do this efficiently, avoiding integer overflow or
|
||||
excessive loss of precision, run-time division or floating point.
|
||||
Function implementation (vs. macro) allows BSP to optimize for the clock
|
||||
frequency by pre-computing (or using constant) scale factors.
|
||||
*/
|
||||
extern void xtbsp_delay_ns(unsigned ns);
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
C LIBRARY SUPPORT.
|
||||
These functions are called by the C library libgloss interface.
|
||||
Their names are predetermined apart from this BSP API.
|
||||
*/
|
||||
|
||||
/*
|
||||
Initialize the board. Called by C library initialization code.
|
||||
Usually simply calls xtbsp_board_init().
|
||||
*/
|
||||
extern void board_init(void);
|
||||
|
||||
/*
|
||||
(Wait for and) Input a single byte from the default character I/O
|
||||
device. Return -1 if there is no input device.
|
||||
This device is usually a UART and this function calls xtbsp_uart_getchar().
|
||||
On some boards (eg.) it might be a directly connected keyboard.
|
||||
*/
|
||||
extern int inbyte(void);
|
||||
|
||||
/*
|
||||
Output a single char to the default character I/O device (and wait
|
||||
until it's been taken).
|
||||
This device is usually a UART and this function calls xtbsp_uart_putchar().
|
||||
On some boards (eg.) it might be a directly connected bit-mapped screen.
|
||||
*/
|
||||
extern void outbyte(int c);
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
UART (SERIAL I/O).
|
||||
Supports a single UART in a simple polling mode and provides control of
|
||||
receiver and transmitter data interrupts (client must provide handler).
|
||||
Provides a mapping to processor interrupt number which can be used with
|
||||
the HAL to control processor interrupt enable (INTENABLE) etc.
|
||||
*/
|
||||
|
||||
/* Bitmasks to identify UART interrupts. */
|
||||
typedef enum xtbsp_uart_int {
|
||||
xtbsp_uart_int_rx = 1<<0,
|
||||
xtbsp_uart_int_tx = 1<<1,
|
||||
/* mask of all valid interrupt bits */
|
||||
xtbsp_uart_int_all = (1<<2)-1
|
||||
} xtbsp_uart_int;
|
||||
|
||||
/*
|
||||
Return non-zero if the board has a UART.
|
||||
*/
|
||||
extern int xtbsp_uart_exists(void);
|
||||
|
||||
/*
|
||||
Initialize the UART:
|
||||
parity = 0 (none), 1 (odd), or 2 (even).
|
||||
nstop = 1 or 2 (stop bits).
|
||||
ndata = 7 or 8 (data bits).
|
||||
Disables all UART interrupts.
|
||||
Returns non-zero if failed (perhaps due to unsupported parameter values).
|
||||
Must call before any of the following functions.
|
||||
*/
|
||||
extern int xtbsp_uart_init(unsigned baud, unsigned ndata,
|
||||
unsigned parity, unsigned nstop);
|
||||
#define xtbsp_uart_init_default() xtbsp_uart_init(38400, 8, 0, 1)
|
||||
|
||||
/*
|
||||
(Wait for and) Input a single char from the UART.
|
||||
Any pending xtbsp_uart_int_rx interrupt is cleared.
|
||||
*/
|
||||
extern char xtbsp_uart_getchar(void);
|
||||
|
||||
/*
|
||||
(Wait for transmitter ready and) Output a single char to the UART.
|
||||
Any pending xtbsp_uart_int_tx interrupt is cleared.
|
||||
*/
|
||||
extern void xtbsp_uart_putchar(const char c);
|
||||
|
||||
/*
|
||||
Return true (non-zero) if a character has been received and is ready
|
||||
to be input by xtbsp_uart_getchar() without waiting, else return 0.
|
||||
*/
|
||||
extern int xtbsp_uart_get_isready(void);
|
||||
|
||||
/*
|
||||
Return non-zero if a character may be output by xtbsp_uart_putchar()
|
||||
without waiting, else return 0.
|
||||
Any pending xtbsp_uart_int_tx interrupt is cleared.
|
||||
*/
|
||||
extern int xtbsp_uart_put_isready(void);
|
||||
|
||||
/*
|
||||
Return the enable status of all UART interrupts represented by this API,
|
||||
that is those with bits defined in type xtbsp_uart_int (1 bit = enabled).
|
||||
This is the enable status at the device, not the processor's INTENABLE.
|
||||
*/
|
||||
extern xtbsp_uart_int xtbsp_uart_int_enable_status(void);
|
||||
|
||||
/*
|
||||
Enable selected UART interrupts at the device.
|
||||
*/
|
||||
extern void xtbsp_uart_int_enable(const xtbsp_uart_int mask);
|
||||
|
||||
/*
|
||||
Disable selected UART interrupts at the device.
|
||||
*/
|
||||
extern void xtbsp_uart_int_disable(const xtbsp_uart_int mask);
|
||||
|
||||
/*
|
||||
Return the interrupt number (0..31) to which the selected UART interrupt
|
||||
is connected. May be used with the link-time HAL to obtain more information,
|
||||
eg. Xthal_intlevel_mask[xtbsp_uart_int_number(xtbsp_uart_int_rx)]
|
||||
This information can be used to control the processor's INTENABLE, etc.
|
||||
Result is -1 if not connected, undefined if mask has more than 1 bit set.
|
||||
*/
|
||||
extern int xtbsp_uart_int_number(const xtbsp_uart_int mask);
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
DISPLAY.
|
||||
Supports a single display that can render a series of ASCII characters.
|
||||
Functions are provided to perform generic display tasks such as display
|
||||
a string, display character by character, or blank the display.
|
||||
Chars are 7-bit printable ASCII. Strings are C style NUL \0 terminated.
|
||||
These functions busy-wait for any required timing delays so the caller does
|
||||
not have to deal with timing. Some displays require long delays which in
|
||||
some client applications warrant a board and RTOS specific approach to
|
||||
driving the display, however that is beyond the scope of this API.
|
||||
*/
|
||||
|
||||
/*
|
||||
Return non-zero if board has a display.
|
||||
*/
|
||||
extern int xtbsp_display_exists(void);
|
||||
|
||||
/*
|
||||
Initialize the display. Must call before any of the following functions.
|
||||
*/
|
||||
extern void xtbsp_display_init(void);
|
||||
|
||||
/*
|
||||
Display a single char at position pos (0 is leftmost). Other positions are
|
||||
left untouched. Positions beyond the width of the display are ignored.
|
||||
*/
|
||||
extern void xtbsp_display_char(unsigned pos, const char c);
|
||||
|
||||
/*
|
||||
Display a string. Blank-pad to or truncate at the end of the display
|
||||
(overwrites any previous string so don't need to blank display first).
|
||||
*/
|
||||
extern void xtbsp_display_string(const char *s);
|
||||
|
||||
/*
|
||||
Blank (clear) the entire display.
|
||||
*/
|
||||
extern void xtbsp_display_blank(void);
|
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _XTBSP_H_ */
|
@ -1,14 +0,0 @@
|
||||
/* Copyright (c) 2006-2013 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
/ These coded instructions, statements, and computer programs are the
|
||||
/ copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
/ They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
/ third parties in any manner, medium, or form, in whole or in part, without
|
||||
/ the prior written consent of Tensilica Inc.
|
||||
*/
|
||||
|
||||
/* xtkc705.h - Xtensa Xilinx KC705 (XT-KC705) board specific definitions */
|
||||
|
||||
/* 99.9% same as ML605, just indicate we're KC705 and include ML605 header: */
|
||||
#define XTBOARD_IS_KC705 1
|
||||
#include <xtensa/xtml605.h>
|
||||
|
@ -1,13 +0,0 @@
|
||||
/*
|
||||
* board.h - Include board-specific definitions
|
||||
*
|
||||
* Copyright (c) 2013 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
* They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
* third parties in any manner, medium, or form, in whole or in part, without
|
||||
* the prior written consent of Tensilica Inc.
|
||||
*/
|
||||
|
||||
#include <xtensa/xtkc705.h>
|
||||
|
@ -1,77 +0,0 @@
|
||||
/* Customer ID=11656; Build=0x5f626; Copyright (c) 2003-2012 Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
These coded instructions, statements, and computer programs are the
|
||||
copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
third parties in any manner, medium, or form, in whole or in part, without
|
||||
the prior written consent of Tensilica Inc. */
|
||||
|
||||
#ifndef _XTLOAD_API_H
|
||||
#define _XTLOAD_API_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define XTENSA_BYTES_PER_WORD 4
|
||||
#define XLOAD_ALL_CORES -1
|
||||
|
||||
typedef int core_number_t;
|
||||
typedef uint32_t xtload_address_t;
|
||||
typedef uint32_t xtload_word_count_t;
|
||||
typedef uint32_t * xtload_word_ptr_t;
|
||||
|
||||
/* These functions correspond one-to-one with xt-load script
|
||||
commands. See the documentation for xt-load for their usage.
|
||||
|
||||
There are however, several higher-level script commands--such as
|
||||
load-elf-file--which don't have direct analogues here. These
|
||||
"missing" commands are essentially just macros that result in
|
||||
several of these commands below. Note that you can execute several
|
||||
of these commands, then the results of a script, or vice-versa.
|
||||
*/
|
||||
|
||||
void xtload_bootloader_wake (void);
|
||||
void xtload_bootloader_sleep (void);
|
||||
void xtload_bootloader_done (void);
|
||||
void xtload_bootloader_not_done (void);
|
||||
void xtload_reset_and_cont (core_number_t core);
|
||||
void xtload_stall_and_reset (core_number_t core);
|
||||
#define xtload_reset_and_stall xtload_stall_and_reset
|
||||
void xtload_stall_and_target (core_number_t core);
|
||||
void xtload_ignore_and_stall (core_number_t core);
|
||||
void xtload_ignore_and_cont (core_number_t core);
|
||||
#define xtload_ignore_and_continue xtload_ignore_and_cont
|
||||
void xtload_read_words (xtload_address_t addr, xtload_word_count_t count);
|
||||
void xtload_zero_words (xtload_address_t addr, xtload_word_count_t count);
|
||||
void xtload_write_words (int swap, xtload_address_t addr,
|
||||
xtload_word_ptr_t ptr, xtload_word_count_t count);
|
||||
void xtload_setup_write_words (xtload_address_t addr, xtload_word_count_t count);
|
||||
void xtload_read_register (core_number_t core);
|
||||
|
||||
/* *I M P O R T A N T*
|
||||
|
||||
The bootloader API calls this function whenever it outputs a word
|
||||
to the bootloader hardware chain.
|
||||
|
||||
Because the API has no information about how the bootloader
|
||||
hardware is connected to the host hardware, the user must
|
||||
implement this function to write a word to the bootloader's register.
|
||||
|
||||
A user's implementation might write the bytes to an Xtensa queue or
|
||||
to a memory-mapped register.
|
||||
|
||||
For example, xt-load uses this API just like any other client. Its
|
||||
implementation of this function simply writes this word to an
|
||||
output file.
|
||||
*/
|
||||
|
||||
void xtload_user_output_word (uint32_t word);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _XTLOAD_API_H */
|
||||
|
@ -1,338 +0,0 @@
|
||||
/* Copyright (c) 2007-2013 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
/ These coded instructions, statements, and computer programs are the
|
||||
/ copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
/ They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
/ third parties in any manner, medium, or form, in whole or in part, without
|
||||
/ the prior written consent of Tensilica Inc.
|
||||
*/
|
||||
|
||||
/* xtml605.h - Xtensa Xilinx ML605 (XT-ML605) board specific definitions */
|
||||
/* xtkc705.h - Also includes this, for the Xilinx KC705 (XT-KC705). */
|
||||
|
||||
#ifndef _INC_ML605_H_
|
||||
#define _INC_ML605_H_
|
||||
|
||||
#include <xtensa/config/core.h>
|
||||
#include <xtensa/config/system.h>
|
||||
|
||||
#if XTBOARD_IS_KC705
|
||||
#define XTBOARD_NAME "XT-KC705"
|
||||
#else
|
||||
#define XTBOARD_NAME "XT-ML605"
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Default assignment of ML605 devices to external interrupts.
|
||||
*/
|
||||
|
||||
/* Ethernet interrupt: */
|
||||
#ifdef XCHAL_EXTINT1_NUM
|
||||
#define ETHERNET_INTNUM XCHAL_EXTINT1_NUM
|
||||
#define ETHERNET_INTLEVEL XCHAL_EXTINT1_LEVEL
|
||||
#define ETHERNET_INTMASK XCHAL_EXTINT1_MASK
|
||||
#else
|
||||
#define ETHERNET_INTMASK 0
|
||||
#endif
|
||||
|
||||
/* UART interrupt: */
|
||||
#ifdef XCHAL_EXTINT0_NUM
|
||||
#define UART16550_INTNUM XCHAL_EXTINT0_NUM
|
||||
#define UART16550_INTLEVEL XCHAL_EXTINT0_LEVEL
|
||||
#define UART16550_INTMASK XCHAL_EXTINT0_MASK
|
||||
#else
|
||||
#define UART16550_INTMASK 0
|
||||
#endif
|
||||
|
||||
/* Audio output interrupt (I2S transmitter FIFO): */
|
||||
#ifdef XCHAL_EXTINT2_NUM
|
||||
#define AUDIO_I2S_OUT_INTNUM XCHAL_EXTINT2_NUM
|
||||
#define AUDIO_I2S_OUT_INTLEVEL XCHAL_EXTINT2_LEVEL
|
||||
#define AUDIO_I2S_OUT_INTMASK XCHAL_EXTINT2_MASK
|
||||
#else
|
||||
#define AUDIO_I2S_OUT_INTMASK 0
|
||||
#endif
|
||||
|
||||
/* Audio input interrupt (I2S receiver FIFO): */
|
||||
#ifdef XCHAL_EXTINT3_NUM
|
||||
#define AUDIO_I2S_IN_INTNUM XCHAL_EXTINT3_NUM
|
||||
#define AUDIO_I2S_IN_INTLEVEL XCHAL_EXTINT3_LEVEL
|
||||
#define AUDIO_I2S_IN_INTMASK XCHAL_EXTINT3_MASK
|
||||
#else
|
||||
#define AUDIO_I2S_IN_INTMASK 0
|
||||
#endif
|
||||
|
||||
/* I2C interrupt */
|
||||
#ifdef XCHAL_EXTINT4_NUM
|
||||
#define I2C_INTNUM XCHAL_EXTINT4_NUM
|
||||
#define I2C_INTLEVEL XCHAL_EXTINT4_LEVEL
|
||||
#define I2C_INTMASK XCHAL_EXTINT4_MASK
|
||||
#else
|
||||
#define I2C_INTMASK 0
|
||||
#endif
|
||||
|
||||
/* USB interrupt */
|
||||
#ifdef XCHAL_EXTINT5_NUM
|
||||
#define USB_INTNUM XCHAL_EXTINT5_NUM
|
||||
#define USB_INTLEVEL XCHAL_EXTINT5_LEVEL
|
||||
#define USB_INTMASK XCHAL_EXTINT5_MASK
|
||||
#else
|
||||
#define USB_INTMASK 0
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Device addresses.
|
||||
*
|
||||
* Note: for endianness-independence, use 32-bit loads and stores for all
|
||||
* register accesses to Ethernet, UART and LED devices. Undefined bits
|
||||
* may need to be masked out if needed when reading if the actual register
|
||||
* size is smaller than 32 bits.
|
||||
*
|
||||
* Note: ML605 bus byte lanes are defined in terms of msbyte and lsbyte
|
||||
* relative to the processor. So 32-bit registers are accessed consistently
|
||||
* from both big and little endian processors. However, this means byte
|
||||
* sequences are not consistent between big and little endian processors.
|
||||
* This is fine for RAM, and for ROM if ROM is created for a specific
|
||||
* processor (and thus has correct byte sequences). However this may be
|
||||
* unexpected for Flash, which might contain a file-system that one wants
|
||||
* to use for multiple processor configurations (eg. the Flash might contain
|
||||
* the Ethernet card's address, endianness-independent application data, etc).
|
||||
* That is, byte sequences written in Flash by a core of a given endianness
|
||||
* will be byte-swapped when seen by a core of the other endianness.
|
||||
* Someone implementing an endianness-independent Flash file system will
|
||||
* likely handle this byte-swapping issue in the Flash driver software.
|
||||
*/
|
||||
|
||||
#define ML605_FLASH_MAXSIZE 0x01000000 /* 16 MB */
|
||||
#define ML605_FLASH_IOBLOCK_OFS 0x08000000
|
||||
|
||||
#define KC705_FLASH_MAXSIZE 0x08000000 /* 128 MB */
|
||||
#define KC705_FLASH_IOBLOCK_OFS 0x00000000
|
||||
|
||||
#if XTBOARD_IS_KC705
|
||||
#define XTBOARD_FLASH_MAXSIZE KC705_FLASH_MAXSIZE
|
||||
#define XTBOARD_FLASH_IO_OFS KC705_FLASH_IOBLOCK_OFS
|
||||
#else
|
||||
#define XTBOARD_FLASH_MAXSIZE ML605_FLASH_MAXSIZE
|
||||
#define XTBOARD_FLASH_IO_OFS ML605_FLASH_IOBLOCK_OFS
|
||||
#endif
|
||||
|
||||
#ifdef XSHAL_IOBLOCK_BYPASS_PADDR
|
||||
|
||||
/* Flash Memory: */
|
||||
# define XTBOARD_FLASH_PADDR (XSHAL_IOBLOCK_BYPASS_PADDR+XTBOARD_FLASH_IO_OFS)
|
||||
|
||||
/* FPGA registers: */
|
||||
# define XTBOARD_FPGAREGS_PADDR (XSHAL_IOBLOCK_BYPASS_PADDR+0x0D020000)
|
||||
|
||||
/* Ethernet controller/transceiver SONIC SN83934: */
|
||||
# define ETHERNET_PADDR (XSHAL_IOBLOCK_BYPASS_PADDR+0x0D030000)
|
||||
|
||||
|
||||
/* UART National-Semi PC16550D: */
|
||||
# define UART16550_PADDR (XSHAL_IOBLOCK_BYPASS_PADDR+0x0D050000)
|
||||
|
||||
/* I2S transmitter */
|
||||
# define AUDIO_I2S_OUT_PADDR (XSHAL_IOBLOCK_BYPASS_PADDR+0x0D080000)
|
||||
|
||||
/* I2S receiver */
|
||||
# define AUDIO_I2S_IN_PADDR (XSHAL_IOBLOCK_BYPASS_PADDR+0x0D088000)
|
||||
|
||||
/* I2C master */
|
||||
# define I2C_PADDR (XSHAL_IOBLOCK_BYPASS_PADDR+0x0D090000)
|
||||
|
||||
/* SPI controller */
|
||||
# define SPI_PADDR (XSHAL_IOBLOCK_BYPASS_PADDR+0x0D0A0000)
|
||||
|
||||
/* Display controller Sunplus SPLC780D, 4bit mode,
|
||||
* LCD Display MYTech MOC-16216B-B: */
|
||||
# define SPLC780D_4BIT_PADDR (XSHAL_IOBLOCK_BYPASS_PADDR+0x0D0C0000)
|
||||
|
||||
/* USB Controller */
|
||||
# define USB_PADDR (XSHAL_IOBLOCK_BYPASS_PADDR+0x0D0D0000)
|
||||
|
||||
/* Ethernet buffer: */
|
||||
# define ETHERNET_BUFFER_PADDR (XSHAL_IOBLOCK_BYPASS_PADDR+0x0D800000)
|
||||
|
||||
#endif /* XSHAL_IOBLOCK_BYPASS_PADDR */
|
||||
|
||||
/* These devices might be accessed cached: */
|
||||
#ifdef XSHAL_IOBLOCK_CACHED_PADDR
|
||||
# define XTBOARD_FLASH_CACHED_PADDR (XSHAL_IOBLOCK_CACHED_PADDR+XTBOARD_FLASH_IO_OFS)
|
||||
# define ETHERNET_BUFFER_CACHED_PADDR (XSHAL_IOBLOCK_CACHED_PADDR+0x0D800000)
|
||||
#endif /* XSHAL_IOBLOCK_CACHED_PADDR */
|
||||
|
||||
|
||||
/*** Same thing over again, this time with virtual addresses: ***/
|
||||
|
||||
#ifdef XSHAL_IOBLOCK_BYPASS_VADDR
|
||||
|
||||
/* Flash Memory: */
|
||||
# define XTBOARD_FLASH_VADDR (XSHAL_IOBLOCK_BYPASS_VADDR+XTBOARD_FLASH_IO_OFS)
|
||||
|
||||
/* FPGA registers: */
|
||||
# define XTBOARD_FPGAREGS_VADDR (XSHAL_IOBLOCK_BYPASS_VADDR+0x0D020000)
|
||||
|
||||
/* Ethernet controller/transceiver SONIC SN83934: */
|
||||
# define ETHERNET_VADDR (XSHAL_IOBLOCK_BYPASS_VADDR+0x0D030000)
|
||||
|
||||
|
||||
/* UART National-Semi PC16550D: */
|
||||
# define UART16550_VADDR (XSHAL_IOBLOCK_BYPASS_VADDR+0x0D050000)
|
||||
|
||||
/* I2S transmitter */
|
||||
# define AUDIO_I2S_OUT_VADDR (XSHAL_IOBLOCK_BYPASS_VADDR+0x0D080000)
|
||||
|
||||
/* I2S receiver */
|
||||
# define AUDIO_I2S_IN_VADDR (XSHAL_IOBLOCK_BYPASS_VADDR+0x0D088000)
|
||||
|
||||
/* I2C master */
|
||||
# define I2C_VADDR (XSHAL_IOBLOCK_BYPASS_VADDR+0x0D090000)
|
||||
|
||||
/* SPI controller */
|
||||
# define SPI_VADDR (XSHAL_IOBLOCK_BYPASS_VADDR+0x0D0A0000)
|
||||
|
||||
/* Display controller Sunplus SPLC780D, 4bit mode,
|
||||
* LCD Display MYTech MOC-16216B-B: */
|
||||
# define SPLC780D_4BIT_VADDR (XSHAL_IOBLOCK_BYPASS_VADDR+0x0D0C0000)
|
||||
|
||||
/* USB Controller */
|
||||
# define USB_VADDR (XSHAL_IOBLOCK_BYPASS_VADDR+0x0D0D0000)
|
||||
|
||||
/* Ethernet buffer: */
|
||||
# define ETHERNET_BUFFER_VADDR (XSHAL_IOBLOCK_BYPASS_VADDR+0x0D800000)
|
||||
|
||||
#endif /* XSHAL_IOBLOCK_BYPASS_VADDR */
|
||||
|
||||
/* These devices might be accessed cached: */
|
||||
#ifdef XSHAL_IOBLOCK_CACHED_VADDR
|
||||
# define XTBOARD_FLASH_CACHED_VADDR (XSHAL_IOBLOCK_CACHED_VADDR+XTBOARD_FLASH_IO_OFS)
|
||||
# define ETHERNET_BUFFER_CACHED_VADDR (XSHAL_IOBLOCK_CACHED_VADDR+0x0D800000)
|
||||
#endif /* XSHAL_IOBLOCK_CACHED_VADDR */
|
||||
|
||||
|
||||
/* System ROM: */
|
||||
#define XTBOARD_ROM_SIZE XSHAL_ROM_SIZE
|
||||
#ifdef XSHAL_ROM_VADDR
|
||||
#define XTBOARD_ROM_VADDR XSHAL_ROM_VADDR
|
||||
#endif
|
||||
#ifdef XSHAL_ROM_PADDR
|
||||
#define XTBOARD_ROM_PADDR XSHAL_ROM_PADDR
|
||||
#endif
|
||||
|
||||
/* System RAM: */
|
||||
#define XTBOARD_RAM_SIZE XSHAL_RAM_SIZE
|
||||
#ifdef XSHAL_RAM_VADDR
|
||||
#define XTBOARD_RAM_VADDR XSHAL_RAM_VADDR
|
||||
#endif
|
||||
#ifdef XSHAL_RAM_PADDR
|
||||
#define XTBOARD_RAM_PADDR XSHAL_RAM_PADDR
|
||||
#endif
|
||||
#define XTBOARD_RAM_BYPASS_VADDR XSHAL_RAM_BYPASS_VADDR
|
||||
#define XTBOARD_RAM_BYPASS_PADDR XSHAL_RAM_BYPASS_PADDR
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Things that depend on device addresses.
|
||||
*/
|
||||
|
||||
|
||||
#define XTBOARD_CACHEATTR_WRITEBACK XSHAL_XT2000_CACHEATTR_WRITEBACK
|
||||
#define XTBOARD_CACHEATTR_WRITEALLOC XSHAL_XT2000_CACHEATTR_WRITEALLOC
|
||||
#define XTBOARD_CACHEATTR_WRITETHRU XSHAL_XT2000_CACHEATTR_WRITETHRU
|
||||
#define XTBOARD_CACHEATTR_BYPASS XSHAL_XT2000_CACHEATTR_BYPASS
|
||||
#define XTBOARD_CACHEATTR_DEFAULT XSHAL_XT2000_CACHEATTR_DEFAULT
|
||||
|
||||
#define XTBOARD_BUSINT_PIPE_REGIONS XSHAL_XT2000_PIPE_REGIONS
|
||||
#define XTBOARD_BUSINT_SDRAM_REGIONS XSHAL_XT2000_SDRAM_REGIONS
|
||||
|
||||
|
||||
/*
|
||||
* FPGA registers.
|
||||
* All these registers are normally accessed using 32-bit loads/stores.
|
||||
*/
|
||||
|
||||
/* Register offsets: */
|
||||
#define XTBOARD_DATECD_OFS 0x00 /* date code (read-only) */
|
||||
#define XTBOARD_CLKFRQ_OFS 0x04 /* clock frequency Hz (read-only) */
|
||||
#define XTBOARD_SYSLED_OFS 0x08 /* LEDs */
|
||||
#define XTBOARD_DIPSW_OFS 0x0C /* DIP switch bits (read-only) */
|
||||
#define XTBOARD_SWRST_OFS 0x10 /* software reset */
|
||||
|
||||
/* Physical register addresses: */
|
||||
#ifdef XTBOARD_FPGAREGS_PADDR
|
||||
#define XTBOARD_DATECD_PADDR (XTBOARD_FPGAREGS_PADDR+XTBOARD_DATECD_OFS)
|
||||
#define XTBOARD_CLKFRQ_PADDR (XTBOARD_FPGAREGS_PADDR+XTBOARD_CLKFRQ_OFS)
|
||||
#define XTBOARD_SYSLED_PADDR (XTBOARD_FPGAREGS_PADDR+XTBOARD_SYSLED_OFS)
|
||||
#define XTBOARD_DIPSW_PADDR (XTBOARD_FPGAREGS_PADDR+XTBOARD_DIPSW_OFS)
|
||||
#define XTBOARD_SWRST_PADDR (XTBOARD_FPGAREGS_PADDR+XTBOARD_SWRST_OFS)
|
||||
#endif
|
||||
|
||||
/* Virtual register addresses: */
|
||||
#ifdef XTBOARD_FPGAREGS_VADDR
|
||||
#define XTBOARD_DATECD_VADDR (XTBOARD_FPGAREGS_VADDR+XTBOARD_DATECD_OFS)
|
||||
#define XTBOARD_CLKFRQ_VADDR (XTBOARD_FPGAREGS_VADDR+XTBOARD_CLKFRQ_OFS)
|
||||
#define XTBOARD_SYSLED_VADDR (XTBOARD_FPGAREGS_VADDR+XTBOARD_SYSLED_OFS)
|
||||
#define XTBOARD_DIPSW_VADDR (XTBOARD_FPGAREGS_VADDR+XTBOARD_DIPSW_OFS)
|
||||
#define XTBOARD_SWRST_VADDR (XTBOARD_FPGAREGS_VADDR+XTBOARD_SWRST_OFS)
|
||||
/* Register access (for C code): */
|
||||
#define XTBOARD_DATECD_REG (*(volatile unsigned*) XTBOARD_DATECD_VADDR)
|
||||
#define XTBOARD_CLKFRQ_REG (*(volatile unsigned*) XTBOARD_CLKFRQ_VADDR)
|
||||
#define XTBOARD_SYSLED_REG (*(volatile unsigned*) XTBOARD_SYSLED_VADDR)
|
||||
#define XTBOARD_DIPSW_REG (*(volatile unsigned*) XTBOARD_DIPSW_VADDR)
|
||||
#define XTBOARD_SWRST_REG (*(volatile unsigned*) XTBOARD_SWRST_VADDR)
|
||||
#endif
|
||||
|
||||
/* DATECD (date code; when core was built) bit fields: */
|
||||
/* BCD-coded month (01..12): */
|
||||
#define XTBOARD_DATECD_MONTH_SHIFT 24
|
||||
#define XTBOARD_DATECD_MONTH_BITS 8
|
||||
#define XTBOARD_DATECD_MONTH_MASK 0xFF000000
|
||||
/* BCD-coded day (01..31): */
|
||||
#define XTBOARD_DATECD_DAY_SHIFT 16
|
||||
#define XTBOARD_DATECD_DAY_BITS 8
|
||||
#define XTBOARD_DATECD_DAY_MASK 0x00FF0000
|
||||
/* BCD-coded year (2001..9999): */
|
||||
#define XTBOARD_DATECD_YEAR_SHIFT 0
|
||||
#define XTBOARD_DATECD_YEAR_BITS 16
|
||||
#define XTBOARD_DATECD_YEAR_MASK 0x0000FFFF
|
||||
|
||||
/* SYSLED (system LED) bit fields: */
|
||||
|
||||
/* LED control bits (off=0, on=1): */
|
||||
#define XTBOARD_SYSLED_USER_SHIFT 0
|
||||
#define XTBOARD_SYSLED_USER_BITS 2
|
||||
#define XTBOARD_SYSLED_USER_MASK 0x00000003
|
||||
|
||||
/* DIP Switch SW? (left=sw1=lsb=bit0, right=sw4=msb=bit3; off=0, on=1): */
|
||||
/* DIP switch bit fields (bit2/sw3 is reserved and presently unused): */
|
||||
#if XTBOARD_IS_KC705
|
||||
#define XTBOARD_DIPSW_USER_SHIFT 0
|
||||
#define XTBOARD_DIPSW_USER_BITS 2
|
||||
#define XTBOARD_DIPSW_USER_MASK 0x00000003
|
||||
#define XTBOARD_DIPSW_BOOT_SHIFT 3
|
||||
#define XTBOARD_DIPSW_BOOT_BITS 1
|
||||
#define XTBOARD_DIPSW_BOOT_MASK 0x00000008
|
||||
#else /* ML605: */
|
||||
#define XTBOARD_DIPSW_USER_SHIFT 0
|
||||
#define XTBOARD_DIPSW_USER_BITS 6
|
||||
#define XTBOARD_DIPSW_USER_MASK 0x0000003F
|
||||
#define XTBOARD_DIPSW_BOOT_SHIFT 7
|
||||
#define XTBOARD_DIPSW_BOOT_BITS 1
|
||||
#define XTBOARD_DIPSW_BOOT_MASK 0x00000080
|
||||
#endif /*ML605*/
|
||||
#define XTBOARD_DIPSW_BOOT_RAM (0<<XTBOARD_DIPSW_BOOT_SHIFT) /* off */
|
||||
#define XTBOARD_DIPSW_BOOT_FLASH (1<<XTBOARD_DIPSW_BOOT_SHIFT) /* on */
|
||||
|
||||
/* SWRST (software reset; allows s/w to generate power-on equivalent reset): */
|
||||
/* Software reset bits: */
|
||||
#define XTBOARD_SWRST_SWR_SHIFT 0
|
||||
#define XTBOARD_SWRST_SWR_BITS 16
|
||||
#define XTBOARD_SWRST_SWR_MASK 0x0000FFFF
|
||||
/* Software reset value -- writing this value resets the board: */
|
||||
#define XTBOARD_SWRST_RESETVALUE 0x0000DEAD
|
||||
|
||||
|
||||
#endif /*_INC_ML605_H_*/
|
||||
|
@ -1,13 +0,0 @@
|
||||
/*
|
||||
* board.h - Include board-specific definitions
|
||||
*
|
||||
* Copyright (c) 2011 by Tensilica Inc. ALL RIGHTS RESERVED.
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* copyrighted works and confidential proprietary information of Tensilica Inc.
|
||||
* They may not be modified, copied, reproduced, distributed, or disclosed to
|
||||
* third parties in any manner, medium, or form, in whole or in part, without
|
||||
* the prior written consent of Tensilica Inc.
|
||||
*/
|
||||
|
||||
#include <xtensa/xtml605.h>
|
||||
|
@ -1,61 +0,0 @@
|
||||
|
||||
/* $Id$ */
|
||||
/*******************************************************************************/
|
||||
/* Copyright (c) 2001-2013 by Tensilica Inc. ALL RIGHTS RESERVED. */
|
||||
/* These coded instructions, statements, and computer programs are the */
|
||||
/* copyrighted works and confidential proprietary information of Tensilica Inc.*/
|
||||
/* They may not be modified, copied, reproduced, distributed, or disclosed to */
|
||||
/* third parties in any manner, medium, or form, in whole or in part, without */
|
||||
/* the prior written consent of Tensilica Inc. */
|
||||
/*******************************************************************************/
|
||||
|
||||
#ifndef XTUTIL_H
|
||||
#define XTUTIL_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
extern int xt_putchar(int c);
|
||||
extern int xt_puts(const char * s);
|
||||
extern void xt_putn(unsigned n);
|
||||
extern int xt_atoi(const char * s);
|
||||
extern int xt_printf(const char *fmt, ...);
|
||||
extern int xt_sprintf(char * buf, const char * fmt, ...);
|
||||
|
||||
typedef int xt_output_fn(int *, int, const void *, int);
|
||||
extern xt_output_fn * xt_set_output_fn(xt_output_fn * fn);
|
||||
|
||||
#ifdef XTUTIL_LIB
|
||||
|
||||
// Only defined if building library
|
||||
|
||||
typedef void (xt_outbuf_fn)(void *, char *, int);
|
||||
|
||||
extern int xt_vprintf(xt_outbuf_fn * out, void * outarg, const char * fmt, va_list ap);
|
||||
|
||||
#else
|
||||
|
||||
// Only defined if building application and overriding
|
||||
|
||||
#ifndef XTUTIL_NO_OVERRIDE
|
||||
|
||||
#define putchar xt_putchar
|
||||
#define puts xt_puts
|
||||
#define putn xt_putn
|
||||
#define atoi xt_atoi
|
||||
#define printf xt_printf
|
||||
#define sprintf xt_sprintf
|
||||
|
||||
#endif // XTUTIL_NO_OVERRIDE
|
||||
|
||||
#endif // XTUTIL_LIB
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // XTUTIL_H
|
||||
|
@ -74,7 +74,6 @@ extern "C" {
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include <xtensa/tie/xt_core.h>
|
||||
#include <xtensa/hal.h>
|
||||
#include <xtensa/config/core.h>
|
||||
#include <xtensa/config/system.h> /* required for XSHAL_CLIB */
|
||||
|
@ -50,7 +50,6 @@ Should be included by all Xtensa generic and RTOS port-specific sources.
|
||||
|
||||
#include <xtensa/corebits.h>
|
||||
#include <xtensa/config/system.h>
|
||||
#include <xtensa/simcall.h>
|
||||
|
||||
/*
|
||||
Include any RTOS specific definitions that are needed by this header.
|
||||
|
Loading…
Reference in New Issue
Block a user