📄 fdisk.c
字号:
#include "board.h"#include "console.h"#include "utils.h"#include "bios.h"#include "bioscall.h"#include "config.h"int main_menu(void){ int list[] = { FDISK_DISPLAY_PART, FDISK_DISPLAY_PARAM, FDISK_CREATE_PART, FDISK_DELETE_PART, FDISK_SET_BOOT }; int select; printf("\r\n\r\nFdisk Menu\r\n\r\n"); printf("1 - Display Partition\r\n"); printf("2 - Display Parameter\r\n"); printf("3 - Create Partition\r\n"); printf("4 - Delete Partition\r\n"); printf("5 - Set Boot Partition\r\n"); printf("\r\nPlease Select "); select = get_select('1', '5'); printf("\r\n"); if (select < 0) return -1; return list[select];}int update_partition_table(struct partition_table_struct *partition_table){ unsigned long offset, size, l; offset = bios_partition_table_offset(); size = bios_partition_table_size(); printf("\r\nUpdate Partition Table .............. "); bios_flash_erase(offset, size); bios_flash_write(offset, size, &l, (unsigned char *)partition_table); printf("Done\r\n"); return 0;}int create_partition(void){ struct partition_table_struct *partition_table; struct partition_struct *partition; int num; char ch; printf("\r\nCreate Partition\r\n\r\n"); printf("Please Select Partition (1 - 8) "); num = get_select('1', '8'); if (num < 0) { printf("\r\n"); return 0; } printf("\r\n\r\n"); partition_table = (struct partition_table_struct *)BUF_ADDR; bios_partition_table(partition_table); partition = &partition_table->partition[num]; if (partition->flag == PART_FLAG_NONE) partition->flag = PART_FLAG_DISK; printf("Flag [1=DISK, 2=NET]: "); ch = get_select_enter('1', '2'); if (ch == 0) partition->flag = PART_FLAG_DISK; else if (ch == 1) partition->flag = PART_FLAG_NET; printf("\r\n"); printf("Type [1=RO, 2=RW]: "); ch = get_select_enter('1', '2'); if (ch == 0) partition->type = PART_TYPE_RO; else if (ch == 1) partition->type = PART_TYPE_RW; printf("\r\n"); printf("Partition Offset (0x%08lx): ", partition->offset); partition->offset = getul(partition->offset, 16); printf("\r\n"); if (partition->offset & 0x00000003) { printf("\r\nInvalid Partition Offset!\r\n"); return -1; } printf("Partition Size (0x%08lx): ", partition->size); partition->size = getul(partition->size, 16); printf("\r\n"); if ((partition->size < 4) || (partition->size & 0x00000003)) { printf("\r\nInvalid Partition Size!\r\n"); return -1; } printf("Image Type [1=uClinux, 2=Other]: "); ch = get_select_enter('1', '2'); if (ch == 0) partition->image_type = IMAGE_UCLINUX; else if (ch == 1) partition->image_type = IMAGE_OTHER; printf("\r\n"); printf("Gzipped Image [1=Yes, 2=No]: "); ch = get_select_enter('1', '2'); if (ch == 0) partition->gzipped_image = 1; else if (ch == 1) partition->gzipped_image = 0; printf("\r\n"); printf("Exec Addr (0x%08lx): ", partition->exec_addr); partition->exec_addr = getul(partition->exec_addr, 16); printf("\r\n"); if (partition->exec_addr & 0x00000003) { printf("\r\nInvalid Exec Addr!\r\n"); return -1; } printf("Param Addr (0x%08lx): ", partition->param_addr); partition->param_addr = getul(partition->param_addr, 16); printf("\r\n"); if (partition->param_addr & 0x00000003) { printf("\r\nInvalid Param Addr!\r\n"); return -1; } printf("Command line: "); gets(partition->command_line, CMD_LENGTH); printf("\r\n"); update_partition_table(partition_table); return 0;}int delete_partition(void){ struct partition_table_struct *partition_table; struct partition_struct *partition; int num; printf("\r\nDelete Partition\r\n\r\n"); printf("Please Select Partition (1 - 8) "); num = get_select('1', '8'); if (num < 0) { printf("\r\n"); return 0; } printf("\r\n"); partition_table = (struct partition_table_struct *)BUF_ADDR; bios_partition_table(partition_table); partition = &partition_table->partition[num]; partition->flag = PART_FLAG_NONE; partition->type = PART_TYPE_RW; partition->offset = 0; partition->size = 0; partition->image_type = IMAGE_UCLINUX; partition->gzipped_image = 1; partition->exec_addr = UCLINUX_EXEC_ADDR; partition->param_addr = UCLINUX_PARAM_ADDR; partition->command_line[0] = '\0'; update_partition_table(partition_table); return 0;}int display_parameter(void){ struct partition_table_struct *partition_table; struct partition_struct *partition; int i; partition_table = (struct partition_table_struct *)BUF_ADDR; bios_partition_table(partition_table); printf("\r\nPartition Parameter\r\n"); printf("\r\nID Image-Type Gzipped Exec-Addr Param-Addr Cmdline\r\n"); for (i = 0; i < PART_MAX_NUM; i++) { partition = &partition_table->partition[i]; printf("%d ", i + 1); switch (partition->flag) { case PART_FLAG_DISK: case PART_FLAG_NET: break; case PART_FLAG_NONE: default: printf("NONE\r\n"); continue; } switch (partition->image_type) { case IMAGE_UCLINUX: printf("uClinux "); break; default: printf("Other "); break; } if (partition->gzipped_image) printf("Yes "); else printf("No "); printf("0x%08lx ", partition->exec_addr); printf("0x%08lx ", partition->param_addr); printf("%s\r\n", partition->command_line); } printf("\r\nPerss any key ... "); getch(); printf("\r\n"); return 0;}int display_partition(void){ struct partition_table_struct *partition_table; struct partition_struct *partition; int i; partition_table = (struct partition_table_struct *)BUF_ADDR; bios_partition_table(partition_table); printf("\r\nPartition Information\r\n\r\n"); printf("Boot ID Flag Type Start End\r\n"); for (i = 0; i < PART_MAX_NUM; i++) { if (i == partition_table->boot_partition) printf("* "); else printf(" "); partition = &partition_table->partition[i]; printf("%d ", i + 1); switch (partition->flag) { case PART_FLAG_DISK: printf("DISK "); break; case PART_FLAG_NET: printf("NET "); break; case PART_FLAG_NONE: default: printf("NONE\r\n"); continue; } switch (partition->type) { case PART_TYPE_RO: printf("RO "); break; case PART_TYPE_RW: printf("RW "); break; default: printf("ERR\r\n"); continue; } printf("0x%08lx - 0x%08lx\r\n", partition->offset, partition->offset + partition->size - 1); } printf("\r\nPress any key ... "); getch(); printf("\r\n"); return 0;}int set_boot_partition(void){ struct partition_table_struct *partition_table; char ch; partition_table = (struct partition_table_struct *)BUF_ADDR; bios_partition_table(partition_table); printf("\r\nSet Boot Partition\r\n\r\n"); printf("Boot Partition (1 - 8) "); ch = get_select('1', '8'); printf("\r\n"); if (ch < 0) return 0; partition_table->boot_partition = ch; update_partition_table(partition_table); return 0;}int fdisk(void){ int select; while ( (select = main_menu()) >= 0) { switch (select) { case FDISK_DISPLAY_PART: display_partition(); break; case FDISK_DISPLAY_PARAM: display_parameter(); break; case FDISK_CREATE_PART: create_partition(); break; case FDISK_DELETE_PART: delete_partition(); break; case FDISK_SET_BOOT: set_boot_partition(); break; default: break; } } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -