Witam serdecznie! Mam na imię Przemek właśnie dołączyłem do grona, więc standardowo proszę o wyrozumiałość. ;D
W datasheet procesora a20 podany jest adres bazowy i offset do konkretnego rejestru:
baza 0x01C20800 (rozmiar 1K)
offset 0x0000010C
Niby prosta sprawa a jednak aby się tam dostać trzeba podzielić offset i adres przez 4 (znalazłem to w kodzie przykładowym linie z tym dzieleniem mają komentarz). Kod działa w przeciwieństwie do mojego w którym nie podzieliłem przez te nieszczęsne 4. Czy orientuje się ktoś dlaczego? Czy ma to związek z rozmiarem strony (4K) i rozmiarem bazy (1K)?
#define PAGESIZE 4096
#define BASE 0x01C20800
#define OFFSET (0x0000010C / 4) // dlaczego -> /4
volatile uint32_t *memory;
int main(int argc, char **argv) {
int fd;
fd = open("/dev/mem", O_RDWR);
uint32_t mask = (~(PAGESIZE - 1));
uint32_t adres = BASE & mask;
uint32_t *map = mmap(0, PAGESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, adres);
memory = (volatile uint32_t *)map + ((BASE & ~mask) / 4); // dlaczego -> /4
*(memory + OFFSET) = /*jakies bity*/ ;
Wielkie dzięki z góry za wszelką pomoc i proszę nie odsyłajcie mnie do literatury bo przeczytałem już tego tony i naprawdę czas na trochę praktyki po takiej porcji teorii. Ogólnie zagadnienie w miarę rozumiem, tylko tego nie potrafię wyszukać.