Участник:Ustinov/Песочница — различия между версиями

Материал из SRNS
Перейти к: навигация, поиск
(То, что)
(Удалено содержимое страницы)
 
(не показаны 16 промежуточных версий 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/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>
 
 
[[File:GPIO186.PNG|100px|thumb|Скрин с осциллографа после выполнения программы управления GPIO186.]]
 

Текущая версия на 14:34, 1 марта 2013

Персональные инструменты
Пространства имён

Варианты
Действия
SRNS Wiki
Рабочие журналы
Приватный файлсервер
QNAP Сервер
Инструменты