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

📄 cpld-ap325rxa.c

📁 U-boot latest tarball
💻 C
字号:
/*************************************************************** * Project: *	  CPLD SlaveSerial Configuration via embedded microprocessor. * * Copyright info: * *	  This is free software; you can redistribute it and/or modify *	  it as you like. * *	  This program is distributed in the hope that it will be useful, *	  but WITHOUT ANY WARRANTY; without even the implied warranty of *	  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * Description: * *      This is the main source file that will allow a microprocessor *      to configure Xilinx Virtex, Virtex-E, Virtex-EM, Virtex-II, *      and Spartan-II devices via the SlaveSerial Configuration Mode. *      This code is discussed in Xilinx Application Note, XAPP502. * * History: *	  3-October-2001  MN/MP  - Created *	  20-August-2008  Renesas Solutions - Modified to SH7723 ****************************************************************/#include <common.h>/* Serial */#define SCIF_BASE 0xffe00000 /* SCIF0 */#define SCSMR	(vu_short *)(SCIF_BASE + 0x00)#define SCBRR	(vu_char *)(SCIF_BASE + 0x04)#define SCSCR	(vu_short *)(SCIF_BASE + 0x08)#define SC_TDR	(vu_char *)(SCIF_BASE + 0x0C)#define SC_SR	(vu_short *)(SCIF_BASE + 0x10)#define SCFCR	(vu_short *)(SCIF_BASE + 0x18)#define	RFCR	(vu_long *)0xFE400020#define SCSCR_INIT		0x0038#define SCSCR_CLR		0x0000#define SCFCR_INIT		0x0006#define SCSMR_INIT		0x0080#define RFCR_CLR		0xA400#define SCI_TD_E		0x0020#define SCI_TDRE_CLEAR	0x00df#define BPS_SETTING_VALUE	1 /* 12.5MHz */#define WAIT_RFCR_COUNTER	500/* CPLD data size */#define CPLD_DATA_SIZE	169216/* out */#define CPLD_PFC_ADR	((vu_short *)0xA4050112)#define CPLD_PROG_ADR	((vu_char *)0xA4050132)#define CPLD_PROG_DAT	0x80/* in */#define CPLD_INIT_ADR	((vu_char *)0xA4050132)#define CPLD_INIT_DAT	0x40#define CPLD_DONE_ADR	((vu_char *)0xA4050132)#define CPLD_DONE_DAT	0x20#define	HIZCRB			((vu_short *)0xA405015A)/* data */#define CPLD_NOMAL_START	0xA0A80000#define CPLD_SAFE_START		0xA0AC0000#define MODE_SW				(vu_char *)0xA405012Astatic void init_cpld_loader(void){	*SCSCR = SCSCR_CLR;	*SCFCR = SCFCR_INIT;	*SCSMR = SCSMR_INIT;	*SCBRR = BPS_SETTING_VALUE;	*RFCR = RFCR_CLR; /* Refresh counter clear */	while (*RFCR < WAIT_RFCR_COUNTER)		;	*SCFCR = 0x0; /* RTRG=00, TTRG=00 */				  /* MCE=0,TFRST=0,RFRST=0,LOOP=0 */	*SCSCR = SCSCR_INIT;}static int check_write_ready(void){	u16 status = *SC_SR;	return status & SCI_TD_E;}static void write_cpld_data(char ch){	while (!check_write_ready())		;	*SC_TDR = ch;	*SC_SR;	*SC_SR = SCI_TDRE_CLEAR;}static int delay(void){	int i;	int c = 0;	for (i = 0; i < 200; i++) {		c = *(volatile int *)0xa0000000;	}	return c;}/*********************************************************************** * * Function:     slave_serial * * Description:  Initiates SlaveSerial Configuration. *               Calls ShiftDataOut() to output serial data * ***********************************************************************/static void slave_serial(void){	int i;	unsigned char *flash;	*CPLD_PROG_ADR |= CPLD_PROG_DAT; /* PROGRAM_OE HIGH */	delay();	/*	 * Toggle Program Pin by Toggling Program_OE bit	 * This is accomplished by writing to the Program Register in the CPLD	 *	 * NOTE: The Program_OE bit should be driven high to bring the Virtex	 *      Program Pin low. Likewise, it should be driven low	 *      to bring the Virtex Program Pin to High-Z	 */	*CPLD_PROG_ADR &= ~CPLD_PROG_DAT; /* PROGRAM_OE LOW */	delay();	/*	 * Bring Program High-Z	 * (Drive Program_OE bit low to bring Virtex Program Pin to High-Z	 */	/* Program_OE bit Low brings the Virtex Program Pin to High Z: */	*CPLD_PROG_ADR |= CPLD_PROG_DAT; /* PROGRAM_OE HIGH */	while ((*CPLD_INIT_ADR & CPLD_INIT_DAT) == 0)		delay();	/* Begin Slave-Serial Configuration */	flash = (unsigned char *)CPLD_NOMAL_START;	for (i = 0; i < CPLD_DATA_SIZE; i++)		write_cpld_data(*flash++);}/*********************************************************************** * * Function: check_done_bit * * Description: This function takes monitors the CPLD Input Register * 		   by checking the status of the DONE bit in that Register. *               By doing so, it monitors the Xilinx Virtex device's DONE *               Pin to see if configuration bitstream has been properly *               loaded * ***********************************************************************/static void check_done_bit(void){	while (!(*CPLD_DONE_ADR & CPLD_DONE_DAT))		;}/*********************************************************************** * * Function: init_cpld * * Description: Begins Slave Serial configuration of Xilinx FPGA * ***********************************************************************/void init_cpld(void){	/* Init serial device */	init_cpld_loader();	if (*CPLD_DONE_ADR & CPLD_DONE_DAT)	/* Already DONE */		return;	*HIZCRB = 0x0000;	*CPLD_PFC_ADR = 0x7c00;			/* FPGA PROG = OUTPUT */	/* write CPLD data from NOR flash to device */	slave_serial();	/*	 * Monitor the DONE bit in the CPLD Input Register to see if	 * configuration successful	 */	check_done_bit();}

⌨️ 快捷键说明

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