Ich habe eine Platine mit einem APM86290 (ppc) SOC drauf. Dies ist mein erster Ausflug in diese Art von Entwicklung und ich versuche mit dem SPI-Controller zu arbeiten, der mit einer 36-Bit-Adresse gemaess dem Datenblatt gemappt wird. Ich möchte einige der Register mit mmap()
und /dev/mem
lesen. Gibt es normalerweise einen einheitlichen Weg, diese hohen vier Bits zu adressieren? Oder ist das wahrscheinlich etwas Spezifisches für diesen Prozessor/compiler? So habe ich es jetzt versucht.Wie adressieren Sie IO-Mapping mit 36 Bits?
#define OFFSET 0xfa0000000
int main()
{
int i;
unsigned int * someRegister;
int fd = open("/dev/mem",O_RDWR|O_SYNC);
if(fd < 0)
{
printf("Can't open /dev/mem\n");
return 1;
}
someRegister = (unsigned int *) mmap(0, sizeof(int), PROT_READ|PROT_WRITE, MAP_SHARED, fd, OFFSET);
if(someRegister <= NULL)
{
printf("Can't mmap\n");
return 1;
}
else
{
printf("register=%x\n",OFFSET);
printf("contents=%x\n",*someRegister);
}
return 0;
}
Die Ausgabe des obigen Programms gibt diese Fehler
Maschinenprüf- im Kernel-Modus.
Anweisung lesen PLB Fehler
PLB Master-Port-Anfrage Fehler
PLB Lesefehler 0x11000000 bei 0x00000000_00000000
ich vielleicht dachte er nicht die 36bit-Adressen und Kürzen etwas wurde mit, aber wenn ich einen cat /proc/iomem
effff8000-effffffff : ocm_mem
fa0000000-fa000001f : serial
Welche zeigen die 36-Bit-Werte, die ich erwarte.
Die mmap64() scheint abzurufen, was ich will. Ich verbrachte den größten Teil des Tages damit, meinen Kopf gegen die Wand zu schlagen ... Danke! – Andy
@Andy: FWIW, Googeln '" 36-Bit "" mmap "' bringt diesen Vorschlag mehrmals auf der ersten Seite. ; -] – ildjarn