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

📄 s_4bri.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 2 页
字号:
				IoAdapter->fpga_features |= PCINIT_FPGA_PLX_ACCESS_SUPPORTED ;			}	}	DBG_LOG(("FPGA[%s] file %s (%s %s) len %d",	         fpgaType, fpgaFile, fpgaDate, fpgaTime, cnt))	return (File) ;}/******************************************************************************/#define FPGA_PROG   0x0001		/* PROG enable low */#define FPGA_BUSY   0x0002		/* BUSY high, DONE low */#define	FPGA_CS     0x000C		/* Enable I/O pins */#define FPGA_CCLK   0x0100#define FPGA_DOUT   0x0400#define FPGA_DIN    FPGA_DOUT   /* bidirectional I/O */int qBri_FPGA_download (PISDN_ADAPTER IoAdapter) {	int            bit ;	byte           *File ;	dword          code, FileLength ;	word volatile __iomem *addr = (word volatile __iomem *)DIVA_OS_MEM_ATTACH_PROM(IoAdapter);	word           val, baseval = FPGA_CS | FPGA_PROG ;	if (DIVA_4BRI_REVISION(IoAdapter))	{		char* name;		switch (IoAdapter->cardType) {			case CARDTYPE_DIVASRV_B_2F_PCI:				name = "dsbri2f.bit";				break;			case CARDTYPE_DIVASRV_B_2M_V2_PCI:			case CARDTYPE_DIVASRV_VOICE_B_2M_V2_PCI:				name = "dsbri2m.bit";				break;			default:				name = "ds4bri2.bit";		}		File = qBri_check_FPGAsrc (IoAdapter, name,	                           		&FileLength, &code);	}	else	{		File = qBri_check_FPGAsrc (IoAdapter, "ds4bri.bit",		                           &FileLength, &code) ;	}	if ( !File ) {		DIVA_OS_MEM_DETACH_PROM(IoAdapter, addr);		return (0) ;	}/* *	prepare download, pulse PROGRAM pin down. */	WRITE_WORD(addr, baseval & ~FPGA_PROG) ; /* PROGRAM low pulse */	WRITE_WORD(addr, baseval) ;              /* release */	diva_os_wait (50) ;  /* wait until FPGA finished internal memory clear *//* *	check done pin, must be low */	if ( READ_WORD(addr) & FPGA_BUSY )	{		DBG_FTL(("FPGA download: acknowledge for FPGA memory clear missing"))		xdiFreeFile (File) ;		DIVA_OS_MEM_DETACH_PROM(IoAdapter, addr);		return (0) ;	}/* *	put data onto the FPGA */	while ( code < FileLength )	{		val = ((word)File[code++]) << 3 ;		for ( bit = 8 ; bit-- > 0 ; val <<= 1 ) /* put byte onto FPGA */		{			baseval &= ~FPGA_DOUT ;             /* clr  data bit */			baseval |= (val & FPGA_DOUT) ;      /* copy data bit */			WRITE_WORD(addr, baseval) ;			WRITE_WORD(addr, baseval | FPGA_CCLK) ;     /* set CCLK hi */			WRITE_WORD(addr, baseval | FPGA_CCLK) ;     /* set CCLK hi */			WRITE_WORD(addr, baseval) ;                 /* set CCLK lo */		}	}	xdiFreeFile (File) ;	diva_os_wait (100) ;	val = READ_WORD(addr) ;	DIVA_OS_MEM_DETACH_PROM(IoAdapter, addr);	if ( !(val & FPGA_BUSY) )	{		DBG_FTL(("FPGA download: chip remains in busy state (0x%04x)", val))		return (0) ;	}	return (1) ;}static int load_qBri_hardware (PISDN_ADAPTER IoAdapter) {	return (0);}/* --------------------------------------------------------------------------		Card ISR	 -------------------------------------------------------------------------- */static int qBri_ISR (struct _ISDN_ADAPTER* IoAdapter) {	dword volatile     __iomem *qBriIrq ;	PADAPTER_LIST_ENTRY QuadroList = IoAdapter->QuadroList ;	word              	i ;	int             	serviced = 0 ;	byte __iomem *p;	p = DIVA_OS_MEM_ATTACH_RESET(IoAdapter);	if ( !(READ_BYTE(&p[PLX9054_INTCSR]) & 0x80) ) {		DIVA_OS_MEM_DETACH_RESET(IoAdapter, p);		return (0) ;	}	DIVA_OS_MEM_DETACH_RESET(IoAdapter, p);/* *	clear interrupt line (reset Local Interrupt Test Register) */	p = DIVA_OS_MEM_ATTACH_CTLREG(IoAdapter);	qBriIrq = (dword volatile __iomem *)(&p[DIVA_4BRI_REVISION(IoAdapter) ? (MQ2_BREG_IRQ_TEST)  : (MQ_BREG_IRQ_TEST)]);	WRITE_DWORD(qBriIrq, MQ_IRQ_REQ_OFF) ;	DIVA_OS_MEM_DETACH_CTLREG(IoAdapter, p);	for ( i = 0 ; i < IoAdapter->tasks; ++i )	{		IoAdapter = QuadroList->QuadroAdapter[i] ;		if ( IoAdapter && IoAdapter->Initialized		  && IoAdapter->tst_irq (&IoAdapter->a) )		{			IoAdapter->IrqCount++ ;			serviced = 1 ;			diva_os_schedule_soft_isr (&IoAdapter->isr_soft_isr);		}	}	return (serviced) ;}/* --------------------------------------------------------------------------		Does disable the interrupt on the card	 -------------------------------------------------------------------------- */static void disable_qBri_interrupt (PISDN_ADAPTER IoAdapter) {	dword volatile __iomem *qBriIrq ;	byte __iomem *p;	if ( IoAdapter->ControllerNumber > 0 )		return ;/* *	clear interrupt line (reset Local Interrupt Test Register) */	p = DIVA_OS_MEM_ATTACH_RESET(IoAdapter);	WRITE_BYTE(&p[PLX9054_INTCSR], 0x00);	/* disable PCI interrupts */	DIVA_OS_MEM_DETACH_RESET(IoAdapter, p);	p = DIVA_OS_MEM_ATTACH_CTLREG(IoAdapter);	qBriIrq = (dword volatile __iomem *)(&p[DIVA_4BRI_REVISION(IoAdapter) ? (MQ2_BREG_IRQ_TEST)  : (MQ_BREG_IRQ_TEST)]);	WRITE_DWORD(qBriIrq, MQ_IRQ_REQ_OFF) ;	DIVA_OS_MEM_DETACH_CTLREG(IoAdapter, p);}/* --------------------------------------------------------------------------		Install Adapter Entry Points	 -------------------------------------------------------------------------- */static void set_common_qBri_functions (PISDN_ADAPTER IoAdapter) {	ADAPTER *a;	a = &IoAdapter->a ;	a->ram_in           = mem_in ;	a->ram_inw          = mem_inw ;	a->ram_in_buffer    = mem_in_buffer ;	a->ram_look_ahead   = mem_look_ahead ;	a->ram_out          = mem_out ;	a->ram_outw         = mem_outw ;	a->ram_out_buffer   = mem_out_buffer ;	a->ram_inc          = mem_inc ;	IoAdapter->out      = pr_out ;	IoAdapter->dpc      = pr_dpc ;	IoAdapter->tst_irq  = scom_test_int ;	IoAdapter->clr_irq  = scom_clear_int ;	IoAdapter->pcm      = (struct pc_maint *)MIPS_MAINT_OFFS ;	IoAdapter->load     = load_qBri_hardware ;	IoAdapter->disIrq   = disable_qBri_interrupt ;	IoAdapter->rstFnc   = reset_qBri_hardware ;	IoAdapter->stop     = stop_qBri_hardware ;	IoAdapter->trapFnc  = qBri_cpu_trapped ;	IoAdapter->diva_isr_handler = qBri_ISR;	IoAdapter->a.io       = (void*)IoAdapter ;}static void set_qBri_functions (PISDN_ADAPTER IoAdapter) {	if (!IoAdapter->tasks) {		IoAdapter->tasks = MQ_INSTANCE_COUNT;	}	IoAdapter->MemorySize = MQ_MEMORY_SIZE ;	set_common_qBri_functions (IoAdapter) ;	diva_os_set_qBri_functions (IoAdapter) ;}static void set_qBri2_functions (PISDN_ADAPTER IoAdapter) {	if (!IoAdapter->tasks) {		IoAdapter->tasks = MQ_INSTANCE_COUNT;	}	IoAdapter->MemorySize = (IoAdapter->tasks == 1) ? BRI2_MEMORY_SIZE : MQ2_MEMORY_SIZE;	set_common_qBri_functions (IoAdapter) ;	diva_os_set_qBri2_functions (IoAdapter) ;}/******************************************************************************/void prepare_qBri_functions (PISDN_ADAPTER IoAdapter) {	set_qBri_functions (IoAdapter->QuadroList->QuadroAdapter[0]) ;	set_qBri_functions (IoAdapter->QuadroList->QuadroAdapter[1]) ;	set_qBri_functions (IoAdapter->QuadroList->QuadroAdapter[2]) ;	set_qBri_functions (IoAdapter->QuadroList->QuadroAdapter[3]) ;}void prepare_qBri2_functions (PISDN_ADAPTER IoAdapter) {	if (!IoAdapter->tasks) {		IoAdapter->tasks = MQ_INSTANCE_COUNT;	}	set_qBri2_functions (IoAdapter->QuadroList->QuadroAdapter[0]) ;	if (IoAdapter->tasks > 1) {		set_qBri2_functions (IoAdapter->QuadroList->QuadroAdapter[1]) ;		set_qBri2_functions (IoAdapter->QuadroList->QuadroAdapter[2]) ;		set_qBri2_functions (IoAdapter->QuadroList->QuadroAdapter[3]) ;	}}/* -------------------------------------------------------------------------- */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -