|
|
(не показаны 22 промежуточные версии 1 участника) |
Строка 1: |
Строка 1: |
− | == Ознакомление ==
| |
− | ''' То, для чего. ''' Для будущего воплощения [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. Описание интересное, но перед управление пином, стоит проверить действительно ли этот пин подключен к GPIO_28. Для этого сверимся с [http://variscite.ru/docs/mechanics/var-am35customboard_v2_3B.pdf CustomBoard Schematics]. Проверяем и видим, что на самом деле выход этого пина подключен к ''GPIO186'', им мы и будем управлять. Далее изучаем раздел ''General-Purpose Interface'' [http://www.ti.com/litv/pdf/sprugr0b Technical Reference Manual]. <br/>
| |
− | :Простейшее управление пином осуществляется в два шага:
| |
− | # разрешить(включить) соответствующий пин на вход/выход
| |
− | # установить на соответствующий пин "1" или "0"
| |
− |
| |
− | Вся шина GPIO разбита на 6 банок по 32 пина. Нужный нам ''GPIO186'' принадлежит к 6-ому банку GPIO (GPIO6). Начальный адрес GPIO6 - ''0x49058000''. Регистр, разрешающий пины на вход/выход, - '''GPIO_OE'''. Его адрес смещен на ''0x034'', относительно начального адреса GPIO6. По умолчанию все пины установлены на вход, значение регистра равно ''0xFFFFFFFF''. ''GPIO186'' соответствует 26ой бит. Нужно инвертировать его, установив в него значение 0, таким образом включив пин ''GPIO186'' на выход.
| |
− | <br/> Вторым шагом нужно подать на выход ''GPIO186'' единицу. Для этого существует регистр '''GPIO_SETDATAOUT'''. Чтобы получить единицу на выходе ''GPIO186'', нужно записать "1" в 26-ой бит этого регистра, его адрес смещен на ''0x094'', относительно начального адреса GPIO6. Если нужно подать на выход ''GPIO186'' ноль, для этого существует регистр '''GPIO_CLEARDATAOUT''', его адрес смещения ''0x090''. Аналогично предыдущему регистру, для установки нуля на выход GPIO186, нужно записать "1" в 26ой бит данного регистра.
| |
− |
| |
− | == Общение ==
| |
− | :На данный момент "общение" с AM3517 выглядит следующим образом:
| |
− |
| |
− | :*С помощью скрипта:
| |
− | <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'' на выполнение.
| |
− |
| |
− | Листинг программы управления ''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>
| |