/* ** 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> /* * Different Amiga models */ #define AMI_UNKNOWN (0) #define AMI_500 (1) #define AMI_500PLUS (2) #define AMI_600 (3) #define AMI_1000 (4) #define AMI_1200 (5) #define AMI_2000 (6) #define AMI_2500 (7) #define AMI_3000 (8) #define AMI_3000T (9) #define AMI_3000PLUS (10) #define AMI_4000 (11) #define AMI_4000T (12) #define AMI_CDTV (13) #define AMI_CD32 (14) #define AMI_DRACO (15) /* * Chipsets */ extern unsigned long amiga_chipset; #define CS_STONEAGE (0) #define CS_OCS (1) #define CS_ECS (2) #define CS_AGA (3) /* * 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) (((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 */