sdutil Initialize CHS too (some BIOSes dont like it), libfat Add update callback function
All checks were successful
Build documentation / build-and-deploy (push) Successful in 4m33s
All checks were successful
Build documentation / build-and-deploy (push) Successful in 4m33s
This commit is contained in:
@@ -8,6 +8,7 @@ $(eval $(call add_lib,libdebugconsole))
|
||||
$(eval $(call add_lib,libmalloc))
|
||||
$(eval $(call add_lib,libinput))
|
||||
$(eval $(call add_lib,libfat))
|
||||
$(eval $(call add_include,libterminal))
|
||||
|
||||
cflags += -DPRINTF_INCLUDE_CONFIG_H=1
|
||||
|
||||
|
||||
@@ -9,6 +9,8 @@
|
||||
#include <strconv.h>
|
||||
#include <string.h>
|
||||
#include <system.h>
|
||||
#include <tcursor.h>
|
||||
#include <tscreen.h>
|
||||
|
||||
struct dos_pte {
|
||||
uint8_t drive_attrs;
|
||||
@@ -27,6 +29,25 @@ struct dos_mbr {
|
||||
uint8_t valid_sign[2];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
static void lba_to_chs (uint32_t lba, uint8_t chs[3]) {
|
||||
uint32_t sectors_per_track = 63;
|
||||
uint32_t heads = 255;
|
||||
|
||||
uint32_t cylinder = lba / (heads * sectors_per_track);
|
||||
uint32_t head = (lba / sectors_per_track) % heads;
|
||||
uint32_t sector = (lba % sectors_per_track) + 1;
|
||||
|
||||
if (cylinder > 1023) {
|
||||
chs[0] = 254;
|
||||
chs[1] = 0xFF;
|
||||
chs[2] = 0xFF;
|
||||
} else {
|
||||
chs[0] = (uint8_t)head;
|
||||
chs[1] = (uint8_t)((sector & 0x3F) | ((cylinder >> 2) & 0xC0));
|
||||
chs[2] = (uint8_t)(cylinder & 0xFF);
|
||||
}
|
||||
}
|
||||
|
||||
static void start_part_dos (void) {
|
||||
char dev_name[64];
|
||||
memset (dev_name, 0, sizeof (dev_name));
|
||||
@@ -54,12 +75,23 @@ static void start_part_dos (void) {
|
||||
|
||||
mbr.ptes[0].start_lba = p0_start_lba;
|
||||
mbr.ptes[0].sector_count = p0_sector_count;
|
||||
lba_to_chs (p0_start_lba, mbr.ptes[0].chs_start_addr);
|
||||
lba_to_chs (p0_start_lba + p0_sector_count - 1, mbr.ptes[0].chs_last_sect_addr);
|
||||
|
||||
mbr.ptes[1].start_lba = p1_start_lba;
|
||||
mbr.ptes[1].sector_count = p1_sector_count;
|
||||
lba_to_chs (p1_start_lba, mbr.ptes[1].chs_start_addr);
|
||||
lba_to_chs (p1_start_lba + p1_sector_count - 1, mbr.ptes[1].chs_last_sect_addr);
|
||||
|
||||
mbr.ptes[2].start_lba = p2_start_lba;
|
||||
mbr.ptes[2].sector_count = p2_sector_count;
|
||||
lba_to_chs (p2_start_lba, mbr.ptes[2].chs_start_addr);
|
||||
lba_to_chs (p2_start_lba + p2_sector_count - 1, mbr.ptes[2].chs_last_sect_addr);
|
||||
|
||||
mbr.ptes[3].start_lba = p3_start_lba;
|
||||
mbr.ptes[3].sector_count = p3_sector_count;
|
||||
lba_to_chs (p3_start_lba, mbr.ptes[3].chs_start_addr);
|
||||
lba_to_chs (p3_start_lba + p3_sector_count - 1, mbr.ptes[3].chs_last_sect_addr);
|
||||
|
||||
mbr.valid_sign[0] = 0x55;
|
||||
mbr.valid_sign[1] = 0xAA;
|
||||
@@ -122,8 +154,24 @@ static void list_part_dos (const char* dev_name) {
|
||||
/* clang-format on */
|
||||
}
|
||||
|
||||
static const char* spinner = "-\\|/";
|
||||
static size_t spinner_state = 0;
|
||||
static size_t sectors_done = 0;
|
||||
|
||||
static void format_update (size_t sector, size_t sector_count) {
|
||||
(void)sector;
|
||||
|
||||
char spinner_char = spinner[(spinner_state++) % (sizeof (spinner) - 1)];
|
||||
mprintf (ANSIQ_CUR_SET_COL (0) ANSIQ_SCR_CLR2LEND "%c %zu", spinner_char, sectors_done);
|
||||
sectors_done += sector_count;
|
||||
}
|
||||
|
||||
static void format_fat32 (const char* dev_name) {
|
||||
mprintf ("Formatting device %s!\n", dev_name);
|
||||
|
||||
struct fatfs_ctx ctx;
|
||||
memset (&ctx, 0, sizeof (ctx));
|
||||
ctx.update_cb = &format_update;
|
||||
|
||||
int r = fat_format_drive (&ctx, dev_name, FS_FAT32);
|
||||
|
||||
@@ -131,7 +179,11 @@ static void format_fat32 (const char* dev_name) {
|
||||
}
|
||||
|
||||
static void format_fat16 (const char* dev_name) {
|
||||
mprintf ("Formatting device %s!\n", dev_name);
|
||||
|
||||
struct fatfs_ctx ctx;
|
||||
memset (&ctx, 0, sizeof (ctx));
|
||||
ctx.update_cb = &format_update;
|
||||
|
||||
int r = fat_format_drive (&ctx, dev_name, FS_FAT16);
|
||||
|
||||
@@ -142,9 +194,9 @@ void app_main (void) {
|
||||
libprocess_self_init ();
|
||||
|
||||
char commandbuf[32];
|
||||
commandbuf[0] = '\0';
|
||||
memset (commandbuf, 0, sizeof (commandbuf));
|
||||
char devnamebuf[64];
|
||||
devnamebuf[0] = '\0';
|
||||
memset (devnamebuf, 0, sizeof (devnamebuf));
|
||||
|
||||
if (env_get (process_get_pgid (), "C", (void*)commandbuf, sizeof (commandbuf)) != ST_OK) {
|
||||
mprintf ("ERROR C=???. No command provided\n");
|
||||
|
||||
Reference in New Issue
Block a user