01.03.2013 GPIO AM3517

Материал из SRNS
Перейти к: навигация, поиск
 
(не показаны 19 промежуточных версий 4 участников)
Строка 1: Строка 1:
<accesscontrol>SuperUsers</accesscontrol>
+
<summary><center>[[file:Its_alive.png|500px]]</center>
<summary><center>[[file:Its_alive.png|слева|500px]]</center>
+
Для будущего воплощения [[Импала|Импалы]] научимся "двигать ногой" с помощью процессорного модуля AM3517 посредством [http://en.wikipedia.org/wiki/GPIO GPIO].
Для будущего воплощения [http://srns.ru/wiki/Импала Импалы] научимся "двигать ногой" с помощью процессорного модуля AM3517 по средствам шины GPIO.
+
 
</summary>
 
</summary>
__NOTOC__
+
 
 +
{{TOCright}}
 +
 
 +
 
 
== GPIO AM3517 ==
 
== GPIO AM3517 ==
В данный момент на плате установлен Linux и всё грузится аналогично [http://srns.ru/wiki/Blog:Korogodin/04.05.2012,_Первая_загрузка_linux'а_на_AM3517 первой загрузке].  
+
В данный момент на плате установлен Linux и всё грузится аналогично [[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 мануалу].  
 
Тулчейн для AM3517 находится по ссылке [http://wiki.variscite.ru/doku.php?id=howto:gcc-toolchain тык]. Его скачиваем и устанавливаем по [http://www.variwiki.com/index.php?title=VAR-SOM-AM35_-_Building_Linux_Images мануалу].  
Строка 14: Строка 16:
 
# установить на соответствующий пин "1" или "0";
 
# установить на соответствующий пин "1" или "0";
  
Вся шина GPIO разбита на 6 банок по 32 пина. Нужный нам ''GPIO186'' принадлежит к 6-ому банку GPIO (GPIO6). Начальный адрес GPIO6 - ''0x49058000''. Регистр, разрешающий пины на вход/выход, - '''GPIO_OE'''. Его адрес смещен на ''0x034'', относительно начального адреса GPIO6. По умолчанию все пины установлены на вход,- значение регистра равно ''0xFFFFFFFF''. ''GPIO186'' соответствует 26ой бит. Нужно инвертировать его, установив в него значение 0, таким образом включив пин ''GPIO186'' на выход.  
+
Вся шина 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ой бит данного регистра. Всё просто!
+
Вторым шагом нужно подать на выход ''GPIO186'' единицу.
 +
 
 +
'''Способ 1 '''  Существует регистр '''GPIO_SETDATAOUT'''. Чтобы получить единицу на выходе ''GPIO186'', нужно записать "1" в 26-ой бит этого регистра, его адрес смещен на ''0x094'', относительно начального адреса GPIO6. Если нужно подать на выход ''GPIO186'' ноль, для этого существует регистр '''GPIO_CLEARDATAOUT''', его адрес смещен на ''0x090''. Аналогично предыдущему регистру, для установки нуля на выход ''GPIO186'', нужно записать "1" в 26ой бит данного регистра.
 +
 
 +
'''Способ 2 '''  Так же существует регистр '''GPIO_DATAOUT''' его адрес смещен на ''0x03C''. С помощью него можно управлять одним выбранным пином или несколькими пинами сразу. Для этого в регистр пишется 32-ух битное слово, единица(ы) в битах которого соответствуют выбранному пину/пинам. Для управления пином ''GPIO186'' в регистр следует записать значение ''0x4000000'', получится что в 26ом бите данного регистра находится единица, которую мы и увидем на выходе пина ''GPIO186''. Для того, чтобы увидеть на выходе ''GPIO186'' нулевой уровень, в 26-ом бите регистра должен стоять "0", получить его можно, например, обнулив регистр, записав в него значение 0x0.
 +
 
 +
Всё просто!
  
 
== Общение ==
 
== Общение ==
На данный момент "общение" с AM3517 выглядит следующим образом:
 
  
 +
На данный момент "общение" с AM3517 выглядит следующим образом:
 
*c помощью ''скрипта'' подключаемся к устройству:
 
*c помощью ''скрипта'' подключаемся к устройству:
<pre>
+
<source lang="bash">
 
#!/usr/bin/kermit
 
#!/usr/bin/kermit
 
set line /dev/ttyUSB0
 
set line /dev/ttyUSB0
Строка 30: Строка 38:
 
SET CARRIER-WATCH Off
 
SET CARRIER-WATCH Off
 
connect
 
connect
</pre>
+
</source>
 
* создаем файл ''example.c'':
 
* создаем файл ''example.c'':
<pre>
+
<source lang="bash">
 
#include <stdio.h>
 
#include <stdio.h>
  
Строка 40: Строка 48:
 
         return 0;
 
         return 0;
 
}
 
}
</pre>
+
</source>
 
* компилируем с помощью тулчейна и получаем файл ''example'':
 
* компилируем с помощью тулчейна и получаем файл ''example'':
<pre>
+
<source lang="bash">
 
$ gcc example.c -o example
 
$ gcc example.c -o example
</pre>
+
</source>
 
* копируем получившийся файлик на флешку, вытаскиваем флешку из компьютера и вставляем в девайс;
 
* копируем получившийся файлик на флешку, вытаскиваем флешку из компьютера и вставляем в девайс;
 
* через терминал Linux`а устройства запускаем файл ''example'' на выполнение.
 
* через терминал Linux`а устройства запускаем файл ''example'' на выполнение.
Строка 50: Строка 58:
 
== Программа управления пином GPIO ==
 
== Программа управления пином GPIO ==
 
Листинг программы управления пином ''GPIO186'':
 
Листинг программы управления пином ''GPIO186'':
<pre>
+
 
 +
'''Способ 1 '''
 +
<source lang="c">
 
#include <stdio.h>
 
#include <stdio.h>
 
#include <stdlib.h>
 
#include <stdlib.h>
Строка 118: Строка 128:
 
  return 0;
 
  return 0;
 
}//main
 
}//main
</pre>
+
</source>
 +
 
 +
 
 +
'''Способ 2 '''
 +
<br>Цикл предыдущего кода заменить на следующий цикл:
 +
<source lang="c">
 +
for (;;)
 +
{
 +
//printf("SET\n");
 +
*DATAOUT=0x4000000;
 +
//printf("DATAOUTPUT: %X\n",*DATAOUT);
 +
//printf("CLEAR\n");
 +
*DATAOUT=0x0;
 +
//printf("DATAOUTPUT: %X\n",*DATAOUT);
 +
}
 +
</source>
 +
 
 +
 
 +
[[File:GPIO186.PNG|center|мини|600px|Скрин с осциллографа после выполнения программы управления GPIO186]]
 +
 
 +
== Конфигурация выводов ==
 +
В процессоре AM3517 выводы могут выполнять различные функции. Практически все выводы могут работать, как GPIO, кроме того, их можно использовать с разными функциональными блоками - интерфейсом памяти, портами ввода-вывода и т.д.
 +
 
 +
Для того, чтобы использовать вывод, как GPIO, его нужно сконфигурировать для выполнения этой функции.
 +
Делается это с помощью регистров SCMR_PADCONF.
 +
 
 +
SCMR - "System control module registers". Таблица этих регистров приведена в описании процессора в разд. 6, табл. 6-5.
 +
Там для каждого вывода приведены возможные функции и номера режимов работы. Номер режима работы GPIO - 4. Таким образом, нужно перевести вывод в режим 4.
 +
 
 +
На каждый вывод отведено 16 бит конфигурационного вывода. Таким образом, один регистр конфигурирует два вывода. Формат регистра приведён на стр. 621 (разд. 6.4.4). Там можно настроить направление (ввод/вывод), использование PullUp/PullDown и режим. Для вывода достаточно установить режим 4 и все.
 +
 
 +
В качестве примера, конфигурация вывода GPIO_83 для вывода:
 +
<source lang="C">
 +
  *((unsigned int*)(SCMR_REGS+0xF4)) = ( (*((unsigned int*)(SCMR_REGS+0xF4))) & (0xFFFF)) | ( 0x4 <<16 ); //083
 +
</source>
 +
Здесь  SCMR_REGS - указатель на базовый адрес регистров SCMR: 0x48002000
  
[[File:GPIO186.PNG|слева|мини|600px|Скрин с осциллографа после выполнения программы управления GPIO186.]]
 
  
 
[[Категория:Импала]]
 
[[Категория:Импала]]
 +
{{wl-publish: 2013-03-01 14:41:41 +0400 | Ustinov }}

Текущая версия на 15:09, 9 июня 2018

Its alive.png

Для будущего воплощения Импалы научимся "двигать ногой" с помощью процессорного модуля AM3517 посредством GPIO.

Содержание


[править] GPIO AM3517

В данный момент на плате установлен Linux и всё грузится аналогично первой загрузке.

Тулчейн для AM3517 находится по ссылке тык. Его скачиваем и устанавливаем по мануалу.

Выберем для "шевеления" пин на отладочной плате. Удобнее всего подцепить осциллограф к одному из пинов разъема LVDS. Ознакомившись с CustomBoard Datasheet выбираем Pin 4, в описании которого написано GPIO#28. Описание интересное, но перед управлением данным пином, стоит проверить действительно ли этот пин подключен к GPIO28. Для этого сверимся с CustomBoard Schematics. Проверяем и видим, что на самом деле выход этого пина подключен к GPIO186, им мы и будем управлять.
Далее изучаем раздел General-Purpose Interface Technical Reference Manual.

Простейшее управление пином осуществляется в два шага:
  1. разрешить(включить) соответствующий пин на вход/выход;
  2. установить на соответствующий пин "1" или "0";

Вся шина GPIO разбита на 6 банков по 32 пина. Нужный нам GPIO186 принадлежит к 6-ому банку GPIO (GPIO6). Начальный адрес GPIO6 - 0x49058000. Регистр, разрешающий пины на вход/выход, - GPIO_OE. Его адрес смещен на 0x034, относительно начального адреса GPIO6. По умолчанию все пины установлены на вход,- значение регистра равно 0xFFFFFFFF. GPIO186 соответствует 26ой бит. Нужно инвертировать его, установив в него значение 0, таким образом включив пин GPIO186 на выход.

Вторым шагом нужно подать на выход GPIO186 единицу.

Способ 1 Существует регистр GPIO_SETDATAOUT. Чтобы получить единицу на выходе GPIO186, нужно записать "1" в 26-ой бит этого регистра, его адрес смещен на 0x094, относительно начального адреса GPIO6. Если нужно подать на выход GPIO186 ноль, для этого существует регистр GPIO_CLEARDATAOUT, его адрес смещен на 0x090. Аналогично предыдущему регистру, для установки нуля на выход GPIO186, нужно записать "1" в 26ой бит данного регистра.

Способ 2 Так же существует регистр GPIO_DATAOUT его адрес смещен на 0x03C. С помощью него можно управлять одним выбранным пином или несколькими пинами сразу. Для этого в регистр пишется 32-ух битное слово, единица(ы) в битах которого соответствуют выбранному пину/пинам. Для управления пином GPIO186 в регистр следует записать значение 0x4000000, получится что в 26ом бите данного регистра находится единица, которую мы и увидем на выходе пина GPIO186. Для того, чтобы увидеть на выходе GPIO186 нулевой уровень, в 26-ом бите регистра должен стоять "0", получить его можно, например, обнулив регистр, записав в него значение 0x0.

Всё просто!

[править] Общение

На данный момент "общение" с AM3517 выглядит следующим образом:

  • c помощью скрипта подключаемся к устройству:
#!/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 на выполнение.

[править] Программа управления пином GPIO

Листинг программы управления пином GPIO186:

Способ 1

#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


Способ 2
Цикл предыдущего кода заменить на следующий цикл:

for (;;)
 {
        //printf("SET\n");
        *DATAOUT=0x4000000;
        //printf("DATAOUTPUT: %X\n",*DATAOUT);
        //printf("CLEAR\n");
        *DATAOUT=0x0;
        //printf("DATAOUTPUT: %X\n",*DATAOUT);
 }


Скрин с осциллографа после выполнения программы управления GPIO186

[править] Конфигурация выводов

В процессоре AM3517 выводы могут выполнять различные функции. Практически все выводы могут работать, как GPIO, кроме того, их можно использовать с разными функциональными блоками - интерфейсом памяти, портами ввода-вывода и т.д.

Для того, чтобы использовать вывод, как GPIO, его нужно сконфигурировать для выполнения этой функции. Делается это с помощью регистров SCMR_PADCONF.

SCMR - "System control module registers". Таблица этих регистров приведена в описании процессора в разд. 6, табл. 6-5. Там для каждого вывода приведены возможные функции и номера режимов работы. Номер режима работы GPIO - 4. Таким образом, нужно перевести вывод в режим 4.

На каждый вывод отведено 16 бит конфигурационного вывода. Таким образом, один регистр конфигурирует два вывода. Формат регистра приведён на стр. 621 (разд. 6.4.4). Там можно настроить направление (ввод/вывод), использование PullUp/PullDown и режим. Для вывода достаточно установить режим 4 и все.

В качестве примера, конфигурация вывода GPIO_83 для вывода:

  *((unsigned int*)(SCMR_REGS+0xF4)) = ( (*((unsigned int*)(SCMR_REGS+0xF4))) & (0xFFFF)) | ( 0x4 <<16 ); //083

Здесь SCMR_REGS - указатель на базовый адрес регистров SCMR: 0x48002000

[ Хронологический вид ]Комментарии

Добавил проверенный сегодня второй способ управления.

Войдите, чтобы комментировать.

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

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