|
|
| (не показана 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 мануалу].
| + | [[Special:Wikilog/User:Ustinov|Поиск по блогу...]] |
| − | | + | |
| − | Выберем для "шевеления" пин на отладочной плате. Удобнее всего подцепить осциллограф к одному из пинов разъема 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|слева|мини|600px|Скрин с осциллографа после выполнения программы управления GPIO186.]]
| + | |
| − | | + | |
| − | [[Категория:Импала]]
| + | |