⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mtdpart.c

📁 SMDK2440 boot code, base on vivi
💻 C
字号:
/* * vivi/drivers/mtd/mtdpart.c: Simple MTD partitioning layer * * Copyright (C) 2001-2004 MIZI Research, Inc. All Rights Reserved. * * Author:	Janghoon Lyu * Created:	December 23, 2001 * * Last modified: $Date: 2004/03/30 04:10:20 $ *                $Revision: 1.14 $ * * $Id: mtdpart.c,v 1.14 2004/03/30 04:10:20 nandy Exp $ * * * o Structure of MTD partition block * * +--------------------------------+ * |  number of partition (4 bytes) | * +--------------------------------+ * |                                | * |  partition table               | * |                                | * +--------------------------------+ * */#include <config.h>#include <machine.h>#include <memory.h>#include <command.h>#include <types.h>#include <vstring.h>#include <mtd/mtd.h>#include <mtd/partitions.h>#include <vfs.h>#include <vmalloc.h>extern mtd_partition_t default_mtd_partitions[];extern int default_nb_part;mtd_partition_t *mtd_parts = NULL;int nb_mtd_parts = 0;#ifdef CONFIG_MTD_PARTITIONS_PARSERint (*mtd_part_parser) (void *ptr) = NULL;int mtdpart_add_parser(int (*func) (void *ptr)) {	mtd_part_parser = func;	return 0;}int mtdpart_del_parser(int (*func) (void *ptr)) {	mtd_part_parser = NULL;	return 0;}void mtdpart_refresh(void){	/* Try to parse mtd partition information */	if ((mymtd != NULL) && (mtd_part_parser != NULL)) {		nb_mtd_parts = mtd_part_parser(mtd_parts);		printk("Parsing mtd partition information... ");		if (nb_mtd_parts > 0) {			printk("ok\n");		} else {			printk("fail\n");		}	}}#endif /* CONFIG_MTD_PARTITIONS_PARSER *//* * APIs for vivi *//* * get a mtd partition by name */mtd_partition_t *get_mtd_partition(const char *name){	int i, num = nb_mtd_parts;	mtd_partition_t *parts = mtd_parts;	for (i = 0; i < num; i++, parts++) {		if ((strncmp(parts->name, name, strlen(name)) == 0) &&		    (strlen(parts->name) == strlen(name))) {			return parts;		}	}	return NULL;}/* * get a information of mtd by offset */mtd_partition_t *find_mtd_partition(ulong ofs){	int i, num = nb_mtd_parts;	mtd_partition_t *parts = mtd_parts;	for (i = 0; i < num; i++, parts++) {		if ((parts->offset <= ofs) && (ofs < (parts->offset+parts->size))) {			return parts;		}	}	return NULL;}/* * add mtd partitions */static int add_mtd_partition(mtd_partition_t *new_part){	int num = nb_mtd_parts;	mtd_partition_t *parts = mtd_parts;	memcpy((parts + num), new_part, sizeof(mtd_partition_t));	num++;	nb_mtd_parts = num;	return 0;}/* * delete mtd partition */static int del_mtd_partition(const char *part_name){	int i, j;	int num = nb_mtd_parts;	mtd_partition_t *parts = mtd_parts;	for (i = 0; i < num; i++) {		if (!strncmp((parts + i)->name, part_name, strlen(part_name)))			break;	}		if (i == num)		return -1;	for (j = i; j < num; j++) {		memcpy((parts+j), (parts+j+1), sizeof(mtd_partition_t));	}	num--;	nb_mtd_parts = num;	return 0;}/* * reset mtd partitions: set mtd partition table to default partition table */static int reset_mtd_partition(void){	/* Try to find built-in mtd partitions */	if (default_mtd_partitions == NULL) {		printk("Can't get default mtd partition information\n");		return -1;	}	nb_mtd_parts = default_nb_part;	memcpy(mtd_parts, default_mtd_partitions, sizeof(mtd_partition_t)*nb_mtd_parts);	return 0;}/* * print partition informations */static void display_mtd_partition(void){	mtd_partition_t *parts = mtd_parts;	int i, nb_parts = nb_mtd_parts;	char sflag[16];	printk("Number of partitions: %d\n", nb_parts);	      /*name            :       offset          size            flag*/	printk("%-16s:\toffset\t\tsize\t\tflag\n", "name");	printk("------------------------------------------------------------\n");	for(i = 0; i < nb_parts; i++) {		switch (parts->flag) {		case MF_CRAMFS:			strcpy(sflag, "cramfs\0");			break;		case MF_BON:			strcpy(sflag, "bon(cramfs)\0");			break;		case MF_YAFFS:			strcpy(sflag, "yaffs\0");			break;		case MF_RAW:			strcpy(sflag, "raw\0");			break;		case MF_DOC:			strcpy(sflag, "doc\0");			break;		default:			strcpy(sflag, "unknown\0");			break;		}		printk("%-16s:\t0x%08lx\t0x%08lx\t%s\n", 			parts->name, parts->offset, 			parts->size, sflag);			parts++;	}}static ulongflagtoul(char *flag){	if (strncmp(flag, "cramfs", 5) == 0) return MF_CRAMFS;	else if (strncmp(flag, "jffs2", 5) == 0) return MF_JFFS2;	else if (strncmp(flag, "lock", 4) == 0) return MF_LOCK;	else if (strncmp(flag, "ram", 3) == 0) return MF_RAM;	else if (strncmp(flag, "bon", 3) == 0) return MF_BON;	else if (strncmp(flag, "yaffs", 3) == 0) return MF_YAFFS;	else if (strncmp(flag, "raw", 3) == 0) return MF_RAW;	else return 0;}static ulongparse_flags(char *str){	char *delim;	ulong flag;	flag = 0;	delim = str;	while ((str = delim) != NULL) {		delim = strchr(str, '|');		if (delim != NULL)			*delim++ = '\0';		flag |= flagtoul(str);	}	return flag;}/* * vivi command */voidusage(void){printk("Usage:\n");printk("  add <name> <offset> <size> <flag>  -- Add a mtd partition entry\n");printk("  del <name>                         -- Delete a mtd partition entry\n");printk("  reset                              -- Reset mtd parition table\n");//printk("  save                               -- Save mtd partition table\n");printk("  info                               -- Display mtd partition table\n");}void command_part(int argc, const char **argv){	switch (argc) {	case 2:		if (strncmp(argv[1], "reset", 5) == 0) {			reset_mtd_partition();			return;		}		if (strncmp(argv[1], "info", 4) == 0) {			display_mtd_partition();			return;		}		break;	case 3:		if (strncmp(argv[1], "del", 3) == 0) {			if (del_mtd_partition(argv[2]) < 0)				printk("'%s' is not exist.\n", argv[2]);			else				printk("deleted '%s' partition\n", argv[2]);			return;		}		break;	case 6:		if (strncmp(argv[1], "add", 3) == 0) {			mtd_partition_t part;			int n;			n = strlen(argv[2]);			if ((n-1) > MAX_PART_NAME) {				printk("invalid partition name\n");			}			strcpy((char *)part.name, argv[2]);			part.name[n] = '\0';			part.offset = simple_strtoul(argv[3], NULL, 0);			part.size = simple_strtoul(argv[4], NULL, 0);			part.flag = parse_flags((char *)argv[5]);			part.priv = NULL;			add_mtd_partition(&part);			printk("%s: offset = 0x%08lx, size = 0x%08lx, flag = %d\n",				part.name, part.offset, part.size, part.flag);			return;		}		break;	default:		break;	}	usage();}user_command_t part_cmd = {	"part", 	command_part, 	NULL};/* * mtd_part_init(): Initialize mtd partitions. */intmtd_part_init(void){	/* allocate memory */	mtd_parts = vmalloc(MAX_PARTITIONS * sizeof(mtd_partition_t));#ifdef CONFIG_MTD_PARTITIONS_PARSER	/* Try to parse mtd partition information */	if ((mymtd != NULL) && (mtd_part_parser != NULL)) {		nb_mtd_parts = mtd_part_parser(mtd_parts);		printk("Parsing mtd partition information... ");		if (nb_mtd_parts > 0) {			printk("ok\n");			goto done;		} else {			printk("fail\n");		}	}#endif#ifdef CONFIG_VIVI_FS	/* Try to find stored mtd partition informations */#endif		/* Try to find built-in mtd partitions */	if (default_mtd_partitions != NULL) {		printk("Found default mtd partitions\n");		nb_mtd_parts = default_nb_part;		memcpy(mtd_parts, default_mtd_partitions, sizeof(mtd_partition_t)*nb_mtd_parts);		goto done;	} else {		printk("Can't get default mtd partition information\n");	}	return 1;done:	add_command(&part_cmd);	return 0;}

⌨️ 快捷键说明

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