Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru
Партнеры:
otladka.com.ua - г.Киев

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:2
Поисковых ботовПоисковых ботов:3
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:6
Форум » starterkit.ru » ARM
Частота GPIO (АРМ)
boyko-alexey
Добавлено 01.12.2010 22:25 Сообщение: 11
boyko-alexey
0

Пункты: 4558
Регистрация: 13.12.2009
Пол: Мужчина
Цитата
в вашем случае обнуляется весь регистр, за исключением 1 бита

нули на эти регистры не действуют.

Цитата
не ясно, что считывается из порта для режима readonly

я мало понимаю про mmap, но может считывается не из порта а из памяти?
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 01.12.2010 22:45 Сообщение: 12
Jury093
4.5

Пункты: 54233
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата
я мало понимаю про mmap, но может считывается не из порта а из памяти?

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

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 01.12.2010 22:53 Сообщение: 13
sasamy
4.70

Пункты: 76882
Регистрация: 14.08.2009
Про mmap:

Это отображение какого-то участка памяти в адресном пространстве текущего процесса. Если кратко в вашем контексте - это прямой доступ к регистрам из юзерспейс, со стороны системы никаких задержек нет.
Спуститься к концу Подняться к началу
Персональная информация
boyko-alexey
Добавлено 01.12.2010 23:07 Сообщение: 14
boyko-alexey
0

Пункты: 4558
Регистрация: 13.12.2009
Пол: Мужчина
Цитата
Про mmap:
в вашем контексте - это прямой доступ к регистрам из юзерспейс

значит так будет быстрее
Код
while(1)
{
GPIO_SET_OUT = 0x00100000; // pin high
GPIO_CLR_OUT = 0x00100000; // pin low
}
Спуститься к концу Подняться к началу
Персональная информация
asd
Добавлено 23.01.2011 10:47 Сообщение: 15
asd
0

Пункты: 568
Регистрация: 30.11.2010
День добрый. Хотел узнать, почему (если правильно понял) используется 4 килобайта MAP_SIZE 4096Ul файла /dev/mem для отображения в памяти?
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 23.01.2011 22:32 Редактировалось 23.01.2011 22:58 Сообщение: 16
sasamy
4.70

Пункты: 76882
Регистрация: 14.08.2009
Цитата

почему (если правильно понял) используется 4 килобайта MAP_SIZE 4096Ul файла /dev/mem для отображения в памяти?


Потому что размер страницы 4 кб, это минимально возможный размер. Есть физические адреса и виртуальные, процессор всегда работает с виртуальными адресами (кроме случая когда mmu отключено, тогда виртуальный адрес равен физическому), вся память поделена на страницы, чтобы процессор смог обратиться к какойто области физической памяти эта страница физической памяти должна быть прописана в таблице страниц - тоесть ей должен соотвествовать какой-то виртуальномый адрес, этим и занимается mmap. У arm регистры периферии отображаются по физическим адресам памяти (в адресном пространстве процессора), поэтому работа с ними ничем не отличается от доступа к памяти.
Спуститься к концу Подняться к началу
Персональная информация
asd
Добавлено 24.01.2011 08:45 Сообщение: 17
asd
0

Пункты: 568
Регистрация: 30.11.2010
Тогда, наверное, было бы правильнее использовать getpagesize() или не принципиально?
Спуститься к концу Подняться к началу
Персональная информация
GLONIUM
Добавлено 31.10.2011 08:47 Сообщение: 18
GLONIUM
0

Пункты: 567
Регистрация: 19.05.2011
Прочитав эту ветку форума появились следующие вопросы:
1) Насколько это правильно использовать файл /dev/mem нельзя причинить вред работающей системе?
2) если у нас один процесс открыл файл /dev/mem сможет ли его открыть другой процесс, если ему необходим доступ к другой периферии например к другому порту или АЦП ...
3) Не лучше ли написать модуль ядра для работы с портами, который отобразит файлы устройств портов?
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 31.10.2011 10:52 Сообщение: 19
Jury093
4.5

Пункты: 54233
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата
1) Насколько это правильно использовать файл /dev/mem нельзя причинить вред работающей системе?
2) если у нас один процесс открыл файл /dev/mem сможет ли его открыть другой процесс, если ему необходим доступ к другой периферии например к другому порту или АЦП ...
3) Не лучше ли написать модуль ядра для работы с портами, который отобразит файлы устройств портов?

1. не знаю.. полагаю, что систему рутом положить сложно, но можно. а вот работая напрямую с железом надо четко понимать последствия..
2. попробуйте запустить две копии программы с разных терминалок, но с обращением к разным блоками регистов.
т.е. open(/dev/mem) одинаковый, а mmap в разные регистры. если проги успешно запустятся, то все ок. если что не пойдет, то ругнется на fd..
3. напишите, написание нового софта и драйверов только приветствуется..

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 28.03.2013 20:43 Сообщение: 20
Jury093
4.5

Пункты: 54233
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
результат "пинодрыгания" для iMX535
контакт 40 разъема X1 rev2.a - по схеме это spi0_miso, как gpio - это GPIO3_17
софтинка:
Код
/* test gpio3-17 for gpio bitbang */
/* pin 40 X1(SPI0_MISO)*/
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <unistd.h>
//-------------------------------------------------------------
#define IMX_PIO2 0x53f8c000 /* block 3 registers */

#define PIO_DR 0x00 /* DATA Register */
#define PIO_GDIR 0x04 /* Direction Register */
#define PIO_PSR 0x08 /* pad status Register */
#define PIO_ICR1 0x0c /* Interrupt config Register1 */
#define PIO_ICR2 0x10 /* Interrupt config Register2 */
#define PIO_IMR 0x14 /* Interrupt mask Register */
#define PIO_ISR 0x18 /* Interrupt status Register */
#define PIO_EDGE_SEL 0x1c /* Edge select Register */

//-------------------------------------------------------------
#define PIN_MASK_GPIO17 (1<<17)
#define MAP_BASE_2 (IMX_PIO2)
#define MAP_SIZE 4096Ul
#define MAP_MASK (MAP_SIZE - 1)

void *mapped_base_2;

//-----------------------------------------------------------------------
int main(void)
{
int fd;
// try open /dev/mem ===============================================
if ((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1)
{
printf("Cannot open /dev/mem.\n");
exit(EXIT_FAILURE);
}
printf("/dev/mem opened.\n");
// try mapped memory A =============================================
mapped_base_2 = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, MAP_BASE_2 & ~MAP_MASK);
if (mapped_base_2 == (void *) -1)
{
printf("Memory mapping error.\n");
exit(EXIT_FAILURE);
}
printf("A Memory block mapped at address %p.\n", mapped_base_2);
mapped_base_2+=(MAP_BASE_2 & MAP_MASK);
printf("A Target address mapped 0x%08x-->0x%08x\n",(int) MAP_BASE_2,(int)mapped_base_2);
//==================================================================
printf("Initing control pin\n");
*(int*)(mapped_base_2+PIO_GDIR) |= PIN_MASK_GPIO17;

while(1)
{
*(int*)(mapped_base_2+PIO_DR) &= !(PIN_MASK_GPIO17);
*(int*)(mapped_base_2+PIO_DR) |= PIN_MASK_GPIO17;
}
close(fd);
printf("Bye!\n");
return 0;
}

картинка:
title

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » ARM