58 lines
1.8 KiB
C
58 lines
1.8 KiB
C
#ifndef _KERNEL_DRIVERS_DRIVER_MANAGER_H
|
|
#define _KERNEL_DRIVERS_DRIVER_MANAGER_H
|
|
|
|
#include <drivers/bits/device.h>
|
|
#include <drivers/bits/driver.h>
|
|
#include <drivers/devtree.h>
|
|
#include <libkern/types.h>
|
|
|
|
#define MAX_DRIVERS_COUNT 256
|
|
#define MAX_DEVICES_COUNT 64
|
|
|
|
#define DEVMAN_FUNC_NOTIFY 0x0
|
|
#define DEVMAN_FUNC_DEVICE_START 0x1
|
|
#define DEVMAN_FUNC_DRIVER_START 0x1
|
|
#define DEVMAN_FUNC_DRIVER_EMIT_DRIVER 0x1
|
|
#define DEVMAN_FUNC_DRIVER_EMIT_DEVICE 0x2
|
|
|
|
#define DEFAULT_DRIVER_PRIV (100)
|
|
|
|
typedef void (*driver_installation_func_t)();
|
|
#define devman_register_driver_installation_order(func, N) \
|
|
static driver_installation_func_t registered_driver_##func \
|
|
__attribute__((used)) __attribute__((section(".driver_init_sections." #N))) \
|
|
= func
|
|
|
|
#define devman_register_driver_installation(func) devman_register_driver_installation_order(func, DEFAULT_DRIVER_PRIV)
|
|
|
|
enum DEVMAN_NOTIFICATIONS {
|
|
DEVMAN_NOTIFICATION_DEVFS_READY = 0,
|
|
DEVMAN_NOTIFICATION_NEW_DRIVER = 1,
|
|
DEVMAN_NOTIFICATION_NEW_DEVICE = 2,
|
|
DEVMAN_NOTIFICATION_STOP,
|
|
};
|
|
|
|
extern driver_t drivers[MAX_DRIVERS_COUNT];
|
|
extern device_t devices[MAX_DEVICES_COUNT];
|
|
|
|
int devman_init();
|
|
int devman_install_drivers();
|
|
void devman_run();
|
|
int devman_register_driver(driver_desc_t driver_info, const char* name);
|
|
int devman_register_device(device_desc_t device_info, int type);
|
|
device_t* new_virtual_device(int type);
|
|
int devman_get_driver_id_by_name(const char* name);
|
|
void devman_send_notification(uintptr_t msg, uintptr_t param);
|
|
|
|
static inline void* devman_driver_function(int driver_id, int function_id)
|
|
{
|
|
return drivers[driver_id].desc.functions[function_id];
|
|
}
|
|
|
|
static inline void* devman_function_handler(device_t* dev, int function_id)
|
|
{
|
|
return devman_driver_function(dev->driver_id, function_id);
|
|
}
|
|
|
|
#endif // _KERNEL_DRIVERS_DRIVER_MANAGER_H
|