1/*
2 * Copyright (C) 2020-2022 The opuntiaOS Project Authors.
3 * + Contributed by Nikita Melekhin <nimelehin@gmail.com>
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8
9#ifndef _KERNEL_DRIVERS_BITS_DRIVER_H
10#define _KERNEL_DRIVERS_BITS_DRIVER_H
11
12#include <libkern/types.h>
13
14#define MAX_DRIVER_FUNCTION_COUNT 32
15
16// Supported driver's types
17enum DRIVERS_TYPE {
18 DRIVER_STORAGE_DEVICE = (1 << 0),
19 DRIVER_VIDEO_DEVICE = (1 << 1),
20 DRIVER_SOUND_DEVICE = (1 << 2),
21 DRIVER_INPUT_SYSTEMS_DEVICE = (1 << 3),
22 DRIVER_NETWORK_DEVICE = (1 << 4),
23 DRIVER_BUS_CONTROLLER = (1 << 5),
24 DRIVER_CHAR_DEVICE = (1 << 6),
25 DRIVER_VIRTUAL_FILE_SYSTEM = (1 << 7),
26 DRIVER_FILE_SYSTEM = (1 << 8),
27 DRIVER_VIRTUAL = (1 << 9),
28};
29
30// Api function of DRIVER_STORAGE type
31enum DRIVER_VIDEO_OPERTAION {
32 DRIVER_VIDEO_INIT = 0x1, // function called when a device is found
33 DRIVER_VIDEO_SET_RESOLUTION,
34};
35
36// Api function of DRIVER_STORAGE type
37enum DRIVER_STORAGE_OPERTAION {
38 DRIVER_STORAGE_ADD_DEVICE = 0x1, // function called when a device is found
39 DRIVER_STORAGE_READ,
40 DRIVER_STORAGE_WRITE,
41 DRIVER_STORAGE_FLUSH,
42 DRIVER_STORAGE_CAPACITY,
43};
44
45// Api function of DRIVER_INPUT_SYSTEMS type
46enum DRIVER_INPUT_SYSTEMS_OPERTAION {
47 DRIVER_INPUT_SYSTEMS_ADD_DEVICE = 0x1, // function called when a device is found
48 DRIVER_INPUT_SYSTEMS_GET_LAST_KEY,
49 DRIVER_INPUT_SYSTEMS_DISCARD_LAST_KEY
50};
51
52// Api function of DRIVER_CONTROLLER type
53enum DRIVER_BUS_CONTROLLER_OPERTAION {
54 DRIVER_BUS_CONTROLLER_FIND_DEVICE = 0x1, // function called when a device is found
55};
56
57// Api function of DRIVER_VIRTUAL_FILE_SYSTEM type
58enum DRIVER_VIRTUAL_FILE_SYSTEM_OPERTAION {
59 DRIVER_VIRTUAL_FILE_SYSTEM_ADD_DRIVER = 0x1,
60 DRIVER_VIRTUAL_FILE_SYSTEM_ADD_DEVICE,
61 DRIVER_VIRTUAL_FILE_SYSTEM_EJECT_DEVICE,
62};
63
64// Api function of DRIVER_FILE_SYSTEM type
65enum DRIVER_FILE_SYSTEM_OPERTAION {
66 DRIVER_FILE_SYSTEM_RECOGNIZE = 0x1,
67 DRIVER_FILE_SYSTEM_PREPARE_FS,
68 DRIVER_FILE_SYSTEM_EJECT_DEVICE,
69
70 DRIVER_FILE_SYSTEM_OPEN,
71 DRIVER_FILE_SYSTEM_CAN_READ,
72 DRIVER_FILE_SYSTEM_CAN_WRITE,
73 DRIVER_FILE_SYSTEM_READ,
74 DRIVER_FILE_SYSTEM_WRITE,
75 DRIVER_FILE_SYSTEM_TRUNCATE,
76 DRIVER_FILE_SYSTEM_MKDIR,
77 DRIVER_FILE_SYSTEM_RMDIR,
78
79 DRIVER_FILE_SYSTEM_READ_INODE,
80 DRIVER_FILE_SYSTEM_WRITE_INODE,
81 DRIVER_FILE_SYSTEM_FREE_INODE,
82 DRIVER_FILE_SYSTEM_GET_FSDATA,
83 DRIVER_FILE_SYSTEM_LOOKUP,
84 DRIVER_FILE_SYSTEM_GETDENTS,
85 DRIVER_FILE_SYSTEM_CREATE,
86 DRIVER_FILE_SYSTEM_UNLINK,
87
88 DRIVER_FILE_SYSTEM_FSTAT,
89 DRIVER_FILE_SYSTEM_IOCTL,
90 DRIVER_FILE_SYSTEM_MMAP,
91};
92
93struct driver;
94struct device;
95typedef struct {
96 void (*recieve_notification)(uint32_t key, uint32_t val);
97 int (*on_start)();
98 int (*on_stop)();
99 int (*init_with_dev)(struct device* device);
100} driver_system_funcs_t;
101
102enum DRIVER_DESC_FLAGS {
103 DRIVER_DESC_FLAG_START = (1 << 0),
104};
105
106struct driver_desc {
107 int type;
108 uint32_t flags;
109 uint32_t listened_device_mask;
110 uint32_t listened_driver_mask;
111 void* functions[MAX_DRIVER_FUNCTION_COUNT];
112 driver_system_funcs_t system_funcs;
113};
114typedef struct driver_desc driver_desc_t;
115
116struct driver {
117 int id;
118 int status;
119 driver_desc_t desc;
120 const char* name;
121};
122typedef struct driver driver_t;
123
124#endif // _KERNEL_DRIVERS_BITS_DRIVER_H