Add some XML docs for GcSrv and SdmmcSrv

This commit is contained in:
Alex Barney 2023-02-01 20:33:18 -07:00
parent 94221ef073
commit fa9d5422cf
31 changed files with 225 additions and 35 deletions

View file

@ -3,31 +3,29 @@ using LibHac.FsSrv.Storage;
namespace LibHac.Fs.Impl; namespace LibHac.Fs.Impl;
/// <summary>
/// Allows getting the current handle for the SD card and checking to see if a provided handle is still valid.
/// </summary>
/// <remarks>Based on nnSdk 15.3.0 (FS 15.0.0)</remarks>
internal class SdHandleManager : IDeviceHandleManager internal class SdHandleManager : IDeviceHandleManager
{ {
// LibHac addition
private readonly FileSystemServer _fsServer;
public SdHandleManager(FileSystemServer fsServer)
{
_fsServer = fsServer;
}
public Result GetHandle(out StorageDeviceHandle handle) public Result GetHandle(out StorageDeviceHandle handle)
{ {
return GetCurrentSdCardHandle(out handle); return _fsServer.Storage.GetCurrentSdCardHandle(out handle).Ret();
} }
public bool IsValid(in StorageDeviceHandle handle) public bool IsValid(in StorageDeviceHandle handle)
{ {
// Note: Nintendo ignores the result here. // Note: Nintendo ignores the result here.
IsSdCardHandleValid(out bool isValid, in handle).IgnoreResult(); _fsServer.Storage.IsSdCardHandleValid(out bool isValid, in handle).IgnoreResult();
return isValid; return isValid;
} }
// Todo: Use FsSrv.Storage
private static Result GetCurrentSdCardHandle(out StorageDeviceHandle handle)
{
handle = new StorageDeviceHandle(1, StorageDevicePortId.SdCard);
return Result.Success;
}
private static Result IsSdCardHandleValid(out bool isValid, in StorageDeviceHandle handle)
{
isValid = handle.PortId == StorageDevicePortId.SdCard;
return Result.Success;
}
} }

View file

@ -76,7 +76,7 @@ public static class FileSystemServerInitializer
var debugConfigurationService = new DebugConfigurationServiceImpl(in debugConfigurationServiceConfig); var debugConfigurationService = new DebugConfigurationServiceImpl(in debugConfigurationServiceConfig);
var saveDataIndexerManager = new SaveDataIndexerManager(server.Hos.Fs, Fs.SaveData.SaveIndexerId, var saveDataIndexerManager = new SaveDataIndexerManager(server.Hos.Fs, Fs.SaveData.SaveIndexerId,
new ArrayPoolMemoryResource(), new SdHandleManager(), false); new ArrayPoolMemoryResource(), new SdHandleManager(server), false);
var programRegistryConfig = new ProgramRegistryServiceImpl.Configuration(); var programRegistryConfig = new ProgramRegistryServiceImpl.Configuration();
programRegistryConfig.FsServer = server; programRegistryConfig.FsServer = server;

View file

@ -1,8 +1,10 @@
using LibHac.Fs; using System;
using LibHac.Common;
using LibHac.Fs;
namespace LibHac.FsSrv.FsCreator; namespace LibHac.FsSrv.FsCreator;
public interface ISdStorageCreator public interface ISdStorageCreator: IDisposable
{ {
Result Create(out IStorage storage); Result Create(ref SharedRef<IStorage> outStorage);
} }

View file

@ -0,0 +1,30 @@
using LibHac.Common;
using LibHac.Fs;
using LibHac.FsSrv.Storage;
namespace LibHac.FsSrv.FsCreator;
/// <summary>
/// Creates <see cref="IStorage"/>s for accessing the inserted SD card's storage.
/// </summary>
/// <remarks>Based on nnSdk 15.3.0 (FS 15.0.0)</remarks>
public class SdStorageCreator : ISdStorageCreator
{
// LibHac addition
private readonly FileSystemServer _fsServer;
public SdStorageCreator(FileSystemServer fsServer)
{
_fsServer = fsServer;
}
public void Dispose()
{
// ...
}
public Result Create(ref SharedRef<IStorage> outStorage)
{
return _fsServer.Storage.OpenSdStorage(ref outStorage).Ret();
}
}

View file

@ -199,6 +199,8 @@ public class EmulatedStorageDeviceManagerFactory : IStorageDeviceManagerFactory
if (!_sdCardDeviceManager.HasValue) if (!_sdCardDeviceManager.HasValue)
{ {
// Missing: Register device address space
using SharedRef<SdCardManager> manager = SdCardManager.CreateShared(_sdmmc); using SharedRef<SdCardManager> manager = SdCardManager.CreateShared(_sdmmc);
_sdCardDeviceManager.SetByMove(ref manager.Ref); _sdCardDeviceManager.SetByMove(ref manager.Ref);

View file

@ -5,6 +5,11 @@ using LibHac.Sf;
namespace LibHac.FsSrv.Storage; namespace LibHac.FsSrv.Storage;
/// <summary>
/// Manages setting storage devices as ready or not ready, and allows opening <see cref="IStorageDeviceManager"/>s for
/// each storage device.
/// </summary>
/// <remarks>Based on nnSdk 15.3.0 (FS 15.0.0)</remarks>
public interface IStorageDeviceManagerFactory : IDisposable public interface IStorageDeviceManagerFactory : IDisposable
{ {
Result Create(ref SharedRef<IStorageDeviceManager> outDeviceManager, StorageDevicePortId portId); Result Create(ref SharedRef<IStorageDeviceManager> outDeviceManager, StorageDevicePortId portId);

View file

@ -5,6 +5,11 @@ namespace LibHac.FsSrv.Storage.Sf;
// Note: This interface doesn't actually implement IStorage. We're giving it IStorage as a base because // Note: This interface doesn't actually implement IStorage. We're giving it IStorage as a base because
// StorageServiceObjectAdapter is a template that is used with either IStorage or IStorageDevice // StorageServiceObjectAdapter is a template that is used with either IStorage or IStorageDevice
/// <summary>
/// Allows reading from or writing to a storage device's storage like an <see cref="IStorage"/>, getting or validating
/// its current handle, and opening an <see cref="IStorageDeviceOperator"/> for the storage device.
/// </summary>
/// <remarks>Based on nnSdk 15.3.0 (FS 15.0.0)</remarks>
public interface IStorageDevice : IStorage public interface IStorageDevice : IStorage
{ {
Result GetHandle(out uint handle); Result GetHandle(out uint handle);

View file

@ -5,6 +5,10 @@ using IStorageSf = LibHac.FsSrv.Sf.IStorage;
namespace LibHac.FsSrv.Storage.Sf; namespace LibHac.FsSrv.Storage.Sf;
/// <summary>
/// Allows getting the current state of a storage device and opening various interfaces to operate on it.
/// </summary>
/// <remarks>Based on nnSdk 15.3.0 (FS 15.0.0)</remarks>
public interface IStorageDeviceManager : IDisposable public interface IStorageDeviceManager : IDisposable
{ {
Result IsInserted(out bool isInserted); Result IsInserted(out bool isInserted);

View file

@ -3,6 +3,13 @@ using LibHac.Sf;
namespace LibHac.FsSrv.Storage.Sf; namespace LibHac.FsSrv.Storage.Sf;
/// <summary>
/// A generic interface for operating on a storage device or a storage device manager, containing methods that all take
/// an operation ID and various combinations of on offset/size, input buffers, and output buffers.
/// </summary>
/// <remarks><para>Operation IDs are not common between implementers of the interface. Every implementer will have its own operations
/// and expected input data.</para>
/// <para>Based on nnSdk 15.3.0 (FS 15.0.0)</para></remarks>
public interface IStorageDeviceOperator : IDisposable public interface IStorageDeviceOperator : IDisposable
{ {
Result Operate(int operationId); Result Operate(int operationId);

View file

@ -10,6 +10,10 @@ using IStorageSf = LibHac.FsSrv.Sf.IStorage;
namespace LibHac.GcSrv; namespace LibHac.GcSrv;
/// <summary>
/// The game card manager used on consoles without a game card slot.
/// </summary>
/// <remarks>Based on nnSdk 15.3.0 (FS 15.0.0)</remarks>
public class DummyGameCardManager : IStorageDeviceManager, IStorageDeviceOperator, IGameCardKeyManager public class DummyGameCardManager : IStorageDeviceManager, IStorageDeviceOperator, IGameCardKeyManager
{ {
private SharedRef<DummyEventNotifier> _eventNotifier; private SharedRef<DummyEventNotifier> _eventNotifier;

View file

@ -6,7 +6,7 @@ namespace LibHac.GcSrv;
/// <summary> /// <summary>
/// Manages registering events and signaling them when a game card is inserted or removed. /// Manages registering events and signaling them when a game card is inserted or removed.
/// </summary> /// </summary>
/// <remarks>Based on nnSdk 14.3.0 (FS 14.1.0)</remarks> /// <remarks>Based on nnSdk 15.3.0 (FS 15.0.0)</remarks>
internal class GameCardDetectionEventManager : CardDeviceDetectionEventManager internal class GameCardDetectionEventManager : CardDeviceDetectionEventManager
{ {
private IGcApi _gc; private IGcApi _gc;

View file

@ -10,6 +10,11 @@ using static LibHac.Gc.Values;
namespace LibHac.GcSrv; namespace LibHac.GcSrv;
/// <summary>
/// Performs various operations on the inserted game card.
/// All available operations are listed in <see cref="GameCardOperationIdValue"/>.
/// </summary>
/// <remarks>Based on nnSdk 15.3.0 (FS 15.0.0)</remarks>
internal class GameCardDeviceOperator : IStorageDeviceOperator internal class GameCardDeviceOperator : IStorageDeviceOperator
{ {
private SharedRef<GameCardStorageDevice> _storageDevice; private SharedRef<GameCardStorageDevice> _storageDevice;

View file

@ -19,6 +19,17 @@ using IStorageSf = LibHac.FsSrv.Sf.IStorage;
namespace LibHac.GcSrv; namespace LibHac.GcSrv;
/// <summary>
/// Provides access to the game card and game card ASIC.
/// </summary>
/// <remarks><para> he manager keeps track of the state of the ASIC and uses a handle system to control access to the
/// storage device. When a consumer wants to access the device, they are given a handle that will be used to make sure
/// they're accessing the same device that they originally opened. The manager's internal handle is incremented every
/// time the game card is deactivated. This ensures the consumer doesn't do things like accidentally continue reading
/// from the game card after the card has been swapped.</para>
/// <para>This class implements the <see cref="IStorageDeviceOperator"/> interface, and all available operations are
/// listed in <see cref="GameCardManagerOperationIdValue"/>.</para>
/// <para>Based on nnSdk 15.3.0 (FS 15.0.0)</para></remarks>
public class GameCardManager : IStorageDeviceManager, IStorageDeviceOperator, IGameCardManager, IGameCardKeyManager public class GameCardManager : IStorageDeviceManager, IStorageDeviceOperator, IGameCardManager, IGameCardKeyManager
{ {
private enum CardState private enum CardState

View file

@ -14,7 +14,7 @@ namespace LibHac.GcSrv;
/// <summary> /// <summary>
/// Provides an <see cref="IStorage"/> interface for reading from the game card. /// Provides an <see cref="IStorage"/> interface for reading from the game card.
/// </summary> /// </summary>
/// <remarks>Based on nnSdk 14.3.0 (FS 14.1.0)</remarks> /// <remarks>Based on nnSdk 15.3.0 (FS 15.0.0)</remarks>
internal class ReadOnlyGameCardStorage : IStorage internal class ReadOnlyGameCardStorage : IStorage
{ {
private SharedRef<IGameCardManager> _deviceManager; private SharedRef<IGameCardManager> _deviceManager;
@ -97,7 +97,7 @@ internal class ReadOnlyGameCardStorage : IStorage
/// <summary> /// <summary>
/// Provides an <see cref="IStorage"/> interface for writing to the game card. /// Provides an <see cref="IStorage"/> interface for writing to the game card.
/// </summary> /// </summary>
/// <remarks>Based on nnSdk 14.3.0 (FS 14.1.0)</remarks> /// <remarks>Based on nnSdk 15.3.0 (FS 15.0.0)</remarks>
internal class WriteOnlyGameCardStorage : IStorage internal class WriteOnlyGameCardStorage : IStorage
{ {
private SharedRef<IGameCardManager> _deviceManager; private SharedRef<IGameCardManager> _deviceManager;
@ -165,9 +165,10 @@ internal class WriteOnlyGameCardStorage : IStorage
} }
/// <summary> /// <summary>
/// An adapter that provides an <see cref="IStorageSf"/> interface for a <see cref="IStorage"/>. /// An adapter that directly translates <see cref="IStorageSf"/> sf calls to <see cref="IStorage"/> calls with no checks
/// or validations.
/// </summary> /// </summary>
/// <remarks>Based on nnSdk 14.3.0 (FS 14.1.0)</remarks> /// <remarks>Based on nnSdk 15.3.0 (FS 15.0.0)</remarks>
internal abstract class GameCardStorageInterfaceAdapter : IStorageSf internal abstract class GameCardStorageInterfaceAdapter : IStorageSf
{ {
private SharedRef<IStorage> _baseStorage; private SharedRef<IStorage> _baseStorage;

View file

@ -10,6 +10,10 @@ using LibHac.Sf;
namespace LibHac.GcSrv; namespace LibHac.GcSrv;
/// <summary>
/// An <see cref="IStorageDevice"/> that handles interacting with the currently inserted game card.
/// </summary>
/// <remarks>Based on nnSdk 15.3.0 (FS 15.0.0)</remarks>
internal class GameCardStorageDevice : GameCardStorageInterfaceAdapter, IStorageDevice internal class GameCardStorageDevice : GameCardStorageInterfaceAdapter, IStorageDevice
{ {
private SharedRef<IGameCardManager> _manager; private SharedRef<IGameCardManager> _manager;

View file

@ -1,5 +1,9 @@
namespace LibHac.GcSrv; namespace LibHac.GcSrv;
/// <summary>
/// The operations that <see cref="GameCardManager"/> can perform on the game card ASIC and writable game cards.
/// </summary>
/// <remarks>Based on nnSdk 15.3.0 (FS 15.0.0)</remarks>
public enum GameCardManagerOperationIdValue public enum GameCardManagerOperationIdValue
{ {
Finalize = 1, Finalize = 1,
@ -18,6 +22,10 @@ public enum GameCardManagerOperationIdValue
SimulateDetectionEventSignaled = 14 SimulateDetectionEventSignaled = 14
} }
/// <summary>
/// The operations that <see cref="GameCardDeviceOperator"/> can perform on the inserted game card.
/// </summary>
/// <remarks>Based on nnSdk 15.3.0 (FS 15.0.0)</remarks>
public enum GameCardOperationIdValue public enum GameCardOperationIdValue
{ {
EraseGameCard = 1, EraseGameCard = 1,
@ -29,6 +37,10 @@ public enum GameCardOperationIdValue
GetGameCardStatus = 7 GetGameCardStatus = 7
} }
/// <summary>
/// Specifies which mode the game card storage should be opened as.
/// </summary>
/// <remarks>Based on nnSdk 15.3.0 (FS 15.0.0)</remarks>
public enum OpenGameCardAttribute : long public enum OpenGameCardAttribute : long
{ {
ReadOnly = 0, ReadOnly = 0,

View file

@ -2,6 +2,10 @@
namespace LibHac.GcSrv; namespace LibHac.GcSrv;
/// <summary>
/// Sets the certificate and key used for communicating with the game card ASIC.
/// </summary>
/// <remarks>Based on nnSdk 15.3.0 (FS 15.0.0)</remarks>
public interface IGameCardKeyManager : IDisposable public interface IGameCardKeyManager : IDisposable
{ {
void PresetInternalKeys(ReadOnlySpan<byte> gameCardKey, ReadOnlySpan<byte> gameCardCertificate); void PresetInternalKeys(ReadOnlySpan<byte> gameCardKey, ReadOnlySpan<byte> gameCardCertificate);

View file

@ -3,6 +3,10 @@ using LibHac.Os;
namespace LibHac.GcSrv; namespace LibHac.GcSrv;
/// <summary>
/// Handles granting access to the game card, and keeps track of the current game card handle.
/// </summary>
/// <remarks>Based on nnSdk 15.3.0 (FS 15.0.0)</remarks>
internal interface IGameCardManager : IDisposable internal interface IGameCardManager : IDisposable
{ {
Result AcquireReadLock(ref SharedLock<ReaderWriterLock> outLock, GameCardHandle handle); Result AcquireReadLock(ref SharedLock<ReaderWriterLock> outLock, GameCardHandle handle);

View file

@ -107,6 +107,11 @@ public partial class SdmmcApi
public void Deactivate(Port port) public void Deactivate(Port port)
{ {
if (port == Port.SdCard0)
{
return;
}
throw new NotImplementedException(); throw new NotImplementedException();
} }

View file

@ -5,6 +5,10 @@ using LibHac.Sdmmc;
namespace LibHac.SdmmcSrv; namespace LibHac.SdmmcSrv;
/// <summary>
/// Manages locking and getting the storage from sdmmc devices.
/// </summary>
/// <remarks>Based on nnSdk 15.3.0 (FS 15.0.0)</remarks>
internal interface ISdmmcDeviceManager : IDisposable internal interface ISdmmcDeviceManager : IDisposable
{ {
Result Lock(ref UniqueLockRef<SdkMutexType> outLock, SdmmcHandle handle); Result Lock(ref UniqueLockRef<SdkMutexType> outLock, SdmmcHandle handle);

View file

@ -12,6 +12,11 @@ using MmcPartition = LibHac.Sdmmc.MmcPartition;
namespace LibHac.SdmmcSrv; namespace LibHac.SdmmcSrv;
/// <summary>
/// Performs various operations on the internal MMC storage.
/// All available operations are listed in <see cref="MmcOperationIdValue"/>.
/// </summary>
/// <remarks>Based on nnSdk 15.3.0 (FS 15.0.0)</remarks>
internal class MmcDeviceOperator : IStorageDeviceOperator internal class MmcDeviceOperator : IStorageDeviceOperator
{ {
private SharedRef<MmcPartitionStorageDevice> _storageDevice; private SharedRef<MmcPartitionStorageDevice> _storageDevice;

View file

@ -11,6 +11,12 @@ using MmcPartition = LibHac.Fs.MmcPartition;
namespace LibHac.SdmmcSrv; namespace LibHac.SdmmcSrv;
/// <summary>
/// Manages the state of the internal MMC and allows reading and writing the MMC storage.
/// </summary>
/// <remarks><para>This class implements the <see cref="IStorageDeviceOperator"/> interface, and all available
/// operations are listed in <see cref="MmcManagerOperationIdValue"/>.</para>
/// <para>Based on nnSdk 15.3.0 (FS 15.0.0)</para></remarks>
internal class MmcManager : IStorageDeviceManager, IStorageDeviceOperator, ISdmmcDeviceManager internal class MmcManager : IStorageDeviceManager, IStorageDeviceOperator, ISdmmcDeviceManager
{ {
private const SdmmcHandle MmcHandle = 1; private const SdmmcHandle MmcHandle = 1;
@ -28,6 +34,8 @@ internal class MmcManager : IStorageDeviceManager, IStorageDeviceOperator, ISdmm
private MmcManager(SdmmcApi sdmmc) private MmcManager(SdmmcApi sdmmc)
{ {
// Missing: An optional parameter with the device address space info is passed in and stored in the MmcManager.
_port = Port.Mmc0; _port = Port.Mmc0;
_mutex = new SdkMutex(); _mutex = new SdkMutex();

View file

@ -7,9 +7,15 @@ using LibHac.Os;
using LibHac.Sdmmc; using LibHac.Sdmmc;
using LibHac.Sf; using LibHac.Sf;
using MmcPartition = LibHac.Sdmmc.MmcPartition; using MmcPartition = LibHac.Sdmmc.MmcPartition;
using IStorageSf = LibHac.FsSrv.Sf.IStorage;
namespace LibHac.SdmmcSrv; namespace LibHac.SdmmcSrv;
/// <summary>
/// Provides base functionality for MMC <see cref="IStorageDevice"/> classes. Derived classes will need to provide
/// methods for reading/writing the MMC storage.
/// </summary>
/// <remarks>Based on nnSdk 15.3.0 (FS 15.0.0)</remarks>
internal abstract class MmcPartitionStorageDevice : IDisposable internal abstract class MmcPartitionStorageDevice : IDisposable
{ {
private SharedRef<ISdmmcDeviceManager> _manager; private SharedRef<ISdmmcDeviceManager> _manager;
@ -81,9 +87,15 @@ internal abstract class MmcPartitionStorageDevice : IDisposable
} }
} }
// The Mmc*PartitionStorageDevice classes inherit both from SdmmcStorageInterfaceAdapter and MmcPartitionStorageDevice /// <summary>
// Because C# doesn't have multiple inheritance, we make a copy of the SdmmcStorageInterfaceAdapter class that inherits /// An adapter that directly translates <see cref="IStorageSf"/> sf calls to <see cref="IStorage"/> calls with no checks
// from MmcPartitionStorageDevice. This class must mirror any changes made to SdmmcStorageInterfaceAdapter. /// or validations.
/// </summary>
/// <remarks><para>The Mmc*PartitionStorageDevice classes inherit both from <see cref="SdmmcStorageInterfaceAdapter"/>
/// and <see cref="MmcPartitionStorageDevice"/>. Because C# doesn't have multiple inheritance, we make a copy of the
/// <see cref="SdmmcStorageInterfaceAdapter"/> class that inherits from <see cref="MmcPartitionStorageDevice"/>.
/// This class must mirror any changes made to <see cref="SdmmcStorageInterfaceAdapter"/>.</para>
/// <para>Based on nnSdk 15.3.0 (FS 15.0.0)</para></remarks>
internal abstract class MmcPartitionStorageDeviceInterfaceAdapter : MmcPartitionStorageDevice, IStorageDevice internal abstract class MmcPartitionStorageDeviceInterfaceAdapter : MmcPartitionStorageDevice, IStorageDevice
{ {
private readonly IStorage _baseStorage; private readonly IStorage _baseStorage;
@ -129,12 +141,16 @@ internal abstract class MmcPartitionStorageDeviceInterfaceAdapter : MmcPartition
} }
} }
/// <summary>
/// An <see cref="IStorageDevice"/> that handles interacting with the <see cref="MmcPartition.UserData"/> partition
/// on the internal MMC.
/// </summary>
/// <remarks>Based on nnSdk 15.3.0 (FS 15.0.0)</remarks>
internal class MmcUserDataPartitionStorageDevice : MmcPartitionStorageDeviceInterfaceAdapter internal class MmcUserDataPartitionStorageDevice : MmcPartitionStorageDeviceInterfaceAdapter
{ {
private MmcUserDataPartitionStorageDevice(ref SharedRef<ISdmmcDeviceManager> manager, SdmmcHandle handle, private MmcUserDataPartitionStorageDevice(ref SharedRef<ISdmmcDeviceManager> manager, SdmmcHandle handle,
SdmmcApi sdmmc) SdmmcApi sdmmc)
: base(manager.Get.GetStorage(), MmcPartition.UserData, ref manager, handle, sdmmc) : base(manager.Get.GetStorage(), MmcPartition.UserData, ref manager, handle, sdmmc) { }
{ }
public static SharedRef<MmcUserDataPartitionStorageDevice> CreateShared(ref SharedRef<ISdmmcDeviceManager> manager, public static SharedRef<MmcUserDataPartitionStorageDevice> CreateShared(ref SharedRef<ISdmmcDeviceManager> manager,
SdmmcHandle handle, SdmmcApi sdmmc) SdmmcHandle handle, SdmmcApi sdmmc)
@ -189,12 +205,16 @@ internal class MmcUserDataPartitionStorageDevice : MmcPartitionStorageDeviceInte
} }
} }
/// <summary>
/// An <see cref="IStorageDevice"/> that handles interacting with the <see cref="MmcPartition.BootPartition1"/> and
/// <see cref="MmcPartition.BootPartition2"/> partitions on the internal MMC.
/// </summary>
/// <remarks>Based on nnSdk 15.3.0 (FS 15.0.0)</remarks>
internal class MmcBootPartitionStorageDevice : MmcPartitionStorageDeviceInterfaceAdapter internal class MmcBootPartitionStorageDevice : MmcPartitionStorageDeviceInterfaceAdapter
{ {
private MmcBootPartitionStorageDevice(Fs.MmcPartition partition, ref SharedRef<ISdmmcDeviceManager> manager, private MmcBootPartitionStorageDevice(Fs.MmcPartition partition, ref SharedRef<ISdmmcDeviceManager> manager,
SdmmcHandle handle, SdmmcApi sdmmc) SdmmcHandle handle, SdmmcApi sdmmc)
: base(manager.Get.GetStorage(), GetPartition(partition), ref manager, handle, sdmmc) : base(manager.Get.GetStorage(), GetPartition(partition), ref manager, handle, sdmmc) { }
{ }
public static SharedRef<MmcBootPartitionStorageDevice> CreateShared(Fs.MmcPartition partition, public static SharedRef<MmcBootPartitionStorageDevice> CreateShared(Fs.MmcPartition partition,
ref SharedRef<ISdmmcDeviceManager> manager, SdmmcHandle handle, SdmmcApi sdmmc) ref SharedRef<ISdmmcDeviceManager> manager, SdmmcHandle handle, SdmmcApi sdmmc)

View file

@ -21,7 +21,7 @@ namespace LibHac.SdmmcSrv;
/// Every 2 hours it will save the current state of the patrol read to Boot Partition 1 on the MMC. /// Every 2 hours it will save the current state of the patrol read to Boot Partition 1 on the MMC.
/// This state contains the next sector index to be read and the number of times the MMC has been patrolled /// This state contains the next sector index to be read and the number of times the MMC has been patrolled
/// from start to finish.</para> /// from start to finish.</para>
/// <para>Based on nnSdk 14.3.0 (FS 14.1.0)</para></remarks> /// <para>Based on nnSdk 15.3.0 (FS 15.0.0)</para></remarks>
internal class PatrolReader internal class PatrolReader
{ {
// Note: This class won't work until events and timer events are properly implemented. // Note: This class won't work until events and timer events are properly implemented.

View file

@ -3,6 +3,10 @@ using LibHac.Sdmmc;
namespace LibHac.SdmmcSrv; namespace LibHac.SdmmcSrv;
/// <summary>
/// Registers an sdmmc detection callback when constructed, and unregisters the callback when disposed.
/// </summary>
/// <remarks>Based on nnSdk 15.3.0 (FS 15.0.0)</remarks>
internal class SdCardDetectionEventManager : CardDeviceDetectionEventManager internal class SdCardDetectionEventManager : CardDeviceDetectionEventManager
{ {
// LibHac addition // LibHac addition

View file

@ -9,6 +9,11 @@ using static LibHac.SdmmcSrv.SdmmcResultConverter;
namespace LibHac.SdmmcSrv; namespace LibHac.SdmmcSrv;
/// <summary>
/// Performs various operations on the inserted SD card.
/// All available operations are listed in <see cref="SdCardOperationIdValue"/>.
/// </summary>
/// <remarks>Based on nnSdk 15.3.0 (FS 15.0.0)</remarks>
internal class SdCardDeviceOperator : IStorageDeviceOperator internal class SdCardDeviceOperator : IStorageDeviceOperator
{ {
private SharedRef<SdCardStorageDevice> _storageDevice; private SharedRef<SdCardStorageDevice> _storageDevice;

View file

@ -13,6 +13,12 @@ using IStorageSf = LibHac.FsSrv.Sf.IStorage;
namespace LibHac.SdmmcSrv; namespace LibHac.SdmmcSrv;
/// <summary>
/// Manages the state of the SD card and allows reading and writing the SD card storage.
/// </summary>
/// <remarks><para>This class implements the <see cref="IStorageDeviceOperator"/> interface, and all available
/// operations are listed in <see cref="SdCardManagerOperationIdValue"/>.</para>
/// <para>Based on nnSdk 15.3.0 (FS 15.0.0)</para></remarks>
public class SdCardManager : IStorageDeviceManager, IStorageDeviceOperator, ISdmmcDeviceManager public class SdCardManager : IStorageDeviceManager, IStorageDeviceOperator, ISdmmcDeviceManager
{ {
private const SdmmcHandle InvalidHandle = 0; private const SdmmcHandle InvalidHandle = 0;
@ -37,6 +43,8 @@ public class SdCardManager : IStorageDeviceManager, IStorageDeviceOperator, ISdm
private SdCardManager(SdmmcApi sdmmc) private SdCardManager(SdmmcApi sdmmc)
{ {
// Missing: An optional parameter with the device address space info is passed in and stored in the SdCardManager.
_port = Port.SdCard0; _port = Port.SdCard0;
_mutex = new SdkMutexType(); _mutex = new SdkMutexType();
_sdStorage = new SdmmcStorage(_port, sdmmc); _sdStorage = new SdmmcStorage(_port, sdmmc);
@ -141,7 +149,6 @@ public class SdCardManager : IStorageDeviceManager, IStorageDeviceOperator, ISdm
outDeviceOperator.SetByMove(ref deviceOperator.Ref); outDeviceOperator.SetByMove(ref deviceOperator.Ref);
return Result.Success; return Result.Success;
} }
public Result OpenDevice(ref SharedRef<IStorageDevice> outStorageDevice, ulong attribute) public Result OpenDevice(ref SharedRef<IStorageDevice> outStorageDevice, ulong attribute)
@ -195,7 +202,7 @@ public class SdCardManager : IStorageDeviceManager, IStorageDeviceOperator, ISdm
using ScopedLock<SdkMutexType> scopedLock = ScopedLock.Lock(ref _mutex); using ScopedLock<SdkMutexType> scopedLock = ScopedLock.Lock(ref _mutex);
DeactivateIfCardRemoved(); DeactivateIfCardRemoved();
if (IsShutDown()) if (IsShutDown())
{ {
outHandle = InvalidHandle; outHandle = InvalidHandle;

View file

@ -7,6 +7,10 @@ using LibHac.Sf;
namespace LibHac.SdmmcSrv; namespace LibHac.SdmmcSrv;
/// <summary>
/// An <see cref="IStorageDevice"/> that handles interacting with the currently inserted game card.
/// </summary>
/// <remarks>Based on nnSdk 15.3.0 (FS 15.0.0)</remarks>
internal class SdCardStorageDevice : SdmmcStorageInterfaceAdapter, IStorageDevice internal class SdCardStorageDevice : SdmmcStorageInterfaceAdapter, IStorageDevice
{ {
private SharedRef<ISdmmcDeviceManager> _manager; private SharedRef<ISdmmcDeviceManager> _manager;

View file

@ -3,6 +3,10 @@ using LibHac.Sdmmc;
namespace LibHac.SdmmcSrv; namespace LibHac.SdmmcSrv;
/// <summary>
/// Contains functions to convert <see cref="ResultSdmmc"/> <see cref="Result"/>s to their <see cref="ResultFs"/> equivalent.
/// </summary>
/// <remarks>Based on nnSdk 15.3.0 (FS 15.0.0)</remarks>
public static class SdmmcResultConverter public static class SdmmcResultConverter
{ {
public static Result GetFsResult(Port port, Result result) public static Result GetFsResult(Port port, Result result)

View file

@ -1,5 +1,9 @@
namespace LibHac.SdmmcSrv; namespace LibHac.SdmmcSrv;
/// <summary>
/// The operations that <see cref="SdCardManager"/> can perform on the SD card device.
/// </summary>
/// <remarks>Based on nnSdk 15.3.0 (FS 15.0.0)</remarks>
public enum SdCardManagerOperationIdValue public enum SdCardManagerOperationIdValue
{ {
GetAndClearErrorInfo = 1, GetAndClearErrorInfo = 1,
@ -8,6 +12,10 @@ public enum SdCardManagerOperationIdValue
SimulateDetectionEventSignaled = 4 SimulateDetectionEventSignaled = 4
} }
/// <summary>
/// The operations that <see cref="SdCardDeviceOperator"/> can perform on the inserted SD card.
/// </summary>
/// <remarks>Based on nnSdk 15.3.0 (FS 15.0.0)</remarks>
public enum SdCardOperationIdValue public enum SdCardOperationIdValue
{ {
GetSpeedMode = 1, GetSpeedMode = 1,
@ -18,6 +26,10 @@ public enum SdCardOperationIdValue
GetProtectedAreaSize = 6 GetProtectedAreaSize = 6
} }
/// <summary>
/// The operations that <see cref="MmcManager"/> can perform on the internal MMC device.
/// </summary>
/// <remarks>Based on nnSdk 15.3.0 (FS 15.0.0)</remarks>
public enum MmcManagerOperationIdValue public enum MmcManagerOperationIdValue
{ {
GetAndClearErrorInfo = 1, GetAndClearErrorInfo = 1,
@ -29,6 +41,10 @@ public enum MmcManagerOperationIdValue
ResumePatrol = 7 ResumePatrol = 7
} }
/// <summary>
/// The operations that <see cref="MmcDeviceOperator"/> can perform on the internal MMC storage.
/// </summary>
/// <remarks>Based on nnSdk 15.3.0 (FS 15.0.0)</remarks>
public enum MmcOperationIdValue public enum MmcOperationIdValue
{ {
GetSpeedMode = 1, GetSpeedMode = 1,

View file

@ -14,6 +14,11 @@ using IStorageSf = LibHac.FsSrv.Sf.IStorage;
namespace LibHac.SdmmcSrv; namespace LibHac.SdmmcSrv;
/// <summary>
/// Provides an <see cref="IStorage"/> interface for calling the sdmmc Read and Write functions.
/// The offset and size of reads and writes must be aligned to 0x200 bytes (<see cref="SdmmcApi.SectorSize"/>).
/// </summary>
/// <remarks>Based on nnSdk 15.3.0 (FS 15.0.0)</remarks>
internal class SdmmcStorage : IStorage internal class SdmmcStorage : IStorage
{ {
private Port _port; private Port _port;
@ -142,6 +147,11 @@ internal class SdmmcStorage : IStorage
} }
} }
/// <summary>
/// An adapter that directly translates <see cref="IStorageSf"/> sf calls to <see cref="IStorage"/> calls with no checks
/// or validations.
/// </summary>
/// <remarks>Based on nnSdk 15.3.0 (FS 15.0.0)</remarks>
internal class SdmmcStorageInterfaceAdapter : IStorageSf internal class SdmmcStorageInterfaceAdapter : IStorageSf
{ {
private IStorage _baseStorage; private IStorage _baseStorage;