You've already forked hackerlibultra
mirror of
https://github.com/HackerN64/hackerlibultra.git
synced 2026-01-21 10:37:53 -08:00
PI IO , EPI IO, Flash (#9)
* Rudimentary type information extraction in mdebug.py, spsetpc OK * ultratypes.h for setglobalintmask.c * pi and epi io routines * Flash files, non-matching elf disassembler tool
This commit is contained in:
260
include/PR/os.h
260
include/PR/os.h
@@ -15,7 +15,14 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "PR/ultratypes.h"
|
||||
#include "ultratypes.h"
|
||||
#include "os_thread.h"
|
||||
#include "os_message.h"
|
||||
#include "os_exception.h"
|
||||
#include "os_pi.h"
|
||||
#include "os_system.h"
|
||||
#include "os_flash.h"
|
||||
#include "os_convert.h"
|
||||
|
||||
#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS)
|
||||
|
||||
@@ -25,140 +32,7 @@ extern "C" {
|
||||
*
|
||||
*/
|
||||
|
||||
typedef s32 OSPri;
|
||||
typedef s32 OSId;
|
||||
typedef union { struct { f32 f_odd; f32 f_even; } f; f64 d; } __OSfp;
|
||||
|
||||
typedef struct {
|
||||
u64 at, v0, v1, a0, a1, a2, a3;
|
||||
u64 t0, t1, t2, t3, t4, t5, t6, t7;
|
||||
u64 s0, s1, s2, s3, s4, s5, s6, s7;
|
||||
u64 t8, t9, gp, sp, s8, ra;
|
||||
u64 lo, hi;
|
||||
u32 sr, pc, cause, badvaddr, rcp;
|
||||
u32 fpcsr;
|
||||
__OSfp fp0, fp2, fp4, fp6, fp8, fp10, fp12, fp14;
|
||||
__OSfp fp16, fp18, fp20, fp22, fp24, fp26, fp28, fp30;
|
||||
} __OSThreadContext;
|
||||
|
||||
typedef struct OSThread_s {
|
||||
struct OSThread_s *next; /* run/mesg queue link */
|
||||
OSPri priority; /* run/mesg queue priority */
|
||||
struct OSThread_s **queue; /* queue thread is on */
|
||||
struct OSThread_s *tlnext; /* all threads queue link */
|
||||
u16 state; /* OS_STATE_* */
|
||||
u16 flags; /* flags for rmon */
|
||||
OSId id; /* id for debugging */
|
||||
int fp; /* thread has used fp unit */
|
||||
__OSThreadContext context; /* register/interrupt mask */
|
||||
} OSThread;
|
||||
|
||||
typedef u32 OSEvent;
|
||||
typedef u32 OSIntMask;
|
||||
typedef u32 OSPageMask;
|
||||
typedef u32 OSHWIntr;
|
||||
|
||||
/*
|
||||
* Structure for message
|
||||
*/
|
||||
typedef void * OSMesg;
|
||||
|
||||
/*
|
||||
* Structure for message queue
|
||||
*/
|
||||
typedef struct OSMesgQueue_s {
|
||||
OSThread *mtqueue; /* Queue to store threads blocked
|
||||
on empty mailboxes (receive) */
|
||||
OSThread *fullqueue; /* Queue to store threads blocked
|
||||
on full mailboxes (send) */
|
||||
s32 validCount; /* Contains number of valid message */
|
||||
s32 first; /* Points to first valid message */
|
||||
s32 msgCount; /* Contains total # of messages */
|
||||
OSMesg *msg; /* Points to message buffer array */
|
||||
} OSMesgQueue;
|
||||
|
||||
/*
|
||||
* Structure for Enhanced PI interface
|
||||
*/
|
||||
|
||||
/*
|
||||
* OSTranxInfo is set up for Leo Disk DMA. This info will be maintained
|
||||
* by exception handler. This is how the PIMGR and the ISR communicate.
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
u32 errStatus; /* error status */
|
||||
void *dramAddr; /* RDRAM buffer address (DMA) */
|
||||
void *C2Addr; /* C2 buffer address */
|
||||
u32 sectorSize; /* size of transfering sector */
|
||||
u32 C1ErrNum; /* total # of C1 errors */
|
||||
u32 C1ErrSector[4]; /* error sectors */
|
||||
} __OSBlockInfo;
|
||||
|
||||
typedef struct {
|
||||
u32 cmdType; /* for disk only */
|
||||
u16 transferMode; /* Block, Track, or sector? */
|
||||
u16 blockNum; /* which block is transfering */
|
||||
s32 sectorNum; /* which sector is transfering */
|
||||
u32 devAddr; /* Device buffer address */
|
||||
u32 bmCtlShadow; /* asic bm_ctl(510) register shadow ram */
|
||||
u32 seqCtlShadow; /* asic seq_ctl(518) register shadow ram */
|
||||
__OSBlockInfo block[2]; /* bolck transfer info */
|
||||
} __OSTranxInfo;
|
||||
|
||||
|
||||
typedef struct OSPiHandle_s {
|
||||
struct OSPiHandle_s *next; /* point to next handle on the table */
|
||||
u8 type; /* DEVICE_TYPE_BULK for disk */
|
||||
u8 latency; /* domain latency */
|
||||
u8 pageSize; /* domain page size */
|
||||
u8 relDuration; /* domain release duration */
|
||||
u8 pulse; /* domain pulse width */
|
||||
u8 domain; /* which domain */
|
||||
u32 baseAddress; /* Domain address */
|
||||
u32 speed; /* for roms only */
|
||||
/* The following are "private" elements" */
|
||||
__OSTranxInfo transferInfo; /* for disk only */
|
||||
} OSPiHandle;
|
||||
|
||||
typedef struct {
|
||||
u8 type;
|
||||
u32 address;
|
||||
} OSPiInfo;
|
||||
|
||||
/*
|
||||
* Structure for I/O message block
|
||||
*/
|
||||
typedef struct {
|
||||
u16 type; /* Message type */
|
||||
u8 pri; /* Message priority (High or Normal) */
|
||||
u8 status; /* Return status */
|
||||
OSMesgQueue *retQueue; /* Return message queue to notify I/O
|
||||
* completion */
|
||||
} OSIoMesgHdr;
|
||||
|
||||
typedef struct {
|
||||
OSIoMesgHdr hdr; /* Message header */
|
||||
void * dramAddr; /* RDRAM buffer address (DMA) */
|
||||
u32 devAddr; /* Device buffer address (DMA) */
|
||||
u32 size; /* DMA transfer size in bytes */
|
||||
OSPiHandle *piHandle; /* PI device handle */
|
||||
} OSIoMesg;
|
||||
|
||||
/*
|
||||
* Structure for device manager block
|
||||
*/
|
||||
typedef struct {
|
||||
s32 active; /* Status flag */
|
||||
OSThread *thread; /* Calling thread */
|
||||
OSMesgQueue *cmdQueue; /* Command queue */
|
||||
OSMesgQueue *evtQueue; /* Event queue */
|
||||
OSMesgQueue *acsQueue; /* Access queue */
|
||||
/* Raw DMA routine */
|
||||
s32 (*dma)(s32, u32, void *, u32);
|
||||
s32 (*edma)(OSPiHandle *, s32, u32, void *, u32);
|
||||
} OSDevMgr;
|
||||
|
||||
|
||||
/*
|
||||
* Structure to store VI register values that remain the same between 2 fields
|
||||
@@ -289,114 +163,6 @@ typedef struct {
|
||||
*
|
||||
*/
|
||||
|
||||
/* Thread states */
|
||||
|
||||
#define OS_STATE_STOPPED 1
|
||||
#define OS_STATE_RUNNABLE 2
|
||||
#define OS_STATE_RUNNING 4
|
||||
#define OS_STATE_WAITING 8
|
||||
|
||||
/* Events */
|
||||
#ifdef _FINALROM
|
||||
#define OS_NUM_EVENTS 15
|
||||
#else
|
||||
#define OS_NUM_EVENTS 23
|
||||
#endif
|
||||
|
||||
#define OS_EVENT_SW1 0 /* CPU SW1 interrupt */
|
||||
#define OS_EVENT_SW2 1 /* CPU SW2 interrupt */
|
||||
#define OS_EVENT_CART 2 /* Cartridge interrupt: used by rmon */
|
||||
#define OS_EVENT_COUNTER 3 /* Counter int: used by VI/Timer Mgr */
|
||||
#define OS_EVENT_SP 4 /* SP task done interrupt */
|
||||
#define OS_EVENT_SI 5 /* SI (controller) interrupt */
|
||||
#define OS_EVENT_AI 6 /* AI interrupt */
|
||||
#define OS_EVENT_VI 7 /* VI interrupt: used by VI/Timer Mgr */
|
||||
#define OS_EVENT_PI 8 /* PI interrupt: used by PI Manager */
|
||||
#define OS_EVENT_DP 9 /* DP full sync interrupt */
|
||||
#define OS_EVENT_CPU_BREAK 10 /* CPU breakpoint: used by rmon */
|
||||
#define OS_EVENT_SP_BREAK 11 /* SP breakpoint: used by rmon */
|
||||
#define OS_EVENT_FAULT 12 /* CPU fault event: used by rmon */
|
||||
#define OS_EVENT_THREADSTATUS 13 /* CPU thread status: used by rmon */
|
||||
#define OS_EVENT_PRENMI 14 /* Pre NMI interrupt */
|
||||
#ifndef _FINALROM
|
||||
#define OS_EVENT_RDB_READ_DONE 15 /* RDB read ok event: used by rmon */
|
||||
#define OS_EVENT_RDB_LOG_DONE 16 /* read of log data complete */
|
||||
#define OS_EVENT_RDB_DATA_DONE 17 /* read of hostio data complete */
|
||||
#define OS_EVENT_RDB_REQ_RAMROM 18 /* host needs ramrom access */
|
||||
#define OS_EVENT_RDB_FREE_RAMROM 19 /* host is done with ramrom access */
|
||||
#define OS_EVENT_RDB_DBG_DONE 20
|
||||
#define OS_EVENT_RDB_FLUSH_PROF 21
|
||||
#define OS_EVENT_RDB_ACK_PROF 22
|
||||
#endif
|
||||
|
||||
/* Flags for debugging purpose */
|
||||
|
||||
#define OS_FLAG_CPU_BREAK 1 /* Break exception has occurred */
|
||||
#define OS_FLAG_FAULT 2 /* CPU fault has occurred */
|
||||
|
||||
/* Interrupt masks */
|
||||
|
||||
#define OS_IM_NONE 0x00000001
|
||||
#define OS_IM_RCP 0x00000401
|
||||
#define OS_IM_SW1 0x00000501
|
||||
#define OS_IM_SW2 0x00000601
|
||||
#define OS_IM_CART 0x00000c01
|
||||
#define OS_IM_PRENMI 0x00001401
|
||||
#define OS_IM_RDBWRITE 0x00002401
|
||||
#define OS_IM_RDBREAD 0x00004401
|
||||
#define OS_IM_COUNTER 0x00008401
|
||||
#define OS_IM_CPU 0x0000ff01
|
||||
#define OS_IM_SP 0x00010401
|
||||
#define OS_IM_SI 0x00020401
|
||||
#define OS_IM_AI 0x00040401
|
||||
#define OS_IM_VI 0x00080401
|
||||
#define OS_IM_PI 0x00100401
|
||||
#define OS_IM_DP 0x00200401
|
||||
#define OS_IM_ALL 0x003fff01
|
||||
#define RCP_IMASK 0x003f0000
|
||||
#define RCP_IMASKSHIFT 16
|
||||
|
||||
/* Recommended thread priorities for the system threads */
|
||||
|
||||
#define OS_PRIORITY_MAX 255
|
||||
#define OS_PRIORITY_VIMGR 254
|
||||
#define OS_PRIORITY_RMON 250
|
||||
#define OS_PRIORITY_RMONSPIN 200
|
||||
#define OS_PRIORITY_PIMGR 150
|
||||
#define OS_PRIORITY_SIMGR 140
|
||||
#define OS_PRIORITY_APPMAX 127
|
||||
#define OS_PRIORITY_IDLE 0 /* Must be 0 */
|
||||
|
||||
|
||||
/* Flags to turn blocking on/off when sending/receiving message */
|
||||
|
||||
#define OS_MESG_NOBLOCK 0
|
||||
#define OS_MESG_BLOCK 1
|
||||
|
||||
/* Flags to indicate direction of data transfer */
|
||||
|
||||
#define OS_READ 0 /* device -> RDRAM */
|
||||
#define OS_WRITE 1 /* device <- RDRAM */
|
||||
#define OS_OTHERS 2 /* for Leo disk only */
|
||||
|
||||
/*
|
||||
* I/O message types
|
||||
*/
|
||||
#define OS_MESG_TYPE_BASE (10)
|
||||
#define OS_MESG_TYPE_LOOPBACK (OS_MESG_TYPE_BASE+0)
|
||||
#define OS_MESG_TYPE_DMAREAD (OS_MESG_TYPE_BASE+1)
|
||||
#define OS_MESG_TYPE_DMAWRITE (OS_MESG_TYPE_BASE+2)
|
||||
#define OS_MESG_TYPE_VRETRACE (OS_MESG_TYPE_BASE+3)
|
||||
#define OS_MESG_TYPE_COUNTER (OS_MESG_TYPE_BASE+4)
|
||||
#define OS_MESG_TYPE_EDMAREAD (OS_MESG_TYPE_BASE+5)
|
||||
#define OS_MESG_TYPE_EDMAWRITE (OS_MESG_TYPE_BASE+6)
|
||||
|
||||
/*
|
||||
* I/O message priority
|
||||
*/
|
||||
#define OS_MESG_PRI_NORMAL 0
|
||||
#define OS_MESG_PRI_HIGH 1
|
||||
|
||||
/*
|
||||
* Page size argument for TLB routines
|
||||
*/
|
||||
@@ -419,13 +185,6 @@ typedef struct {
|
||||
|
||||
#define OS_MIN_STACKSIZE 72
|
||||
|
||||
/*
|
||||
* Values for osTvType
|
||||
*/
|
||||
#define OS_TV_PAL 0
|
||||
#define OS_TV_NTSC 1
|
||||
#define OS_TV_MPAL 2
|
||||
|
||||
/*
|
||||
* Video Interface (VI) mode type
|
||||
*/
|
||||
@@ -846,8 +605,6 @@ extern s32 osPiRawReadIo(u32, u32 *);
|
||||
extern s32 osPiRawStartDma(s32, u32, void *, u32);
|
||||
extern s32 osPiWriteIo(u32, u32);
|
||||
extern s32 osPiReadIo(u32, u32 *);
|
||||
extern s32 osPiStartDma(OSIoMesg *, s32, s32, u32, void *, u32,
|
||||
OSMesgQueue *);
|
||||
extern void osCreatePiManager(OSPri, OSMesgQueue *, OSMesg *, s32);
|
||||
|
||||
/* Video interface (Vi) */
|
||||
@@ -959,7 +716,6 @@ extern void bzero(void *, int);
|
||||
|
||||
/* Miscellaneous operations */
|
||||
|
||||
extern void osInitialize(void);
|
||||
extern u32 osGetCount(void);
|
||||
extern void osExit(void);
|
||||
extern u32 osGetMemSize(void);
|
||||
|
||||
43
include/PR/os_convert.h
Normal file
43
include/PR/os_convert.h
Normal file
@@ -0,0 +1,43 @@
|
||||
#ifndef _OS_CONVERT_H_
|
||||
#define _OS_CONVERT_H_
|
||||
|
||||
#ifdef _LANGUAGE_C_PLUS_PLUS
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "ultratypes.h"
|
||||
|
||||
#define OS_CLOCK_RATE 62500000LL
|
||||
#define OS_CPU_COUNTER (OS_CLOCK_RATE*3/4)
|
||||
|
||||
#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS)
|
||||
|
||||
#define OS_NSEC_TO_CYCLES(n) (((u64)(n)*(OS_CPU_COUNTER/15625000LL))/(1000000000LL/15625000LL))
|
||||
#define OS_USEC_TO_CYCLES(n) (((u64)(n)*(OS_CPU_COUNTER/15625LL))/(1000000LL/15625LL))
|
||||
#define OS_CYCLES_TO_NSEC(c) (((u64)(c)*(1000000000LL/15625000LL))/(OS_CPU_COUNTER/15625000LL))
|
||||
#define OS_CYCLES_TO_USEC(c) (((u64)(c)*(1000000LL/15625LL))/(OS_CPU_COUNTER/15625LL))
|
||||
|
||||
/* OS_K?_TO_PHYSICAL macro bug fix for CodeWarrior */
|
||||
#ifndef __MWERKS__
|
||||
#define OS_K0_TO_PHYSICAL(x) (u32)(((char *)(x)-0x80000000))
|
||||
#define OS_K1_TO_PHYSICAL(x) (u32)(((char *)(x)-0xa0000000))
|
||||
#else
|
||||
#define OS_K0_TO_PHYSICAL(x) ((char *)(x)-0x80000000)
|
||||
#define OS_K1_TO_PHYSICAL(x) ((char *)(x)-0xa0000000)
|
||||
#endif
|
||||
|
||||
#define OS_PHYSICAL_TO_K0(x) (void *)(((u32)(x)+0x80000000))
|
||||
#define OS_PHYSICAL_TO_K1(x) (void *)(((u32)(x)+0xa0000000))
|
||||
|
||||
/* Address translation routines and macros */
|
||||
|
||||
extern u32 osVirtualToPhysical(void *);
|
||||
extern void *osPhysicalToVirtual(u32);
|
||||
|
||||
#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */
|
||||
|
||||
#ifdef _LANGUAGE_C_PLUS_PLUS
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* !_OS_CONVERT_H_ */
|
||||
57
include/PR/os_exception.h
Normal file
57
include/PR/os_exception.h
Normal file
@@ -0,0 +1,57 @@
|
||||
#ifndef _OS_EXCEPTION_H_
|
||||
#define _OS_EXCEPTION_H_
|
||||
|
||||
#ifdef _LANGUAGE_C_PLUS_PLUS
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "ultratypes.h"
|
||||
|
||||
#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS)
|
||||
|
||||
typedef u32 OSIntMask;
|
||||
typedef u32 OSHWIntr;
|
||||
|
||||
#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */
|
||||
|
||||
/* Flags for debugging purpose */
|
||||
|
||||
#define OS_FLAG_CPU_BREAK 1 /* Break exception has occurred */
|
||||
#define OS_FLAG_FAULT 2 /* CPU fault has occurred */
|
||||
|
||||
/* Interrupt masks */
|
||||
|
||||
#define OS_IM_NONE 0x00000001
|
||||
#define OS_IM_RCP 0x00000401
|
||||
#define OS_IM_SW1 0x00000501
|
||||
#define OS_IM_SW2 0x00000601
|
||||
#define OS_IM_CART 0x00000c01
|
||||
#define OS_IM_PRENMI 0x00001401
|
||||
#define OS_IM_RDBWRITE 0x00002401
|
||||
#define OS_IM_RDBREAD 0x00004401
|
||||
#define OS_IM_COUNTER 0x00008401
|
||||
#define OS_IM_CPU 0x0000ff01
|
||||
#define OS_IM_SP 0x00010401
|
||||
#define OS_IM_SI 0x00020401
|
||||
#define OS_IM_AI 0x00040401
|
||||
#define OS_IM_VI 0x00080401
|
||||
#define OS_IM_PI 0x00100401
|
||||
#define OS_IM_DP 0x00200401
|
||||
#define OS_IM_ALL 0x003fff01
|
||||
#define RCP_IMASK 0x003f0000
|
||||
#define RCP_IMASKSHIFT 16
|
||||
|
||||
#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS)
|
||||
|
||||
/* Interrupt operations */
|
||||
|
||||
extern OSIntMask osGetIntMask(void);
|
||||
extern OSIntMask osSetIntMask(OSIntMask);
|
||||
|
||||
#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */
|
||||
|
||||
#ifdef _LANGUAGE_C_PLUS_PLUS
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* !_OS_EXCEPTION_H_ */
|
||||
69
include/PR/os_flash.h
Normal file
69
include/PR/os_flash.h
Normal file
@@ -0,0 +1,69 @@
|
||||
#ifndef _OS_FLASH_H_
|
||||
#define _OS_FLASH_H_
|
||||
|
||||
#ifdef _LANGUAGE_C_PLUS_PLUS
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "ultratypes.h"
|
||||
#include "os_pi.h"
|
||||
|
||||
#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS)
|
||||
|
||||
/*
|
||||
* defines for FLASH
|
||||
*/
|
||||
#define FLASH_START_ADDR 0x08000000
|
||||
|
||||
#define FLASH_SIZE 0x20000
|
||||
|
||||
#define FLASH_LATENCY 0x5
|
||||
#define FLASH_PULSE 0x0c
|
||||
#define FLASH_PAGE_SIZE 0xf
|
||||
#define FLASH_REL_DURATION 0x2
|
||||
#define DEVICE_TYPE_FLASH 8
|
||||
|
||||
#define FLASH_VERSION_MX_PROTO_A 0x00c20000
|
||||
#define FLASH_VERSION_MX_A 0x00c20001
|
||||
#define FLASH_VERSION_MX_C 0x00c2001e
|
||||
#define FLASH_VERSION_MX_B_AND_D 0x00c2001d
|
||||
#define FLASH_VERSION_MEI 0x003200f1
|
||||
|
||||
/* OLD_FLASH is MX_PROTO_A, MX_A and MX_C */
|
||||
#define OLD_FLASH 0
|
||||
/* NEW_FLASH is MX_B_AND_D and MATSUSHITA flash */
|
||||
#define NEW_FLASH 1
|
||||
|
||||
#define FLASH_STATUS_ERASE_BUSY 2
|
||||
#define FLASH_STATUS_ERASE_OK 0
|
||||
#define FLASH_STATUS_ERASE_ERROR -1
|
||||
|
||||
#define FLASH_STATUS_WRITE_BUSY 1
|
||||
#define FLASH_STATUS_WRITE_OK 0
|
||||
#define FLASH_STATUS_WRITE_ERROR -1
|
||||
|
||||
extern OSPiHandle *osFlashReInit(u8 latency, u8 pulse,
|
||||
u8 page_size, u8 rel_duration, u32 start);
|
||||
extern OSPiHandle *osFlashInit(void);
|
||||
extern void osFlashReadStatus(u8 *flash_status);
|
||||
extern void osFlashReadId(u32 *flash_type, u32 *flash_maker);
|
||||
extern void osFlashClearStatus(void);
|
||||
extern s32 osFlashAllErase(void);
|
||||
extern s32 osFlashSectorErase(u32 page_num);
|
||||
extern s32 osFlashWriteBuffer(OSIoMesg *mb, s32 priority,
|
||||
void *dramAddr, OSMesgQueue *mq);
|
||||
extern s32 osFlashWriteArray(u32 page_num);
|
||||
extern s32 osFlashReadArray(OSIoMesg *mb, s32 priority, u32 page_num,
|
||||
void *dramAddr, u32 n_pages, OSMesgQueue *mq);
|
||||
extern void osFlashChange(u32 flash_num);
|
||||
extern void osFlashAllEraseThrough(void);
|
||||
extern void osFlashSectorEraseThrough(u32 page_num);
|
||||
extern s32 osFlashCheckEraseEnd(void);
|
||||
|
||||
#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */
|
||||
|
||||
#ifdef _LANGUAGE_C_PLUS_PLUS
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* !_OS_FLASH_H_ */
|
||||
@@ -13,34 +13,13 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "PR/os.h"
|
||||
#include "os.h"
|
||||
|
||||
#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS)
|
||||
|
||||
#include "os_internal_reg.h"
|
||||
#include "os_internal_exception.h"
|
||||
|
||||
/* Routines to get/fetch coprocessor 0 registers */
|
||||
|
||||
extern u32 __osGetCause(void);
|
||||
extern void __osSetCause(u32);
|
||||
extern u32 __osGetCompare(void);
|
||||
extern void __osSetCompare(u32);
|
||||
extern u32 __osGetConfig(void);
|
||||
extern void __osSetConfig(u32);
|
||||
extern void __osSetCount(u32);
|
||||
extern u32 __osGetSR(void);
|
||||
extern void __osSetSR(u32);
|
||||
extern u32 __osDisableInt(void);
|
||||
extern void __osRestoreInt(u32);
|
||||
|
||||
/* Routines to get/set floating-point control and status register */
|
||||
extern u32 __osSetFpcCsr(u32);
|
||||
extern u32 __osGetFpcCsr(void);
|
||||
|
||||
/* Routine for global interrupt mask */
|
||||
extern void __osSetGlobalIntMask(OSHWIntr);
|
||||
extern void __osResetGlobalIntMask(OSHWIntr);
|
||||
#include "os_internal_flash.h"
|
||||
|
||||
/* Routine for global interrupt mask */
|
||||
extern s32 __osLeoInterrupt(void);
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "PR/os.h"
|
||||
#include "os.h"
|
||||
|
||||
#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS)
|
||||
|
||||
|
||||
40
include/PR/os_internal_flash.h
Normal file
40
include/PR/os_internal_flash.h
Normal file
@@ -0,0 +1,40 @@
|
||||
#ifndef _OS_INTERNAL_FLASH_H_
|
||||
#define _OS_INTERNAL_FLASH_H_
|
||||
|
||||
#include "os_message.h"
|
||||
#include "os_flash.h"
|
||||
|
||||
#define FLASH_BLOCK_SIZE 128
|
||||
|
||||
/**
|
||||
* Flash commands
|
||||
*/
|
||||
#define FLASH_CMD_REG 0x10000
|
||||
|
||||
/* set whole chip erase mode */
|
||||
#define FLASH_CMD_CHIP_ERASE 0x3C000000
|
||||
/* set sector erase mode */
|
||||
#define FLASH_CMD_SECTOR_ERASE 0x4B000000
|
||||
/* do erasure */
|
||||
#define FLASH_CMD_EXECUTE_ERASE 0x78000000
|
||||
/* program selected page */
|
||||
#define FLASH_CMD_PROGRAM_PAGE 0xA5000000
|
||||
/* set page program mode */
|
||||
#define FLASH_CMD_PAGE_PROGRAM 0xB4000000
|
||||
/* set status mode */
|
||||
#define FLASH_CMD_STATUS 0xD2000000
|
||||
/* set silicon id mode */
|
||||
#define FLASH_CMD_ID 0xE1000000
|
||||
/* set read mode */
|
||||
#define FLASH_CMD_READ_ARRAY 0xF0000000
|
||||
|
||||
extern s32 __osFlashVersion;
|
||||
extern OSPiHandle __osFlashHandler;
|
||||
extern OSMesgQueue __osFlashMessageQ;
|
||||
extern OSMesg __osFlashMsgBuf[1];
|
||||
extern OSIoMesg __osFlashMsg;
|
||||
extern u32 __osFlashID[4];
|
||||
|
||||
u32 __osFlashGetAddr(u32 page_num);
|
||||
|
||||
#endif
|
||||
@@ -1,41 +1,32 @@
|
||||
/*---------------------------------------------------------------------*
|
||||
|
||||
$RCSfile: os_internal_reg.h,v $
|
||||
$Revision: 1.2 $
|
||||
$Date: 1999/03/10 12:19:14 $
|
||||
*---------------------------------------------------------------------*/
|
||||
|
||||
#ifndef _OS_INTERNAL_REG_H_
|
||||
#define _OS_INTERNAL_REG_H_
|
||||
#define _OS_INTERNAL_REG_H_
|
||||
|
||||
#ifdef _LANGUAGE_C_PLUS_PLUS
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "PR/os.h"
|
||||
#include "os.h"
|
||||
|
||||
#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS)
|
||||
|
||||
/* Routines to get/fetch coprocessor 0 registers */
|
||||
|
||||
extern u32 __osGetCause(void);
|
||||
extern void __osSetCause(u32);
|
||||
extern u32 __osGetCompare(void);
|
||||
extern void __osSetCompare(u32);
|
||||
extern u32 __osGetConfig(void);
|
||||
extern void __osSetConfig(u32);
|
||||
extern void __osSetCount(u32);
|
||||
extern u32 __osGetSR(void);
|
||||
extern void __osSetSR(u32);
|
||||
extern u32 __osDisableInt(void);
|
||||
extern void __osRestoreInt(u32);
|
||||
extern u32 __osGetWatchLo(void);
|
||||
extern void __osSetWatchLo(u32);
|
||||
extern u32 __osGetCause(void);
|
||||
extern void __osSetCause(u32);
|
||||
extern u32 __osGetCompare(void);
|
||||
extern void __osSetCompare(u32);
|
||||
extern u32 __osGetConfig(void);
|
||||
extern void __osSetConfig(u32);
|
||||
extern void __osSetCount(u32);
|
||||
extern u32 __osGetSR(void);
|
||||
extern void __osSetSR(u32);
|
||||
extern u32 __osDisableInt(void);
|
||||
extern void __osRestoreInt(u32);
|
||||
extern u32 __osGetWatchLo(void);
|
||||
extern void __osSetWatchLo(u32);
|
||||
|
||||
/* Routines to get/set floating-point control and status register */
|
||||
extern u32 __osSetFpcCsr(u32);
|
||||
extern u32 __osGetFpcCsr(void);
|
||||
|
||||
extern u32 __osSetFpcCsr(u32);
|
||||
extern u32 __osGetFpcCsr(void);
|
||||
|
||||
#endif /* _LANGUAGE_C */
|
||||
|
||||
|
||||
98
include/PR/os_message.h
Normal file
98
include/PR/os_message.h
Normal file
@@ -0,0 +1,98 @@
|
||||
#ifndef _OS_MESSAGE_H_
|
||||
#define _OS_MESSAGE_H_
|
||||
|
||||
#ifdef _LANGUAGE_C_PLUS_PLUS
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "ultratypes.h"
|
||||
#include "os_thread.h"
|
||||
|
||||
#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS)
|
||||
|
||||
typedef u32 OSEvent;
|
||||
|
||||
/*
|
||||
* Structure for message
|
||||
*/
|
||||
typedef void *OSMesg;
|
||||
|
||||
/*
|
||||
* Structure for message queue
|
||||
*/
|
||||
typedef struct OSMesgQueue_s {
|
||||
OSThread *mtqueue; /* Queue to store threads blocked on empty mailboxes (receive) */
|
||||
OSThread *fullqueue; /* Queue to store threads blocked on full mailboxes (send) */
|
||||
s32 validCount; /* Contains number of valid message */
|
||||
s32 first; /* Points to first valid message */
|
||||
s32 msgCount; /* Contains total # of messages */
|
||||
OSMesg *msg; /* Points to message buffer array */
|
||||
} OSMesgQueue;
|
||||
|
||||
#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */
|
||||
|
||||
/* Events */
|
||||
#ifdef _FINALROM
|
||||
#define OS_NUM_EVENTS 15
|
||||
#else
|
||||
#define OS_NUM_EVENTS 23
|
||||
#endif
|
||||
|
||||
#define OS_EVENT_SW1 0 /* CPU SW1 interrupt */
|
||||
#define OS_EVENT_SW2 1 /* CPU SW2 interrupt */
|
||||
#define OS_EVENT_CART 2 /* Cartridge interrupt: used by rmon */
|
||||
#define OS_EVENT_COUNTER 3 /* Counter int: used by VI/Timer Mgr */
|
||||
#define OS_EVENT_SP 4 /* SP task done interrupt */
|
||||
#define OS_EVENT_SI 5 /* SI (controller) interrupt */
|
||||
#define OS_EVENT_AI 6 /* AI interrupt */
|
||||
#define OS_EVENT_VI 7 /* VI interrupt: used by VI/Timer Mgr */
|
||||
#define OS_EVENT_PI 8 /* PI interrupt: used by PI Manager */
|
||||
#define OS_EVENT_DP 9 /* DP full sync interrupt */
|
||||
#define OS_EVENT_CPU_BREAK 10 /* CPU breakpoint: used by rmon */
|
||||
#define OS_EVENT_SP_BREAK 11 /* SP breakpoint: used by rmon */
|
||||
#define OS_EVENT_FAULT 12 /* CPU fault event: used by rmon */
|
||||
#define OS_EVENT_THREADSTATUS 13 /* CPU thread status: used by rmon */
|
||||
#define OS_EVENT_PRENMI 14 /* Pre NMI interrupt */
|
||||
#ifndef _FINALROM
|
||||
#define OS_EVENT_RDB_READ_DONE 15 /* RDB read ok event: used by rmon */
|
||||
#define OS_EVENT_RDB_LOG_DONE 16 /* read of log data complete */
|
||||
#define OS_EVENT_RDB_DATA_DONE 17 /* read of hostio data complete */
|
||||
#define OS_EVENT_RDB_REQ_RAMROM 18 /* host needs ramrom access */
|
||||
#define OS_EVENT_RDB_FREE_RAMROM 19 /* host is done with ramrom access */
|
||||
#define OS_EVENT_RDB_DBG_DONE 20
|
||||
#define OS_EVENT_RDB_FLUSH_PROF 21
|
||||
#define OS_EVENT_RDB_ACK_PROF 22
|
||||
#endif
|
||||
|
||||
/* Flags to turn blocking on/off when sending/receiving message */
|
||||
|
||||
#define OS_MESG_NOBLOCK 0
|
||||
#define OS_MESG_BLOCK 1
|
||||
|
||||
#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS)
|
||||
|
||||
/* Get count of valid messages in queue */
|
||||
#define MQ_GET_COUNT(mq) ((mq)->validCount)
|
||||
|
||||
/* Figure out if message queue is empty or full */
|
||||
#define MQ_IS_EMPTY(mq) (MQ_GET_COUNT(mq) == 0)
|
||||
#define MQ_IS_FULL(mq) (MQ_GET_COUNT(mq) >= (mq)->msgCount)
|
||||
|
||||
/* Message operations */
|
||||
|
||||
extern void osCreateMesgQueue(OSMesgQueue *, OSMesg *, s32);
|
||||
extern s32 osSendMesg(OSMesgQueue *, OSMesg, s32);
|
||||
extern s32 osJamMesg(OSMesgQueue *, OSMesg, s32);
|
||||
extern s32 osRecvMesg(OSMesgQueue *, OSMesg *, s32);
|
||||
|
||||
/* Event operations */
|
||||
|
||||
extern void osSetEventMesg(OSEvent, OSMesgQueue *, OSMesg);
|
||||
|
||||
#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */
|
||||
|
||||
#ifdef _LANGUAGE_C_PLUS_PLUS
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* !_OS_MESSAGE_H_ */
|
||||
158
include/PR/os_pi.h
Normal file
158
include/PR/os_pi.h
Normal file
@@ -0,0 +1,158 @@
|
||||
#ifndef _OS_PI_H_
|
||||
#define _OS_PI_H_
|
||||
|
||||
#ifdef _LANGUAGE_C_PLUS_PLUS
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "ultratypes.h"
|
||||
#include "os_thread.h"
|
||||
#include "os_message.h"
|
||||
|
||||
#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS)
|
||||
|
||||
/*
|
||||
* Structure for Enhanced PI interface
|
||||
*/
|
||||
|
||||
/*
|
||||
* OSTranxInfo is set up for Leo Disk DMA. This info will be maintained
|
||||
* by exception handler. This is how the PIMGR and the ISR communicate.
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
u32 errStatus; /* error status */
|
||||
void *dramAddr; /* RDRAM buffer address (DMA) */
|
||||
void *C2Addr; /* C2 buffer address */
|
||||
u32 sectorSize; /* size of transfering sector */
|
||||
u32 C1ErrNum; /* total # of C1 errors */
|
||||
u32 C1ErrSector[4]; /* error sectors */
|
||||
} __OSBlockInfo;
|
||||
|
||||
typedef struct {
|
||||
u32 cmdType; /* for disk only */
|
||||
u16 transferMode; /* Block, Track, or sector? */
|
||||
u16 blockNum; /* which block is transfering */
|
||||
s32 sectorNum; /* which sector is transfering */
|
||||
u32 devAddr; /* Device buffer address */
|
||||
u32 bmCtlShadow; /* asic bm_ctl(510) register shadow ram */
|
||||
u32 seqCtlShadow; /* asic seq_ctl(518) register shadow ram */
|
||||
__OSBlockInfo block[2]; /* bolck transfer info */
|
||||
} __OSTranxInfo;
|
||||
|
||||
typedef struct OSPiHandle_s {
|
||||
struct OSPiHandle_s *next; /* point to next handle on the table */
|
||||
u8 type; /* DEVICE_TYPE_BULK for disk */
|
||||
u8 latency; /* domain latency */
|
||||
u8 pageSize; /* domain page size */
|
||||
u8 relDuration; /* domain release duration */
|
||||
u8 pulse; /* domain pulse width */
|
||||
u8 domain; /* which domain */
|
||||
u32 baseAddress; /* Domain address */
|
||||
u32 speed; /* for roms only */
|
||||
/* The following are "private" elements" */
|
||||
__OSTranxInfo transferInfo; /* for disk only */
|
||||
} OSPiHandle;
|
||||
|
||||
typedef struct {
|
||||
u8 type;
|
||||
u32 address;
|
||||
} OSPiInfo;
|
||||
|
||||
/*
|
||||
* Structure for I/O message block
|
||||
*/
|
||||
typedef struct {
|
||||
u16 type; /* Message type */
|
||||
u8 pri; /* Message priority (High or Normal) */
|
||||
u8 status; /* Return status */
|
||||
OSMesgQueue *retQueue; /* Return message queue to notify I/O completion */
|
||||
} OSIoMesgHdr;
|
||||
|
||||
typedef struct {
|
||||
OSIoMesgHdr hdr; /* Message header */
|
||||
void *dramAddr; /* RDRAM buffer address (DMA) */
|
||||
u32 devAddr; /* Device buffer address (DMA) */
|
||||
u32 size; /* DMA transfer size in bytes */
|
||||
OSPiHandle *piHandle; /* PI device handle */
|
||||
} OSIoMesg;
|
||||
|
||||
/*
|
||||
* Structure for device manager block
|
||||
*/
|
||||
typedef struct {
|
||||
s32 active; /* Status flag */
|
||||
OSThread *thread; /* Calling thread */
|
||||
OSMesgQueue *cmdQueue; /* Command queue */
|
||||
OSMesgQueue *evtQueue; /* Event queue */
|
||||
OSMesgQueue *acsQueue; /* Access queue */
|
||||
/* Raw DMA routine */
|
||||
s32 (*dma)(s32, u32, void *, u32);
|
||||
s32 (*edma)(OSPiHandle *, s32, u32, void *, u32);
|
||||
} OSDevMgr;
|
||||
|
||||
#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */
|
||||
|
||||
/* Flags to indicate direction of data transfer */
|
||||
|
||||
#define OS_READ 0 /* device -> RDRAM */
|
||||
#define OS_WRITE 1 /* device <- RDRAM */
|
||||
#define OS_OTHERS 2 /* for Leo disk only */
|
||||
|
||||
/*
|
||||
* I/O message types
|
||||
*/
|
||||
#define OS_MESG_TYPE_BASE (10)
|
||||
#define OS_MESG_TYPE_LOOPBACK (OS_MESG_TYPE_BASE + 0)
|
||||
#define OS_MESG_TYPE_DMAREAD (OS_MESG_TYPE_BASE + 1)
|
||||
#define OS_MESG_TYPE_DMAWRITE (OS_MESG_TYPE_BASE + 2)
|
||||
#define OS_MESG_TYPE_VRETRACE (OS_MESG_TYPE_BASE + 3)
|
||||
#define OS_MESG_TYPE_COUNTER (OS_MESG_TYPE_BASE + 4)
|
||||
#define OS_MESG_TYPE_EDMAREAD (OS_MESG_TYPE_BASE + 5)
|
||||
#define OS_MESG_TYPE_EDMAWRITE (OS_MESG_TYPE_BASE + 6)
|
||||
|
||||
/*
|
||||
* I/O message priority
|
||||
*/
|
||||
#define OS_MESG_PRI_NORMAL 0
|
||||
#define OS_MESG_PRI_HIGH 1
|
||||
|
||||
/*
|
||||
* PI/EPI
|
||||
*/
|
||||
#define PI_DOMAIN1 0
|
||||
#define PI_DOMAIN2 1
|
||||
|
||||
|
||||
#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS)
|
||||
|
||||
extern OSPiHandle *__osPiTable; /* The head of OSPiHandle link list */
|
||||
|
||||
/* Peripheral interface (PI) */
|
||||
|
||||
extern u32 osPiGetStatus(void);
|
||||
extern s32 osPiGetDeviceType(void);
|
||||
extern s32 osPiWriteIo(u32, u32);
|
||||
extern s32 osPiReadIo(u32, u32 *);
|
||||
extern s32 osPiStartDma(OSIoMesg *, s32, s32, u32, void *, u32, OSMesgQueue *);
|
||||
extern void osCreatePiManager(OSPri, OSMesgQueue *, OSMesg *, s32);
|
||||
|
||||
/* Enhanced PI interface */
|
||||
|
||||
extern OSPiHandle *osCartRomInit(void);
|
||||
extern OSPiHandle *osLeoDiskInit(void);
|
||||
extern OSPiHandle *osDriveRomInit(void);
|
||||
|
||||
extern s32 osEPiDeviceType(OSPiHandle *, OSPiInfo *);
|
||||
extern s32 osEPiWriteIo(OSPiHandle *, u32 , u32 );
|
||||
extern s32 osEPiReadIo(OSPiHandle *, u32 , u32 *);
|
||||
extern s32 osEPiStartDma(OSPiHandle *, OSIoMesg *, s32);
|
||||
extern s32 osEPiLinkHandle(OSPiHandle *);
|
||||
|
||||
#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */
|
||||
|
||||
#ifdef _LANGUAGE_C_PLUS_PLUS
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* !_OS_PI_H_ */
|
||||
57
include/PR/os_system.h
Normal file
57
include/PR/os_system.h
Normal file
@@ -0,0 +1,57 @@
|
||||
#ifndef _OS_SYSTEM_H_
|
||||
#define _OS_SYSTEM_H_
|
||||
|
||||
#ifdef _LANGUAGE_C_PLUS_PLUS
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "ultratypes.h"
|
||||
#include "os_exception.h"
|
||||
|
||||
/*
|
||||
* Values for osTvType
|
||||
*/
|
||||
#define OS_TV_PAL 0
|
||||
#define OS_TV_NTSC 1
|
||||
#define OS_TV_MPAL 2
|
||||
|
||||
/*
|
||||
* Size of buffer the retains contents after NMI
|
||||
*/
|
||||
#define OS_APP_NMI_BUFSIZE 64
|
||||
|
||||
#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS)
|
||||
|
||||
extern s32 osRomType; /* Bulk or cartridge ROM. 0=cartridge 1=bulk */
|
||||
extern void *osRomBase; /* Rom base address of the game image */
|
||||
extern s32 osTvType; /* 0 = PAL, 1 = NTSC, 2 = MPAL */
|
||||
extern s32 osResetType; /* 0 = cold reset, 1 = NMI */
|
||||
extern s32 osCicId;
|
||||
extern s32 osVersion;
|
||||
extern u32 osMemSize; /* Memory Size */
|
||||
extern s32 osAppNMIBuffer[OS_APP_NMI_BUFSIZE/sizeof(s32)];
|
||||
|
||||
extern u64 osClockRate;
|
||||
|
||||
extern OSIntMask __OSGlobalIntMask; /* global interrupt mask */
|
||||
|
||||
#define osInitialize() \
|
||||
__osInitialize_common(); \
|
||||
__osInitialize_autodetect()
|
||||
|
||||
void __osInitialize_common(void);
|
||||
void __osInitialize_autodetect(void);
|
||||
|
||||
extern void osExit(void);
|
||||
extern u32 osGetMemSize(void);
|
||||
|
||||
/* pre-NMI */
|
||||
extern s32 osAfterPreNMI(void);
|
||||
|
||||
#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */
|
||||
|
||||
#ifdef _LANGUAGE_C_PLUS_PLUS
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* !_OS_SYSTEM_H_ */
|
||||
98
include/PR/os_thread.h
Normal file
98
include/PR/os_thread.h
Normal file
@@ -0,0 +1,98 @@
|
||||
#ifndef _OS_THREAD_H_
|
||||
#define _OS_THREAD_H_
|
||||
|
||||
#ifdef _LANGUAGE_C_PLUS_PLUS
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "ultratypes.h"
|
||||
|
||||
#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS)
|
||||
|
||||
typedef s32 OSPri;
|
||||
typedef s32 OSId;
|
||||
|
||||
typedef union {
|
||||
struct {
|
||||
f32 f_odd;
|
||||
f32 f_even;
|
||||
} f;
|
||||
f64 d;
|
||||
} __OSfp;
|
||||
|
||||
typedef struct {
|
||||
u64 at, v0, v1, a0, a1, a2, a3;
|
||||
u64 t0, t1, t2, t3, t4, t5, t6, t7;
|
||||
u64 s0, s1, s2, s3, s4, s5, s6, s7;
|
||||
u64 t8, t9;
|
||||
u64 gp, sp, s8, ra;
|
||||
u64 lo, hi;
|
||||
u32 sr, pc, cause, badvaddr, rcp;
|
||||
u32 fpcsr;
|
||||
__OSfp fp0, fp2, fp4, fp6, fp8, fp10, fp12, fp14;
|
||||
__OSfp fp16, fp18, fp20, fp22, fp24, fp26, fp28, fp30;
|
||||
} __OSThreadContext;
|
||||
|
||||
typedef struct {
|
||||
u32 flag;
|
||||
u32 count;
|
||||
u64 time;
|
||||
} __OSThreadprofile_s;
|
||||
|
||||
typedef struct OSThread_s {
|
||||
struct OSThread_s *next; /* run/mesg queue link */
|
||||
OSPri priority; /* run/mesg queue priority */
|
||||
struct OSThread_s **queue; /* queue thread is on */
|
||||
struct OSThread_s *tlnext; /* all threads queue link */
|
||||
u16 state; /* OS_STATE_* */
|
||||
u16 flags; /* flags for rmon */
|
||||
OSId id; /* id for debugging */
|
||||
int fp; /* thread has used fp unit */
|
||||
__OSThreadprofile_s *thprof; /* workarea for thread profiler */
|
||||
__OSThreadContext context; /* register/interrupt mask */
|
||||
} OSThread;
|
||||
|
||||
#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */
|
||||
|
||||
/* Thread states */
|
||||
|
||||
#define OS_STATE_STOPPED (1 << 0)
|
||||
#define OS_STATE_RUNNABLE (1 << 1)
|
||||
#define OS_STATE_RUNNING (1 << 2)
|
||||
#define OS_STATE_WAITING (1 << 3)
|
||||
|
||||
/* Recommended thread priorities for the system threads */
|
||||
|
||||
#define OS_PRIORITY_MAX 255
|
||||
#define OS_PRIORITY_VIMGR 254
|
||||
#define OS_PRIORITY_RMON 250
|
||||
#define OS_PRIORITY_RMONSPIN 200
|
||||
#define OS_PRIORITY_PIMGR 150
|
||||
#define OS_PRIORITY_SIMGR 140
|
||||
#define OS_PRIORITY_APPMAX 127
|
||||
#define OS_PRIORITY_IDLE 0 /* Must be 0 */
|
||||
|
||||
/* For thread profiler */
|
||||
#define THPROF_IDMAX 64
|
||||
#define THPROF_STACKSIZE 256
|
||||
|
||||
#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS)
|
||||
|
||||
/* Thread operations */
|
||||
|
||||
extern void osCreateThread(OSThread *, OSId, void (*)(void *), void *, void *, OSPri);
|
||||
extern void osDestroyThread(OSThread *);
|
||||
extern void osYieldThread(void);
|
||||
extern void osStartThread(OSThread *);
|
||||
extern void osStopThread(OSThread *);
|
||||
extern OSId osGetThreadId(OSThread *);
|
||||
extern void osSetThreadPri(OSThread *, OSPri);
|
||||
extern OSPri osGetThreadPri(OSThread *);
|
||||
|
||||
#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */
|
||||
|
||||
#ifdef _LANGUAGE_C_PLUS_PLUS
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* !_OS_THREAD_H_ */
|
||||
@@ -13,7 +13,7 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "PR/ultratypes.h"
|
||||
#include "ultratypes.h"
|
||||
|
||||
#define OS_ERROR_FMT "/usr/lib/PR/error.fmt"
|
||||
#define OS_ERROR_MAGIC 0x6b617479
|
||||
|
||||
@@ -3,4 +3,6 @@
|
||||
|
||||
#define ALIGNED(x) __attribute__((aligned(x)))
|
||||
|
||||
#define ARRLEN(x) ((s32)(sizeof(x) / sizeof(x[0])))
|
||||
|
||||
#endif
|
||||
|
||||
31
src/flash/flashallerase.c
Normal file
31
src/flash/flashallerase.c
Normal file
@@ -0,0 +1,31 @@
|
||||
#include "PR/os_internal.h"
|
||||
|
||||
s32 osFlashAllErase(void) {
|
||||
u32 status;
|
||||
OSTimer mytimer;
|
||||
OSMesgQueue timerMesgQueue;
|
||||
OSMesg dummy;
|
||||
|
||||
// start chip erase operation
|
||||
osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_CHIP_ERASE);
|
||||
osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_EXECUTE_ERASE);
|
||||
|
||||
// wait for completion by polling erase-busy flag
|
||||
osCreateMesgQueue(&timerMesgQueue, &dummy, 1);
|
||||
do {
|
||||
osSetTimer(&mytimer, OS_USEC_TO_CYCLES(15000), 0, &timerMesgQueue, &dummy);
|
||||
osRecvMesg(&timerMesgQueue, &dummy, OS_MESG_BLOCK);
|
||||
osEPiReadIo(&__osFlashHandler, __osFlashHandler.baseAddress, &status);
|
||||
} while ((status & FLASH_STATUS_ERASE_BUSY) == FLASH_STATUS_ERASE_BUSY);
|
||||
|
||||
// check erase operation status, clear status
|
||||
osEPiReadIo(&__osFlashHandler, __osFlashHandler.baseAddress, &status);
|
||||
osFlashClearStatus();
|
||||
|
||||
// check for success
|
||||
if (((status & 0xFF) == 8) || ((status & 0xFF) == 0x48) || ((status & 8) == 8)) {
|
||||
return FLASH_STATUS_ERASE_OK;
|
||||
} else {
|
||||
return FLASH_STATUS_ERASE_ERROR;
|
||||
}
|
||||
}
|
||||
7
src/flash/flashallerasethrough.c
Normal file
7
src/flash/flashallerasethrough.c
Normal file
@@ -0,0 +1,7 @@
|
||||
#include "PR/os_internal.h"
|
||||
|
||||
void osFlashAllEraseThrough(void) {
|
||||
// start chip erase operation, no waiting for completion
|
||||
osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_CHIP_ERASE);
|
||||
osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_EXECUTE_ERASE);
|
||||
}
|
||||
8
src/flash/flashchange.c
Normal file
8
src/flash/flashchange.c
Normal file
@@ -0,0 +1,8 @@
|
||||
#include "PR/os_internal.h"
|
||||
#include "PR/R4300.h"
|
||||
|
||||
void osFlashChange(u32 flash_num) {
|
||||
__osFlashHandler.baseAddress = PHYS_TO_K1((FLASH_START_ADDR + flash_num * FLASH_SIZE));
|
||||
__osFlashHandler.type = DEVICE_TYPE_FLASH + flash_num;
|
||||
return;
|
||||
}
|
||||
21
src/flash/flashcheckeraseend.c
Normal file
21
src/flash/flashcheckeraseend.c
Normal file
@@ -0,0 +1,21 @@
|
||||
#include "PR/os_internal.h"
|
||||
|
||||
s32 osFlashCheckEraseEnd(void) {
|
||||
u8 status;
|
||||
|
||||
osFlashReadStatus(&status);
|
||||
|
||||
if (!(status & FLASH_STATUS_ERASE_BUSY)) {
|
||||
// not busy, read and clear status
|
||||
osFlashReadStatus(&status);
|
||||
osFlashClearStatus();
|
||||
|
||||
// check for success
|
||||
if (((status & 0xFF) == 8) || ((status & 0xFF) == 0x48) || ((status & 8) == 8)) {
|
||||
return FLASH_STATUS_ERASE_OK;
|
||||
} else {
|
||||
return FLASH_STATUS_ERASE_ERROR;
|
||||
}
|
||||
}
|
||||
return FLASH_STATUS_ERASE_BUSY;
|
||||
}
|
||||
10
src/flash/flashclearstatus.c
Normal file
10
src/flash/flashclearstatus.c
Normal file
@@ -0,0 +1,10 @@
|
||||
#include "PR/os_internal.h"
|
||||
|
||||
void osFlashClearStatus(void) {
|
||||
// select status mode
|
||||
osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_STATUS);
|
||||
// clear status
|
||||
osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress, 0);
|
||||
|
||||
return;
|
||||
}
|
||||
7
src/flash/flashgetaddr.c
Normal file
7
src/flash/flashgetaddr.c
Normal file
@@ -0,0 +1,7 @@
|
||||
#include "PR/os_internal.h"
|
||||
|
||||
u32 __osFlashGetAddr(u32 page_num) {
|
||||
u32 devAddr = (__osFlashVersion == OLD_FLASH) ? page_num << 6 : page_num << 7;
|
||||
|
||||
return devAddr;
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user