📄 hh405.c
字号:
/* * 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 + -