blob: 0f1cf52efbf45e8aeec743310c422ec7f1e6b596 [file] [log] [blame]
/*******************************************************************************
* Copyright (C) 2016, ZIXC Corporation.
*
* File Name:cmd_bbt_count.c
* File Mark:
* Description:
* Others:
* Version: 1.0
* Author: lankai
* Date: 2017-12-14
* History 1:
* Date:
* Version:
* Author:
* Modification:
* History 2:
********************************************************************************/
/****************************************************************************
* Include files
****************************************************************************/
#include <common.h>
#include <command.h>
#include <nand.h>
#include "downloader_serial.h"
#include "errno.h"
#include <partition_table.h>
#include <boot_mode.h>
/****************************************************************************
* Global Function Prototypes
****************************************************************************/
int crc_switch_flag = 0;
extern char *tsp_console_buffer;
extern partition_table_t *g_partition_table_dl;
extern partition_table_t *g_partition_table;
/*******************************************************************************
* Function:do_bbt_count
* Description:
* Parameters:
* Input:
*
* Output:
*
* Returns:
*
*
* Others:
********************************************************************************/
int do_bbt_count(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
struct mtd_info *mtd = get_mtd_info();
struct nand_chip *this = NULL;
int bad_block_num = 0;
int total_block_num = 0;
char ack[64] = {0};
if(argc != 1)
{
return cmd_usage(cmdtp);
}
if (NULL == mtd)
{
printf("FAIL\n");
return ENODEV;
}
this = mtd->priv;
bad_block_num = mtd->ecc_stats.badblocks;
total_block_num = this->chipsize >> this->bbt_erase_shift;
sprintf(ack, "bad_block_num:%04d total_block_num:%04d", bad_block_num, total_block_num);
downloader_serial_write(ack, strlen(ack) + 1);
return 0;
}
U_BOOT_CMD(
bbt_count, CONFIG_SYS_MAXARGS, 0, do_bbt_count, "bbt_count", ""
);
/*******************************************************************************
* Function:do_crc
* Description:
* Parameters:
* Input:
*
* Output:
*
* Returns:
*
*
* Others:
********************************************************************************/
int do_crc(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
u_char *crc_flag = NULL;
char *ack = tsp_console_buffer;
if(argc<2)
{
return cmd_usage(cmdtp);
}
crc_flag = argv[1];
if (strcmp((const char *)crc_flag,"on") == 0)
{
crc_switch_flag = 1;
sprintf(ack,"OKAY");
}
else if (strcmp((const char *)crc_flag,"off") == 0)
{
crc_switch_flag = 0;
sprintf(ack,"OKAY");
}
else
{
sprintf(ack,"FAIL COMMAND ERROR");
}
downloader_serial_write(ack, strlen(ack)+1);
return 0;
}
U_BOOT_CMD(
crc, CONFIG_SYS_MAXARGS, 0, do_crc, "crc_check", ""
);
/*******************************************************************************
* Function:do_crc
* Description:
* Parameters:
* Input:
*
* Output:
*
* Returns:
*
*
* Others:
********************************************************************************/
int do_partition_bbc(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
int i, j, len, bad_nums, partition_nums;
char *ack = tsp_console_buffer;
nand_info_t *nand = &nand_info[nand_curr_device];
if(argc != 1)
{
return cmd_usage(cmdtp);
}
partition_entry_t *entry = NULL;
uint32_t entry_nums = 0;
if(get_load_mode() == TLOAD_MODE)
{
entry_nums = g_partition_table_dl->entrys;
entry = &g_partition_table_dl->table[0];
}
else
{
entry_nums = g_partition_table->entrys;
entry = &g_partition_table->table[0];
}
sprintf(ack, "partition_nums:%04d", entry_nums - 2);
printf("entry_nums=%d\n", entry_nums - 2);
for(i = 0; i < entry_nums - 2; i++)
{
printf("entry->part_offset=0x%x, entry->part_size=0x%x\n",
entry->part_offset, entry->part_size);
bad_nums = 0;
partition_nums = entry->part_size / nand->erasesize;
for(j = 0; j < partition_nums; j++)
{
if(nand_block_isbad (nand, entry->part_offset + (loff_t)j * nand->erasesize))
{
printf("bad block addr = 0x%x\n", (entry->part_offset + j * nand->erasesize));
bad_nums++;
}
}
len = strlen(ack);
sprintf(ack + len, " %s,%04d,%04d", entry->part_name, bad_nums, partition_nums);
entry++;
}
printf("partition_bbc:%s\n", ack);
downloader_serial_write(ack, strlen(ack) + 1);
return 0;
}
U_BOOT_CMD(
part_bbc, CONFIG_SYS_MAXARGS, 0, do_partition_bbc, "partition bad block count", ""
);
/*******************************************************************************
* Function:do_single_partition_bbc
* Description:
* Parameters:
* Input:
*
* Output:
*
* Returns:
*
*
* Others:
********************************************************************************/
int do_single_partition_bbc(cmd_tbl_t *cmdtp, int flag,
int argc, char * const argv[])
{
int j, bad_nums, part_block_nums;
u_char *partition_name = NULL;
char *ack = tsp_console_buffer;
nand_info_t *nand = &nand_info[nand_curr_device];
partition_entry_t *entry = NULL;
if(argc < 2)
{
return cmd_usage(cmdtp);
}
partition_name = argv[1];
entry = find_partition_para(partition_name);
if(entry == NULL)
{
BOOT_PRINTF(UBOOT_ERR, "[%s]: can't find the partition...\n", partition_name);
return 1;
}
printf("entry->part_offset=0x%x, entry->part_size=0x%x\n",
entry->part_offset, entry->part_size);
bad_nums = 0;
part_block_nums = entry->part_size / nand->erasesize;
for(j = 0; j < part_block_nums; j++)
{
if(nand_block_isbad (nand, entry->part_offset + (loff_t)j * nand->erasesize))
{
printf("bad block addr = 0x%x\n", (entry->part_offset + j * nand->erasesize));
bad_nums++;
}
}
sprintf(ack, "%s,%04d,%04d", entry->part_name, bad_nums, part_block_nums);
printf("single_partition_bbc:%s\n", ack);
downloader_serial_write(ack, strlen(ack) + 1);
return 0;
}
U_BOOT_CMD(
single_part_bbc, CONFIG_SYS_MAXARGS, 0, do_single_partition_bbc,
"single partition bad block count", ""
);
/*******************************************************************************
* Function:do_badblock_query
* Description:
* Parameters:
* Input:
*
* Output:
*
* Returns:
*
*
* Others:
********************************************************************************/
int do_badblock_query(cmd_tbl_t *cmdtp,
int flag,
int argc,
char * const argv[])
{
u_char *crc_flag = NULL;
int flash_type = 0;
char *ack = tsp_console_buffer;
if(argc != 1)
{
return cmd_usage(cmdtp);
}
crc_flag = argv[0];
if(strcmp((const char *)crc_flag,"badblock_query") != 0)
{
sprintf(ack,"COMMAND ERROR");
downloader_serial_write(ack, strlen(ack) + 1);
return -1;
}
flash_type = read_boot_flashtype();
switch(flash_type)
{
case IF_TYPE_NAND:
case IF_TYPE_SPI_NAND:
sprintf(ack,"SUPPORT");
break;
default:
sprintf(ack,"UNSUPPORT");
break;
}
downloader_serial_write(ack, strlen(ack) + 1);
return 0;
}
U_BOOT_CMD(
badblock_query, CONFIG_SYS_MAXARGS, 0, do_badblock_query,
"is support bad block query", ""
);
/*
******************************************************************************
* Function:do_part_valid_space_query
* Description:
* Parameters:
* Input:
* Output:
* Returns:
* Others:
*******************************************************************************
*/
int do_part_valid_space_query(cmd_tbl_t *cmdtp, int flag,
int argc, char * const argv[])
{
int j, bad_nums, part_block_nums;
u_char *partition_name = NULL;
char *ack = tsp_console_buffer;
nand_info_t *nand = &nand_info[nand_curr_device];
partition_entry_t *entry = NULL;
int flash_type = 0;
unsigned int valid_space_size = 0;
if(argc < 2)
{
return cmd_usage(cmdtp);
}
partition_name = argv[1];
entry = find_partition_para(partition_name);
if(entry == NULL)
{
BOOT_PRINTF(UBOOT_ERR, "[%s]: can't find the partition...\n", partition_name);
sprintf(ack,"FAIL INVALID PARTITION");
downloader_serial_write(ack, strlen(ack)+1);
return -1;
}
flash_type = read_boot_flashtype();
if(flash_type == IF_TYPE_NOR)
{
valid_space_size = entry->part_size;
}
else
{
bad_nums = 0;
part_block_nums = entry->part_size / nand->erasesize;
for(j = 0; j < part_block_nums; j++)
{
if(nand_block_isbad (nand, entry->part_offset + (loff_t)j * nand->erasesize))
{
printf("bad block addr = 0x%x\n", (entry->part_offset + j * nand->erasesize));
bad_nums++;
}
}
valid_space_size = entry->part_size - bad_nums * nand->erasesize;
}
sprintf(ack, "%s,%08x", entry->part_name, valid_space_size);
printf("part_valid_space_query:%s\n", ack);
downloader_serial_write(ack, strlen(ack) + 1);
return 0;
}
U_BOOT_CMD(
part_valid_space_query, CONFIG_SYS_MAXARGS, 0, do_part_valid_space_query,
"get partition valid physics space size", ""
);