Участник:Ustinov/Песочница — различия между версиями
Ustinov (обсуждение | вклад) (Новая страница: «== GPIO на AM3517 == ''' То, для чего. ''' Начинаем с простого. Для будущего воплощения [http://srns.ru/wiki/Имп...») |
Ustinov (обсуждение | вклад) (→GPIO на AM3517) |
||
| Строка 4: | Строка 4: | ||
''' То, что нужно. ''' Тулчейн для 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 мануалом]. | ||
| − | ''' То, как. ''' Выберем для "шевеления" пин на отладочной плате. Удобнее всего подцепить осциллограф к одному из пинов разъема 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/>Простейшее управление пином осуществляется в два шага: | + | ''' То, как. ''' Выберем для "шевеления" пин на отладочной плате. Удобнее всего подцепить осциллограф к одному из пинов разъема 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 | + | Вся шина 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ой бит данного регистра. | ||
| + | <br/> | ||
| + | :На данный момент "общение" с 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> | ||
Версия 15:17, 28 февраля 2013
GPIO на AM3517
То, для чего. Начинаем с простого. Для будущего воплощения Импалы необходимо научиться "двигать ногой" с помощью процессорного модуля AM3517 по средствам шины GPIO. В данный момент на плате установлен Linux и всё грузится в соответствии с первой загрузкой.
То, что нужно. Тулчейн для AM3517 находится по ссылке тык. Его скачиваем и устанавливаем в соответствии с мануалом.
То, как. Выберем для "шевеления" пин на отладочной плате. Удобнее всего подцепить осциллограф к одному из пинов разъема LVDS. В соответствии с CustomBoard Datasheet выбираем Pin 4, в описании которого написано GPIO#28. Описание интересное, но перед управление пином, стоит проверить действительно ли этот пин подключен к GPIO_28. Для этого сверимся с 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