2010-04-11 13 views
1

J'écris pour un bras AT91SAM9260 atmel 9 évidées ordinateur monocarte [glomation gesbc9260]écrit à un ioport résultat segfaults

En utilisant request_mem_region(0xFFFFFC00,0x100,"name"); //port range runs from fc00 to fcff

qui fonctionne très bien et montre dans /proc/iomem

alors je tente d'écrire le dernier bit du port à FC20 avec

writel(0x1, 0xFFFFFC20);

et je segfault ... spécifiquement "incapable de gérer la demande de pagination du noyau à l'adresse virtuelle fffffc20."

Je suis de l'esprit que je ne suis pas allouer l'espace mémoire droit ...

toute idée utile serait génial ...

Répondre

3

Vous devez ioremap la région mem vous avez demandé. ioremap mappe une adresse virtuelle à une adresse physique. writel fonctionne avec des adresses virtuelles, pas avec des adresses physiques.

/* request mem_region */ 
... 

base = ioremap(0xFFFFFC00, 0x100); 
if(base == NULL) 
    release_mem_region(...); 
/* now you can use base */ 
writel(0x1, base + 20) 
... 

Ce que vous avez probablement besoin est d'écrire votre pilote comme platform_driver et déclarer un dispositif de plate-forme dans votre board_file

Un exemple d'un platform_driver relativement simple se trouve here
En fait, naviguer à travers les sources du noyau en utilisant lxr est probablement la meilleure façon d'apprendre comment des choses comme ça.

+0

génial - ça m'a réglé :) thaks – Sniperchild

+0

Faut-il utiliser 'iowrite32' à la place? –

+0

Est-ce que 'request_mem_region' est toujours requis ainsi que' ioremap' si un autre pilote l'a déjà mappé en mémoire virtuelle? –