forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
325 lines
10 KiB
325 lines
10 KiB
/* |
|
** asm-m68k/amigahw.h -- This header defines some macros and pointers for |
|
** the various Amiga custom hardware registers. |
|
** The naming conventions used here conform to those |
|
** used in the Amiga Hardware Reference Manual, 3rd Edition |
|
** |
|
** Copyright 1992 by Greg Harp |
|
** |
|
** This file is subject to the terms and conditions of the GNU General Public |
|
** License. See the file COPYING in the main directory of this archive |
|
** for more details. |
|
** |
|
** Created: 9/24/92 by Greg Harp |
|
*/ |
|
|
|
#ifndef _M68K_AMIGAHW_H |
|
#define _M68K_AMIGAHW_H |
|
|
|
#include <linux/ioport.h> |
|
|
|
#include <asm/bootinfo-amiga.h> |
|
|
|
|
|
/* |
|
* Chipsets |
|
*/ |
|
|
|
extern unsigned long amiga_chipset; |
|
|
|
|
|
/* |
|
* Miscellaneous |
|
*/ |
|
|
|
extern unsigned long amiga_eclock; /* 700 kHz E Peripheral Clock */ |
|
extern unsigned long amiga_colorclock; /* 3.5 MHz Color Clock */ |
|
extern unsigned long amiga_chip_size; /* Chip RAM Size (bytes) */ |
|
extern unsigned char amiga_vblank; /* VBLANK Frequency */ |
|
|
|
|
|
#define AMIGAHW_DECLARE(name) unsigned name : 1 |
|
#define AMIGAHW_SET(name) (amiga_hw_present.name = 1) |
|
#define AMIGAHW_PRESENT(name) (amiga_hw_present.name) |
|
|
|
struct amiga_hw_present { |
|
/* video hardware */ |
|
AMIGAHW_DECLARE(AMI_VIDEO); /* Amiga Video */ |
|
AMIGAHW_DECLARE(AMI_BLITTER); /* Amiga Blitter */ |
|
AMIGAHW_DECLARE(AMBER_FF); /* Amber Flicker Fixer */ |
|
/* sound hardware */ |
|
AMIGAHW_DECLARE(AMI_AUDIO); /* Amiga Audio */ |
|
/* disk storage interfaces */ |
|
AMIGAHW_DECLARE(AMI_FLOPPY); /* Amiga Floppy */ |
|
AMIGAHW_DECLARE(A3000_SCSI); /* SCSI (wd33c93, A3000 alike) */ |
|
AMIGAHW_DECLARE(A4000_SCSI); /* SCSI (ncr53c710, A4000T alike) */ |
|
AMIGAHW_DECLARE(A1200_IDE); /* IDE (A1200 alike) */ |
|
AMIGAHW_DECLARE(A4000_IDE); /* IDE (A4000 alike) */ |
|
AMIGAHW_DECLARE(CD_ROM); /* CD ROM drive */ |
|
/* other I/O hardware */ |
|
AMIGAHW_DECLARE(AMI_KEYBOARD); /* Amiga Keyboard */ |
|
AMIGAHW_DECLARE(AMI_MOUSE); /* Amiga Mouse */ |
|
AMIGAHW_DECLARE(AMI_SERIAL); /* Amiga Serial */ |
|
AMIGAHW_DECLARE(AMI_PARALLEL); /* Amiga Parallel */ |
|
/* real time clocks */ |
|
AMIGAHW_DECLARE(A2000_CLK); /* Hardware Clock (A2000 alike) */ |
|
AMIGAHW_DECLARE(A3000_CLK); /* Hardware Clock (A3000 alike) */ |
|
/* supporting hardware */ |
|
AMIGAHW_DECLARE(CHIP_RAM); /* Chip RAM */ |
|
AMIGAHW_DECLARE(PAULA); /* Paula (8364) */ |
|
AMIGAHW_DECLARE(DENISE); /* Denise (8362) */ |
|
AMIGAHW_DECLARE(DENISE_HR); /* Denise (8373) */ |
|
AMIGAHW_DECLARE(LISA); /* Lisa (8375) */ |
|
AMIGAHW_DECLARE(AGNUS_PAL); /* Normal/Fat PAL Agnus (8367/8371) */ |
|
AMIGAHW_DECLARE(AGNUS_NTSC); /* Normal/Fat NTSC Agnus (8361/8370) */ |
|
AMIGAHW_DECLARE(AGNUS_HR_PAL); /* Fat Hires PAL Agnus (8372) */ |
|
AMIGAHW_DECLARE(AGNUS_HR_NTSC); /* Fat Hires NTSC Agnus (8372) */ |
|
AMIGAHW_DECLARE(ALICE_PAL); /* PAL Alice (8374) */ |
|
AMIGAHW_DECLARE(ALICE_NTSC); /* NTSC Alice (8374) */ |
|
AMIGAHW_DECLARE(MAGIC_REKICK); /* A3000 Magic Hard Rekick */ |
|
AMIGAHW_DECLARE(PCMCIA); /* PCMCIA Slot */ |
|
AMIGAHW_DECLARE(ZORRO); /* Zorro AutoConfig */ |
|
AMIGAHW_DECLARE(ZORRO3); /* Zorro III */ |
|
}; |
|
|
|
extern struct amiga_hw_present amiga_hw_present; |
|
|
|
struct CUSTOM { |
|
unsigned short bltddat; |
|
unsigned short dmaconr; |
|
unsigned short vposr; |
|
unsigned short vhposr; |
|
unsigned short dskdatr; |
|
unsigned short joy0dat; |
|
unsigned short joy1dat; |
|
unsigned short clxdat; |
|
unsigned short adkconr; |
|
unsigned short pot0dat; |
|
unsigned short pot1dat; |
|
unsigned short potgor; |
|
unsigned short serdatr; |
|
unsigned short dskbytr; |
|
unsigned short intenar; |
|
unsigned short intreqr; |
|
unsigned char *dskptr; |
|
unsigned short dsklen; |
|
unsigned short dskdat; |
|
unsigned short refptr; |
|
unsigned short vposw; |
|
unsigned short vhposw; |
|
unsigned short copcon; |
|
unsigned short serdat; |
|
unsigned short serper; |
|
unsigned short potgo; |
|
unsigned short joytest; |
|
unsigned short strequ; |
|
unsigned short strvbl; |
|
unsigned short strhor; |
|
unsigned short strlong; |
|
unsigned short bltcon0; |
|
unsigned short bltcon1; |
|
unsigned short bltafwm; |
|
unsigned short bltalwm; |
|
unsigned char *bltcpt; |
|
unsigned char *bltbpt; |
|
unsigned char *bltapt; |
|
unsigned char *bltdpt; |
|
unsigned short bltsize; |
|
unsigned char pad2d; |
|
unsigned char bltcon0l; |
|
unsigned short bltsizv; |
|
unsigned short bltsizh; |
|
unsigned short bltcmod; |
|
unsigned short bltbmod; |
|
unsigned short bltamod; |
|
unsigned short bltdmod; |
|
unsigned short spare2[4]; |
|
unsigned short bltcdat; |
|
unsigned short bltbdat; |
|
unsigned short bltadat; |
|
unsigned short spare3[3]; |
|
unsigned short deniseid; |
|
unsigned short dsksync; |
|
unsigned short *cop1lc; |
|
unsigned short *cop2lc; |
|
unsigned short copjmp1; |
|
unsigned short copjmp2; |
|
unsigned short copins; |
|
unsigned short diwstrt; |
|
unsigned short diwstop; |
|
unsigned short ddfstrt; |
|
unsigned short ddfstop; |
|
unsigned short dmacon; |
|
unsigned short clxcon; |
|
unsigned short intena; |
|
unsigned short intreq; |
|
unsigned short adkcon; |
|
struct { |
|
unsigned short *audlc; |
|
unsigned short audlen; |
|
unsigned short audper; |
|
unsigned short audvol; |
|
unsigned short auddat; |
|
unsigned short audspare[2]; |
|
} aud[4]; |
|
unsigned char *bplpt[8]; |
|
unsigned short bplcon0; |
|
unsigned short bplcon1; |
|
unsigned short bplcon2; |
|
unsigned short bplcon3; |
|
unsigned short bpl1mod; |
|
unsigned short bpl2mod; |
|
unsigned short bplcon4; |
|
unsigned short clxcon2; |
|
unsigned short bpldat[8]; |
|
unsigned char *sprpt[8]; |
|
struct { |
|
unsigned short pos; |
|
unsigned short ctl; |
|
unsigned short dataa; |
|
unsigned short datab; |
|
} spr[8]; |
|
unsigned short color[32]; |
|
unsigned short htotal; |
|
unsigned short hsstop; |
|
unsigned short hbstrt; |
|
unsigned short hbstop; |
|
unsigned short vtotal; |
|
unsigned short vsstop; |
|
unsigned short vbstrt; |
|
unsigned short vbstop; |
|
unsigned short sprhstrt; |
|
unsigned short sprhstop; |
|
unsigned short bplhstrt; |
|
unsigned short bplhstop; |
|
unsigned short hhposw; |
|
unsigned short hhposr; |
|
unsigned short beamcon0; |
|
unsigned short hsstrt; |
|
unsigned short vsstrt; |
|
unsigned short hcenter; |
|
unsigned short diwhigh; |
|
unsigned short spare4[11]; |
|
unsigned short fmode; |
|
}; |
|
|
|
/* |
|
* DMA register bits |
|
*/ |
|
#define DMAF_SETCLR (0x8000) |
|
#define DMAF_AUD0 (0x0001) |
|
#define DMAF_AUD1 (0x0002) |
|
#define DMAF_AUD2 (0x0004) |
|
#define DMAF_AUD3 (0x0008) |
|
#define DMAF_DISK (0x0010) |
|
#define DMAF_SPRITE (0x0020) |
|
#define DMAF_BLITTER (0x0040) |
|
#define DMAF_COPPER (0x0080) |
|
#define DMAF_RASTER (0x0100) |
|
#define DMAF_MASTER (0x0200) |
|
#define DMAF_BLITHOG (0x0400) |
|
#define DMAF_BLTNZERO (0x2000) |
|
#define DMAF_BLTDONE (0x4000) |
|
#define DMAF_ALL (0x01FF) |
|
|
|
struct CIA { |
|
unsigned char pra; char pad0[0xff]; |
|
unsigned char prb; char pad1[0xff]; |
|
unsigned char ddra; char pad2[0xff]; |
|
unsigned char ddrb; char pad3[0xff]; |
|
unsigned char talo; char pad4[0xff]; |
|
unsigned char tahi; char pad5[0xff]; |
|
unsigned char tblo; char pad6[0xff]; |
|
unsigned char tbhi; char pad7[0xff]; |
|
unsigned char todlo; char pad8[0xff]; |
|
unsigned char todmid; char pad9[0xff]; |
|
unsigned char todhi; char pada[0x1ff]; |
|
unsigned char sdr; char padb[0xff]; |
|
unsigned char icr; char padc[0xff]; |
|
unsigned char cra; char padd[0xff]; |
|
unsigned char crb; char pade[0xff]; |
|
}; |
|
|
|
#define zTwoBase (0x80000000) |
|
#define ZTWO_PADDR(x) (((unsigned long)(x))-zTwoBase) |
|
#define ZTWO_VADDR(x) ((void __iomem *)(((unsigned long)(x))+zTwoBase)) |
|
|
|
#define CUSTOM_PHYSADDR (0xdff000) |
|
#define amiga_custom ((*(volatile struct CUSTOM *)(zTwoBase+CUSTOM_PHYSADDR))) |
|
|
|
#define CIAA_PHYSADDR (0xbfe001) |
|
#define CIAB_PHYSADDR (0xbfd000) |
|
#define ciaa ((*(volatile struct CIA *)(zTwoBase + CIAA_PHYSADDR))) |
|
#define ciab ((*(volatile struct CIA *)(zTwoBase + CIAB_PHYSADDR))) |
|
|
|
#define CHIP_PHYSADDR (0x000000) |
|
|
|
void amiga_chip_init (void); |
|
void *amiga_chip_alloc(unsigned long size, const char *name); |
|
void *amiga_chip_alloc_res(unsigned long size, struct resource *res); |
|
void amiga_chip_free(void *ptr); |
|
unsigned long amiga_chip_avail( void ); /*MILAN*/ |
|
extern volatile unsigned short amiga_audio_min_period; |
|
|
|
static inline void amifb_video_off(void) |
|
{ |
|
if (amiga_chipset == CS_ECS || amiga_chipset == CS_AGA) { |
|
/* program Denise/Lisa for a higher maximum play rate */ |
|
amiga_custom.htotal = 113; /* 31 kHz */ |
|
amiga_custom.vtotal = 223; /* 70 Hz */ |
|
amiga_custom.beamcon0 = 0x4390; /* HARDDIS, VAR{BEAM,VSY,HSY,CSY}EN */ |
|
/* suspend the monitor */ |
|
amiga_custom.hsstrt = amiga_custom.hsstop = 116; |
|
amiga_custom.vsstrt = amiga_custom.vsstop = 226; |
|
amiga_audio_min_period = 57; |
|
} |
|
} |
|
|
|
struct tod3000 { |
|
unsigned int :28, second2:4; /* lower digit */ |
|
unsigned int :28, second1:4; /* upper digit */ |
|
unsigned int :28, minute2:4; /* lower digit */ |
|
unsigned int :28, minute1:4; /* upper digit */ |
|
unsigned int :28, hour2:4; /* lower digit */ |
|
unsigned int :28, hour1:4; /* upper digit */ |
|
unsigned int :28, weekday:4; |
|
unsigned int :28, day2:4; /* lower digit */ |
|
unsigned int :28, day1:4; /* upper digit */ |
|
unsigned int :28, month2:4; /* lower digit */ |
|
unsigned int :28, month1:4; /* upper digit */ |
|
unsigned int :28, year2:4; /* lower digit */ |
|
unsigned int :28, year1:4; /* upper digit */ |
|
unsigned int :28, cntrl1:4; /* control-byte 1 */ |
|
unsigned int :28, cntrl2:4; /* control-byte 2 */ |
|
unsigned int :28, cntrl3:4; /* control-byte 3 */ |
|
}; |
|
#define TOD3000_CNTRL1_HOLD 0 |
|
#define TOD3000_CNTRL1_FREE 9 |
|
#define tod_3000 ((*(volatile struct tod3000 *)(zTwoBase+0xDC0000))) |
|
|
|
struct tod2000 { |
|
unsigned int :28, second2:4; /* lower digit */ |
|
unsigned int :28, second1:4; /* upper digit */ |
|
unsigned int :28, minute2:4; /* lower digit */ |
|
unsigned int :28, minute1:4; /* upper digit */ |
|
unsigned int :28, hour2:4; /* lower digit */ |
|
unsigned int :28, hour1:4; /* upper digit */ |
|
unsigned int :28, day2:4; /* lower digit */ |
|
unsigned int :28, day1:4; /* upper digit */ |
|
unsigned int :28, month2:4; /* lower digit */ |
|
unsigned int :28, month1:4; /* upper digit */ |
|
unsigned int :28, year2:4; /* lower digit */ |
|
unsigned int :28, year1:4; /* upper digit */ |
|
unsigned int :28, weekday:4; |
|
unsigned int :28, cntrl1:4; /* control-byte 1 */ |
|
unsigned int :28, cntrl2:4; /* control-byte 2 */ |
|
unsigned int :28, cntrl3:4; /* control-byte 3 */ |
|
}; |
|
|
|
#define TOD2000_CNTRL1_HOLD (1<<0) |
|
#define TOD2000_CNTRL1_BUSY (1<<1) |
|
#define TOD2000_CNTRL3_24HMODE (1<<2) |
|
#define TOD2000_HOUR1_PM (1<<2) |
|
#define tod_2000 ((*(volatile struct tod2000 *)(zTwoBase+0xDC0000))) |
|
|
|
#endif /* _M68K_AMIGAHW_H */
|
|
|