User Info
Добро пожаловать, Guest Пользователей: 1 Поисковых ботов: 3 Гостей: 1
Eddiebal forum Google Bot account oBot news Yandex Bot forum
Jury093
Пункты: 54271
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Поборов лень, подключил к SK-MNUK950 (200МГц тактовая) осциллоскоп
Tektronix TDS2012B(100MHz, 1GS/s) на ножку №168 (IRQ1). Заинтересовала максимальная частота "ногодрыгания".
Вот результат работы несложной программы:
собственно программа (компилировал прямо на плате)
Код #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
Группа: Клиенты
Пункты: 6973
Регистрация: 26.03.2009
у меня 1,5 мегагерца получалось на программном SPI на 9260.
Jury093
Пункты: 54271
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата у меня 1,5 мегагерца получалось на программном SPI на 9260.
все правильно, у тебя помимо пинодрыгания еще что-то полезное делалось - обработка данных, их трансфер и обсчет. а тут "чистое" дрыгание..
по хорошему, надо написать ассмовый код с инитом пина и циклом дрыгания и подсунуть бинарник вместо ядра при загрузке. уверен, что частота будет еще выше, т.к. не будет "отвлекающих" прерываний.
понятно, что это идеализированный случай, для практики слабоприменимый. но полезно знать предел возможности АРМа.
полагаю, что ситуацию можно исправить (не меняя камня) прицепив туже ФПГА на внешнюю шину и изобразить внешнюю память. Обдрыгаться можно :)
На любой вопрос есть любой ответ.
Jury093
Пункты: 54271
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
результат "пинодрыгания" для 9G45
Код Clocks: CPU 400 MHz, master 133 MHz, main 12.000 MHz
осциллоскоп тот же, пин 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
Пункты: 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
Пункты: 54271
Регистрация: 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
Пункты: 4558
Регистрация: 13.12.2009
Пол: Мужчина
Цитата хм.. не понял вопроса..
Write Only ?
Цитата в репу получить за бесконтрольное ... :)
Jury093
Пункты: 54271
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата Write Only ?
а, вот о чем речь. да, я проглядел этот момент.
и тем не менее, в вашем случае обнуляется весь регистр, за исключением 1 бита. в моем же случае вообще не ясно, что считывается из порта для режима
readonly . обычно в доках это оговаривается.
правильнее будет считывать содержимое
30.6.12 PIO Output Data Status Register
и в зависимости от состояния анализируемого бита работать с соответствующим регистром (PIO_SET или PIO_CLR) по маске бита
надо будет глянуть сорцы ядра на эту тему..
На любой вопрос есть любой ответ.
sasamy
Пункты: 83552
Регистрация: 14.08.2009
Цитата
Заинтересовала максимальная частота "ногодрыгания".
Одно непонятно, зачем это все - скоростной интерфейс на gpio не получить, это и без осциллографа ясно :)
Jury093
Пункты: 54271
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата Одно непонятно, зачем это все - скоростной интерфейс на gpio не получить, это и без осциллографа ясно :)
А чтобы было. Ну и ответ на частый вопрос - "с какой максимальной частотой частотой можно переключать пин?"
На любой вопрос есть любой ответ.