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

📄 fdisk.c

📁 Compex BIOS for SAMSUNG S3C4510B v1.20-lt
💻 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 + -