Участник:Ustinov/Песочница — различия между версиями
Ustinov (обсуждение | вклад) |
Ustinov (обсуждение | вклад) (→Ознакомление) |
||
Строка 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. Описание интересное, но перед управление пином, стоит проверить действительно ли этот пин подключен к GPIO28. Для этого сверимся с [http://variscite.ru/docs/mechanics/var-am35customboard_v2_3B.pdf CustomBoard Schematics]. Проверяем и видим, что на самом деле выход этого пина подключен к ''GPIO186'', им мы и будем управлять. <br/> Далее изучаем раздел ''General-Purpose Interface'' [http://www.ti.com/litv/pdf/sprugr0b Technical Reference Manual]. <br/> | |
:Простейшее управление пином осуществляется в два шага: | :Простейшее управление пином осуществляется в два шага: | ||
# разрешить(включить) соответствующий пин на вход/выход | # разрешить(включить) соответствующий пин на вход/выход |
Версия 18:02, 28 февраля 2013
Ознакомление
Для будущего воплощения Импалы научимся "двигать ногой" с помощью процессорного модуля AM3517 по средствам шины GPIO. В данный момент на плате установлен 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 выглядит следующим образом:
- С помощью скрипта:
#!/usr/bin/kermit set line /dev/ttyUSB0 set FLOW auto set speed 115200 set serial 8n1 SET CARRIER-WATCH Off connect
подключаемся к нему, затем:
- создаем файл example.c
#include <stdio.h> int main(void) { printf("Hello world! \n"); return 0; }
- компилируем с помощью тулчейна и получаем файл example
$ gcc example.c -o example
- копируем получившийся файлик на флешку, вытаскиваем флешку из компьютера и вставляем в девайс
- через терминал Linux`а устройства запускаем файл example на выполнение.
Листинг программы управления GPIO186:
#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