;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; ;; BSD 3-Clause License ;; ;; ;; ;; Copyright (C) 2022, Mikhail Frolov aka Doczom ;; ;; All rights reserved. ;; ;; ;; ;; Device subsystem from kernel Kolibri OS. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Подсистема устройств ;; Для нормальной работы приложений в ОС должна быть система ;; работы с оборудованием. Для стандартизации доступа (единого ;; интерфейса взаимодействия) к оборудованию нужен интерфейс ;; позволяющий обращаться к функциям устройства и различать эти ;; устройства между собой. ;; Для чёткой идентефикациии устройств есть 2 поля: ;; * virt_type - Это виртуальный тип устройства, на основе ;; которого можно определить базовые функции ;; устройства. Например последовательный порт, ;; HID устройство или принтеры. ;; Для каждого типа должен существовать набор ;; функций, позволяющий организовать минимальный ;; интерфейс для работы с данным оборудованием. ;; Кроме этого базвого интерфейса, могут быть и ;; дополнительные функции. ;; * real_type - Это реальный идентификатор устройства, через ;; который можно получить информацию о расположении ;; оборудования в компьютере(шина данны, порт, номер ;; шины, device_id, vendor_id, класс устройства и тд). ;; ;; Для ; real_type format ; ; offset 0x00 ; 0xYYRRRRXX ; YY - bus protool ; 0 - old dev ; 1 - pci dev ; 2 - acpi dev ; 3 - usb dev ; 4 - virtual dev ; XX - подтип, например для pci тут будет по сути класс, для юсб тоже, для acpi не знаю ; RRRR - остальная часть типа, тут может быть подтип например ; ; offset 0x04 - other data for bus: number port, number bus, and etc. ; dword = 0xPPBBRRRR ; PP - port device ; BB - bus number ; RRRR - other data bus ; Type ; dword = 0xTTTTTTNN ; TTTTTT - type device ; 0xFF - unknown device type ; NN - motes for this type ; 0xFF - unknown device struct DEVICE next dd 0 prev dd 0 root dd 0 ; ptr to root device for this device list_dev dd 0 dd 0 lock MUTEX state_flags dd 0 ; bit0: 0 - driver not found 1 - driver found ; bit1: 0 - driver notlock dev 1 - driver lock dev ; Функции устройства - для работы с устройством из драйвера dev_func_data dd 0 ; uint32_t value for call function dev_func_arr_u dd 0 ; ptr to array userspace function dev_func_arr_k dd 0 ; ptr to array kernel function ; данные драйвера для вызова из программм drv_func_data dd 0 ; uint32_t value for call function drv_func_arr_u dd 0 ; ptr to array userspace function drv_func_arr_k dd 0 ; ptr to array kernel function ; состояния ; данные устройства - характеристики type DEV_FUNC_TYPE phys_type DEV_PHYS_TYPE ends ; type on system, for knowing list functions this device ; (printer, serial port, etc ) struct DEV_FUNC_TYPE main_type dd 0 sub_type dd 0 ends struct DEV_PHYS_TYPE ; с запасом на ACPI, DMI и прочие тяжёлые интерфейсы type_bus dw 0 data_bus dw 0 ; больше данных о шине vendor_id dw 0 device_id dw 0 class dd 0 rswd rd 5 ends ; format functions ; stdcall NTSTATUS name_func(uint32_t context, IOCTL* param) ; typedef DEV_IO_FD uint32_t; ; Functions subsystem ; ; stdcall DEVICE* add_device(DEV_PHYS_TYPE* phys_type, ; int32_t phys_type_size, ; DEVICE* root_device, ; void* function_array, ; uint32_t context); ; stdcall int32_t del_device(DEVICE* handle) ; stdcall DEV_IO_FD open_device_io(DEVICE* handle, uint32_t flags) ; stdcall int32_t close_device_io(DEV_IO_FD io_fd) ; stdcall int32_t call_device_u(DEV_FD io_func_fd, ; DEV_IOCTL* param) ; stdcall int32_t call_device_k(DEV_IO_FD io_func_fd, ; DEV_IOCTL* param) ; stdcall int32_t prob_device_driver(DEVICE* handle, ; void* prob_function) ; stdcall ; Driver Function ; stdcall int32_t prob_function(DEVICE* handle, ; DEV_IO_FD io_func_fd, ; DEV_FUNC_TYPE* dev_type, ; void** func_array, ; uint32_t* context) ; DF_NO_PROTECT = 00b - функция никак не влияет на устройство и драйвер; ; DF_PROTECTED_1 = 01b - Функция влияет на работу основного драйвера; ; DF_PROTECTED_2 = 10b - функция не влияет на работу основного драйвера, ; но может косвенно воздействовать на него. ; ;dev_func_array: ; dd dev_func_array.count_func ; dd (func_1_my_device and not 11b) or DF_PROTECT ; dd (func_2_my_device and not 11b) or DF_NO_PROTECT ; ;.count_func = ($ - dev_func_array - 4)/4 ;