3 #include "io/status_loggers.h"
9 "DiskCTL - Disk Management Utility by NDRAEY (c) 2023.\n"
12 "- info [disk num] - shows info about selected disk (or all disks if disk num is not present)\n"
13 "- eject [disk num] - ejects disc\n"
17 void diskctl_show_disk(
size_t drive_n) {
18 if(drives[drive_n].is_packet)
19 ide_identify(drive_n >> 1, drive_n & 1);
24 "Drive #%d: %s [%s]\n",
26 drive.
is_packet ?
"Packet Device" :
"Hard Drive",
27 drive.online ?
"online" :
"offline"
33 tty_printf(
"|--- Capacity: ");
35 if(drive.is_chs_addressing) {
37 "Cylinders: %d; Heads: %d; Sectors: %d\n",
44 "%d bytes; %d kilobytes; %d megabytes\n",
51 tty_printf(
"|--- CHS Addressing: %s\n", drive.is_chs_addressing ?
"yes" :
"no");
52 tty_printf(
"|--- Block size: %d\n", drive.
block_size);
55 tty_printf(
"|--- Media presence: %s\n", atapi_check_media_presence(ATA_SECONDARY, ATA_MASTER) ?
"true" :
"false");
61 void diskctl_show_all_disks() {
62 for(
int i = 0; i < 4; i++) {
67 void diskctl_info(uint32_t argc,
char** argv) {
69 diskctl_show_all_disks();
71 if(!isnumberstr(argv[1])) {
72 tty_error(
"Not a number!\n");
76 size_t disk_n =
atoi(argv[1]);
78 if(disk_n < 1 || disk_n > 4) {
79 tty_error(
"Invalid disk number. Disk number in range 1 ... 4\n");
83 diskctl_show_disk(disk_n - 1);
87 void diskctl_eject(uint32_t argc,
char** argv) {
89 tty_error(
"Choose disc drive in range 1 ... 4");
91 if(!isnumberstr(argv[1])) {
92 tty_error(
"Not a number!\n");
96 size_t disk_n =
atoi(argv[1]);
98 if(disk_n < 1 || disk_n > 4) {
99 tty_error(
"Invalid disk number. Disk number in range 1 ... 4\n");
105 if(!drives[disk_n].is_packet) {
106 tty_error(
"This drive does not supports eject.\n");
110 atapi_eject(disk_n >> 1, disk_n & 1);
114 void diskctl_test(uint32_t argc,
char** argv) {
116 tty_error(
"Choose disc drive in range 1 ... 4");
118 if(!isnumberstr(argv[1])) {
119 tty_error(
"Not a number!\n");
123 size_t disk_n =
atoi(argv[1]);
125 if(disk_n < 1 || disk_n > 4) {
126 tty_error(
"Invalid disk number. Disk number in range 1 ... 4\n");
132 if(!drives[disk_n].online) {
133 tty_printf(
"Cannot read from that drive: it's offline.\n");
137 tty_printf(
"Allocating 1 MB buffer...\n");
139 uint8_t* buf = kmalloc(1 * 1024 * 1024);
141 tty_printf(
"Reading 1 MB from address 0...\n");
143 ata_read(disk_n, buf, 0, 1 * 1024 * 1024);
145 tty_printf(
"Freeing buffer...\n");
151 int shell_diskctl(uint32_t argc,
char** argv) {
153 tty_printf(
"Not enough arguments.\n\n");
159 char* verb = argv[1];
161 if(!
strcmp(verb,
"info")) {
162 diskctl_info(argc - 1, argv + 1);
163 }
else if(!
strcmp(verb,
"eject")) {
164 diskctl_eject(argc - 1, argv + 1);
165 }
else if(!
strcmp(verb,
"test")) {
166 diskctl_test(argc - 1, argv + 1);
168 tty_error(
"Unknown verb: %s", verb);
int strcmp(const char *s1, const char *s2)
Сравнение строк
uint32_t atoi(const char s[])
Превращает строку в число
Эта структура определяет каждый ATA диск в системе
uint16_t cylinders
Размер сектора
uint16_t block_size
Адресация по CHS?
size_t capacity
Устройство доступно?
bool is_packet
Ёмкость диска в секторах