50 lines
1.4 KiB
C++
50 lines
1.4 KiB
C++
|
#include "fs/devices/DeviceRegistry.h"
|
||
|
#include "Log.h"
|
||
|
#include "fs/devices/ConsoleDevice.h"
|
||
|
#include "fs/devices/NullDevice.h"
|
||
|
#include <luna/Vector.h>
|
||
|
|
||
|
struct DeviceDescriptor
|
||
|
{
|
||
|
device_create_func_t initializer;
|
||
|
u32 major;
|
||
|
u32 minor;
|
||
|
};
|
||
|
|
||
|
Vector<DeviceDescriptor> g_available_devices = {};
|
||
|
|
||
|
namespace DeviceRegistry
|
||
|
{
|
||
|
Result<SharedPtr<Device>> create_special_device(u32 major, u32 minor)
|
||
|
{
|
||
|
for (const auto& descriptor : g_available_devices)
|
||
|
{
|
||
|
if (descriptor.major == major && descriptor.minor == minor) return descriptor.initializer();
|
||
|
}
|
||
|
|
||
|
return err(ENODEV);
|
||
|
}
|
||
|
|
||
|
Result<void> register_special_device(u32 major, u32 minor, device_create_func_t initializer)
|
||
|
{
|
||
|
for (const auto& descriptor : g_available_devices)
|
||
|
{
|
||
|
if (descriptor.major == major && descriptor.minor == minor) return err(EEXIST);
|
||
|
}
|
||
|
|
||
|
kdbgln("device manager: registered new device type %u:%u", major, minor);
|
||
|
|
||
|
return g_available_devices.try_append(
|
||
|
DeviceDescriptor { .initializer = initializer, .major = major, .minor = minor });
|
||
|
}
|
||
|
|
||
|
Result<void> init()
|
||
|
{
|
||
|
// Hardcode default devices.
|
||
|
TRY(register_special_device(DeviceMajorTypes::Memory, 0, NullDevice::create));
|
||
|
TRY(register_special_device(DeviceMajorTypes::Console, 0, ConsoleDevice::create));
|
||
|
|
||
|
return {};
|
||
|
}
|
||
|
}
|