📄 i82365.c
字号:
return;}int deinit_i82365(void) { printf("Deinitializing i82365\n" ); return 0;}/*static int i365_get_status(u_short sock, u_int *value){ u_int status; status = i365_get(sock, I365_STATUS); *value = ((status & I365_CS_DETECT) == I365_CS_DETECT) ? SS_DETECT : 0; if (i365_get(sock, I365_INTCTL) & I365_PC_IOCARD) *value |= (status & I365_CS_STSCHG) ? 0 : SS_STSCHG; else { *value |= (status & I365_CS_BVD1) ? 0 : SS_BATDEAD; *value |= (status & I365_CS_BVD2) ? 0 : SS_BATWARN; } *value |= (status & I365_CS_WRPROT) ? SS_WRPROT : 0; *value |= (status & I365_CS_READY) ? SS_READY : 0; *value |= (status & I365_CS_POWERON) ? SS_POWERON : 0;#ifdef CONFIG_ISA if (pccsock[sock].type == IS_VG469) { status = i365_get(sock, VG469_VSENSE); if (pccsock[sock].internalid & 1) { *value |= (status & VG469_VSENSE_B_VS1) ? 0 : SS_3VCARD; *value |= (status & VG469_VSENSE_B_VS2) ? 0 : SS_XVCARD; } else { *value |= (status & VG469_VSENSE_A_VS1) ? 0 : SS_3VCARD; *value |= (status & VG469_VSENSE_A_VS2) ? 0 : SS_XVCARD; } }#endif printf("i82365: GetStatus(%d) = %#4.4x\n", sock, *value); return 0;} //i365_get_status*//*static int i365_set_socket(u_short sock, socket_state_t *state){ socket_info_t *t = &socket[sock]; u_char reg; printf("i82365: SetSocket(%d, flags %#3.3x, Vcc %d, Vpp %d, " "io_irq %d, csc_mask %#2.2x)\n", sock, state->flags, state->Vcc, state->Vpp, state->io_irq, state->csc_mask);printf ("\nERROR:UNIMPLEMENTED\n" );return 0; // First set global controller options // set_bridge_state(sock); *TODO* check: need this here? // IO card, RESET flag, IO interrupt reg = t->intr; if (state->io_irq != t->cap.pci_irq) reg |= state->io_irq; reg |= (state->flags & SS_RESET) ? 0 : I365_PC_RESET; reg |= (state->flags & SS_IOCARD) ? I365_PC_IOCARD : 0; i365_set(sock, I365_INTCTL, reg); reg = I365_PWR_NORESET; if (state->flags & SS_PWR_AUTO) reg |= I365_PWR_AUTO; if (state->flags & SS_OUTPUT_ENA) reg |= I365_PWR_OUT; if (t->flags & IS_CIRRUS) { if (state->Vpp != 0) { if (state->Vpp == 120) reg |= I365_VPP1_12V; else if (state->Vpp == state->Vcc) reg |= I365_VPP1_5V; else return -EINVAL; } if (state->Vcc != 0) { reg |= I365_VCC_5V; if (state->Vcc == 33) i365_bset(sock, PD67_MISC_CTL_1, PD67_MC1_VCC_3V); else if (state->Vcc == 50) i365_bclr(sock, PD67_MISC_CTL_1, PD67_MC1_VCC_3V); else return -EINVAL; } } else if (t->flags & IS_VG_PWR) { if (state->Vpp != 0) { if (state->Vpp == 120) reg |= I365_VPP1_12V; else if (state->Vpp == state->Vcc) reg |= I365_VPP1_5V; else return -EINVAL; } if (state->Vcc != 0) { reg |= I365_VCC_5V; if (state->Vcc == 33) i365_bset(sock, VG469_VSELECT, VG469_VSEL_VCC); else if (state->Vcc == 50) i365_bclr(sock, VG469_VSELECT, VG469_VSEL_VCC); else return -EINVAL; } } else if (t->flags & IS_DF_PWR) { switch (state->Vcc) { case 0: break; case 33: reg |= I365_VCC_3V; break; case 50: reg |= I365_VCC_5V; break; default: return -EINVAL; } switch (state->Vpp) { case 0: break; case 50: reg |= I365_VPP1_5V; break; case 120: reg |= I365_VPP1_12V; break; default: return -EINVAL; } } else { switch (state->Vcc) { case 0: break; case 50: reg |= I365_VCC_5V; break; default: return -EINVAL; } switch (state->Vpp) { case 0: break; case 50: reg |= I365_VPP1_5V | I365_VPP2_5V; break; case 120: reg |= I365_VPP1_12V | I365_VPP2_12V; break; default: return -EINVAL; } } if (reg != i365_get(sock, I365_POWER)) i365_set(sock, I365_POWER, reg); // Chipset-specific functions if (t->flags & IS_CIRRUS) { // Speaker control i365_bflip(sock, PD67_MISC_CTL_1, PD67_MC1_SPKR_ENA, state->flags & SS_SPKR_ENA); } // Card status change interrupt mask reg = t->cs_irq << 4; if (state->csc_mask & SS_DETECT) reg |= I365_CSC_DETECT; if (state->flags & SS_IOCARD) { if (state->csc_mask & SS_STSCHG) reg |= I365_CSC_STSCHG; } else { if (state->csc_mask & SS_BATDEAD) reg |= I365_CSC_BVD1; if (state->csc_mask & SS_BATWARN) reg |= I365_CSC_BVD2; if (state->csc_mask & SS_READY) reg |= I365_CSC_READY; } i365_set(sock, I365_CSCINT, reg); i365_get(sock, I365_CSC); return 0;} // i365_set_socket *//*static int i365_get_io_map(u_short sock, struct pccard_io_map *io){ u_char map, ioctl, addr; printf ( "GETIOMAP unimplemented\n" ); return 0; map = io->map; if (map > 1) return -EINVAL; io->start = i365_get_pair(sock, I365_IO(map)+I365_W_START); io->stop = i365_get_pair(sock, I365_IO(map)+I365_W_STOP); ioctl = i365_get(sock, I365_IOCTL); addr = i365_get(sock, I365_ADDRWIN); io->speed = to_ns(ioctl & I365_IOCTL_WAIT(map)) ? 1 : 0; io->flags = (addr & I365_ENA_IO(map)) ? MAP_ACTIVE : 0; io->flags |= (ioctl & I365_IOCTL_0WS(map)) ? MAP_0WS : 0; io->flags |= (ioctl & I365_IOCTL_16BIT(map)) ? MAP_16BIT : 0; io->flags |= (ioctl & I365_IOCTL_IOCS16(map)) ? MAP_AUTOSZ : 0; printf("i82365: GetIOMap(%d, %d) = %#2.2x, %d ns, " "%#4.4x-%#4.4x\n", sock, map, io->flags, io->speed, io->start, io->stop); return 0;} // i365_get_io_map *//*====================================================================*//*static int i365_set_io_map(u_short sock, struct pccard_io_map *io){ u_char map, ioctl; printf("i82365: SetIOMap(%d, %d, %#2.2x, %d ns, " "%#4.4x-%#4.4x)\n", sock, io->map, io->flags, io->speed, io->start, io->stop);printf ( "UNIMPLEMENTED\n" ); return 0; map = io->map; //if ((map > 1) || (io->start > 0xffff) || (io->stop > 0xffff) || if ((map > 1) || (io->stop < io->start)) return -EINVAL; // Turn off the window before changing anything if (i365_get(sock, I365_ADDRWIN) & I365_ENA_IO(map)) i365_bclr(sock, I365_ADDRWIN, I365_ENA_IO(map)); i365_set_pair(sock, I365_IO(map)+I365_W_START, io->start); i365_set_pair(sock, I365_IO(map)+I365_W_STOP, io->stop); ioctl = i365_get(sock, I365_IOCTL) & ~I365_IOCTL_MASK(map); if (io->speed) ioctl |= I365_IOCTL_WAIT(map); if (io->flags & MAP_0WS) ioctl |= I365_IOCTL_0WS(map); if (io->flags & MAP_16BIT) ioctl |= I365_IOCTL_16BIT(map); if (io->flags & MAP_AUTOSZ) ioctl |= I365_IOCTL_IOCS16(map); i365_set(sock, I365_IOCTL, ioctl); // Turn on the window if necessary if (io->flags & MAP_ACTIVE) i365_bset(sock, I365_ADDRWIN, I365_ENA_IO(map)); return 0;} // i365_set_io_map *//*static int i365_set_mem_map(u_short sock, struct pccard_mem_map *mem){ u_short base, i; u_char map; printf("i82365: SetMemMap(%d, %d, %#2.2x, %d ns, %#5.5lx-%#5.5" "lx, %#5.5x)\n", sock, mem->map, mem->flags, mem->speed, mem->sys_start, mem->sys_stop, mem->card_start);printf ( "UNIMPLEMENTED\n" ); return 0; map = mem->map; if ((map > 4) || (mem->card_start > 0x3ffffff) || (mem->sys_start > mem->sys_stop) || (mem->speed > 1000)) return -EINVAL; if (!(socket[sock].flags & IS_PCI) && ((mem->sys_start > 0xffffff) || (mem->sys_stop > 0xffffff))) return -EINVAL; // Turn off the window before changing anything if (i365_get(sock, I365_ADDRWIN) & I365_ENA_MEM(map)) i365_bclr(sock, I365_ADDRWIN, I365_ENA_MEM(map)); base = I365_MEM(map); i = (mem->sys_start >> 12) & 0x0fff; if (mem->flags & MAP_16BIT) i |= I365_MEM_16BIT; if (mem->flags & MAP_0WS) i |= I365_MEM_0WS; i365_set_pair(sock, base+I365_W_START, i); i = (mem->sys_stop >> 12) & 0x0fff; switch (to_cycles(mem->speed)) { case 0: break; case 1: i |= I365_MEM_WS0; break; case 2: i |= I365_MEM_WS1; break; default: i |= I365_MEM_WS1 | I365_MEM_WS0; break; } i365_set_pair(sock, base+I365_W_STOP, i); i = ((mem->card_start - mem->sys_start) >> 12) & 0x3fff; if (mem->flags & MAP_WRPROT) i |= I365_MEM_WRPROT; if (mem->flags & MAP_ATTRIB) i |= I365_MEM_REG; i365_set_pair(sock, base+I365_W_OFF, i); // Turn on the window if necessary if (mem->flags & MAP_ACTIVE) i365_bset(sock, I365_ADDRWIN, I365_ENA_MEM(map)); return 0;} // i365_set_mem_map */int i82365_interfacer ( interface_func_t func, int sockno, int par1, int par2, void* par3 ) { //int i, j, k; //u_int ui; u_char *upc; struct pcc_config_t * pccc; switch ( func ) { case INIT: mydriverid = par1; return init_i82365(); case SHUTDOWN: i365_set(sockno, I365_ADDRWIN, i365_get(sockno, I365_ADDRWIN) & 0x20 ); i365_set(sockno, I365_INTCTL, 0x05 ); sleepticks(2); i365_set(sockno,I365_INTCTL, 0x45 ); //no-reset, memory-card break; case MAPATTRMEM: i365_set(sockno,I365_POWER, 0xb1 ); i365_set(sockno, I365_INTCTL, 0x05 ); sleepticks(2); i365_set(sockno,I365_INTCTL, 0x45 ); //no-reset, memory-card i365_set(sockno, I365_ADDRWIN, i365_get(sockno, I365_ADDRWIN) & 0x20 ); //i365_bclr(sockno, I365_ADDRWIN, 1 ); i365_set(sockno, I365_MEM(0)+0, ( par1 >> 12 )& 0xff ); //start i365_set(sockno, I365_MEM(0)+1, ( par1 >> 20 ) & 0x0f ); i365_set(sockno, I365_MEM(0)+2, ((par1 + par2 - 1 ) >> 12 ) & 0xff ); //end i365_set(sockno, I365_MEM(0)+3, (( par1 + par2 - 1 ) >> 20 ) & 0x0f ); i365_set(sockno, I365_MEM(0)+4, ((0x4000000 - par1) >> 12) & 0xff ); //offset low i365_set(sockno, I365_MEM(0)+5, 0x40 | (((0x40000000 - par1) >> 12) & 0x3f)); i365_bset(sockno, I365_ADDRWIN, 1 ); if ( ! ( 1 & i365_get ( sockno, I365_ADDRWIN ) ) ) return 1; break; case UNMAPATTRMEM: i365_set(sockno, I365_ADDRWIN, i365_get(sockno, I365_ADDRWIN) & 0x20 ); i365_set(sockno,I365_INTCTL, 0x45 ); //no-reset, memory-card break; case SELECTCONFIG: // Params: par1: config number; par3 config pointer pointer if ( 0 > pccsock[sockno].configoffset ) return 1; if ( NULL == (pccc = par3 ) ) return 2; // write config number to upc = ioremap ( MAP_ATTRMEM_TO, MAP_ATTRMEM_LEN ); if ( pccsock[sockno].configoffset > MAP_ATTRMEM_LEN ) return 3; if ( ( par1 & 0x7fffffc0 ) ) return 4; if ( pccc->index != par1 ) return 5; upc[pccsock[sockno].configoffset] = ( upc[pccsock[sockno].configoffset] & 0xc0 ) | ( par1 & 0x3f ); i365_set(sockno, I365_IOCTL, (i365_get(sockno, I365_IOCTL) & 0xfe) | 0x20 ); // 16bit autosize i365_set(sockno, I365_IO(0)+0, pccc->iowin & 0xff); i365_set(sockno, I365_IO(0)+1, (pccc->iowin >> 8) & 0xff); i365_set(sockno, I365_IO(0)+2, (pccc->iowin+pccc->iolen - 1) & 0xff); i365_set(sockno, I365_IO(0)+3, ((pccc->iowin+pccc->iolen- 1) >> 8) & 0xff); // Disable mem mapping i365_bclr(sockno, I365_ADDRWIN, 1); i365_set(sockno, I365_INTCTL, 0x65); i365_bset(sockno, I365_ADDRWIN,0x40); break; default: return -1; // ERROR: Unknown function called } return 0;}// get_mem_map[1320]// cirrus_get_state/set/opts...// vg46x_get_state/...// get_bridge_state/...
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -