亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? 44x_spd_ddr2.c

?? U-boot源碼 ARM7啟動代碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
/* * cpu/ppc4xx/44x_spd_ddr2.c * This SPD SDRAM detection code supports AMCC PPC44x cpu's with a * DDR2 controller (non Denali Core). Those are 440SP/SPe. * * (C) Copyright 2007 * Stefan Roese, DENX Software Engineering, sr@denx.de. * * COPYRIGHT   AMCC   CORPORATION 2004 * * See file CREDITS for list of people who contributed to this * project. * * 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 of * the License, or (at your option) any later version. * * 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.	 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., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA * *//* define DEBUG for debugging output (obviously ;-)) */#if 0#define DEBUG#endif#include <common.h>#include <command.h>#include <ppc4xx.h>#include <i2c.h>#include <asm/io.h>#include <asm/processor.h>#include <asm/mmu.h>#if defined(CONFIG_SPD_EEPROM) &&				\	(defined(CONFIG_440SP) || defined(CONFIG_440SPE))/*-----------------------------------------------------------------------------+ * Defines *-----------------------------------------------------------------------------*/#ifndef	TRUE#define TRUE		1#endif#ifndef FALSE#define FALSE		0#endif#define SDRAM_DDR1	1#define SDRAM_DDR2	2#define SDRAM_NONE	0#define MAXDIMMS	2#define MAXRANKS	4#define MAXBXCF		4#define MAX_SPD_BYTES	256   /* Max number of bytes on the DIMM's SPD EEPROM */#define ONE_BILLION	1000000000#define MULDIV64(m1, m2, d)	(u32)(((u64)(m1) * (u64)(m2)) / (u64)(d))#define CMD_NOP		(7 << 19)#define CMD_PRECHARGE	(2 << 19)#define CMD_REFRESH	(1 << 19)#define CMD_EMR		(0 << 19)#define CMD_READ	(5 << 19)#define CMD_WRITE	(4 << 19)#define SELECT_MR	(0 << 16)#define SELECT_EMR	(1 << 16)#define SELECT_EMR2	(2 << 16)#define SELECT_EMR3	(3 << 16)/* MR */#define DLL_RESET	0x00000100#define WRITE_RECOV_2	(1 << 9)#define WRITE_RECOV_3	(2 << 9)#define WRITE_RECOV_4	(3 << 9)#define WRITE_RECOV_5	(4 << 9)#define WRITE_RECOV_6	(5 << 9)#define BURST_LEN_4	0x00000002/* EMR */#define ODT_0_OHM	0x00000000#define ODT_50_OHM	0x00000044#define ODT_75_OHM	0x00000004#define ODT_150_OHM	0x00000040#define ODS_FULL	0x00000000#define ODS_REDUCED	0x00000002/* defines for ODT (On Die Termination) of the 440SP(e) DDR2 controller */#define ODT_EB0R	(0x80000000 >> 8)#define ODT_EB0W	(0x80000000 >> 7)#define CALC_ODT_R(n)	(ODT_EB0R << (n << 1))#define CALC_ODT_W(n)	(ODT_EB0W << (n << 1))#define CALC_ODT_RW(n)	(CALC_ODT_R(n) | CALC_ODT_W(n))/* Defines for the Read Cycle Delay test */#define NUMMEMTESTS	8#define NUMMEMWORDS	8#define NUMLOOPS	64		/* memory test loops */#undef CONFIG_ECC_ERROR_RESET		/* test-only: see description below, at check_ecc() *//* * This DDR2 setup code can dynamically setup the TLB entries for the DDR2 memory * region. Right now the cache should still be disabled in U-Boot because of the * EMAC driver, that need it's buffer descriptor to be located in non cached * memory. * * If at some time this restriction doesn't apply anymore, just define * CFG_ENABLE_SDRAM_CACHE in the board config file and this code should setup * everything correctly. */#ifdef CFG_ENABLE_SDRAM_CACHE#define MY_TLB_WORD2_I_ENABLE	0			/* enable caching on SDRAM */#else#define MY_TLB_WORD2_I_ENABLE	TLB_WORD2_I_ENABLE	/* disable caching on SDRAM */#endif/* * Board-specific Platform code can reimplement spd_ddr_init_hang () if needed */void __spd_ddr_init_hang (void){	hang ();}void spd_ddr_init_hang (void) __attribute__((weak, alias("__spd_ddr_init_hang")));/* * To provide an interface for board specific config values in this common * DDR setup code, we implement he "weak" default functions here. They return * the default value back to the caller. * * Please see include/configs/yucca.h for an example fora board specific * implementation. */u32 __ddr_wrdtr(u32 default_val){	return default_val;}u32 ddr_wrdtr(u32) __attribute__((weak, alias("__ddr_wrdtr")));u32 __ddr_clktr(u32 default_val){	return default_val;}u32 ddr_clktr(u32) __attribute__((weak, alias("__ddr_clktr")));/* Private Structure Definitions *//* enum only to ease code for cas latency setting */typedef enum ddr_cas_id {	DDR_CAS_2      = 20,	DDR_CAS_2_5    = 25,	DDR_CAS_3      = 30,	DDR_CAS_4      = 40,	DDR_CAS_5      = 50} ddr_cas_id_t;/*-----------------------------------------------------------------------------+ * Prototypes *-----------------------------------------------------------------------------*/static unsigned long sdram_memsize(void);static void get_spd_info(unsigned long *dimm_populated,			 unsigned char *iic0_dimm_addr,			 unsigned long num_dimm_banks);static void check_mem_type(unsigned long *dimm_populated,			   unsigned char *iic0_dimm_addr,			   unsigned long num_dimm_banks);static void check_frequency(unsigned long *dimm_populated,			    unsigned char *iic0_dimm_addr,			    unsigned long num_dimm_banks);static void check_rank_number(unsigned long *dimm_populated,			      unsigned char *iic0_dimm_addr,			      unsigned long num_dimm_banks);static void check_voltage_type(unsigned long *dimm_populated,			       unsigned char *iic0_dimm_addr,			       unsigned long num_dimm_banks);static void program_memory_queue(unsigned long *dimm_populated,				 unsigned char *iic0_dimm_addr,				 unsigned long num_dimm_banks);static void program_codt(unsigned long *dimm_populated,			 unsigned char *iic0_dimm_addr,			 unsigned long num_dimm_banks);static void program_mode(unsigned long *dimm_populated,			 unsigned char *iic0_dimm_addr,			 unsigned long num_dimm_banks,			 ddr_cas_id_t *selected_cas,			 int *write_recovery);static void program_tr(unsigned long *dimm_populated,		       unsigned char *iic0_dimm_addr,		       unsigned long num_dimm_banks);static void program_rtr(unsigned long *dimm_populated,			unsigned char *iic0_dimm_addr,			unsigned long num_dimm_banks);static void program_bxcf(unsigned long *dimm_populated,			 unsigned char *iic0_dimm_addr,			 unsigned long num_dimm_banks);static void program_copt1(unsigned long *dimm_populated,			  unsigned char *iic0_dimm_addr,			  unsigned long num_dimm_banks);static void program_initplr(unsigned long *dimm_populated,			    unsigned char *iic0_dimm_addr,			    unsigned long num_dimm_banks,			    ddr_cas_id_t selected_cas,			    int write_recovery);static unsigned long is_ecc_enabled(void);#ifdef CONFIG_DDR_ECCstatic void program_ecc(unsigned long *dimm_populated,			unsigned char *iic0_dimm_addr,			unsigned long num_dimm_banks,			unsigned long tlb_word2_i_value);static void program_ecc_addr(unsigned long start_address,			     unsigned long num_bytes,			     unsigned long tlb_word2_i_value);#endifstatic void program_DQS_calibration(unsigned long *dimm_populated,				    unsigned char *iic0_dimm_addr,				    unsigned long num_dimm_banks);#ifdef HARD_CODED_DQS /* calibration test with hardvalues */static void	test(void);#elsestatic void	DQS_calibration_process(void);#endifstatic void ppc440sp_sdram_register_dump(void);int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);void dcbz_area(u32 start_address, u32 num_bytes);void dflush(void);static u32 mfdcr_any(u32 dcr){	u32 val;	switch (dcr) {	case SDRAM_R0BAS + 0:		val = mfdcr(SDRAM_R0BAS + 0);		break;	case SDRAM_R0BAS + 1:		val = mfdcr(SDRAM_R0BAS + 1);		break;	case SDRAM_R0BAS + 2:		val = mfdcr(SDRAM_R0BAS + 2);		break;	case SDRAM_R0BAS + 3:		val = mfdcr(SDRAM_R0BAS + 3);		break;	default:		printf("DCR %d not defined in case statement!!!\n", dcr);		val = 0; /* just to satisfy the compiler */	}	return val;}static void mtdcr_any(u32 dcr, u32 val){	switch (dcr) {	case SDRAM_R0BAS + 0:		mtdcr(SDRAM_R0BAS + 0, val);		break;	case SDRAM_R0BAS + 1:		mtdcr(SDRAM_R0BAS + 1, val);		break;	case SDRAM_R0BAS + 2:		mtdcr(SDRAM_R0BAS + 2, val);		break;	case SDRAM_R0BAS + 3:		mtdcr(SDRAM_R0BAS + 3, val);		break;	default:		printf("DCR %d not defined in case statement!!!\n", dcr);	}}static unsigned char spd_read(uchar chip, uint addr){	unsigned char data[2];	if (i2c_probe(chip) == 0)		if (i2c_read(chip, addr, 1, data, 1) == 0)			return data[0];	return 0;}/*-----------------------------------------------------------------------------+ * sdram_memsize *-----------------------------------------------------------------------------*/static unsigned long sdram_memsize(void){	unsigned long mem_size;	unsigned long mcopt2;	unsigned long mcstat;	unsigned long mb0cf;	unsigned long sdsz;	unsigned long i;	mem_size = 0;	mfsdram(SDRAM_MCOPT2, mcopt2);	mfsdram(SDRAM_MCSTAT, mcstat);	/* DDR controller must be enabled and not in self-refresh. */	/* Otherwise memsize is zero. */	if (((mcopt2 & SDRAM_MCOPT2_DCEN_MASK) == SDRAM_MCOPT2_DCEN_ENABLE)	    && ((mcopt2 & SDRAM_MCOPT2_SREN_MASK) == SDRAM_MCOPT2_SREN_EXIT)	    && ((mcstat & (SDRAM_MCSTAT_MIC_MASK | SDRAM_MCSTAT_SRMS_MASK))		== (SDRAM_MCSTAT_MIC_COMP | SDRAM_MCSTAT_SRMS_NOT_SF))) {		for (i = 0; i < MAXBXCF; i++) {			mfsdram(SDRAM_MB0CF + (i << 2), mb0cf);			/* Banks enabled */			if ((mb0cf & SDRAM_BXCF_M_BE_MASK) == SDRAM_BXCF_M_BE_ENABLE) {				sdsz = mfdcr_any(SDRAM_R0BAS + i) & SDRAM_RXBAS_SDSZ_MASK;				switch(sdsz) {				case SDRAM_RXBAS_SDSZ_8:					mem_size+=8;					break;				case SDRAM_RXBAS_SDSZ_16:					mem_size+=16;					break;				case SDRAM_RXBAS_SDSZ_32:					mem_size+=32;					break;				case SDRAM_RXBAS_SDSZ_64:					mem_size+=64;					break;				case SDRAM_RXBAS_SDSZ_128:					mem_size+=128;					break;				case SDRAM_RXBAS_SDSZ_256:					mem_size+=256;					break;				case SDRAM_RXBAS_SDSZ_512:					mem_size+=512;					break;				case SDRAM_RXBAS_SDSZ_1024:					mem_size+=1024;					break;				case SDRAM_RXBAS_SDSZ_2048:					mem_size+=2048;					break;				case SDRAM_RXBAS_SDSZ_4096:					mem_size+=4096;					break;				default:					mem_size=0;					break;				}			}		}	}	mem_size *= 1024 * 1024;	return(mem_size);}/*-----------------------------------------------------------------------------+ * initdram.  Initializes the 440SP Memory Queue and DDR SDRAM controller. * Note: This routine runs from flash with a stack set up in the chip's * sram space.  It is important that the routine does not require .sbss, .bss or * .data sections.  It also cannot call routines that require these sections. *-----------------------------------------------------------------------------*//*----------------------------------------------------------------------------- * Function:	 initdram * Description:  Configures SDRAM memory banks for DDR operation. *		 Auto Memory Configuration option reads the DDR SDRAM EEPROMs *		 via the IIC bus and then configures the DDR SDRAM memory *		 banks appropriately. If Auto Memory Configuration is *		 not used, it is assumed that no DIMM is plugged *-----------------------------------------------------------------------------*/long int initdram(int board_type){	unsigned char iic0_dimm_addr[] = SPD_EEPROM_ADDRESS;	unsigned char spd0[MAX_SPD_BYTES];	unsigned char spd1[MAX_SPD_BYTES];	unsigned char *dimm_spd[MAXDIMMS];	unsigned long dimm_populated[MAXDIMMS];	unsigned long num_dimm_banks;		    /* on board dimm banks */	unsigned long val;	ddr_cas_id_t  selected_cas;	int write_recovery;	unsigned long dram_size = 0;	num_dimm_banks = sizeof(iic0_dimm_addr);	/*------------------------------------------------------------------	 * Set up an array of SPD matrixes.	 *-----------------------------------------------------------------*/	dimm_spd[0] = spd0;	dimm_spd[1] = spd1;	/*------------------------------------------------------------------	 * Reset the DDR-SDRAM controller.	 *-----------------------------------------------------------------*/	mtsdr(SDR0_SRST, (0x80000000 >> 10));	mtsdr(SDR0_SRST, 0x00000000);	/*

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美在线播放高清精品| 欧美久久免费观看| 午夜久久久影院| 精品福利在线导航| 91国产免费看| 成人黄色一级视频| 另类人妖一区二区av| 亚洲激情男女视频| 欧美激情一二三区| 欧美videos大乳护士334| 欧美性色欧美a在线播放| 成人一区二区三区| 黑人精品欧美一区二区蜜桃| 亚洲国产sm捆绑调教视频| 国产精品欧美综合在线| 久久综合色之久久综合| 欧美一区二区三区在| 欧美性猛交xxxx乱大交退制版| 国产成人av在线影院| 精品一区二区在线视频| 五月婷婷久久丁香| 亚洲www啪成人一区二区麻豆| 中文字幕亚洲电影| 国产精品理伦片| 欧美激情在线一区二区三区| 久久看人人爽人人| 久久久久高清精品| www久久久久| 精品国产乱码久久久久久久久| 91麻豆精品久久久久蜜臀| 欧美少妇一区二区| 欧美午夜一区二区三区免费大片| 成人app软件下载大全免费| 国产不卡一区视频| 成人综合在线视频| 波多野结衣在线一区| 成人少妇影院yyyy| av午夜一区麻豆| 91同城在线观看| 日本道精品一区二区三区| 欧洲av一区二区嗯嗯嗯啊| 欧美性高清videossexo| 欧美日韩免费一区二区三区视频| 欧美三级视频在线| 91精品国产综合久久精品图片 | 蜜臀久久99精品久久久久久9| 亚洲国产成人91porn| 石原莉奈一区二区三区在线观看| 性欧美疯狂xxxxbbbb| 肉色丝袜一区二区| 黄色精品一二区| 国产99一区视频免费| www.亚洲在线| 91国在线观看| 欧美一区二区三区免费在线看| 欧美一卡2卡3卡4卡| 2021中文字幕一区亚洲| 国产农村妇女精品| 亚洲免费av网站| 日本欧美在线看| 国内精品在线播放| 99久久精品国产毛片| 欧美亚洲国产bt| 精品国产乱码久久久久久图片 | 4438成人网| 欧美岛国在线观看| 国产日本欧洲亚洲| 亚洲另类中文字| 肉肉av福利一精品导航| 国产精品18久久久久久vr| 91在线视频观看| 91麻豆精品国产自产在线 | 成人免费av在线| 欧美在线free| 26uuu久久综合| 亚洲女同女同女同女同女同69| 婷婷久久综合九色综合绿巨人 | 亚洲一线二线三线视频| 七七婷婷婷婷精品国产| 成人免费毛片aaaaa**| 欧美色电影在线| 国产无一区二区| 亚洲午夜一二三区视频| 国产综合成人久久大片91| 色妹子一区二区| 久久久影院官网| 亚洲成年人影院| 国产成人av影院| 7777精品伊人久久久大香线蕉的| 国产欧美日韩综合| 日本三级亚洲精品| 色悠久久久久综合欧美99| 2023国产一二三区日本精品2022| 亚洲伦理在线免费看| 国产精品自拍在线| 欧美久久久久久久久| 最新国产成人在线观看| 国内久久婷婷综合| 欧美日韩一区二区欧美激情| 中文幕一区二区三区久久蜜桃| 日韩激情在线观看| 色狠狠av一区二区三区| 国产亚洲短视频| 美女精品一区二区| 欧美日韩日本视频| 亚洲欧美另类在线| 成人美女在线观看| 久久先锋资源网| 日本女优在线视频一区二区| 一本到高清视频免费精品| 日本一区二区三区国色天香 | 蜜臀av亚洲一区中文字幕| 在线视频中文字幕一区二区| 日本一区二区三区视频视频| 久久电影网电视剧免费观看| 91.麻豆视频| 亚洲成在人线免费| 91黄色免费看| 一区二区三区国产精华| 99在线精品免费| 一区免费观看视频| 成人动漫一区二区| 国产精品美女久久久久av爽李琼| 国产中文字幕精品| 精品国产人成亚洲区| 麻豆精品国产91久久久久久| 欧美片网站yy| 日韩中文欧美在线| 这里只有精品电影| 美女视频黄a大片欧美| 欧美一级高清片在线观看| 日韩不卡一区二区三区| 欧美一区二区三区成人| 首页欧美精品中文字幕| 欧美精品久久一区二区三区 | www.欧美日韩国产在线| 国产欧美精品一区二区色综合| 国产一区二区调教| 国产午夜亚洲精品羞羞网站| 国产很黄免费观看久久| 国产欧美一区二区三区在线老狼| 国产成人精品免费看| 国产精品丝袜久久久久久app| 成人午夜伦理影院| 中文字幕字幕中文在线中不卡视频| 91免费视频网| 亚洲一二三四久久| 欧美一区二区三区啪啪| 国产一区二区三区不卡在线观看 | 欧美在线一二三四区| 亚洲综合激情网| 在线综合亚洲欧美在线视频| 麻豆精品国产传媒mv男同| 久久网站最新地址| 波多野结衣一区二区三区| 亚洲综合丝袜美腿| 制服丝袜亚洲色图| 国产一区二区91| 亚洲视频免费看| 91精品久久久久久久久99蜜臂| 另类小说色综合网站| 国产无一区二区| 91久久国产综合久久| 图片区日韩欧美亚洲| 久久久久久麻豆| 色综合久久久久综合体| 男男成人高潮片免费网站| 久久精品一级爱片| 91福利小视频| 久久超碰97中文字幕| 中文字幕亚洲区| 制服丝袜成人动漫| 成人激情电影免费在线观看| 亚洲午夜精品17c| 久久久久亚洲蜜桃| 欧美在线观看视频一区二区三区| 美腿丝袜一区二区三区| 亚洲欧洲国产日本综合| 91精品国产91热久久久做人人| 粉嫩久久99精品久久久久久夜| 亚洲国产精品久久久久婷婷884| 日韩三级免费观看| 91亚洲国产成人精品一区二三 | 中文字幕精品三区| 欧美色爱综合网| 国产成人99久久亚洲综合精品| 亚洲成人免费视| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 91欧美激情一区二区三区成人| 日韩av午夜在线观看| 亚洲视频一区二区在线| 2020国产精品久久精品美国| 欧美亚洲国产一区在线观看网站| 国产精品综合在线视频| 天天综合网天天综合色| 国产精品久久久一区麻豆最新章节| 欧美一级久久久久久久大片| 91免费版pro下载短视频| 国产在线视频一区二区| 婷婷激情综合网|