00001
00002
00003
00004
00005 #define DATA_OFF 0
00006 #define RDWR_OFF 1
00007 #define BIT_NINE_OFF 1
00008 #define IRQ_OFF 2
00009 #define DTACK_OFFSET 2
00010 #define ISOOUT_OFF 3
00011 #define ISOIN_OFF 3
00012 #define EDGE_CONTROL RDWR_OFF
00013
00014 #define IRQ_BIT 0x80
00015 #define NINE_BIT 0x80
00016
00017 #define PLDR1_IDENT 0x72
00018
00019 #define RISING_EDGE 0x80
00020 #define FALLING_EDGE 0
00021
00022 #define PLDWR(device,offset,data){outb(data,(device->address+offset));}
00023
00024 #define DTACK_ON(device){PLDWR(device,DTACK_OFFSET,1);wmb();}
00025 #define DTACK_OFF(device){PLDWR(device,DTACK_OFFSET,0);wmb();}
00026 #define READ_MODE(device){PLDWR(device,RDWR_OFF,(device->IRQedge|1));wmb();}
00027 #define WRITE_MODE(device){PLDWR(device,RDWR_OFF,device->IRQedge);wmb();}
00028 #define BUSOUT(device,data){PLDWR(device,DATA_OFF,data);wmb();}
00029 #define ISO_OUT(device,data){PLDWR(device,ISOOUT_OFF,data);wmb();}
00030 #define IRQ_EDGE_INIT(device) READ_MODE(device)
00031
00032 #define PLDRD(device,offset) inb(device->address+offset)
00033
00034 #define MIRQ_HIGH(device) (PLDRD(device,IRQ_OFF)&IRQ_BIT)
00035 #define MIRQ_LOW(device) (!MIRQ_HIGH(device))
00036
00037 #define BIT_NINE_READ(device,data){data=PLDRD(device,BIT_NINE_OFF)&NINE_BIT;rmb();}
00038 #define DATA_PORT(device,data){data=PLDRD(device,DATA_OFF);rmb();}
00039 #define ISO_IN(device,data){data=PLDRD(device,ISOIN_OFF);rmb();}
00040
00041
00042
00043 #define WAIT_FOR_IRQ_LOW(device){rmb();while(MIRQ_HIGH(device))rmb();}
00044 #define WAIT_FOR_IRQ_HIGH(device){rmb();while(MIRQ_LOW(device))rmb();}
00045
00046
00047 #define IDENT_CHECK(device,ident){ident=(PLDRD(device,BIT_NINE_OFF)&(~NINE_BIT));rmb();}
00048