На компьютере вы пишете на указанный «адрес памяти». Этот адрес распознается системой как аппаратный адрес, и соответствующее оборудование получает или отправляет соответствующее значение.
Большинство аппаратных систем имеют много разных регистров, которые можно установить или прочитать. У некоторых может быть несколько, у некоторых может быть много. Эти регистры будут сгруппированы в непрерывном диапазоне. Базовый указатель указывает на первый в диапазоне, и вы пишете, например, на второй порт с base_pointer + 1. Вам не нужно, вы можете писать прямо в указатель, но использование смещения облегчает работу.
Raspberry Pi распознает широкий спектр аппаратных регистров по адресу 0x20000000. Диапазон регистров, которые управляют системами синхронизации, доступен из BCM2708_PERI_BASE + 0x101000. Регистры, которые управляют тактовым сигналом I2S, являются 38-м и 39-м регистрами в этом блоке, записанными с использованием BCM2708_PERI_BASE + 0x101000 + 0x26 и 0x27
Вы не можете просто изменить значения часов, вы должны отключить часы, изменить значения и перезапустить их.
Если этот ответ слишком простой, мои извинения. В этом случае ваш вопрос действительно хардкор, удачи. Вы можете найти эту ссылку полезной
Обновление: зачем использовать mmap, а не записывать напрямую в память?
Когда программа запускает адреса памяти, которые, по ее мнению, не являются реальными, они сопоставляются с реальными адресами диспетчером памяти. Это мешает одной программе влиять на другую. Два процесса могут совершенно счастливо читать и записывать на свой собственный адрес 1234, и диспетчер памяти будет сохранять эти два местоположения совершенно раздельно.
Аппаратные порты, однако, имеют абсолютные физические адреса. Но вы не можете писать им напрямую, потому что менеджер памяти возьмет ваш адрес и отобразит его в вашей личной области памяти.
В Linux / dev / mem это « файл символьного устройства, который представляет собой образ основной памяти компьютера »
Если вы откроете это как файл, вы сможете читать и писать в него как файл. В предоставленном примере mem_fd - дескриптор файла, полученный в результате открытия / dev / mem
Еще одна система, которая может значительно облегчить жизнь, - это возможность отобразить файл в память и записать его в память. Таким образом, если у вас есть файл, в котором вы хотите прочитать или записать разные конкретные биты, вместо того, чтобы перемещать указатель файла вперед и назад, вы можете сопоставить его с местом в памяти, а затем записать в него напрямую, как если бы это была память.
Таким образом, в этом примере код создает дескриптор физической памяти, как если бы это был файл на диске, а затем просит систему обращаться с ним, как с памятью. Немного запутанный, но необходимый для того, чтобы обойти менеджер виртуальной памяти и записать реальный физический адрес. Кажется, значение 0x20000000 - это нечто вроде красной сельди. Код предлагает этот адрес в качестве подсказки, система не должна отображать / dev / mem здесь, хотя, вероятно, и делает. Обычно передается значение null, и система сопоставляет дескриптор файла с любым адресом, который считает лучшим.
Теперь физическая память сопоставлена с виртуальной памятью процессов, и операции чтения и записи идут туда, куда вы ожидаете.
Ссылки:
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