flash_region.c

来自「Hermit-at-1.1.3,一款bootloader」· C语言 代码 · 共 251 行

C
251
字号
/* * Copyright (C) 2003-2005 Atmark Techno, Inc.  All Rights Reserved. */#include "flash_region.h"#include "memregions.h"#include <target/flash.h>#include "mode.h"struct FlashRegion {        enum FlashRegionID id;        unsigned int start;        unsigned int size;        char * blocking;};struct FlashRegion flash_regions_8MiB[] = {        { .id       = FlashRegionIdFpga,          .start    = FLASH_8MiB_FPGA_START,          .size     = FLASH_8MiB_FPGA_SIZE,          .blocking = "8x64K/l",        },        { .id       = FlashRegionIdBootloader,          .start    = FLASH_8MiB_BOOTLOADER_START,          .size     = FLASH_8MiB_BOOTLOADER_SIZE,          .blocking = "2x64K/l",        },        { .id       = FlashRegionIdImage,          .start    = FLASH_8MiB_IMAGE_START,          .size     = FLASH_8MiB_IMAGE_SIZE,          .blocking = "109x64K",        },        { .id       = FlashRegionIdKernel,          .start    = FLASH_8MiB_KERNEL_START,          .size     = FLASH_8MiB_KERNEL_SIZE,          .blocking = "48x64K",        },        { .id       = FlashRegionIdUser,          .start    = FLASH_8MiB_USER_START,          .size     = FLASH_8MiB_USER_SIZE,          .blocking = "61x64K",        },        { .id       = FlashRegionIdConfig,          .start    = FLASH_8MiB_CONFIG_START,          .size     = FLASH_8MiB_CONFIG_SIZE,          .blocking = "8x8K",        },        { .id       = FlashRegionIdFree1,          .start    = FLASH_8MiB_FREE1_START,          .size     = FLASH_8MiB_FREE1_SIZE,          .blocking = "8x8K",        },        { .id       = FlashRegionIdFree2,          .start    = FLASH_8MiB_FREE2_START,          .size     = FLASH_8MiB_FREE2_SIZE,          .blocking = "7x64K",        },};struct FlashRegion flash_regions_4MiB[] = {        { .id       = FlashRegionIdFpga,          .start    = FLASH_4MiB_FPGA_START,          .size     = FLASH_4MiB_FPGA_SIZE,          .blocking = "8x64K/l",        },        { .id       = FlashRegionIdBootloader,          .start    = FLASH_4MiB_BOOTLOADER_START,          .size     = FLASH_4MiB_BOOTLOADER_SIZE,          .blocking = "2x64K/l",        },        { .id       = FlashRegionIdImage,          .start    = FLASH_4MiB_IMAGE_START,          .size     = FLASH_4MiB_IMAGE_SIZE,          .blocking = "53x64K",        },        { .id       = FlashRegionIdKernel,          .start    = FLASH_4MiB_KERNEL_START,          .size     = FLASH_4MiB_KERNEL_SIZE,          .blocking = "23x64K",        },        { .id       = FlashRegionIdUser,          .start    = FLASH_4MiB_USER_START,          .size     = FLASH_4MiB_USER_SIZE,          .blocking = "30x64K",        },        { .id       = FlashRegionIdConfig,          .start    = FLASH_4MiB_CONFIG_START,          .size     = FLASH_4MiB_CONFIG_SIZE,          .blocking = "8x8K",        },        { .id       = FlashRegionIdFree1,          .start    = 0,          .size     = 0,          .blocking = "0x0K",        },        { .id       = FlashRegionIdFree2,          .start    = 0,          .size     = 0,          .blocking = "0x0K",        },};struct FlashRegion flash_regions_spi[] = {        { .id       = FlashRegionIdFpga,          .start    = FLASH_BASEADDR,          .size     = 16*64*KiB,          .blocking = "16x64K/l",        },        { .id       = FlashRegionIdBootloader,          .start    = FLASH_8MiB_BOOTLOADER_START,          .size     = FLASH_8MiB_BOOTLOADER_SIZE,          .blocking = "2x64K/l",        },        { .id       = FlashRegionIdImage,          .start    = FLASH_8MiB_IMAGE_START,          .size     = FLASH_8MiB_IMAGE_SIZE,          .blocking = "109x64K",        },        { .id       = FlashRegionIdKernel,          .start    = FLASH_8MiB_KERNEL_START,          .size     = FLASH_8MiB_KERNEL_SIZE,          .blocking = "48x64K",        },        { .id       = FlashRegionIdUser,          .start    = FLASH_8MiB_USER_START,          .size     = FLASH_8MiB_USER_SIZE,          .blocking = "61x64K",        },        { .id       = FlashRegionIdConfig,          .start    = FLASH_SPI_CONFIG_START,          .size     = FLASH_SPI_CONFIG_SIZE,          .blocking = "1x64K",        },        { .id       = FlashRegionIdFree1,          .start    = 0,          .size     = 0,          .blocking = "0x0K",        },        { .id       = FlashRegionIdFree2,          .start    = 0,          .size     = 0,          .blocking = "0x0K",        },};static int is_flash_8MiB(void){        return ((flash_get_size(FLASH_BASEADDR) == FLASH_8MiB) && (!is_compatible_mode()));}/* is there any header file I can include? -- yashi 2006/05/17 */#define NULL ((void *)0)unsigned int flash_region_get_start_address(enum FlashRegionID id){	unsigned int ret = 0xffffffff;        if (id > FlashRegionIdMax)                return ret;	if (is_flash_spi()) {		ret = flash_regions_spi[id].start;	} else {		if (is_flash_8MiB())			ret = flash_regions_8MiB[id].start;		else			ret = flash_regions_4MiB[id].start;	}	return ret;}unsigned int flash_region_get_end_address(enum FlashRegionID id){	unsigned int ret = 0;        if (id > FlashRegionIdMax)                return ret;	return flash_region_get_start_address(id) + flash_region_get_size(id) - 1;}int flash_region_get_size(enum FlashRegionID id){	int ret = -1;        if (id > FlashRegionIdMax)                return ret;	if (is_flash_spi()) {		ret = flash_regions_spi[id].size;	} else {		if (is_flash_8MiB())			ret = flash_regions_8MiB[id].size;		else			ret = flash_regions_4MiB[id].size;	}	return ret;}char * flash_region_get_name(enum FlashRegionID id){	char *ret = NULL;        if (id > FlashRegionIdMax)		return ret;	switch(id) {	case FlashRegionIdFpga:		ret = "fpga"; break;	case FlashRegionIdBootloader:		ret = "bootloader"; break;	case FlashRegionIdImage:		ret = "image"; break;	case FlashRegionIdKernel:		ret = "kernel"; break;	case FlashRegionIdUser:		ret = "user"; break;	case FlashRegionIdConfig:		ret = "config"; break;	case FlashRegionIdFree1:		ret = "free1"; break;	case FlashRegionIdFree2:		ret = "free2"; break;	default:		ret = "unknown"; break;	}	return ret;}char * flash_region_get_blocking(enum FlashRegionID id){	char *ret = NULL;        if (id > FlashRegionIdMax)		return ret;	if (is_flash_spi()) {		ret = flash_regions_spi[id].blocking;	} else {		if (is_flash_8MiB())			ret = flash_regions_8MiB[id].blocking;		else			ret = flash_regions_4MiB[id].blocking;	}	return ret;}

⌨️ 快捷键说明

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