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

Материал из SRNS
Перейти к: навигация, поиск
(GPIO на AM3517)
(GPIO на AM3517)
Строка 1: Строка 1:
== GPIO на AM3517 ==
+
== Ознакомление ==
 
''' То, для чего. ''' Начинаем с простого. Для будущего воплощения [http://srns.ru/wiki/Импала Импалы] необходимо научиться "двигать ногой" с помощью процессорного модуля AM3517 по средствам шины GPIO. В данный момент на плате установлен Linux и всё грузится в соответствии с [http://srns.ru/wiki/Blog:Korogodin/04.05.2012,_Первая_загрузка_linux'а_на_AM3517 первой загрузкой].
 
''' То, для чего. ''' Начинаем с простого. Для будущего воплощения [http://srns.ru/wiki/Импала Импалы] необходимо научиться "двигать ногой" с помощью процессорного модуля AM3517 по средствам шины GPIO. В данный момент на плате установлен Linux и всё грузится в соответствии с [http://srns.ru/wiki/Blog:Korogodin/04.05.2012,_Первая_загрузка_linux'а_на_AM3517 первой загрузкой].
  
Строка 11: Строка 11:
 
Вся шина 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'' на выход.  
 
<br/> Вторым шагом нужно подать на выход ''GPIO186'' единицу. Для этого существует регистр '''GPIO_SETDATAOUT'''. Чтобы получить единицу на выходе ''GPIO186'', нужно записать "1" в 26-ой бит этого регистра, его адрес смещен на ''0x094'', относительно начального адреса GPIO6. Если нужно подать на выход ''GPIO186'' ноль, для этого существует регистр '''GPIO_CLEARDATAOUT''', его адрес смещения ''0x090''. Аналогично предыдущему регистру, для установки нуля на выход GPIO186, нужно записать "1" в 26ой бит данного регистра.
 
<br/> Вторым шагом нужно подать на выход ''GPIO186'' единицу. Для этого существует регистр '''GPIO_SETDATAOUT'''. Чтобы получить единицу на выходе ''GPIO186'', нужно записать "1" в 26-ой бит этого регистра, его адрес смещен на ''0x094'', относительно начального адреса GPIO6. Если нужно подать на выход ''GPIO186'' ноль, для этого существует регистр '''GPIO_CLEARDATAOUT''', его адрес смещения ''0x090''. Аналогично предыдущему регистру, для установки нуля на выход GPIO186, нужно записать "1" в 26ой бит данного регистра.
<br/>
+
 
 +
== Общение ==
 
:На данный момент "общение" с AM3517 выглядит следующим образом:
 
:На данный момент "общение" с AM3517 выглядит следующим образом:
  
Строка 39: Строка 40:
 
$ gcc example.c -o example
 
$ gcc example.c -o example
 
</pre>
 
</pre>
:* копируем получившийся файлик на флешку
+
:* копируем получившийся файлик на флешку, вытаскиваем флешку из компьютера и вставляем в девайс
 
:* через терминал Linux`а устройства запускаем файл ''example'' на выполнение.
 
:* через терминал Linux`а устройства запускаем файл ''example'' на выполнение.
  
Строка 81: Строка 82:
 
  gpio = mmap(0, getpagesize(), PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_BASE);
 
  gpio = mmap(0, getpagesize(), PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_BASE);
  
  close(fd); //не следует держать fd открытым после mmap
+
  close(fd); //закрываем fd после mmap
  
 
  if ((long)gpio < 0)  
 
  if ((long)gpio < 0)  

Версия 15:24, 28 февраля 2013

Ознакомление

То, для чего. Начинаем с простого. Для будущего воплощения Импалы необходимо научиться "двигать ногой" с помощью процессорного модуля AM3517 по средствам шины GPIO. В данный момент на плате установлен Linux и всё грузится в соответствии с первой загрузкой.

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

То, как. Выберем для "шевеления" пин на отладочной плате. Удобнее всего подцепить осциллограф к одному из пинов разъема LVDS. В соответствии с CustomBoard Datasheet выбираем Pin 4, в описании которого написано GPIO#28. Описание интересное, но перед управление пином, стоит проверить действительно ли этот пин подключен к GPIO_28. Для этого сверимся с 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 единицу. Для этого существует регистр 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
Персональные инструменты
Пространства имён

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