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

📄 hh405.c

📁 Uboot源码,非常通用的bootloader.适用于各种平台的Linux系统引导.
💻 C
📖 第 1 页 / 共 2 页
字号:
	/*	 * Reset FPGA via FPGA_INIT pin	 */	out32(GPIO0_TCR, in32(GPIO0_TCR) | FPGA_INIT); /* setup FPGA_INIT as output */	out32(GPIO0_OR, in32(GPIO0_OR) & ~FPGA_INIT);  /* reset low */	udelay(1000); /* wait 1ms */	out32(GPIO0_OR, in32(GPIO0_OR) | FPGA_INIT);   /* reset high */	udelay(1000); /* wait 1ms */	/*	 * Write Board revision into FPGA	 */	*fpga_ctrl |= gd->board_type & 0x0003; 	/*	 * Setup and enable EEPROM write protection	 */	out32(GPIO0_OR, in32(GPIO0_OR) | CFG_EEPROM_WP);	/*	 * Set NAND-FLASH GPIO signals to default	 */	out32(GPIO0_OR, in32(GPIO0_OR) & ~(CFG_NAND_CLE | CFG_NAND_ALE));	out32(GPIO0_OR, in32(GPIO0_OR) | CFG_NAND_CE);	/*	 * Reset touch-screen controller	 */	out32(GPIO0_OR, in32(GPIO0_OR) & ~CFG_TOUCH_RST);	udelay(1000);	out32(GPIO0_OR, in32(GPIO0_OR) | CFG_TOUCH_RST);	/*	 * Enable power on PS/2 interface (with reset)	 */	*fpga_ctrl &= ~(CFG_FPGA_CTRL_PS2_PWR);	for (i=0;i<500;i++)		udelay(1000);	*fpga_ctrl |= (CFG_FPGA_CTRL_PS2_PWR);	/*	 * Get contrast value from environment variable	 */	str = getenv("contrast0");	if (str) {		contrast0 = simple_strtol(str, NULL, 16);		if (contrast0 > 255) {			printf("ERROR: contrast0 value too high (0x%lx)!\n", contrast0);			contrast0 = 0xffffffff;		}	}	/*	 * Init lcd interface and display logo	 */	str = getenv("bd_type");	if (strcmp(str, "ppc230") == 0) {		/*		 * Switch backlight on		 */		*fpga_ctrl |= CFG_FPGA_CTRL_VGA0_BL;		*lcd_backlight = 0x0000;		lcd_setup(1, 0);		lcd_init((uchar *)CFG_LCD_BIG_REG, (uchar *)CFG_LCD_BIG_MEM,			 regs_13806_1024_768_8bpp,			 sizeof(regs_13806_1024_768_8bpp)/sizeof(regs_13806_1024_768_8bpp[0]),			 logo_bmp_1024, sizeof(logo_bmp_1024));	} else if (strcmp(str, "ppc220") == 0) {		/*		 * Switch backlight on		 */		*fpga_ctrl &= ~CFG_FPGA_CTRL_VGA0_BL;		*lcd_backlight = 0x0000;		lcd_setup(1, 0);		lcd_init((uchar *)CFG_LCD_BIG_REG, (uchar *)CFG_LCD_BIG_MEM,			 regs_13806_640_480_16bpp,			 sizeof(regs_13806_640_480_16bpp)/sizeof(regs_13806_640_480_16bpp[0]),			 logo_bmp_640, sizeof(logo_bmp_640));	} else if (strcmp(str, "ppc215") == 0) {		/*		 * Set default display contrast voltage		 */		if (contrast0 == 0xffffffff) {			*lcd_contrast = 0x0082;		} else {			*lcd_contrast = contrast0;		}		*lcd_backlight = 0xffff;		/*		 * Switch backlight on		 */		*fpga_ctrl |= CFG_FPGA_CTRL_VGA0_BL | CFG_FPGA_CTRL_VGA0_BL_MODE;		/*		 * Set lcd clock (small epson)		 */		*fpga_ctrl |= LCD_CLK_06250;		udelay(100);               /* wait for 100 us */		lcd_setup(0, 1);		lcd_init((uchar *)CFG_LCD_SMALL_REG, (uchar *)CFG_LCD_SMALL_MEM,			 regs_13705_320_240_8bpp,			 sizeof(regs_13705_320_240_8bpp)/sizeof(regs_13705_320_240_8bpp[0]),			 logo_bmp_320_8bpp, sizeof(logo_bmp_320_8bpp));	} else if (strcmp(str, "ppc210") == 0) {		/*		 * Set default display contrast voltage		 */		if (contrast0 == 0xffffffff) {			*lcd_contrast = 0x0060;		} else {			*lcd_contrast = contrast0;		}		*lcd_backlight = 0xffff;		/*		 * Switch backlight on		 */		*fpga_ctrl |= CFG_FPGA_CTRL_VGA0_BL | CFG_FPGA_CTRL_VGA0_BL_MODE;		/*		 * Set lcd clock (small epson), enable 1-wire interface		 */		*fpga_ctrl |= LCD_CLK_08330 | CFG_FPGA_CTRL_OW_ENABLE;		lcd_setup(0, 1);		lcd_init((uchar *)CFG_LCD_SMALL_REG, (uchar *)CFG_LCD_SMALL_MEM,			 regs_13704_320_240_4bpp,			 sizeof(regs_13704_320_240_4bpp)/sizeof(regs_13704_320_240_4bpp[0]),			 logo_bmp_320, sizeof(logo_bmp_320));#ifdef CONFIG_VIDEO_SM501	} else {		pci_dev_t devbusfn;		/*		 * Is SM501 connected (ppc221/ppc231)?		 */		devbusfn = pci_find_device(PCI_VENDOR_SM, PCI_DEVICE_SM501, 0);		if (devbusfn != -1) {			puts("VGA:   SM501 with 8 MB ");			if (strcmp(str, "ppc221") == 0) {				printf("(800*600, %dbpp)\n", BPP);				*lcd_backlight = 0x002d; /* max. allowed brightness */			} else if (strcmp(str, "ppc231") == 0) {				printf("(1024*768, %dbpp)\n", BPP);				*lcd_backlight = 0x0000;			} else {				printf("Unsupported bd_type defined (%s) -> No display configured!\n", str);				return 0;			}		} else {			printf("Unsupported bd_type defined (%s) -> No display configured!\n", str);			return 0;		}#endif /* CONFIG_VIDEO_SM501 */	}	cf_enable();	return (0);}/* * Check Board Identity: */int checkboard (void){	char str[64];	int i = getenv_r ("serial#", str, sizeof(str));	puts ("Board: ");	if (i == -1) {		puts ("### No HW ID - assuming HH405");	} else {		puts(str);	}	if (getenv_r("bd_type", str, sizeof(str)) != -1) {		printf(" (%s", str);	} else {		puts(" (Missing bd_type!");	}	gd->board_type = board_revision();	printf(", Rev %ld.x)\n", gd->board_type);	return 0;}long int initdram (int board_type){	unsigned long val;	mtdcr(memcfga, mem_mb0cf);	val = mfdcr(memcfgd);#if 0	printf("\nmb0cf=%x\n", val); /* test-only */	printf("strap=%x\n", mfdcr(strap)); /* test-only */#endif	return (4*1024*1024 << ((val & 0x000e0000) >> 17));}#ifdef CONFIG_IDE_RESETvoid ide_set_reset(int on){	volatile unsigned short *fpga_mode =		(unsigned short *)((ulong)CFG_FPGA_BASE_ADDR + CFG_FPGA_CTRL);	volatile unsigned short *fpga_status =		(unsigned short *)((ulong)CFG_FPGA_BASE_ADDR + CFG_FPGA_CTRL + 2);	if (((gd->board_type >= 2) && (*fpga_status & CFG_FPGA_STATUS_CF_DETECT)) ||	    (gd->board_type < 2)) {		/*		 * Assert or deassert CompactFlash Reset Pin		 */		if (on) {		/* assert RESET */			cf_enable();			*fpga_mode &= ~(CFG_FPGA_CTRL_CF_RESET);		} else {		/* release RESET */			*fpga_mode |= CFG_FPGA_CTRL_CF_RESET;		}	}}#endif /* CONFIG_IDE_RESET */#if (CONFIG_COMMANDS & CFG_CMD_NAND)#include <linux/mtd/nand_legacy.h>extern struct nand_chip nand_dev_desc[CFG_MAX_NAND_DEVICE];void nand_init(void){	nand_probe(CFG_NAND_BASE);	if (nand_dev_desc[0].ChipID != NAND_ChipID_UNKNOWN) {		print_size(nand_dev_desc[0].totlen, "\n");	}}#endif#if defined(CFG_EEPROM_WREN)/* Input: <dev_addr>  I2C address of EEPROM device to enable. *         <state>     -1: deliver current state *	               0: disable write *		       1: enable write *  Returns:           -1: wrong device address *                      0: dis-/en- able done *		     0/1: current state if <state> was -1. */int eeprom_write_enable (unsigned dev_addr, int state){	if (CFG_I2C_EEPROM_ADDR != dev_addr) {		return -1;	} else {		switch (state) {		case 1:			/* Enable write access, clear bit GPIO_SINT2. */			out32(GPIO0_OR, in32(GPIO0_OR) & ~CFG_EEPROM_WP);			state = 0;			break;		case 0:			/* Disable write access, set bit GPIO_SINT2. */			out32(GPIO0_OR, in32(GPIO0_OR) | CFG_EEPROM_WP);			state = 0;			break;		default:			/* Read current status back. */			state = (0 == (in32(GPIO0_OR) & CFG_EEPROM_WP));			break;		}	}	return state;}int do_eep_wren (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]){	int query = argc == 1;	int state = 0;	if (query) {		/* Query write access state. */		state = eeprom_write_enable (CFG_I2C_EEPROM_ADDR, -1);		if (state < 0) {			puts ("Query of write access state failed.\n");		} else {			printf ("Write access for device 0x%0x is %sabled.\n",				CFG_I2C_EEPROM_ADDR, state ? "en" : "dis");			state = 0;		}	} else {		if ('0' == argv[1][0]) {			/* Disable write access. */			state = eeprom_write_enable (CFG_I2C_EEPROM_ADDR, 0);		} else {			/* Enable write access. */			state = eeprom_write_enable (CFG_I2C_EEPROM_ADDR, 1);		}		if (state < 0) {			puts ("Setup of write access state failed.\n");		}	}	return state;}U_BOOT_CMD(eepwren,	2,	0,	do_eep_wren,	   "eepwren - Enable / disable / query EEPROM write access\n",	   NULL);#endif /* #if defined(CFG_EEPROM_WREN) */#ifdef CONFIG_VIDEO_SM501#ifdef CONFIG_CONSOLE_EXTRA_INFO/* * Return text to be printed besides the logo. */void video_get_info_str (int line_number, char *info){	char str[64];	char str2[64];	int i = getenv_r("serial#", str2, sizeof(str));	if (line_number == 1) {		sprintf(str, " Board: ");		if (i == -1) {			strcat(str, "### No HW ID - assuming HH405");		} else {			strcat(str, str2);		}		if (getenv_r("bd_type", str2, sizeof(str2)) != -1) {			strcat(str, " (");			strcat(str, str2);		} else {			strcat(str, " (Missing bd_type!");		}		sprintf(str2, ", Rev %ld.x)", gd->board_type);		strcat(str, str2);		strcpy(info, str);	} else {		info [0] = '\0';	}}#endif /* CONFIG_CONSOLE_EXTRA_INFO *//* * Returns SM501 register base address. First thing called in the driver. */unsigned int board_video_init (void){	pci_dev_t devbusfn;	u32 addr;	/*	 * Is SM501 connected (ppc221/ppc231)?	 */	devbusfn = pci_find_device(PCI_VENDOR_SM, PCI_DEVICE_SM501, 0);	if (devbusfn != -1) {		pci_read_config_dword(devbusfn, PCI_BASE_ADDRESS_1, (u32 *)&addr);		return (addr & 0xfffffffe);	}	return 0;}/* * Returns SM501 framebuffer address */unsigned int board_video_get_fb (void){	pci_dev_t devbusfn;	u32 addr;	/*	 * Is SM501 connected (ppc221/ppc231)?	 */	devbusfn = pci_find_device(PCI_VENDOR_SM, PCI_DEVICE_SM501, 0);	if (devbusfn != -1) {		pci_read_config_dword(devbusfn, PCI_BASE_ADDRESS_0, (u32 *)&addr);		addr &= 0xfffffffe;#ifdef CONFIG_VIDEO_SM501_FBMEM_OFFSET		addr += CONFIG_VIDEO_SM501_FBMEM_OFFSET;#endif		return addr;	}	return 0;}/* * Called after initializing the SM501 and before clearing the screen. */void board_validate_screen (unsigned int base){}/* * Return a pointer to the initialization sequence. */const SMI_REGS *board_get_regs (void){	char *str;	str = getenv("bd_type");	if (strcmp(str, "ppc221") == 0) {		return init_regs_800x600;	} else {		return init_regs_1024x768;	}}int board_get_width (void){	char *str;	str = getenv("bd_type");	if (strcmp(str, "ppc221") == 0) {		return 800;	} else {		return 1024;	}}int board_get_height (void){	char *str;	str = getenv("bd_type");	if (strcmp(str, "ppc221") == 0) {		return 600;	} else {		return 768;	}}#endif /* CONFIG_VIDEO_SM501 */void reset_phy(void){#ifdef CONFIG_LXT971_NO_SLEEP	/*	 * Disable sleep mode in LXT971	 */	lxt971_no_sleep();#endif}

⌨️ 快捷键说明

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