Na komputerze piszesz pod określonym „adresem pamięci”. Ten adres jest rozpoznawany przez system jako adres sprzętowy, a odpowiedni sprzęt odbiera lub wysyła odpowiednią wartość.
Większość systemów sprzętowych ma wiele różnych rejestrów, które można ustawić lub odczytać. Niektóre mogą mieć kilka, niektóre mogą mieć wiele. Rejestry te zostaną pogrupowane w ciągły zakres. Wskaźnik bazowy wskazuje pierwszy w zakresie, a ty piszesz na przykład do drugiego portu za pomocą wskaźnika_podstawowego + 1. Nie musisz, możesz pisać bezpośrednio do wskaźnika, ale użycie offsetu ułatwia pracę.
Raspberry Pi rozpoznaje ogromny zakres rejestrów sprzętowych pod adresem 0x20000000. Dostęp do szeregu rejestrów sterujących systemami zegarowymi można uzyskać od BCM2708_PERI_BASE + 0x101000. Rejestry sterujące zegarem I2S to 38. i 39. rejestr w tym bloku, zapisany przy użyciu BCM2708_PERI_BASE + 0x101000 + 0x26 i 0x27
Nie możesz po prostu zmienić wartości zegara, musisz wyłączyć zegar, zmienić wartości i uruchomić go ponownie.
Jeśli ta odpowiedź jest zbyt prosta, przepraszam. W takim przypadku twoje pytanie jest naprawdę hardcorowe, powodzenia. Ten link może okazać się pomocny
Aktualizacja: Dlaczego warto korzystać z mmap i nie zapisywać bezpośrednio w pamięci?
Gdy program uruchamia adresy pamięci, które sądzi, że nie są to adresy rzeczywiste, menedżer pamięci mapuje je na adresy rzeczywiste. To powstrzymuje jeden program od wpływu na inny. Dwa procesy mogą doskonale odczytywać i zapisywać pod własnym adresem 1234, a menedżer pamięci zachowa dwie lokalizacje całkowicie osobno.
Porty sprzętowe znajdują się jednak pod bezwzględnymi adresami fizycznymi. Ale nie możesz do nich pisać bezpośrednio, ponieważ menedżer pamięci weźmie twój adres i zamapuje go w osobistym obszarze pamięci.
W systemie Linux / dev / mem znajduje się „ plik urządzenia znakowego, który jest obrazem głównej pamięci komputera ”
Jeśli otworzysz to jak plik, możesz czytać i zapisywać jak plik. W dostarczonej próbce mem_fd jest uchwytem pliku wynikającym z otwarcia / dev / mem
Innym systemem, który może znacznie ułatwić życie, jest możliwość mapowania pliku do pamięci i zapisania go jak pamięci. Jeśli więc masz plik, w którym chcesz odczytać lub zapisać różne określone bity, zamiast przesuwać wskaźnik pliku do tyłu i do przodu, możesz zmapować go do lokalizacji w pamięci, a następnie zapisać do niego bezpośrednio, tak jakby był pamięcią.
W tym przykładzie kod tworzy uchwyt pamięci fizycznej, tak jakby to był plik na dysku, a następnie prosi system, aby traktował go tak, jakby był pamięcią. Trochę skomplikowane, ale konieczne, aby obejść menedżera pamięci wirtualnej i napisać na rzeczywisty adres fizyczny. Wydaje się, że wartość 0x20000000 jest trochę czerwonym śledziem. Kod proponuje ten adres jako wskazówkę, system nie musi tutaj mapować / dev / mem, choć prawdopodobnie tak jest. Zwykle przekazywana jest wartość null, a system mapuje uchwyt pliku na dowolny adres, który uzna za najlepszy.
Teraz pamięć fizyczna jest mapowana na pamięć wirtualną procesów, a odczyty i zapisy idą tam, gdzie się tego spodziewacie.
Referencje:
http://www.kernel.org/doc/man-pages/online/pages/man2/mmap.2.html
http://www.raspberrypi.org/phpBB3/viewtopic.php?f=44&t=8496&p=104359
https://superuser.com/questions/71389/what-is-dev-mem