Ник:
Пароль:

Контакты

Cтатус Skype: starterkit.ru
тел.: (+7 3412) 478-448
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
E-mail: info@starterkit.ru
Google+
Партнеры:
otladka.com.ua - г.Киев
tixer.ru - г.Москва

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

User Info


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

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

Ник:
Пароль:

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

ОбновитьПодробнееВсегоВсего:4
Форум » starterkit.ru » ARM
Частота GPIO (АРМ)
Jury093
Добавлено 26.11.2010 13:35
0
Сообщение: 1
Jury093
4.58

Пункты: 53975
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Поборов лень, подключил к SK-MNUK950 (200МГц тактовая) осциллоскоп Tektronix TDS2012B(100MHz, 1GS/s) на ножку №168 (IRQ1). Заинтересовала максимальная частота "ногодрыгания".
Вот результат работы несложной программы:

title

собственно программа (компилировал прямо на плате)

Код
#include <stdlib.h>
#include <malloc.h>

#include <stdio.h>
#include <termio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <unistd.h>
#include <string.h>

void *mapped_base;

#define GPIO_BA 0xB8003000

#define MAP_BASE (GPIO_BA)
#define MAP_SIZE 4096Ul
#define MAP_MASK (MAP_SIZE - 1)

#define GPIOH_DIR *(int*)(mapped_base+0x54)
#define GPIOH_OUT *(int*)(mapped_base+0x58)

int main(void)
{
int fd;
printf("\nResearch of gpio frequency (W90P950, NUC950) by Jury093 v0.01\n");
printf("Use Pin N168->IRQ1\n");
//-------------------------------------------------
// mapping GPIO Register
if ((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1)
{
printf("Cannot open /dev/mem.\n");
exit(EXIT_FAILURE);
}
printf("/dev/mem opened.\n");
mapped_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, MAP_BASE & ~MAP_MASK);
if (mapped_base == (void *) -1)
{
printf("Memory mapping error.\n");
exit(EXIT_FAILURE);
}
mapped_base+=(MAP_BASE & MAP_MASK);
printf("Target address mapped 0x%08x-->0x%08x\n",(int) MAP_BASE,(int)mapped_base);
// -----------------------------------------------------------------------
printf("GPIOH_DIR=%08X\n", GPIOH_DIR);
printf("GPIOH_OUT=%08X\n", GPIOH_OUT);
GPIOH_DIR = GPIOH_DIR | 0x02; // use pin->irq1
while(1)
{
GPIOH_OUT = GPIOH_OUT & 0xfffffffd; // pin->low
GPIOH_OUT = GPIOH_OUT | 0x02; // pin->high
}
// -----------------------------------------------------------------------
printf("Nice work. Bye!\n");
close(fd);
return 0;
}


Makefile к ней

Код
CC=gcc
LD=ld

export CC
export LD

EXEC = gpio
OBJECTS = gpio.o

gpio: gpio.c
$(CC) gpio.c -o gpio


за базу программы взяты исходники из Wiki, написанные repairman

зы если будет интерес, если будет возможность, если не забуду, то в понедельник выложу картинку для 9260 :)

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
rw9uao
Добавлено 27.11.2010 10:08 Сообщение: 2
rw9uao
Ранг
5

Группа: Клиенты
Пункты: 6923
Регистрация: 26.03.2009
у меня 1,5 мегагерца получалось на программном SPI на 9260.
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 27.11.2010 12:39 Сообщение: 3
Jury093
4.58

Пункты: 53975
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата
у меня 1,5 мегагерца получалось на программном SPI на 9260.

все правильно, у тебя помимо пинодрыгания еще что-то полезное делалось - обработка данных, их трансфер и обсчет. а тут "чистое" дрыгание..
по хорошему, надо написать ассмовый код с инитом пина и циклом дрыгания и подсунуть бинарник вместо ядра при загрузке. уверен, что частота будет еще выше, т.к. не будет "отвлекающих" прерываний.
понятно, что это идеализированный случай, для практики слабоприменимый. но полезно знать предел возможности АРМа.
полагаю, что ситуацию можно исправить (не меняя камня) прицепив туже ФПГА на внешнюю шину и изобразить внешнюю память. Обдрыгаться можно :)

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 01.12.2010 15:16 Сообщение: 4
Jury093
4.58

Пункты: 53975
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
результат "пинодрыгания" для 9G45
Код
Clocks: CPU 400 MHz, master 133 MHz, main 12.000 MHz


title

осциллоскоп тот же, пин PC20. вот софтина:

Код
#include <stdlib.h>
#include <malloc.h>

#include <stdio.h>
#include <termio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <unistd.h>
#include <string.h>

void *mapped_base;

#define GPIO_BA 0xFFFFF600 // GPIO C

#define MAP_BASE (GPIO_BA)
#define MAP_SIZE 4096Ul
#define MAP_MASK (MAP_SIZE - 1)

#define GPIO_EN_GPIO *(int*)(mapped_base+0x00)
#define GPIO_DIS_GPIO *(int*)(mapped_base+0x04)
#define GPIO_STAT_GPIO *(int*)(mapped_base+0x08)
#define GPIO_EN_OUT *(int*)(mapped_base+0x10)
#define GPIO_DIS_OUT *(int*)(mapped_base+0x14)
#define GPIO_SET_OUT *(int*)(mapped_base+0x30)
#define GPIO_CLR_OUT *(int*)(mapped_base+0x34)

int main(void)
{
int fd;
printf("\nResearch of gpio frequency (9G45, 400MHz) by Jury093 v0.01\n");
printf("Use Pin A4->PC20\n");
//-------------------------------------------------
// mapping GPIO Register
if ((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1)
{
printf("Cannot open /dev/mem.\n");
exit(EXIT_FAILURE);
}
printf("/dev/mem opened.\n");
mapped_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, MAP_BASE & ~MAP_MASK);
if (mapped_base == (void *) -1)
{
printf("Memory mapping error.\n");
exit(EXIT_FAILURE);
}
mapped_base+=(MAP_BASE & MAP_MASK);
printf("Target address mapped 0x%08x-->0x%08x\n",(int) MAP_BASE,(int)mapped_base);
// -------------------------------------------------------------
printf("GPIO_STAT_GPIO=%08X\n", GPIO_STAT_GPIO);
GPIO_EN_OUT = GPIO_EN_OUT | 0x00100000; // set pin fuction is output
while(1)
{
GPIO_SET_OUT = GPIO_SET_OUT | 0x00100000; // pin high
GPIO_CLR_OUT = GPIO_CLR_OUT | 0x00100000; // pin low
}
// -----------------------------------------------------------------------
printf("Nice work. Bye!\n");
close(fd);
return 0;
}

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
boyko-alexey
Добавлено 01.12.2010 18:21 Сообщение: 5
boyko-alexey
0

Пункты: 4558
Регистрация: 13.12.2009
Пол: Мужчина
регистры проца GPIO_SET_OUT, GPIO_CLR_OUT - WO?
если сделать так, быстрее будет?

Код
while(1)
{
GPIO_SET_OUT = 0x00100000; // pin high
GPIO_CLR_OUT = 0x00100000; // pin low
}
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 01.12.2010 18:44 Редактировалось 01.12.2010 18:46 Сообщение: 6
Jury093
4.58

Пункты: 53975
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата
регистры проца GPIO_SET_OUT, GPIO_CLR_OUT - WO?

хм.. не понял вопроса..

Цитата
если сделать так, быстрее будет?

while(1)
{
GPIO_SET_OUT = 0x00100000; // pin high
GPIO_CLR_OUT = 0x00100000; // pin low
}

для эксперимента возможно можно сделать и так, но при неудачном стечение обстоятельств можно от линукса в репу получить за бесконтрольное обнуление остальных 31 битов регистра :)

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
boyko-alexey
Добавлено 01.12.2010 18:51 Сообщение: 7
boyko-alexey
0

Пункты: 4558
Регистрация: 13.12.2009
Пол: Мужчина
Цитата
хм.. не понял вопроса..

Write Only ?

Цитата
в репу получить за бесконтрольное ... :)
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 01.12.2010 20:55 Сообщение: 8
Jury093
4.58

Пункты: 53975
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата
Write Only ?

а, вот о чем речь. да, я проглядел этот момент.
и тем не менее, в вашем случае обнуляется весь регистр, за исключением 1 бита. в моем же случае вообще не ясно, что считывается из порта для режима readonly. обычно в доках это оговаривается.
правильнее будет считывать содержимое
30.6.12 PIO Output Data Status Register
и в зависимости от состояния анализируемого бита работать с соответствующим регистром (PIO_SET или PIO_CLR) по маске бита

надо будет глянуть сорцы ядра на эту тему..

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

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

Заинтересовала максимальная частота "ногодрыгания".


Одно непонятно, зачем это все - скоростной интерфейс на gpio не получить, это и без осциллографа ясно :)
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 01.12.2010 22:07 Сообщение: 10
Jury093
4.58

Пункты: 53975
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата
Одно непонятно, зачем это все - скоростной интерфейс на gpio не получить, это и без осциллографа ясно :)

А чтобы было. Ну и ответ на частый вопрос - "с какой максимальной частотой частотой можно переключать пин?"

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