⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 common.c

📁 Linux内核源代码 为压缩文件 是<<Linux内核>>一书中的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * * 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 + -