01.03.2013 GPIO AM3517

Материал из SRNS
Перейти к: навигация, поиск
(Конфигурация выводов)
 
(не показаны 3 промежуточные версии 2 участников)
Строка 2: Строка 2:
 
Для будущего воплощения [[Импала|Импалы]] научимся "двигать ногой" с помощью процессорного модуля AM3517 посредством [http://en.wikipedia.org/wiki/GPIO GPIO].
 
Для будущего воплощения [[Импала|Импалы]] научимся "двигать ногой" с помощью процессорного модуля AM3517 посредством [http://en.wikipedia.org/wiki/GPIO GPIO].
 
</summary>
 
</summary>
__NOTOC__
+
 
 +
{{TOCright}}
 +
 
 +
 
 
== GPIO AM3517 ==
 
== GPIO AM3517 ==
 
В данный момент на плате установлен Linux и всё грузится аналогично [[Blog:Korogodin/04.05.2012,_Первая_загрузка_linux'а_на_AM3517|первой загрузке]].  
 
В данный момент на плате установлен Linux и всё грузится аналогично [[Blog:Korogodin/04.05.2012,_Первая_загрузка_linux'а_на_AM3517|первой загрузке]].  
Строка 146: Строка 149:
  
 
== Конфигурация выводов ==
 
== Конфигурация выводов ==
В процессоре AM3517 выводы могут выполнять различные функции. Практически все выводы могут работать, как GPIO, кроме того, их можно использовать с разными функциональными блоками - интерфесом памяти, портами ввода-вывода и т.д.
+
В процессоре AM3517 выводы могут выполнять различные функции. Практически все выводы могут работать, как GPIO, кроме того, их можно использовать с разными функциональными блоками - интерфейсом памяти, портами ввода-вывода и т.д.
  
 
Для того, чтобы использовать вывод, как GPIO, его нужно сконфигурировать для выполнения этой функции.
 
Для того, чтобы использовать вывод, как GPIO, его нужно сконфигурировать для выполнения этой функции.

Текущая версия на 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 Сервер
Инструменты