Добавление модуля-драйвера PCI
This commit is contained in:
parent
4f0c943fa3
commit
4061a74523
|
@ -0,0 +1,6 @@
|
||||||
|
#/bin/sh
|
||||||
|
echo "Название: PCI"
|
||||||
|
echo "Лицензия: Публичное достояние"
|
||||||
|
gcc -I../../modlib -O0 -finput-charset=UTF-8 -fexec-charset=cp1251 -c -fPIC -nostdlib main.c -o pci.o
|
||||||
|
gcc -Wl,--entry=init -fPIC -shared -nostdlib pci.o -o pci.ko
|
||||||
|
echo "Сборка завершена, файл: pci.ko"
|
|
@ -0,0 +1,75 @@
|
||||||
|
#include <system.h>
|
||||||
|
|
||||||
|
static inline uint32_t inl(uint16_t port) {
|
||||||
|
uint32_t data;
|
||||||
|
asm volatile("inl %1, %0" : "=a"(data) : "Nd"(port));
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void outl(uint16_t port, uint32_t data) {
|
||||||
|
asm volatile("outl %0, %1" : : "a"(data), "Nd"(port));
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint16_t pci_read_word(uint16_t bus, uint16_t slot, uint16_t func,
|
||||||
|
uint16_t offset) {
|
||||||
|
uint64_t address;
|
||||||
|
uint64_t lbus = (uint64_t)bus;
|
||||||
|
uint64_t lslot = (uint64_t)slot;
|
||||||
|
uint64_t lfunc = (uint64_t)func;
|
||||||
|
uint16_t tmp = 0;
|
||||||
|
address = (uint64_t)((lbus << 16) | (lslot << 11) | (lfunc << 8) |
|
||||||
|
(offset & 0xFC) | ((uint32_t)0x80000000));
|
||||||
|
outl(0xCF8, address);
|
||||||
|
tmp = (uint16_t)((inl(0xCFC) >> ((offset & 2) * 8)) & 0xFFFF);
|
||||||
|
return (tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint16_t get_vendor_id(uint16_t bus, uint16_t device,
|
||||||
|
uint16_t function) {
|
||||||
|
uint32_t r0 = pci_read_word(bus, device, function, 0);
|
||||||
|
return r0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint16_t get_device_id(uint16_t bus, uint16_t device,
|
||||||
|
uint16_t function) {
|
||||||
|
uint32_t r0 = pci_read_word(bus, device, function, 2);
|
||||||
|
return r0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint16_t get_class_id(uint16_t bus, uint16_t device, uint16_t function) {
|
||||||
|
uint32_t r0 = pci_read_word(bus, device, function, 0xA);
|
||||||
|
return (r0 & ~0x00FF) >> 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint16_t get_sub_class_id(uint16_t bus, uint16_t device,
|
||||||
|
uint16_t function) {
|
||||||
|
uint32_t r0 = pci_read_word(bus, device, function, 0xA);
|
||||||
|
return (r0 & ~0xFF00);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void scan( ) {
|
||||||
|
uint64_t devices = 0;
|
||||||
|
for (uint32_t bus = 0; bus < 256; bus++) {
|
||||||
|
for (uint32_t slot = 0; slot < 32; slot++) {
|
||||||
|
for (uint32_t function = 0; function < 8; function++) {
|
||||||
|
uint16_t vendor = get_vendor_id(bus, slot, function);
|
||||||
|
if (vendor == 0xFFFF) { continue; }
|
||||||
|
uint16_t device_id = get_device_id(bus, slot, function);
|
||||||
|
uint16_t class_id = get_class_id(bus, slot, function);
|
||||||
|
|
||||||
|
fb_printf("[%u] vendor: %x, device: %x, class: %u\n",
|
||||||
|
devices, vendor, device_id);
|
||||||
|
devices++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module_info_t init(env_t *env) {
|
||||||
|
init_env(env);
|
||||||
|
scan( );
|
||||||
|
return (module_info_t){ .name = (char *)"[PCI]",
|
||||||
|
.message = (char *)"PCI драйвер",
|
||||||
|
.err_code = 0,
|
||||||
|
.func_count = 1 };
|
||||||
|
}
|
|
@ -133,7 +133,7 @@ def create_hdd(IMAGE_NAME):
|
||||||
os.system(f"mformat -i {IMAGE_NAME}.hdd@@1M")
|
os.system(f"mformat -i {IMAGE_NAME}.hdd@@1M")
|
||||||
os.system(f"mmd -i {IMAGE_NAME}.hdd@@1M ::/mod ::/EFI ::/EFI/BOOT ::/user")
|
os.system(f"mmd -i {IMAGE_NAME}.hdd@@1M ::/mod ::/EFI ::/EFI/BOOT ::/user")
|
||||||
os.system(f"mcopy -i {IMAGE_NAME}.hdd@@1M kernel.elf configs/limine.cfg limine/limine-bios.sys ::/")
|
os.system(f"mcopy -i {IMAGE_NAME}.hdd@@1M kernel.elf configs/limine.cfg limine/limine-bios.sys ::/")
|
||||||
os.system(f"mcopy -i {IMAGE_NAME}.hdd@@1M modules/music/music.ko modules/simd/simd.ko modules/cpubench/cpubench.ko modules/helloworld/hello.ko ::/mod")
|
os.system(f"mcopy -i {IMAGE_NAME}.hdd@@1M modules/pci/pci.ko modules/simd/simd.ko modules/cpubench/cpubench.ko ::/mod")
|
||||||
os.system(f"mcopy -i {IMAGE_NAME}.hdd@@1M limine/BOOTX64.EFI limine/BOOTIA32.EFI ::/EFI/BOOT")
|
os.system(f"mcopy -i {IMAGE_NAME}.hdd@@1M limine/BOOTX64.EFI limine/BOOTIA32.EFI ::/EFI/BOOT")
|
||||||
os.system(f"mcopy -i {IMAGE_NAME}.hdd@@1M boot.jpg boot.tga ::/")
|
os.system(f"mcopy -i {IMAGE_NAME}.hdd@@1M boot.jpg boot.tga ::/")
|
||||||
os.system(f"./limine/limine bios-install {IMAGE_NAME}.hdd")
|
os.system(f"./limine/limine bios-install {IMAGE_NAME}.hdd")
|
||||||
|
@ -147,8 +147,7 @@ def create_iso(IMAGE_NAME):
|
||||||
os.system(f"cp -v kernel.elf boot.jpg boot.tga configs/limine.cfg limine/limine-bios.sys limine/limine-bios-cd.bin limine/limine-uefi-cd.bin iso_root/")
|
os.system(f"cp -v kernel.elf boot.jpg boot.tga configs/limine.cfg limine/limine-bios.sys limine/limine-bios-cd.bin limine/limine-uefi-cd.bin iso_root/")
|
||||||
os.system(f"mkdir -p iso_root/EFI/BOOT")
|
os.system(f"mkdir -p iso_root/EFI/BOOT")
|
||||||
os.system(f"mkdir -p iso_root/mod")
|
os.system(f"mkdir -p iso_root/mod")
|
||||||
os.system(f"cp -v modules/helloworld/hello.ko iso_root/mod/")
|
os.system(f"cp -v modules/pci/pci.ko iso_root/mod/")
|
||||||
os.system(f"cp -v modules/music/music.ko iso_root/mod/")
|
|
||||||
os.system(f"cp -v modules/simd/simd.ko iso_root/mod/")
|
os.system(f"cp -v modules/simd/simd.ko iso_root/mod/")
|
||||||
os.system(f"cp -v modules/cpubench/cpubench.ko iso_root/mod/")
|
os.system(f"cp -v modules/cpubench/cpubench.ko iso_root/mod/")
|
||||||
os.system(f"cp -v limine/BOOTX64.EFI iso_root/EFI/BOOT/")
|
os.system(f"cp -v limine/BOOTX64.EFI iso_root/EFI/BOOT/")
|
||||||
|
|
Loading…
Reference in New Issue