#include #include #include #include #include #include #include "flashutils/flashutils.h" #ifndef BOARD_BML_BOOT #define BOARD_BML_BOOT "/dev/block/bml7" #endif #ifndef BOARD_BML_RECOVERY #define BOARD_BML_RECOVERY "/dev/block/bml8" #endif int the_flash_type = UNKNOWN; int device_flash_type() { if (the_flash_type == UNKNOWN) { if (access(BOARD_BML_BOOT, F_OK) == 0) { the_flash_type = BML; } else if (access("/proc/mtd", F_OK) == 0) { the_flash_type = MTD; } else if (access("/proc/emmc", F_OK) == 0 || access("/dev/block/mmcblk0", F_OK) == 0 || access("/dev/block/sda", F_OK) == 0) { the_flash_type = MMC; } else { the_flash_type = UNSUPPORTED; } } return the_flash_type; } char* get_default_filesystem() { return device_flash_type() == MMC ? "ext3" : "yaffs2"; } int get_flash_type(const char* partitionType) { int type = UNSUPPORTED; if (strcmp(partitionType, "mtd") == 0) type = MTD; else if (strcmp(partitionType, "emmc") == 0) type = MMC; else if (strcmp(partitionType, "bml") == 0) type = BML; return type; } static int detect_partition(const char *partitionType, const char *partition) { int type = device_flash_type(); if (strstr(partition, "/dev/block/mtd") != NULL) type = MTD; else if (strstr(partition, "/dev/block/mmc") != NULL || strstr(partition, "/dev/block/sd") != NULL) type = MMC; else if (strstr(partition, "/dev/block/bml") != NULL) type = BML; if (partitionType != NULL) { type = get_flash_type(partitionType); } return type; } int restore_raw_partition(const char* partitionType, const char *partition, const char *filename) { int type = detect_partition(partitionType, partition); switch (type) { case MTD: return cmd_mtd_restore_raw_partition(partition, filename); case MMC: return cmd_mmc_restore_raw_partition(partition, filename); case BML: return cmd_bml_restore_raw_partition(partition, filename); default: return -1; } } int backup_raw_partition(const char* partitionType, const char *partition, const char *filename) { int type = detect_partition(partitionType, partition); switch (type) { case MTD: return cmd_mtd_backup_raw_partition(partition, filename); case MMC: return cmd_mmc_backup_raw_partition(partition, filename); case BML: return cmd_bml_backup_raw_partition(partition, filename); default: printf("unable to detect device type"); return -1; } } int erase_raw_partition(const char* partitionType, const char *partition) { int type = detect_partition(partitionType, partition); switch (type) { case MTD: return cmd_mtd_erase_raw_partition(partition); case MMC: return cmd_mmc_erase_raw_partition(partition); case BML: return cmd_bml_erase_raw_partition(partition); default: return -1; } } int erase_partition(const char *partition, const char *filesystem) { int type = detect_partition(NULL, partition); switch (type) { case MTD: return cmd_mtd_erase_partition(partition, filesystem); case MMC: return cmd_mmc_erase_partition(partition, filesystem); case BML: return cmd_bml_erase_partition(partition, filesystem); default: return -1; } } int mount_partition(const char *partition, const char *mount_point, const char *filesystem, int read_only) { int type = detect_partition(NULL, partition); switch (type) { case MTD: return cmd_mtd_mount_partition(partition, mount_point, filesystem, read_only); case MMC: return cmd_mmc_mount_partition(partition, mount_point, filesystem, read_only); case BML: return cmd_bml_mount_partition(partition, mount_point, filesystem, read_only); default: return -1; } } int get_partition_device(const char *partition, char *device) { int type = device_flash_type(); switch (type) { case MTD: return cmd_mtd_get_partition_device(partition, device); case MMC: return cmd_mmc_get_partition_device(partition, device); case BML: return cmd_bml_get_partition_device(partition, device); default: return -1; } }