📄 dma.h
字号:
/* @(#)types.h 2.4 85/02/06 SMI; from UCB 4.11 83/07/01 */
typedef struct _physadr { short r[1]; } *physadr;
typedef struct label_t {
int val[13];
} label_t;
#ifdef notdef
typedef struct _quad { long val[2]; } quad;
typedef long daddr_t;
typedef char * caddr_t;
typedef u_long ino_t;
typedef long swblk_t;
typedef int time_t;
typedef short dev_t;
typedef int off_t;
typedef struct fd_set { int fds_bits[1]; } fd_set;
#endif
/* from Sun's machdep.h file */
/*
* @(#)machdep.h 1.5 10/20/83 Copyright Sun Micro
*/
/*
* various handy constants for mapping and self-abuse
*/
#define ADDRSIZE (0x100000000) /* 32-bit addresses */
#define ADDRMASK (ADDRSIZE - 1)
#define SEGSIZE (0x20000) /* 128k segments*/
#define SEGMASK (SEGSIZE - 1)
#define SEGSHIFT (17)
#define PAGESIZE (0x2000) /* 8k pages */
#define PAGEMASK (PAGESIZE -1)
#define PAGESHIFT (13)
/*
* handy macros
*/
#define BTOP(x) ((u_long)(x)>>PAGESHIFT) /* byte to page */
#define PTOB(x) ((u_long)(x)<<PAGESHIFT) /* page to byte */
#define GETPHYS(x) ((PTOB(getpgreg(x))& ADDRMASK)+((u_long)(x)&PAGEMASK))
#define ISVALID(x) ((getpgreg(x) & (u_long)0x80000000) == 0x80000000)
/*
* for parity(gen,check) mnemonics
*/
#define PAR_GEN (1) /* like in parity(PAR_GEN or ! PAR_GEN */
#define PAR_CHECK (1) /* ditto */
/*
* offsets into fc3 accesses
*/
#define ID_OFF (0x0) /* id prom */
#define PG_OFF (0x10000000) /* page map offset in fc3 space */
#define SM_OFF (0x20000000) /* segment map */
#define CX_OFF (0x30000000) /* context registers */
#define ENABLE_OFF (0x40000000) /* system enable register */
#define UDVMA_OFF (0x50000000) /* user dvma enable */
#define BERR_OFF (0x60000000) /* buserror register */
#define LED_OFF (0x70000000) /* led (diagnostic register) */
/*
* physical addresses of devices
*/
#define pa_kbm (0x00000000) /* keyboard mouse scc */
#define pa_scc (0x00020000) /* scc */
#define pa_eeprom (0x00040000) /* eeprom */
#define pa_clock (0x00060000)
#define pa_parity (0x00080000)
#define pa_interrupt (0x000a0000)
#define pa_ethernet (0x000c0000)
#define pa_color (0x000e0000)
#define pa_eprom (0x00100000)
/*
* assembly setups (for internal use)
* users should use get/set/fc3()
*/
#define MOVC(from, to) asm(" movc from, to")
#define MOVL(from, to) asm(" movl from, to")
#define MOVSB(from, to) asm(" movsb from, to")
#define MOVSW(from, to) asm(" movsw from, to")
#define MOVSL(from, to) asm(" movsl from, to")
/*
* permissions available
*/
#define PMP_ALL (3) /* real loose - valid, write, supervisor */
/*
* memory spaces available
*/
enum pm_type { /* possible address spaces on board */
PM_MEM = 0, /* on-board memory */
PM_IO = 1, /* on-board I/O */
PM_16VME = 2, /* 16bit bus memory (MB or VME) */
PM_32VME = 3 /* 32bit bus memory (MB or VME) */
};
/*
* These are the layouts of various MMU registers in
* both whole entry layout, and bitfield definitions. To use,
* pass and return ??_reg.??_whole, and to play with afterwards,
* use ??_reg.??_field.??_whatever.
* The machdep.c routines are defined with ??_size
* usage (in and ??out)
*
* WARNING WARNING
*
* DO NOT ATTEMPT TO PASS OR RETURN THE STRUCTS, the compiler
* has bugs on things which are not long aligned.
*/
typedef u_char cx_size;
typedef u_char sm_size;
typedef u_long pg_size;
union cx_reg {
cx_size cx_whole; /* supv and user contexts */
struct cx_field {
unsigned :4;
unsigned :1;
unsigned context :3; /* context [0..7] */
} cx_field;
};
union sm_reg {
sm_size sm_whole; /* segment entry */
struct sm_field {
u_char sm_pmeg; /* pmeg group */
} sm_field;
};
union pg_reg {
pg_size pg_whole; /* page map entry */
struct pg_field{
unsigned pg_valid:1; /* valid bit */
unsigned pg_permission:2; /* write/sup */
unsigned pg_cache:1; /* cache */
enum pm_type pg_space:2; /* address space */
unsigned pg_accessed:1; /* page accessed?? */
unsigned pg_modified:1; /* page modified?? */
unsigned :5;
unsigned pg_pagenum:19; /* page number */
} pg_field;
};
/*
* some handy typedefs
*/
typedef union cx_reg cx_t;
typedef union sm_reg sm_t;
typedef union pg_reg pg_t;
/*
* the similar definitions of things in fc3 space that are not
* MMU related, same caveats apply as above
*/
typedef u_char id_size, led_size;
typedef u_char berr_size, enable_size, interrupt_size, parity_size;
union id_reg {
id_size id_whole; /* id prom */
struct id_field {
u_char id_byte;
} id_field;
};
/*
* the setledreg routine will invert the given led pattern,
* because 0=lit, so passed lit=1
*/
union led_reg {
led_size led_whole; /* led (diagnostic) register */
struct led_field {
unsigned led_d7 :1; /* individual bits inverted */
unsigned led_d6 :1;
unsigned led_d5 :1;
unsigned led_d4 :1;
unsigned led_d3 :1;
unsigned led_d2 :1;
unsigned led_d1 :1;
unsigned led_d0 :1;
} led_field;
};
union berr_reg {
berr_size berr_whole; /* bus error register */
struct berr_field {
unsigned berr_invalidpg :1;
unsigned berr_proterr :1; /* protection error */
unsigned berr_timeout :1; /* timeout error */
unsigned berr_vmebuserr :1; /* p1 bus master */
unsigned :4; /* reserved */
} berr_field;
};
union enable_reg {
enable_size enable_whole; /* system enable register */
struct enable_field {
unsigned enable_diag :1; /* diag switch */
unsigned :1; /* reserved */
unsigned enable_vcopy :1; /* copy mode video fb */
unsigned enable_video :1; /* video display */
unsigned enable_cache :1; /* external cache */
unsigned enable_dvma :1; /* system dvma */
unsigned enable_fpp :1; /* floating point */
unsigned enable_normal :1; /* 0 = bootstate */
} enable_field;
};
union interrupt_reg {
interrupt_size interrupt_whole; /* interrupt register */
struct interrupt_field {
unsigned enable_todint7 :1; /* int 7 (nmi,tod) */
unsigned :1; /* reserved */
unsigned enable_todint5 :1; /* int 5 (tod) */
unsigned enable_vidint4 :1; /* int 4 video */
unsigned enable_swint3 :1; /* int 3 sw */
unsigned enable_swint2 :1; /* int 2 sw */
unsigned enable_swint1 :1; /* int 1 sw */
unsigned enable_ints :1; /* enable all ints */
} interrupt_field;
};
union parity_reg {
parity_size parity_whole; /* parity register */
struct parity_field {
unsigned par_int :1; /* */
unsigned par_int_ena :1; /* */
unsigned par_gen :1; /* */
unsigned par_check :1; /* */
unsigned parerr24 :1; /* */
unsigned parerr16 :1; /* */
unsigned parerr08 :1; /* */
unsigned parerr00 :1; /* */
} parity_field;
};
/*
* more less handy typedefs
*/
typedef union id_reg id_t;
typedef union led_reg led_t;
typedef union berr_reg berr_t;
typedef union enable_reg enable_t;
/*
* definition of the exception vector table
* accessed with ex_vector->?????
*/
struct mc68k_vector {
char *e_initsp; /* 0 initial stack pointer */
int (*e_initpc)(); /* 1 initial program counter */
int (*e_buserr)(); /* 2 buserror */
int (*e_addrerr)(); /* 3 address error */
int (*e_illinst)(); /* 4 illegal instruction */
int (*e_zerodiv)(); /* 5 divide by zero */
int (*e_chk)(); /* 6 CHK instruction */
int (*e_trapv)(); /* 7 TRAPV instruction */
int (*e_priv)(); /* 8 privilege violation */
int (*e_trace)(); /* 9 trace */
int (*e_line10)(); /* 10 line 1010 emulator */
int (*e_line15)(); /* 11 line 1111 emulator */
int (*e_res0[2])(); /* 12-13 reserved by Motorola */
int (*e_format)(); /* 14 format error */
int (*e_uninit)(); /* 15 uninitialized interrupt vector */
int (*e_res1[8])(); /* 16-23 reserved blah blah */
int (*e_int[8])(); /* 24 is spurious, 25-31 are auto level 1-7*/
int (*e_trap[16])(); /* 32-47 are trap#n vectors */
int (*e_res2[16])(); /* 48-63 are reserved */
int (*e_user[192])(); /* 64-255 are user int vectors */
};
#define spurious e_int[0]
#define ex_vector ((struct mc68k_vector *)0)
/* defined for Xun3 Xinu */
#define DMA_VM_START 0xf000000
#define DMA_MASK 0xfffff
#define DMA_NBYTES 0x8000
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -