2008. június 2., hétfő

TS-7200 - EP9302 regiszterek virtuális cimei

Mikor elakarjuk egy kernel modulban érni a processzor egy adott regiszterét, akkor a fizikai cimet le kell forditani virtuális cimmé. Ez architektúra függő.
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: