|
|
(не показана 1 промежуточная версия 1 участника) |
Строка 1: |
Строка 1: |
− | == GPIO AM3517 ==
| |
− | Для будущего воплощения [http://srns.ru/wiki/Импала Импалы] научимся "двигать ногой" с помощью процессорного модуля AM3517 по средствам шины GPIO. В данный момент на плате установлен Linux и всё грузится аналогично [http://srns.ru/wiki/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 мануалу].
| |
− |
| |
− | Выберем для "шевеления" пин на отладочной плате. Удобнее всего подцепить осциллограф к одному из пинов разъема LVDS. Ознакомившись с [http://variscite.ru/docs/datasheets/VAR-3xCustomBoard_V2_1_DS.pdf CustomBoard Datasheet] выбираем Pin 4, в описании которого написано GPIO#28. Описание интересное, но перед управлением данным пином, стоит проверить действительно ли этот пин подключен к GPIO28. Для этого сверимся с [http://variscite.ru/docs/mechanics/var-am35customboard_v2_3B.pdf CustomBoard Schematics]. Проверяем и видим, что на самом деле выход этого пина подключен к ''GPIO186'', им мы и будем управлять. <br/> Далее изучаем раздел ''General-Purpose Interface'' [http://www.ti.com/lit/ug/sprugr0b/sprugr0b.pdf Technical Reference Manual]. <br/>
| |
− | :Простейшее управление пином осуществляется в два шага:
| |
− | # разрешить(включить) соответствующий пин на вход/выход;
| |
− | # установить на соответствующий пин "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 помощью ''скрипта'' подключаемся к устройству:
| |
− | <pre>
| |
− | #!/usr/bin/kermit
| |
− | set line /dev/ttyUSB0
| |
− | set FLOW auto
| |
− | set speed 115200
| |
− | set serial 8n1
| |
− | SET CARRIER-WATCH Off
| |
− | connect
| |
− | </pre>
| |
− | * создаем файл ''example.c'':
| |
− | <pre>
| |
− | #include <stdio.h>
| |
− |
| |
− | int main(void)
| |
− | {
| |
− | printf("Hello world! \n");
| |
− | return 0;
| |
− | }
| |
− | </pre>
| |
− | * компилируем с помощью тулчейна и получаем файл ''example'':
| |
− | <pre>
| |
− | $ gcc example.c -o example
| |
− | </pre>
| |
− | * копируем получившийся файлик на флешку, вытаскиваем флешку из компьютера и вставляем в девайс;
| |
− | * через терминал Linux`а устройства запускаем файл ''example'' на выполнение.
| |
− |
| |
− | == Программа управления пином GPIO ==
| |
− | Листинг программы управления пином ''GPIO186'':
| |
− | <pre>
| |
− | #include <stdio.h>
| |
− | #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
| |
− | </pre>
| |
− |
| |
− | [[File:GPIO186.PNG|300px|thumb|Скрин с осциллографа после выполнения программы управления GPIO186.]]
| |
− |
| |
− | [[Категория:Импала]]
| |
− |
| |
− | [[Участник:Ustinov|Ustinov]] 21:08, 28 февраля 2013 (MSK)
| |