From: Minkyu Kang Date: Wed, 5 Jan 2011 06:05:28 +0000 (+0900) Subject: mbr: move mbr related codes / add mbr default command X-Git-Tag: v0.2~80 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2ed367e5524251c6331d340bfeb1d2eb7a5428ac;p=kernel%2Fu-boot.git mbr: move mbr related codes / add mbr default command Signed-off-by: Minkyu Kang --- diff --git a/common/cmd_usbd.c b/common/cmd_usbd.c index 4cd6804..95c7f9f 100644 --- a/common/cmd_usbd.c +++ b/common/cmd_usbd.c @@ -628,63 +628,6 @@ static int write_file_mmc_part(struct usbd_ops *usbd, u32 len) } #endif -static unsigned int mbr_offset[16]; -static int mbr_parts = 0; - -static unsigned long memsize_parse (const char *const ptr, const char **retptr) -{ - unsigned long ret = simple_strtoul(ptr, (char **)retptr, 0); - - switch (**retptr) { - case 'G': - case 'g': - ret <<= 10; - case 'M': - case 'm': - ret <<= 10; - case 'K': - case 'k': - ret <<= 10; - (*retptr)++; - default: - break; - } - - return ret; -} - -static void set_mbr_info(struct usbd_ops *usbd, char *ramaddr, u32 len) -{ - char mbr_str[256]; - char save[16][16]; - char *p; - char *tok; - unsigned int size[16]; - int i = 0; - - strncpy(mbr_str, ramaddr, len); - p = mbr_str; - - for (i = 0; ; i++, p = NULL) { - tok = strtok(p, ","); - if (tok == NULL) - break; - strcpy(save[i], tok); - printf("part%d: %s\n", i, save[i]); - } - - mbr_parts = i; - printf("find %d partitions\n", mbr_parts); - - for (i = 0; i < mbr_parts; i++) { - p = save[i]; - size[i] = memsize_parse(p, (const char **)&p) / 512; - } - - puts("save the MBR Table...\n"); - set_mbr_table(0x800, mbr_parts, size, mbr_offset); -} - static int write_mmc_image(struct usbd_ops *usbd, unsigned int len, int part_num) { int ret = 0; @@ -1036,7 +979,7 @@ static int write_v2_image(struct usbd_ops *usbd, int img_type, case IMG_MBR: #ifdef CONFIG_CMD_MBR - set_mbr_info(usbd, (char *)down_ram_addr, len); + set_mbr_info((char *)down_ram_addr, len); #endif break; @@ -1438,14 +1381,8 @@ int do_usbd_down(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) #ifdef CONFIG_CMD_MBR /* get mbr info */ mbr_parts = get_mbr_table(mbr_offset); - if (!mbr_parts) { - char *mbrparts; - - puts("using default MBR\n"); - - mbrparts = getenv("mbrparts"); - set_mbr_info(usbd, mbrparts, strlen(mbrparts)); - } + if (!mbr_parts) + run_command("mbr default", 0); #endif /* init the usb controller */ diff --git a/drivers/misc/mbr.c b/drivers/misc/mbr.c index 885c20f..8083ada 100644 --- a/drivers/misc/mbr.c +++ b/drivers/misc/mbr.c @@ -9,6 +9,9 @@ #define SIGNATURE ((unsigned short) 0xAA55) +unsigned int mbr_offset[16]; +unsigned int mbr_parts = 0; + static int logical = 4; static int extended_lba; @@ -311,14 +314,79 @@ static void mbr_show(void) } } +static unsigned long memsize_parse (const char *const ptr, const char **retptr) +{ + unsigned long ret = simple_strtoul(ptr, (char **)retptr, 0); + + switch (**retptr) { + case 'G': + case 'g': + ret <<= 10; + case 'M': + case 'm': + ret <<= 10; + case 'K': + case 'k': + ret <<= 10; + (*retptr)++; + default: + break; + } + + return ret; +} + +void set_mbr_info(char *ramaddr, unsigned int len) +{ + char mbr_str[256]; + char save[16][16]; + char *p; + char *tok; + unsigned int size[16]; + int i = 0; + + strncpy(mbr_str, ramaddr, len); + p = mbr_str; + + for (i = 0; ; i++, p = NULL) { + tok = strtok(p, ","); + if (tok == NULL) + break; + strcpy(save[i], tok); + printf("part%d: %s\n", i, save[i]); + } + + mbr_parts = i; + printf("find %d partitions\n", mbr_parts); + + for (i = 0; i < mbr_parts; i++) { + p = save[i]; + size[i] = memsize_parse(p, (const char **)&p) / 512; + } + + puts("save the MBR Table...\n"); + set_mbr_table(0x800, mbr_parts, size, mbr_offset); +} + +static void mbr_default(void) +{ + char *mbrparts; + + puts("using default MBR\n"); + + mbrparts = getenv("mbrparts"); + set_mbr_info(mbrparts, strlen(mbrparts)); +} + static int do_mbr(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { switch (argc) { case 2: - if (strncmp(argv[1], "show", 2) == 0) { + if (strncmp(argv[1], "show", 2) == 0) mbr_show(); - break; - } + else if (strncmp(argv[1], "default", 3) == 0) + mbr_default(); + break; default: cmd_usage(cmdtp); return 1; @@ -331,4 +399,5 @@ U_BOOT_CMD( mbr, CONFIG_SYS_MAXARGS, 1, do_mbr, "Master Boot Record", "show - show MBR\n" + "mbr default - reset MBR partition to defaults\n" ); diff --git a/include/mbr.h b/include/mbr.h index 09c8e63..e2c29e8 100644 --- a/include/mbr.h +++ b/include/mbr.h @@ -19,6 +19,10 @@ struct mbr { unsigned short signature; }; +extern unsigned int mbr_offset[16]; +extern unsigned int mbr_parts; + +void set_mbr_info(char *ramaddr, unsigned int len); void set_mbr_table(unsigned int start_addr, int parts, unsigned int *blocks, unsigned int *part_offset); int get_mbr_table(unsigned int *part_offset);