
Ez utan kutattam tegnap, hogy EP9302 processzor esetében hogy is néz ki a dolog 2.4 Linux kernel alatt.
Szükséges include fájlok:
(kernel forrásfa)
linux/include/asm-arm/arch-ep93xx/
io.h -itt van definiálva az __io() makró. Ezzel lehet a fizikai cim virtuális cimmé való átalakitását elvégezni. Én cim_forditásnak nevezem.
regmap.h -ebben van definiálva az IO_ADDRESS makró, használja az io.h, ezért ezt is be kell huzni a modulban !
Pl. mondjuk el szeretnénk érni az E port adat -és adatirány regiszterét:
static unsigned long virt_gpio_addr;
static volatile unsigned int *PEDR;
static volatile unsigned int *PEDDR;
//cimforditás
virt_gpio_addr = ( unsigned long ) __io(0x80840000); //GPIO psychical base address
// a port fizikai cime : 0x80840000 + 0x20
PEDR = (unsigned int *)(virt_gpio_addr + 0x20); // port e data reg
// a port fizikai cime : 0x80840000 + 0x24
PEDDR = (unsigned int *)(virt_gpio_addr + 0x24); // port e data direction register
*PEDR = új érték
*PEDDR = új érték
Viszont előtte érdemes elmenteni a regiszterek értékét.
regmap.h -itt megnézhetők a base address-ek (bar adatlapban is benne van)
Tömör és érdekes olvasmány a fenti két header tanulmányozása.
>>Link <<: Példa egy egyszerű LED vezérlő kernel modulra.
Nincsenek megjegyzések:
Megjegyzés küldése