Portál AbcLinuxu, 12. května 2025 06:43
Dobré odpoledne,
potřebuji napsat Linux ovladač, který bude vyčítat MMIO (tedy IO mapované do paměti) a údaj předávat dál do user space. Konkrétně se jedná o přečtení hodnoty hlavního čítače HPET. Dle jádra by na mé desce měl HPET ležet na adrese 0xFED00000 a příslučný čítač má offset 0xF0. Pokusil jsem se o čtení pomocí ioread32, ale při pokusu o čtení dojde k pádu jádra. Jinak je modul stabilní :)
Zdrojový kód je v příloze. Asi to bude nějaká hloupost, ale ovladače běžně nepíšu, takže nemám zkušenosti.
Děkuji za odpovědi.
Jakub Kocourek
Tak ještě jinak. Už jsem našel zdrojový kód ovladače HPET, který používá jádro. Tam se definuje adresa HPET jako:
hpet_base = (void __iomem*)ioremap_nocache(hpet_address, HPET_MMAP_SIZE);
hpet_ptr = hpet_base + HPET_COUNTER;
Když se naincluduje: #include <linux/clocksource.h> #include <linux/errno.h> #include <linux/hpet.h>
#include <linux/init.h> #include <asm/hpet.h> #include <asm/io.h>
,tak by mělo být možné číst pomocí:
(cycle_t)readl(hpet_ptr); Problém je, že jádro při zavedení modulu hlásí "Unknown symbol" a z dmesg je vidět, že hledá symbol "hpet_address". Problém je, že ten je definován v <asm/hpet.h> a nachází se i v /boot/Symbol.map. Díky za rady.
...pokud zadám adresu HPET ručně, tak driver konečně funguje jak má. Takže problém je jen ten symbol. Co s tím?
Jakub
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.