01.03.2013 GPIO AM3517
Ustinov (обсуждение | вклад) |
Korogodin (обсуждение | вклад) |
||
Строка 1: | Строка 1: | ||
<accesscontrol>SuperUsers</accesscontrol> | <accesscontrol>SuperUsers</accesscontrol> | ||
− | <summary | + | <summary>[[file:Its_alive.png|справа|500px]] |
− | Для будущего воплощения [ | + | Для будущего воплощения [[Импала|Импалы]] научимся "двигать ногой" с помощью процессорного модуля AM3517 посредством [http://en.wikipedia.org/wiki/GPIO GPIO]. |
</summary> | </summary> | ||
__NOTOC__ | __NOTOC__ | ||
== GPIO AM3517 == | == GPIO AM3517 == | ||
− | В данный момент на плате установлен Linux и всё грузится аналогично [ | + | В данный момент на плате установлен Linux и всё грузится аналогично [[Blog:Korogodin/04.05.2012,_Первая_загрузка_linux'а_на_AM3517|первой загрузке]]. |
Тулчейн для AM3517 находится по ссылке [http://wiki.variscite.ru/doku.php?id=howto:gcc-toolchain тык]. Его скачиваем и устанавливаем по [http://www.variwiki.com/index.php?title=VAR-SOM-AM35_-_Building_Linux_Images мануалу]. | Тулчейн для AM3517 находится по ссылке [http://wiki.variscite.ru/doku.php?id=howto:gcc-toolchain тык]. Его скачиваем и устанавливаем по [http://www.variwiki.com/index.php?title=VAR-SOM-AM35_-_Building_Linux_Images мануалу]. | ||
Строка 19: | Строка 19: | ||
== Общение == | == Общение == | ||
− | |||
+ | На данный момент "общение" с AM3517 выглядит следующим образом: | ||
*c помощью ''скрипта'' подключаемся к устройству: | *c помощью ''скрипта'' подключаемся к устройству: | ||
− | < | + | <source lang="bash"> |
#!/usr/bin/kermit | #!/usr/bin/kermit | ||
set line /dev/ttyUSB0 | set line /dev/ttyUSB0 | ||
Строка 30: | Строка 30: | ||
SET CARRIER-WATCH Off | SET CARRIER-WATCH Off | ||
connect | connect | ||
− | </ | + | </source> |
* создаем файл ''example.c'': | * создаем файл ''example.c'': | ||
− | < | + | <source lang="bash"> |
#include <stdio.h> | #include <stdio.h> | ||
Строка 40: | Строка 40: | ||
return 0; | return 0; | ||
} | } | ||
− | </ | + | </source> |
* компилируем с помощью тулчейна и получаем файл ''example'': | * компилируем с помощью тулчейна и получаем файл ''example'': | ||
− | < | + | <source lang="bash"> |
$ gcc example.c -o example | $ gcc example.c -o example | ||
− | </ | + | </source> |
* копируем получившийся файлик на флешку, вытаскиваем флешку из компьютера и вставляем в девайс; | * копируем получившийся файлик на флешку, вытаскиваем флешку из компьютера и вставляем в девайс; | ||
* через терминал Linux`а устройства запускаем файл ''example'' на выполнение. | * через терминал Linux`а устройства запускаем файл ''example'' на выполнение. | ||
Строка 50: | Строка 50: | ||
== Программа управления пином GPIO == | == Программа управления пином GPIO == | ||
Листинг программы управления пином ''GPIO186'': | Листинг программы управления пином ''GPIO186'': | ||
− | < | + | <source lang="c"> |
#include <stdio.h> | #include <stdio.h> | ||
#include <stdlib.h> | #include <stdlib.h> | ||
Строка 118: | Строка 118: | ||
return 0; | return 0; | ||
}//main | }//main | ||
− | </ | + | </source> |
− | [[File:GPIO186.PNG| | + | [[File:GPIO186.PNG|center|мини|600px|Скрин с осциллографа после выполнения программы управления GPIO186]] |
[[Категория:Импала]] | [[Категория:Импала]] | ||
{{wl-publish: 2013-03-01 14:41:41 +0400 | Ustinov }} | {{wl-publish: 2013-03-01 14:41:41 +0400 | Ustinov }} |
Версия 19:39, 1 марта 2013
<accesscontrol>SuperUsers</accesscontrol>
Для будущего воплощения Импалы научимся "двигать ногой" с помощью процессорного модуля AM3517 посредством GPIO.
GPIO AM3517
В данный момент на плате установлен Linux и всё грузится аналогично первой загрузке.
Тулчейн для AM3517 находится по ссылке тык. Его скачиваем и устанавливаем по мануалу.
Выберем для "шевеления" пин на отладочной плате. Удобнее всего подцепить осциллограф к одному из пинов разъема LVDS. Ознакомившись с CustomBoard Datasheet выбираем Pin 4, в описании которого написано GPIO#28. Описание интересное, но перед управлением данным пином, стоит проверить действительно ли этот пин подключен к GPIO28. Для этого сверимся с CustomBoard Schematics. Проверяем и видим, что на самом деле выход этого пина подключен к GPIO186, им мы и будем управлять.
Далее изучаем раздел General-Purpose Interface Technical Reference Manual.
- Простейшее управление пином осуществляется в два шага:
- разрешить(включить) соответствующий пин на вход/выход;
- установить на соответствующий пин "1" или "0";
Вся шина GPIO разбита на 6 банок по 32 пина. Нужный нам GPIO186 принадлежит к 6-ому банку GPIO (GPIO6). Начальный адрес GPIO6 - 0x49058000. Регистр, разрешающий пины на вход/выход, - GPIO_OE. Его адрес смещен на 0x034, относительно начального адреса GPIO6. По умолчанию все пины установлены на вход,- значение регистра равно 0xFFFFFFFF. GPIO186 соответствует 26ой бит. Нужно инвертировать его, установив в него значение 0, таким образом включив пин GPIO186 на выход.
Вторым шагом нужно подать на выход GPIO186 единицу. Для этого существует регистр GPIO_SETDATAOUT. Чтобы получить единицу на выходе GPIO186, нужно записать "1" в 26-ой бит этого регистра, его адрес смещен на 0x094, относительно начального адреса GPIO6. Если нужно подать на выход GPIO186 ноль, для этого существует регистр GPIO_CLEARDATAOUT, его адрес смещен на 0x090. Аналогично предыдущему регистру, для установки нуля на выход GPIO186, нужно записать "1" в 26ой бит данного регистра. Всё просто!
Общение
На данный момент "общение" с AM3517 выглядит следующим образом:
- c помощью скрипта подключаемся к устройству:
set line /dev/ttyUSB0
set FLOW auto
set speed 115200
set serial 8n1
SET CARRIER-WATCH Off
connect
- создаем файл example.c:
int main(void)
{
printf("Hello world! \n");
return 0;
}
- компилируем с помощью тулчейна и получаем файл example:
- копируем получившийся файлик на флешку, вытаскиваем флешку из компьютера и вставляем в девайс;
- через терминал Linux`а устройства запускаем файл example на выполнение.
Программа управления пином GPIO
Листинг программы управления пином GPIO186:
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
#define GPIO_BASE 0x49058000 //начальный адрес GPIO6
#define GPIO_OE 0x034
#define GPIO_DATAOUT 0x03C
#define GPIO_SETDATAOUT 0x094
#define GPIO_CLEARDATAOUT 0x090
#define GPIO_REVISION 0x000
/* GPIO memory mapped registers */
volatile unsigned int *OE;
volatile unsigned int *DATAOUT;
volatile unsigned int *SETDATAOUT;
volatile unsigned int *CLEARDATAOUT;
volatile unsigned int *REVISION;
int main (void)
{
unsigned char *gpio;
int fd,rep;
/* открываем /dev/mem */
if ((fd = open("/dev/mem", O_RDWR|O_SYNC) ) < 0)
{
printf("can't open /dev/mem \n");
exit(-1);
}
/* mmap GPIO */
gpio = mmap(0, getpagesize(), PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_BASE);
close(fd); //закрываем fd после mmap
if ((long)gpio < 0)
{
printf("mmap error %d\n", (int)gpio);
exit(-1);
}
OE = (unsigned int *)(gpio + GPIO_OE);
DATAOUT = (unsigned int *)(gpio + GPIO_DATAOUT);
SETDATAOUT = (unsigned int *)(gpio + GPIO_SETDATAOUT);
CLEARDATAOUT = (unsigned int *)(gpio + GPIO_CLEARDATAOUT);
REVISION = (unsigned int *)(gpio + GPIO_REVISION);
*OE=~(1<<26); //26ой бит устанавливается как output
//printf("Set all as output\n");
//printf("OUTPUTEN: %X\n",*OE);
for (;;)
{
//printf("SET\n");
*SETDATAOUT=1<<26;
//printf("DATAOUTPUT: %X\n",*DATAOUT);
//printf("CLEAR\n");
*CLEARDATAOUT=1<<26;
//printf("DATAOUTPUT: %X\n",*DATAOUT);
}
return 0;
}//main
[ Хронологический вид ]Комментарии
Немного поправил
Добавил проверенный сегодня второй способ управления.
Войдите, чтобы комментировать.