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); }
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); }