-
Notifications
You must be signed in to change notification settings - Fork 0
Driver API
NtinosTheGamer2324 edited this page Dec 11, 2025
·
3 revisions
API for developing hardware drivers in ModuOS.
typedef struct {
const char *name;
int (*init)(void);
int (*probe)(void);
void (*remove)(void);
} driver_t;typedef struct {
uint8_t bus;
uint8_t device;
uint8_t function;
uint16_t vendor_id;
uint16_t device_id;
uint8_t class_code;
uint8_t subclass;
uint32_t bar[6];
} pci_device_t;// Find device by vendor/device ID
pci_device_t* pci_find_device(uint16_t vendor_id, uint16_t device_id);
// Find device by class
pci_device_t* pci_find_class(uint8_t class_code, uint8_t subclass);
// Enable bus mastering
void pci_enable_bus_mastering(pci_device_t *dev);
// Read BAR
uint32_t pci_read_bar(pci_device_t *dev, int bar_num);int mydriver_init(void) {
// Find device
pci_device_t *dev = pci_find_device(VENDOR_ID, DEVICE_ID);
if (!dev) {
return -1;
}
// Enable device
pci_enable_bus_mastering(dev);
pci_enable_memory_space(dev);
// Map BARs
uint32_t bar0 = pci_read_bar(dev, 0);
// Initialize hardware
// ...
return 0;
}void irq_register_handler(int irq, irq_handler_t handler);
void my_irq_handler(registers_t *regs) {
// Handle interrupt
// ...
}
// In driver init:
irq_register_handler(IRQ_NUM, my_irq_handler);// Read from I/O port
uint8_t inb(uint16_t port);
uint16_t inw(uint16_t port);
uint32_t inl(uint16_t port);
// Write to I/O port
void outb(uint16_t port, uint8_t value);
void outw(uint16_t port, uint16_t value);
void outl(uint16_t port, uint32_t value);// Map physical address to virtual
void *ioremap(uint64_t phys_addr, size_t size);
// Access memory-mapped registers
volatile uint32_t *regs = (volatile uint32_t*)ioremap(bar0, 0x1000);
uint32_t status = regs[0];
regs[1] = command;- Device Drivers - Driver overview
- PCI Subsystem - PCI details