📄 common.c
字号:
/* * * Copyright (C) Eicon Technology Corporation, 2000. * * This source file is supplied for the exclusive use with Eicon * Technology Corporation's range of DIVA Server Adapters. * * Eicon File Revision : 1.15 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */#include "sys.h"#include "idi.h"#include "constant.h"#include "divas.h"#include "pc.h"#include "pr_pc.h"#include "uxio.h"#include <sys/types.h>#define MAX_ADDR_LEN#define DIVAS_LOAD_CMD 0x02#define DIVAS_START_CMD 0x03#define DIVAS_IRQ_RESET 0xC18#define DIVAS_IRQ_RESET_VAL 0xFE#define PCI_COMMAND 0x04#define PCI_STATUS 0x06#define PCI_LATENCY 0x0D#define PCI_INTERRUPT 0x3C#define TEST_INT_DIVAS 0x11#define TEST_INT_DIVAS_BRI 0x12#define TEST_INT_DIVAS_Q 0x13#define DIVAS_RESET 0x81#define DIVAS_LED1 0x04#define DIVAS_LED2 0x08#define DIVAS_LED3 0x20#define DIVAS_LED4 0x40#define DIVAS_SIGNATURE 0x4447#define MP_PROTOCOL_ADDR 0xA0011000#define PLX_IOBASE 0#define DIVAS_IOBASE 1typedef struct { dword cmd; dword addr; dword len; dword err; dword live; dword reserved[(0x1020>>2)-6]; dword signature; byte data[1];} diva_server_boot_t;int DivasCardNext;card_t DivasCards[MAX_CARDS];dia_config_t *DivasConfig(card_t *, dia_config_t *);staticDESCRIPTOR DIDD_Table[32];void DIVA_DIDD_Read( DESCRIPTOR *table, int tablelength ){ bzero(table, tablelength); if (tablelength > sizeof(DIDD_Table)) tablelength = sizeof(DIDD_Table); if(tablelength % sizeof(DESCRIPTOR)) { tablelength /= sizeof(DESCRIPTOR); tablelength *= sizeof(DESCRIPTOR); } if (tablelength > 0) bcopy((caddr_t)DIDD_Table, (caddr_t)table, tablelength); return;}staticvoid DIVA_DIDD_Write(DESCRIPTOR *table, int tablelength){ if (tablelength > sizeof(DIDD_Table)) tablelength = sizeof(DIDD_Table); bcopy((caddr_t)table, (caddr_t)DIDD_Table, tablelength); return;}staticvoid init_idi_tab(void){ DESCRIPTOR d[32]; bzero(d, sizeof(d)); d[0].type = IDI_DIMAINT; /* identify the DIMAINT entry */ d[0].channels = 0; /* zero channels associated with dimaint*/ d[0].features = 0; /* no features associated with dimaint */ d[0].request = (IDI_CALL) DivasPrintf; DIVA_DIDD_Write(d, sizeof(d)); return;}/* * I/O routines for memory mapped cards */byte mem_in(ADAPTER *a, void *adr){ card_t *card = a->io; unsigned char *b, *m; byte value; m = b = UxCardMemAttach(card->hw, DIVAS_SHARED_MEMORY); m += (unsigned int) adr; value = UxCardMemIn(card->hw, m); UxCardMemDetach(card->hw, b); return value;}word mem_inw(ADAPTER *a, void *adr){ card_t *card = a->io; unsigned char *b, *m; word value; m = b = UxCardMemAttach(card->hw, DIVAS_SHARED_MEMORY); m += (unsigned int) adr; value = UxCardMemInW(card->hw, m); UxCardMemDetach(card->hw, b); return value;}void mem_in_buffer(ADAPTER *a, void *adr, void *P, word length){ card_t *card = a->io; unsigned char *b, *m; m = b = UxCardMemAttach(card->hw, DIVAS_SHARED_MEMORY); m += (unsigned int) adr; UxCardMemInBuffer(card->hw, m, P, length); UxCardMemDetach(card->hw, b); return;}void mem_look_ahead(ADAPTER *a, PBUFFER *RBuffer, ENTITY *e){ card_t *card = a->io; unsigned char *b, *m; m = b = UxCardMemAttach(card->hw, DIVAS_SHARED_MEMORY); m += (dword) &RBuffer->length; card->RBuffer.length = UxCardMemInW(card->hw, m); m = b; m += (dword) &RBuffer->P; UxCardMemInBuffer(card->hw, m, card->RBuffer.P, card->RBuffer.length); e->RBuffer = (DBUFFER *) &card->RBuffer; UxCardMemDetach(card->hw, b); return;}void mem_out(ADAPTER *a, void *adr, byte data){ card_t *card = a->io; unsigned char *b, *m; m = b = UxCardMemAttach(card->hw, DIVAS_SHARED_MEMORY); m += (unsigned int) adr; UxCardMemOut(card->hw, m, data); UxCardMemDetach(card->hw, b); return;}void mem_outw(ADAPTER *a, void *adr, word data){ card_t *card = a->io; unsigned char *b, *m; m = b = UxCardMemAttach(card->hw, DIVAS_SHARED_MEMORY); m += (unsigned int) adr; UxCardMemOutW(card->hw, m, data); UxCardMemDetach(card->hw, b); return;}void mem_out_buffer(ADAPTER *a, void *adr, void *P, word length){ card_t *card = a->io; unsigned char *b, *m; m = b = UxCardMemAttach(card->hw, DIVAS_SHARED_MEMORY); m += (unsigned int) adr; UxCardMemOutBuffer(card->hw, m, P, length); UxCardMemDetach(card->hw, b); return;}void mem_inc(ADAPTER *a, void *adr){ word value; card_t *card = a->io; unsigned char *b, *m; m = b = UxCardMemAttach(card->hw, DIVAS_SHARED_MEMORY); m += (unsigned int) adr; value = UxCardMemInW(card->hw, m); value++; UxCardMemOutW(card->hw, m, value); UxCardMemDetach(card->hw, b); return;}/* * I/O routines for I/O mapped cards */byte io_in(ADAPTER *a, void *adr){ card_t *card = a->io; byte value; byte *DivasIOBase = NULL; DivasIOBase = UxCardMemAttach(card->hw, DIVAS_IOBASE); value = UxCardIoIn(card->hw, DivasIOBase, adr); UxCardMemDetach(card->hw, DivasIOBase); return value;}word io_inw(ADAPTER *a, void *adr){ card_t *card = a->io; word value; byte *DivasIOBase = NULL; DivasIOBase = UxCardMemAttach(card->hw, DIVAS_IOBASE); value = UxCardIoInW(card->hw, DivasIOBase, adr); UxCardMemDetach(card->hw, DivasIOBase); return value;}void io_in_buffer(ADAPTER *a, void *adr, void *P, word length){ card_t *card = a->io; byte *DivasIOBase = NULL; DivasIOBase = UxCardMemAttach(card->hw, DIVAS_IOBASE); UxCardIoInBuffer(card->hw, DivasIOBase, adr, P,length); UxCardMemDetach(card->hw, DivasIOBase); return;}void io_look_ahead(ADAPTER *a, PBUFFER *RBuffer, ENTITY *e){ card_t *card = a->io; byte *DivasIOBase = NULL; DivasIOBase = UxCardMemAttach(card->hw, DIVAS_IOBASE); card->RBuffer.length = UxCardIoInW(card->hw, DivasIOBase, (byte *) RBuffer); UxCardIoInBuffer(card->hw, DivasIOBase, &RBuffer->P, card->RBuffer.P, card->RBuffer.length); UxCardMemDetach(card->hw, DivasIOBase); e->RBuffer = (DBUFFER *) &card->RBuffer; return;}void io_out(ADAPTER *a, void *adr, byte data){ card_t *card = a->io; byte *DivasIOBase = NULL; DivasIOBase = UxCardMemAttach(card->hw, DIVAS_IOBASE); UxCardIoOut(card->hw, DivasIOBase, adr, data); UxCardMemDetach(card->hw, DivasIOBase); return;}void io_outw(ADAPTER *a, void *adr, word data){ card_t *card = a->io; byte *DivasIOBase = NULL; DivasIOBase = UxCardMemAttach(card->hw, DIVAS_IOBASE); UxCardIoOutW(card->hw, DivasIOBase, adr, data); UxCardMemDetach(card->hw, DivasIOBase); return;}void io_out_buffer(ADAPTER *a, void *adr, void *P, word length){ card_t *card = a->io; byte *DivasIOBase = NULL; DivasIOBase = UxCardMemAttach(card->hw, DIVAS_IOBASE); UxCardIoOutBuffer(card->hw, DivasIOBase, adr, P, length); UxCardMemDetach(card->hw, DivasIOBase); return;}void io_inc(ADAPTER *a, void *adr){ word value; card_t *card = a->io; byte *DivasIOBase; DivasIOBase = UxCardMemAttach(card->hw, DIVAS_IOBASE); value = UxCardIoInW(card->hw, DivasIOBase, adr); value++; UxCardIoOutW(card->hw, DivasIOBase, adr, value); UxCardMemDetach(card->hw, DivasIOBase); return;}staticvoid test_int(card_t *card){ byte *shared, *DivasIOBase; switch (card->test_int_pend) { case TEST_INT_DIVAS: DPRINTF(("divas: test interrupt pending")); shared = UxCardMemAttach(card->hw, DIVAS_SHARED_MEMORY); if (UxCardMemIn(card->hw, &shared[0x3FE])) { UxCardMemOut(card->hw, &(((struct pr_ram *)shared)->RcOutput), 0); UxCardMemDetach(card->hw, shared); (*card->reset_int)(card); shared = UxCardMemAttach(card->hw, DIVAS_SHARED_MEMORY); UxCardMemOut(card->hw, &shared[0x3FE], 0); DPRINTF(("divas: test interrupt cleared")); } UxCardMemDetach(card->hw, shared); card->test_int_pend = 0; break; case TEST_INT_DIVAS_BRI: DPRINTF(("divas: BRI test interrupt pending")); (*card->reset_int)(card); DivasIOBase = UxCardMemAttach(card->hw, DIVAS_IOBASE); UxCardIoOutW(card->hw, DivasIOBase, (void *) 0x3FE, 0); UxCardMemDetach(card->hw, DivasIOBase); DPRINTF(("divas: test interrupt cleared")); card->test_int_pend = 0; break; case TEST_INT_DIVAS_Q: DPRINTF(("divas: 4BRI test interrupt pending")); (*card->reset_int)(card); card->test_int_pend = 0; break; default: DPRINTF(("divas: unknown test interrupt pending")); return; } return;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -