From c8d6da5a23f2b0b8455f4a649715bdd09aefaab0 Mon Sep 17 00:00:00 2001 From: CTCaer Date: Thu, 30 Apr 2020 14:58:53 +0300 Subject: [PATCH] storage: Add Ramdisk driver --- nyx/Makefile | 2 +- nyx/nyx_gui/storage/ramdisk.c | 67 +++++++++++++++++++++++++++++++++++ nyx/nyx_gui/storage/ramdisk.h | 30 ++++++++++++++++ 3 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 nyx/nyx_gui/storage/ramdisk.c create mode 100644 nyx/nyx_gui/storage/ramdisk.h diff --git a/nyx/Makefile b/nyx/Makefile index 8056005..7420cb7 100644 --- a/nyx/Makefile +++ b/nyx/Makefile @@ -32,7 +32,7 @@ OBJS = $(addprefix $(BUILDDIR)/$(TARGET)/, \ OBJS += $(addprefix $(BUILDDIR)/$(TARGET)/, \ bpmp.o clock.o cluster.o di.o gpio.o i2c.o irq.o pinmux.o se.o smmu.o tsec.o uart.o \ fuse.o kfuse.o \ - mc.o sdram.o minerva.o \ + mc.o sdram.o minerva.o ramdisk.o \ sdmmc.o sdmmc_driver.o nx_emmc.o nx_sd.o \ bq24193.o max17050.o max7762x.o max77620-rtc.o regulator_5v.o \ touch.o joycon.o tmp451.o fan.o \ diff --git a/nyx/nyx_gui/storage/ramdisk.c b/nyx/nyx_gui/storage/ramdisk.c new file mode 100644 index 0000000..5143b3b --- /dev/null +++ b/nyx/nyx_gui/storage/ramdisk.c @@ -0,0 +1,67 @@ +/* + * Ramdisk driver for Tegra X1 + * + * Copyright (c) 2019 CTCaer + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include + +#include "ramdisk.h" +#include "../mem/heap.h" +#include "../utils/types.h" + +#include "../../../common/memory_map.h" + +int ram_disk_init(FATFS *ram_fs) +{ + int res; + u8 *buf = malloc(0x400000); + + f_mount(NULL, "ram:", 1); // Unmount ramdisk. + + res = f_mkfs("ram:", FM_EXFAT, RAMDISK_CLUSTER_SZ, buf, 0x400000); // Format as exFAT w/ 32KB cluster. + if (!res) + res = f_mount(ram_fs, "ram:", 1); // Mount ramdisk. + + free(buf); + + return res; +} + +int ram_disk_read(u32 sector, u32 sector_count, void *buf) +{ + u32 sector_off = RAM_DISK_ADDR + (sector << 9); + u32 bytes_count = sector_count << 9; + + if ((sector_off - RAM_DISK_ADDR) > RAM_DISK_SZ) + return 1; + + memcpy(buf, (void *)sector_off, bytes_count); + + return 0; +} + +int ram_disk_write(u32 sector, u32 sector_count, const void *buf) +{ + u32 sector_off = RAM_DISK_ADDR + (sector << 9); + u32 bytes_count = sector_count << 9; + + if ((sector_off - RAM_DISK_ADDR) > RAM_DISK_SZ) + return 1; + + memcpy((void *)sector_off, buf, bytes_count); + + return 0; +} diff --git a/nyx/nyx_gui/storage/ramdisk.h b/nyx/nyx_gui/storage/ramdisk.h new file mode 100644 index 0000000..12c8ffb --- /dev/null +++ b/nyx/nyx_gui/storage/ramdisk.h @@ -0,0 +1,30 @@ +/* + * Ramdisk driver for Tegra X1 + * + * Copyright (c) 2019 CTCaer + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef RAM_DISK_H +#define RAM_DISK_H + +#include "../libs/fatfs/ff.h" + +#define RAMDISK_CLUSTER_SZ 32768 + +int ram_disk_init(FATFS *ram_fs); +int ram_disk_read(u32 sector, u32 sector_count, void *buf); +int ram_disk_write(u32 sector, u32 sector_count, const void *buf); + +#endif \ No newline at end of file