partition table就是分区表的意思
注册分区表需要使用system_partition_table_regist()函数,这个函数必须在void ICACHE_FLASH_ATTR user_pre_init(void){这里面使用}。
在搭建SDK环境时,在makeFile中修改的SPI_SIZE_MAP?=6
就是选择8266内存容量的,在sdk烧录时,同样要指定各模块烧录的地址与大小,并注册分区表。示例代码中是这样的:
#if ((SPI_FLASH_SIZE_MAP == 0) || (SPI_FLASH_SIZE_MAP == 1))
#error "The flash map is not supported"
#elif (SPI_FLASH_SIZE_MAP == 2)
#define SYSTEM_PARTITION_OTA_SIZE 0x6A000
#define SYSTEM_PARTITION_OTA_2_ADDR 0x81000
#define SYSTEM_PARTITION_RF_CAL_ADDR 0xfb000
#define SYSTEM_PARTITION_PHY_DATA_ADDR 0xfc000
#define SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR 0xfd000
#elif (SPI_FLASH_SIZE_MAP == 3)
#define SYSTEM_PARTITION_OTA_SIZE 0x6A000
#define SYSTEM_PARTITION_OTA_2_ADDR 0x81000
#define SYSTEM_PARTITION_RF_CAL_ADDR 0x1fb000
#define SYSTEM_PARTITION_PHY_DATA_ADDR 0x1fc000
#define SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR 0x1fd000
#elif (SPI_FLASH_SIZE_MAP == 4)
#define SYSTEM_PARTITION_OTA_SIZE 0x6A000
#define SYSTEM_PARTITION_OTA_2_ADDR 0x81000
#define SYSTEM_PARTITION_RF_CAL_ADDR 0x3fb000
#define SYSTEM_PARTITION_PHY_DATA_ADDR 0x3fc000
#define SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR 0x3fd000
#elif (SPI_FLASH_SIZE_MAP == 5)
#define SYSTEM_PARTITION_OTA_SIZE 0x6A000
#define SYSTEM_PARTITION_OTA_2_ADDR 0x101000
#define SYSTEM_PARTITION_RF_CAL_ADDR 0x1fb000
#define SYSTEM_PARTITION_PHY_DATA_ADDR 0x1fc000
#define SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR 0x1fd000
#elif (SPI_FLASH_SIZE_MAP == 6)
#define SYSTEM_PARTITION_OTA_SIZE 0x6A000
#define SYSTEM_PARTITION_OTA_2_ADDR 0x101000
#define SYSTEM_PARTITION_RF_CAL_ADDR 0x3fb000
#define SYSTEM_PARTITION_PHY_DATA_ADDR 0x3fc000
#define SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR 0x3fd000
/* 预定义地址分布参数
* 0x6A000=434176=106
* 0x101000=1052672字节=257扇区
* 0x3fb000=4173824=1019
* 0x3fc000=4177920=1020
* 0x3fd000=4182016=1021
* 0x1000 =4096 =1
*******************************/
#else
#error "The flash map is not supported"
#endif
static const partition_item_t at_partition_table[] = {
/*要分配系统空间名字 分配的地址 分配的内存空间大小*/
{ SYSTEM_PARTITION_BOOTLOADER, 0x0, 0x1000},
{ SYSTEM_PARTITION_OTA_1, 0x1000, SYSTEM_PARTITION_OTA_SIZE},
{ SYSTEM_PARTITION_OTA_2, SYSTEM_PARTITION_OTA_2_ADDR, SYSTEM_PARTITION_OTA_SIZE},
{ SYSTEM_PARTITION_RF_CAL, SYSTEM_PARTITION_RF_CAL_ADDR, 0x1000},
{ SYSTEM_PARTITION_PHY_DATA, SYSTEM_PARTITION_PHY_DATA_ADDR, 0x1000},
{ SYSTEM_PARTITION_SYSTEM_PARAMETER, SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR, 0x3000},
};
void ICACHE_FLASH_ATTR user_pre_init(void)
{
if(!system_partition_table_regist(at_partition_table, sizeof(at_partition_table)/sizeof(at_partition_table[0]),SPI_FLASH_SIZE_MAP)) {
os_printf("system_partition_table_regist fail\r\n");
while(1);
}
}
其中调用了user_interface.h,可以看出,最少都要定义这6个分区:
static const partition_item_t at_partition_table[] = {
/*要分配系统空间名字 分配的地址,从这个地址后面开始分配 分配的内存空间大小*/
{ SYSTEM_PARTITION_BOOTLOADER, 0x0, 0x1000},
{ SYSTEM_PARTITION_OTA_1, 0x1000, SYSTEM_PARTITION_OTA_SIZE},
{ SYSTEM_PARTITION_OTA_2, SYSTEM_PARTITION_OTA_2_ADDR, SYSTEM_PARTITION_OTA_SIZE},
{ SYSTEM_PARTITION_RF_CAL, SYSTEM_PARTITION_RF_CAL_ADDR, 0x1000},
{ SYSTEM_PARTITION_PHY_DATA, SYSTEM_PARTITION_PHY_DATA_ADDR, 0x1000},
{ SYSTEM_PARTITION_SYSTEM_PARAMETER, SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR, 0x3000},
};
SYSTEM_PARTITION_INVALID = 0, /*系统分区无效*/
SYSTEM_PARTITION_BOOTLOADER, /*系统分区引导装载程序, 用户不能修改此分区地址,但可以修改大小 */
SYSTEM_PARTITION_OTA_1, /* 系统分区OTA_1,用户不能修改此分区地址,但可以修改大小 */
SYSTEM_PARTITION_OTA_2, /* 系统分区OTA_2,用户不能修改此分区地址,但可以修改大小*/
SYSTEM_PARTITION_RF_CAL, /* 系统分区RF_CAL,用户必须定义这个分区 */
SYSTEM_PARTITION_PHY_DATA, /* 系统分区物理量,用户必须定义这个分区 */
SYSTEM_PARTITION_SYSTEM_PARAMETER, /* 系统分区系统参数,用户必须定义这个分区 */
SYSTEM_PARTITION_AT_PARAMETER, /* 系统分区划分AT参数分区*/
SYSTEM_PARTITION_SSL_CLIENT_CERT_PRIVKEY,/*系统分区SSL客户端证书私钥*/
SYSTEM_PARTITION_SSL_CLIENT_CA, /*系统分区SSL客户端CA*/
SYSTEM_PARTITION_SSL_SERVER_CERT_PRIVKEY,/*系统分区SSL服务器证书私钥*/
SYSTEM_PARTITION_SSL_SERVER_CA, /*系统分区SSL服务器CA*/
SYSTEM_PARTITION_WPA2_ENTERPRISE_CERT_PRIVKEY, /*系统分区WPA2企业证书私钥*/
SYSTEM_PARTITION_WPA2_ENTERPRISE_CA, /*系统分区WPA2企业CA*/
SYSTEM_PARTITION_CUSTOMER_BEGIN = 100, /* 系统分区客户开始 用户可以在这里定义分区user can define partition after here 用户可以在这里定义分区*/
SYSTEM_PARTITION_MAX /*系统分区最大化*/