/* ------------------------------------------- Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. ------------------------------------------- */ /* ------------------------------------------- Revision History: 31/01/24: Add kDeviceCnt (amlel) 15/11/24: Add NE_DEVICE macro, to inherit from device object. ------------------------------------------- */ #pragma once /* @note Device Mgr. */ /* @file KernelKit/DeviceMgr.h */ /* @brief Device abstraction and I/O buffer. */ #include #include #define kDeviceMgrRootDirPath "/devices/" #define NE_DEVICE : public ::Kernel::IDeviceObject // Last Rev: Wed, May 27, 2025 6:22 PM namespace Kernel { template class IDeviceObject; template class IOBuf; /***********************************************************************************/ /// @brief Device contract interface, represents an HW device. /***********************************************************************************/ template class IDeviceObject { public: explicit IDeviceObject(void (*Out)(IDeviceObject*, T), void (*In)(IDeviceObject*, T)) : fOut(Out), fIn(In) {} virtual ~IDeviceObject() = default; public: IDeviceObject& operator=(const IDeviceObject&) = default; IDeviceObject(const IDeviceObject&) = default; public: virtual IDeviceObject& operator<<(T Data) { fOut(this, Data); return *this; } virtual IDeviceObject& operator>>(T Data) { fIn(this, Data); return *this; } virtual const char* Name() const { return "/devices/null"; } operator bool() { return fOut && fIn; } Bool operator!() { return !fOut || !fIn; } protected: Void (*fOut)(IDeviceObject*, T Data) = {nullptr}; Void (*fIn)(IDeviceObject*, T Data) = {nullptr}; }; /// /// @brief Input Output abstract class. /// Used mainly to communicate between OS to hardware. /// template class IOBuf final { public: explicit IOBuf(T dma_addr) : fData(dma_addr) { // At least pass something valid when instancating this struct. MUST_PASS(fData); } IOBuf& operator=(const IOBuf&) = default; IOBuf(const IOBuf&) = default; ~IOBuf() = default; public: template R operator->() const { return fData; } template R& operator[](Size index) const { return fData[index]; } private: T fData; }; ///! @brief Device enum types. enum { kDeviceTypeInvalid = 0, kDeviceTypeIDE = 100, kDeviceTypeEthernet, kDeviceTypeWiFi, kDeviceTypeFW, kDeviceTypeBT, kDeviceTypeRS232, kDeviceTypeSCSI, kDeviceTypeAHCI, kDeviceTypeMBCI, kDeviceTypeATA, kDeviceTypeUSB, kDeviceTypeAPM, // Adv. Pwr. Mgmt. kDeviceTypePCI, kDeviceTypeVGA, kDeviceTypeGPU, kDeviceTypeCount, }; } // namespace Kernel