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

📄 fpga.c

📁 linux-2.6.15.6
💻 C
字号:
/*  * Copyright (C) 2000 David J. Mckay (david.mckay@st.com) * * May be copied or modified under the terms of the GNU General Public * License.  See linux/COPYING for more information.                             * * This file handles programming up the Altera Flex10K that interfaces to * the Galileo, and does the PS/2 keyboard and mouse * */#include <linux/config.h>#include <linux/kernel.h>#include <linux/smp.h>#include <linux/smp_lock.h>#include <linux/init.h>#include <linux/errno.h>#include <linux/pci.h>#include <linux/delay.h>#include <asm/overdriver/gt64111.h>#include <asm/overdrive/overdrive.h>#include <asm/overdrive/fpga.h>#define FPGA_NotConfigHigh()  (*FPGA_ControlReg) = (*FPGA_ControlReg) | ENABLE_FPGA_BIT#define FPGA_NotConfigLow()   (*FPGA_ControlReg) = (*FPGA_ControlReg) & RESET_FPGA_MASK/* I need to find out what (if any) the real delay factor here is *//* The delay is definately not critical */#define long_delay() {int i;for(i=0;i<10000;i++);}#define short_delay() {int i;for(i=0;i<100;i++);}static void __init program_overdrive_fpga(const unsigned char *fpgacode,					  int size){	int timeout = 0;	int i, j;	unsigned char b;	static volatile unsigned char *FPGA_ControlReg =	    (volatile unsigned char *) (OVERDRIVE_CTRL);	static volatile unsigned char *FPGA_ProgramReg =	    (volatile unsigned char *) (FPGA_DCLK_ADDRESS);	printk("FPGA:  Commencing FPGA Programming\n");	/* The PCI reset but MUST be low when programming the FPGA !!! */	b = (*FPGA_ControlReg) & RESET_PCI_MASK;	(*FPGA_ControlReg) = b;	/* Prepare FPGA to program */	FPGA_NotConfigHigh();	long_delay();	FPGA_NotConfigLow();	short_delay();	while ((*FPGA_ProgramReg & FPGA_NOT_STATUS) != 0) {		printk("FPGA:  Waiting for NotStatus to go Low ... \n");	}	FPGA_NotConfigHigh();	/* Wait for FPGA "ready to be programmed" signal */	printk("FPGA:  Waiting for NotStatus to go high (FPGA ready)... \n");	for (timeout = 0;	     (((*FPGA_ProgramReg & FPGA_NOT_STATUS) == 0)	      && (timeout < FPGA_TIMEOUT)); timeout++);	/* Check if timeout condition occured - i.e. an error */	if (timeout == FPGA_TIMEOUT) {		printk		    ("FPGA:  Failed to program - Timeout waiting for notSTATUS to go high\n");		return;	}	printk("FPGA:  Copying data to FPGA ... %d bytes\n", size);	/* Copy array to FPGA - bit at a time */	for (i = 0; i < size; i++) {		volatile unsigned w = 0;		for (j = 0; j < 8; j++) {			*FPGA_ProgramReg = (fpgacode[i] >> j) & 0x01;			short_delay();		}		if ((i & 0x3ff) == 0) {			printk(".");		}	}	/* Waiting for CONFDONE to go high - means the program is complete  */	for (timeout = 0;	     (((*FPGA_ProgramReg & FPGA_CONFDONE) == 0)	      && (timeout < FPGA_TIMEOUT)); timeout++) {		*FPGA_ProgramReg = 0x0;		long_delay();	}	if (timeout == FPGA_TIMEOUT) {		printk		    ("FPGA:  Failed to program - Timeout waiting for CONFDONE to go high\n");		return;	} else {		/* Clock another 10 times - gets the device into a working state      */		for (i = 0; i < 10; i++) {			*FPGA_ProgramReg = 0x0;			short_delay();		}	}	printk("FPGA:  Programming complete\n");}static const unsigned char __init fpgacode[] = {#include "./overdrive.ttf"	/* Code from maxplus2 compiler */	, 0, 0};int __init init_overdrive_fpga(void){	program_overdrive_fpga(fpgacode, sizeof(fpgacode));	return 0;}

⌨️ 快捷键说明

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