mirror of
https://github.com/EnderIce2/Fennix.git
synced 2025-05-28 15:34:31 +00:00
feat(kernel/driver): add CreateDeviceFile method
Signed-off-by: EnderIce2 <enderice2@protonmail.com>
This commit is contained in:
parent
f31d11f7ad
commit
1af2cf657d
@ -747,6 +747,43 @@ namespace Driver
|
|||||||
ReturnLogError(-1, "No available slots for device %d", DriverID);
|
ReturnLogError(-1, "No available slots for device %d", DriverID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dev_t Manager::CreateDeviceFile(dev_t DriverID, const char *name, mode_t mode, const InodeOperations *Operations)
|
||||||
|
{
|
||||||
|
std::unordered_map<dev_t, Driver::DriverObject> &drivers = DriverManager->GetDrivers();
|
||||||
|
const auto it = drivers.find(DriverID);
|
||||||
|
if (it == drivers.end())
|
||||||
|
ReturnLogError(-EINVAL, "Driver %d not found", DriverID);
|
||||||
|
const Driver::DriverObject *drv = &it->second;
|
||||||
|
|
||||||
|
auto dop = drv->DeviceOperations;
|
||||||
|
for (size_t i = 0; i < 128; i++)
|
||||||
|
{
|
||||||
|
const auto dOps = dop->find(i);
|
||||||
|
if (dOps != dop->end())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
FileNode *node = fs->GetByPath(name, devNode);
|
||||||
|
if (node)
|
||||||
|
ReturnLogError(-EEXIST, "Device file %s already exists", name);
|
||||||
|
|
||||||
|
node = fs->Create(devNode, name, mode);
|
||||||
|
if (node == nullptr)
|
||||||
|
ReturnLogError(-ENOMEM, "Failed to create device file %s", name);
|
||||||
|
|
||||||
|
node->Node->SetDevice(DriverID, i);
|
||||||
|
|
||||||
|
DriverHandlers dh{};
|
||||||
|
dh.Ops = Operations;
|
||||||
|
dh.Node = node->Node;
|
||||||
|
dh.InputReports = new RingBuffer<InputReport>(16);
|
||||||
|
dop->insert({i, std::move(dh)});
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnLogError(-1, "No available slots for device %d", DriverID);
|
||||||
|
return -1; /* -Werror=return-type */
|
||||||
|
}
|
||||||
|
|
||||||
int Manager::UnregisterDevice(dev_t DriverID, dev_t Device)
|
int Manager::UnregisterDevice(dev_t DriverID, dev_t Device)
|
||||||
{
|
{
|
||||||
std::unordered_map<dev_t, Driver::DriverObject> &drivers =
|
std::unordered_map<dev_t, Driver::DriverObject> &drivers =
|
||||||
|
@ -149,6 +149,8 @@ namespace Driver
|
|||||||
*/
|
*/
|
||||||
dev_t CreateIncrementalDevice(dev_t DriverID, const std::string &Prefix, mode_t Mode, InodeOperations *Ops);
|
dev_t CreateIncrementalDevice(dev_t DriverID, const std::string &Prefix, mode_t Mode, InodeOperations *Ops);
|
||||||
|
|
||||||
|
dev_t CreateDeviceFile(dev_t DriverID, const char *name, mode_t mode, const InodeOperations *Operations);
|
||||||
|
|
||||||
dev_t RegisterDevice(dev_t DriverID, DeviceType Type, const InodeOperations *Operations);
|
dev_t RegisterDevice(dev_t DriverID, DeviceType Type, const InodeOperations *Operations);
|
||||||
int ReportInputEvent(dev_t DriverID, InputReport *Report);
|
int ReportInputEvent(dev_t DriverID, InputReport *Report);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user