Skip to content
Snippets Groups Projects
Unverified Commit 246d7a5e authored by Byron Lathi's avatar Byron Lathi
Browse files

Print out more information, read a file

Prints out information about the drive, now inside its own function.

Also changes the read function to take in a 32 bit address instead of a
16 bit one.

Attempts to read the first file on the disk
parent 380550c7
No related branches found
No related tags found
1 merge request!12Read data from a file
Pipeline #151 passed
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
uint8_t buf[512]; uint8_t buf[512];
void sd_readblock(uint8_t addr) { void sd_readblock(uint32_t addr) {
uint32_t resp; uint32_t resp;
int i; int i;
...@@ -24,20 +24,65 @@ void sd_readblock(uint8_t addr) { ...@@ -24,20 +24,65 @@ void sd_readblock(uint8_t addr) {
buf[i] = sd_card_read_byte(); buf[i] = sd_card_read_byte();
} }
/*
for (i = 0; i < 512; i++){ for (i = 0; i < 512; i++){
if (i % 16 == 0) if (i % 16 == 0)
cprintf("\n %2x: ", i); cprintf("\n %2x: ", i);
cprintf("%2x ", buf[i]); cprintf("%2x ", buf[i]);
} }
*/
cprintf("\n"); cprintf("\n");
} }
void print_pbp_info(ebpb_t* epbp){
cprintf("Bytes per sector: %d\n", epbp->bpb3.bpb2.bytes_per_sector);
cprintf("Sectors per cluster: %d\n", epbp->bpb3.bpb2.sectors_per_cluster);
cprintf("Reserved Sectors: %d\n", epbp->bpb3.bpb2.reserved_sectors);
cprintf("Fat Count: %d\n", epbp->bpb3.bpb2.fat_count);
cprintf("Max Dir Entries: %d\n", epbp->bpb3.bpb2.max_dir_entries);
cprintf("Total Sector Count: %d\n", epbp->bpb3.bpb2.total_sector_count);
cprintf("Media Descriptor: 0x%x\n", epbp->bpb3.bpb2.media_descriptor);
cprintf("Sectors per Fat: %d\n", epbp->bpb3.bpb2.sectors_per_fat);
cprintf("\n");
cprintf("Sectors per track: %d\n", epbp->bpb3.sectors_per_track);
cprintf("Head Count: %d\n", epbp->bpb3.head_count);
cprintf("Hidden Sector Count: %ld\n", epbp->bpb3.hidden_sector_count);
cprintf("Logical Sector Count: %ld\n", epbp->bpb3.logical_sector_count);
cprintf("Sectors per Fat: %ld\n", epbp->bpb3.sectors_per_fat);
cprintf("Extended Flags: 0x%x\n", epbp->bpb3.extended_flags);
cprintf("Version: %d\n", epbp->bpb3.version);
cprintf("Root Cluster: 0x%lx\n", epbp->bpb3.root_cluster);
cprintf("System Information: 0x%x\n", epbp->bpb3.system_information);
cprintf("Backup Boot Sector: 0x%x\n", epbp->bpb3.backup_boot_sector);
cprintf("\n");
cprintf("Drive Number: %d\n", epbp->drive_num);
cprintf("Extended Signature: 0x%x\n", epbp->extended_signature);
cprintf("Volume ID: 0x%lx\n", epbp->volume_id);
cprintf("Partition Label: %.11s\n", &epbp->partition_label);
cprintf("Partition Label: %.8s\n", &epbp->filesystem_type);
cprintf("\n");
}
int main() { int main() {
int i; int i;
uint8_t sw; uint8_t sw;
uint32_t resp; uint32_t resp;
ebpb_t* epbp; ebpb_t* epbp;
fs_info_sector_t* fsis;
vfat_dentry_t* vfat_dentry;
dos_dentry_t* dos_dentry;
uint32_t cluster;
uint16_t reserved_count;
uint32_t sectors_per_fat;
uint8_t fat_count;
uint32_t data_region_start;
char s[16]; char s[16];
s[15] = 0; s[15] = 0;
...@@ -45,36 +90,13 @@ int main() { ...@@ -45,36 +90,13 @@ int main() {
cprintf("Hello, world!\n"); cprintf("Hello, world!\n");
for (i = 0; i < 16; i++){ for (i = 0; i < 16; i++){
cprintf("Mapping %1xxxx to %2xxxx\n", i, i); //cprintf("Mapping %1xxxx to %2xxxx\n", i, i);
mapper_write(i, i); mapper_write(i, i);
} }
cprintf("Enabling Mapper\n"); cprintf("Enabling Mapper\n");
mapper_enable(1); mapper_enable(1);
cprintf("Writing 0xcccc to 0x4000\n");
*(unsigned int*)(0x4000) = 0xcccc;
cprintf("Writing 0xdddd to 0x5000\n");
*(unsigned int*)(0x5000) = 0xdddd;
cprintf("Mapping %1xxxx to %2xxxx\n", 4, 16);
mapper_write(16, 4);
cprintf("Mapping %1xxxx to %2xxxx\n", 5, 16);
mapper_write(16, 5);
cprintf("Writing 0xa5a5 to 0x4000\n");
*(unsigned int*)(0x4000) = 0xa5a5;
cprintf("Reading from 0x5000: %x\n", *(unsigned int*)(0x5000));
cprintf("Resetting map\n");
mapper_write(4, 4);
mapper_write(5, 5);
cprintf("Reading from 0x4000: %x\n", *(unsigned int*)(0x4000));
cprintf("Reading from 0x5000: %x\n", *(unsigned int*)(0x5000));
// This will read a 512 block from the sd card. // This will read a 512 block from the sd card.
// The RCA is hard coded for the one that I have on hand as responses // The RCA is hard coded for the one that I have on hand as responses
...@@ -115,36 +137,73 @@ int main() { ...@@ -115,36 +137,73 @@ int main() {
epbp = (ebpb_t*)&buf[11]; epbp = (ebpb_t*)&buf[11];
cprintf("Bytes per sector: %d\n", epbp->bpb3.bpb2.bytes_per_sector); print_pbp_info(epbp);
cprintf("Sectors per cluster: %d\n", epbp->bpb3.bpb2.sectors_per_cluster);
cprintf("Reserved Sectors: %d\n", epbp->bpb3.bpb2.reserved_sectors);
cprintf("Fat Count: %d\n", epbp->bpb3.bpb2.fat_count);
cprintf("Max Dir Entries: %d\n", epbp->bpb3.bpb2.max_dir_entries);
cprintf("Total Sector Count: %d\n", epbp->bpb3.bpb2.total_sector_count);
cprintf("Media Descriptor: 0x%x\n", epbp->bpb3.bpb2.media_descriptor);
cprintf("Sectors per Fat: %d\n", epbp->bpb3.bpb2.sectors_per_fat);
cprintf("\n");
cprintf("Sectors per track: %d\n", epbp->bpb3.sectors_per_track); cprintf("Boot Signature: %x %x\n", buf[510], buf[511]);
cprintf("Head Count: %d\n", epbp->bpb3.head_count);
cprintf("Hidden Sector Count: %d\n", epbp->bpb3.hidden_sector_count);
cprintf("Logical Sector Count: %d\n", epbp->bpb3.logical_sector_count);
cprintf("Sectors per Fat: %d\n", epbp->bpb3.sectors_per_fat);
cprintf("Extended Flags: 0x%x\n", epbp->bpb3.extended_flags);
cprintf("Version: %d\n", epbp->bpb3.version);
cprintf("Root Cluster: 0x%x\n", epbp->bpb3.root_cluster);
cprintf("System Information: 0x%x\n", epbp->bpb3.system_information);
cprintf("Backup Boot Sector: 0x%x\n", epbp->bpb3.backup_boot_sector);
cprintf("\n");
cprintf("Drive Number: %d\n", epbp->drive_num); reserved_count = epbp->bpb3.bpb2.reserved_sectors;
cprintf("Extended Signature: 0x%x\n", epbp->extended_signature); fat_count = epbp->bpb3.bpb2.fat_count;
cprintf("Volume ID: 0x%lx\n", epbp->volume_id); sectors_per_fat = epbp->bpb3.sectors_per_fat;
cprintf("Partition Label: %.11s\n", &epbp->partition_label);
cprintf("Partition Label: %.8s\n", &epbp->filesystem_type); sd_readblock(1);
fsis = (fs_info_sector_t*)&buf[0];
cprintf("Free Data clusters: %ld\n", fsis->free_data_clusters);
cprintf("Last allocated data cluster: %ld\n", fsis->last_allocated_data_cluster);
cprintf("32 reserved sectors, reading from sector 32...\n");
sd_readblock(32);
cprintf("CLUST_0: %08lx\n", *(uint32_t*)&buf[0]);
cprintf("CLUST_1: %08lx\n", *(uint32_t*)&buf[1*4]);
cprintf("Root cluster: %08lx\n", *(uint32_t*)&buf[2*4]);
data_region_start = reserved_count + fat_count*sectors_per_fat;
cprintf("Data Region starting sector: %lx\n", data_region_start);
cprintf("Reading root directory entry...\n");
cprintf("%ld\n", data_region_start*512);
sd_readblock(data_region_start);
vfat_dentry = (vfat_dentry_t*)buf;
while(vfat_dentry->sequence_number == 0xe5)
vfat_dentry++;
cprintf("Sequence: %x\n", vfat_dentry->sequence_number);
cprintf("Name: ");
for (i = 0;; i++) { // this will not work for proper vfat names
if (i < 5) {
if (!vfat_dentry->filename0[i])
break;
cprintf("%c", vfat_dentry->filename0[i]);
} else if (i < 11) {
if (!vfat_dentry->filename0[i])
break;
cprintf("%c", vfat_dentry->filename1[i-5]);
} else {
break;
}
}
cprintf("\n"); cprintf("\n");
dos_dentry = (dos_dentry_t*)(vfat_dentry + 1);
cprintf("DOS name: %.8s.%.3s\n", &dos_dentry->filename, &dos_dentry->extension);
cluster = (dos_dentry->first_cluster_h << 16) + dos_dentry->first_cluster_l;
cprintf("Cluster: %ld\n", cluster);
cprintf("File location: %lx\n", data_region_start + (cluster - 2) * 8);
sd_readblock(data_region_start + (cluster - 2) * 8);
cprintf("File contents: %s\n", buf);
cprintf("Done!\n");
cprintf("Boot Signature: %x %x\n", buf[510], buf[511]);
while (1) { while (1) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment