Luna/kernel/src/fs/devices/DeviceRegistry.cpp

54 lines
1.6 KiB
C++
Raw Normal View History

#include "fs/devices/DeviceRegistry.h"
#include "Log.h"
#include "fs/devices/ConsoleDevice.h"
#include "fs/devices/FramebufferDevice.h"
#include "fs/devices/NullDevice.h"
2023-03-30 21:19:16 +02:00
#include "fs/devices/ZeroDevice.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("DeviceRegistry: 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));
2023-03-30 21:19:16 +02:00
TRY(register_special_device(DeviceMajorTypes::Memory, 1, ZeroDevice::create));
TRY(register_special_device(DeviceMajorTypes::Console, 0, ConsoleDevice::create));
TRY(register_special_device(DeviceMajorTypes::Framebuffer, 0, FramebufferDevice::create));
return {};
}
}