コード例 #1
0
ファイル: ar7240_flash.c プロジェクト: andim2/u-boot_mod
unsigned long flash_init(void){
	flash_info_t *info;
#if defined(PLL_IN_FLASH_MAGIC_OFFSET)
	u32 pll_magic, spi_control;

	pll_magic = ar7240_reg_rd(CFG_FLASH_BASE + PLL_IN_FLASH_DATA_BLOCK_OFFSET + PLL_IN_FLASH_MAGIC_OFFSET);

	// read SPI CONTROL Configuration register (SPI_CONTROL) value stored in FLASH (PLL_IN_FLASH_MAGIC_OFFSET + 12)
	spi_control = ar7240_reg_rd(CFG_FLASH_BASE + PLL_IN_FLASH_DATA_BLOCK_OFFSET + PLL_IN_FLASH_MAGIC_OFFSET + 12);
#endif

	info = &flash_info[0];

	// spi flash clock
	ar7240_reg_wr(AR7240_SPI_FS,	0x01);

	// if reset button is pressed -> write default CLOCK_DIVIDER for SPI CLOCK
	if(reset_button_status()){
		ar7240_reg_wr(AR7240_SPI_CLOCK,	AR7240_SPI_CONTROL_DEFAULT);
	} else {
#if defined(PLL_IN_FLASH_MAGIC_OFFSET)
		// do we have PLL_MAGIC in FLASH?
		if(pll_magic == PLL_IN_FLASH_MAGIC){
			ar7240_reg_wr(AR7240_SPI_CLOCK,	spi_control);
		} else {
#endif
			ar7240_reg_wr(AR7240_SPI_CLOCK,	AR7240_SPI_CONTROL);
#if defined(PLL_IN_FLASH_MAGIC_OFFSET)
		}
#endif
	}

	ar7240_reg_wr(AR7240_SPI_FS,	0x0);

	// get flash id
	info->flash_id = read_id();

	puts("FLASH:  ");

	// fill flash info based on JEDEC ID
	switch(info->flash_id){
		/*
		 * 4M flash chips
		 */
		case 0x010215:	// tested
			flash_set_geom(SIZE_INBYTES_4MBYTES, 64, SIZE_INBYTES_64KBYTES);
			puts("Spansion S25FL032P (4 MB)");
			break;

		case 0x1F4700:
			flash_set_geom(SIZE_INBYTES_4MBYTES, 64, SIZE_INBYTES_64KBYTES);
			puts("Atmel AT25DF321 (4 MB)");
			break;

		case 0x1C3016:	// tested
			flash_set_geom(SIZE_INBYTES_4MBYTES, 64, SIZE_INBYTES_64KBYTES);
			puts("EON EN25Q32 (4 MB)");
			break;

		case 0x202016:
			flash_set_geom(SIZE_INBYTES_4MBYTES, 64, SIZE_INBYTES_64KBYTES);
			puts("Micron M25P32 (4 MB)");
			break;

		case 0xEF4016:
			flash_set_geom(SIZE_INBYTES_4MBYTES, 64, SIZE_INBYTES_64KBYTES);
			puts("Winbond W25Q32 (4 MB)");
			break;

		case 0xC22016:
			flash_set_geom(SIZE_INBYTES_4MBYTES, 64, SIZE_INBYTES_64KBYTES);
			puts("Macronix MX25L320 (4 MB)");
			break;

			/*
			 * 8M flash chips
			 */
		case 0x010216:
			flash_set_geom(SIZE_INBYTES_8MBYTES, 128, SIZE_INBYTES_64KBYTES);
			puts("Spansion S25FL064P (8 MB)");
			break;

		case 0x1F4800:
			flash_set_geom(SIZE_INBYTES_8MBYTES, 128, SIZE_INBYTES_64KBYTES);
			puts("Atmel AT25DF641 (8 MB)");
			break;

		case 0x1C3017:	// tested
			flash_set_geom(SIZE_INBYTES_8MBYTES, 128, SIZE_INBYTES_64KBYTES);
			puts("EON EN25Q64 (8 MB)");
			break;

		case 0x202017:
			flash_set_geom(SIZE_INBYTES_8MBYTES, 128, SIZE_INBYTES_64KBYTES);
			puts("Micron M25P64 (8 MB)");
			break;

		case 0xEF4017:	// tested
			flash_set_geom(SIZE_INBYTES_8MBYTES, 128, SIZE_INBYTES_64KBYTES);
			puts("Winbond W25Q64 (8 MB)");
			break;

		case 0xC22017:	// tested
		case 0xC22617:
			flash_set_geom(SIZE_INBYTES_8MBYTES, 128, SIZE_INBYTES_64KBYTES);
			puts("Macronix MX25L64 (8 MB)");
			break;

		case 0xBF254B:
			flash_set_geom(SIZE_INBYTES_8MBYTES, 128, SIZE_INBYTES_64KBYTES);
			puts("SST 25VF064C (8 MB)");
			break;

			/*
			 * 16M flash chips
			 */
		case 0xEF4018:	// tested
			flash_set_geom(SIZE_INBYTES_16MBYTES, 256, SIZE_INBYTES_64KBYTES);
			puts("Winbond W25Q128 (16 MB)");
			break;

		case 0xC22018:
		case 0xC22618:
			flash_set_geom(SIZE_INBYTES_16MBYTES, 256, SIZE_INBYTES_64KBYTES);
			puts("Macronix MX25L128 (16 MB)");
			break;

		case 0x012018:
 			flash_set_geom(SIZE_INBYTES_16MBYTES, 256, SIZE_INBYTES_64KBYTES);
 			puts("Spansion S25FL127S (16 MB)");
 			break;

		case 0x20BA18:
 			flash_set_geom(SIZE_INBYTES_16MBYTES, 256, SIZE_INBYTES_64KBYTES);
 			puts("Micron N25Q128 (16 MB)");
 			break;

			/*
			 * Unknown flash
			 */
		default:
#if (DEFAULT_FLASH_SIZE_IN_MB == 4)
			flash_set_geom(SIZE_INBYTES_4MBYTES, 64, SIZE_INBYTES_64KBYTES);
			puts("Unknown type (using only 4 MB)\n");
#elif (DEFAULT_FLASH_SIZE_IN_MB == 8)
			flash_set_geom(SIZE_INBYTES_8MBYTES, 128, SIZE_INBYTES_64KBYTES);
			puts("Unknown type (using only 8 MB)\n");
#elif (DEFAULT_FLASH_SIZE_IN_MB == 16)
			flash_set_geom(SIZE_INBYTES_16MBYTES, 256, SIZE_INBYTES_64KBYTES);
			puts("Unknown type (using only 16 MB)\n");
#endif
			printf("\nPlease, send request to add support\nfor your flash - JEDEC ID: 0x%06lX\n", info->flash_id);
			info->flash_id = FLASH_CUSTOM;
			break;
	}

	puts("\n");

	return(info->size);
}
コード例 #2
0
unsigned long flash_init(void) {
	flash_info_t *info;

	info = &flash_info[0];

	// spi flash clock
	ar7240_reg_wr(AR7240_SPI_FS,	0x01);
	ar7240_reg_wr(AR7240_SPI_CLOCK,	AR7240_SPI_CONTROL);
	ar7240_reg_wr(AR7240_SPI_FS,	0x0);

	// get flash id
	info->flash_id = read_id();

	puts("FLASH: ");

	// fill flash info based on JEDEC ID
	switch (info->flash_id) {
		/*
		 * 4M flash chips
		 */
		case 0x010215:	// tested
			flash_set_geom(SIZE_INBYTES_4MBYTES, 64, SIZE_INBYTES_64KBYTES);
			puts("Spansion S25FL032P (4 MB)");
			break;

		case 0x1F4700:
			flash_set_geom(SIZE_INBYTES_4MBYTES, 64, SIZE_INBYTES_64KBYTES);
			puts("Atmel AT25DF321 (4 MB)");
			break;

		case 0x1C3016:	// tested
			flash_set_geom(SIZE_INBYTES_4MBYTES, 64, SIZE_INBYTES_64KBYTES);
			puts("EON EN25Q32 (4 MB)");
			break;

		case 0x202016:
			flash_set_geom(SIZE_INBYTES_4MBYTES, 64, SIZE_INBYTES_64KBYTES);
			puts("Micron M25P32 (4 MB)");
			break;

		case 0xEF4016:
			flash_set_geom(SIZE_INBYTES_4MBYTES, 64, SIZE_INBYTES_64KBYTES);
			puts("Winbond W25Q32 (4 MB)");
			break;

		case 0xC22016:
			flash_set_geom(SIZE_INBYTES_4MBYTES, 64, SIZE_INBYTES_64KBYTES);
			puts("Macronix MX25L320 (4 MB)");
			break;

			/*
			 * 8M flash chips
			 */
		case 0x010216:
			flash_set_geom(SIZE_INBYTES_8MBYTES, 128, SIZE_INBYTES_64KBYTES);
			puts("Spansion S25FL064P (8 MB)");
			break;

		case 0x1F4800:
			flash_set_geom(SIZE_INBYTES_8MBYTES, 128, SIZE_INBYTES_64KBYTES);
			puts("Atmel AT25DF641 (8 MB)");
			break;

		case 0x1C3017:	// tested
			flash_set_geom(SIZE_INBYTES_8MBYTES, 128, SIZE_INBYTES_64KBYTES);
			puts("EON EN25Q64 (8 MB)");
			break;

		case 0x202017:
			flash_set_geom(SIZE_INBYTES_8MBYTES, 128, SIZE_INBYTES_64KBYTES);
			puts("Micron M25P64 (8 MB)");
			break;

		case 0xEF4017:	// tested
			flash_set_geom(SIZE_INBYTES_8MBYTES, 128, SIZE_INBYTES_64KBYTES);
			puts("Winbond W25Q64 (8 MB)");
			break;

		case 0xC22017:	// tested
		case 0xC22617:
			flash_set_geom(SIZE_INBYTES_8MBYTES, 128, SIZE_INBYTES_64KBYTES);
			puts("Macronix MX25L64 (8 MB)");
			break;

		case 0xBF254B:
			flash_set_geom(SIZE_INBYTES_8MBYTES, 128, SIZE_INBYTES_64KBYTES);
			puts("SST 25VF064C (8 MB)");
			break;

			/*
			 * 16M flash chips
			 */
		case 0xEF4018:	// tested
			flash_set_geom(SIZE_INBYTES_16MBYTES, 256, SIZE_INBYTES_64KBYTES);
			puts("Winbond W25Q128 (16 MB)");
			break;

		case 0xC22018:
		case 0xC22618:
			flash_set_geom(SIZE_INBYTES_16MBYTES, 256, SIZE_INBYTES_64KBYTES);
			puts("Macronix MX25L128 (16 MB)");
			break;

			/*
			 * Unknown flash -> set 4M with 64 KiB erase block
			 */
		default:
			flash_set_geom(SIZE_INBYTES_4MBYTES, 64, SIZE_INBYTES_64KBYTES);
			puts("Unknown type (using only 4 MB)\n");
			printf("\nPlease, send request to add support\nfor your flash - JEDEC ID: 0x%06lX", info->flash_id);
			info->flash_id = FLASH_M25P64;
			break;
	}

	return (info->size);
}