Пишите на физический адрес в Linux на ARM - PullRequest
0 голосов
/ 21 декабря 2018

Я хотел бы записать целое число (только одно значение, это может быть также другой тип) в конкретный регистр (например, 0x60006666) на машине Linux с платформой ARM.

Существует много примеров использования mmap (2), но не ясно, как записать только одно значение в конкретный адрес с помощью mmap ().Взглянув на руководство по mmap (), он не определяет, какое значение записать в конкретный регистр: http://man7.org/linux/man-pages/man2/mmap.2.html

Вот функция:

void *mmap(void *addr, size_t length, int prot, int flags,
              int fd, off_t offset);

ItПонятно, что * addr - это адрес, но куда мы вставляем записанное значение по этому адресу?

В моем случае я хотел бы написать int по определенному адресу, как будет выглядеть mmap?

#define _WRITE_ADDR       0x60006666 //address where to write 
unsigned int value_addr = 0x00000080 //value to be written to the address

Я хотел бы записать указанное выше значение по указанному адресу.Это должно быть тривиально, но не очень понятно, так как прошло много времени с тех пор, как я работал с такими вопросами, надеюсь, у кого-то есть какие-то подсказки.Спасибо!

Аналогичный вопрос:
ЗАПИСЬ и ЧИТАТЬ регистры в Linux на ARM

1 Ответ

0 голосов
/ 21 декабря 2018

Это довольно просто.Пример, основанный на RPI

, сначала необходимо:

mem_fd = open("/dev/mem", O_RDWR | O_SYNC);

, а затем выделить память для карты.Например, для одного периферийного устройства BCM RPi мне будет 4K + 4K

Периферийная запись = malloc (8 * 1024 - 1);

, затем убедитесь, что он выровнен по 4k, а mmap это:

gpio_map = (unsigned char *)mmap((caddr_t)poriph_mem, BLOCK_SIZE,PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, mem_fd, PERIPH_BASE    );

где PERIPH_BASE - базовый адрес периферийного устройства (например, GPIO 0x20000000 (база периферийных устройств BCM) + 0x200000)

, тогда вы можете обращаться к ним как к обычным указателям (но помните, что они имеютvolatile)

*(volatile uint32_t *)(periph_mem + OFFSET) = VALUE;
...