01.03.2013 GPIO AM3517
Для будущего воплощения Импалы научимся "двигать ногой" с помощью процессорного модуля AM3517 посредством GPIO.
GPIO AM3517
В данный момент на плате установлен Linux и всё грузится аналогично первой загрузке.
Тулчейн для AM3517 находится по ссылке тык. Его скачиваем и устанавливаем по мануалу.
Выберем для "шевеления" пин на отладочной плате. Удобнее всего подцепить осциллограф к одному из пинов разъема LVDS. Ознакомившись с CustomBoard Datasheet выбираем Pin 4, в описании которого написано GPIO#28. Описание интересное, но перед управлением данным пином, стоит проверить действительно ли этот пин подключен к GPIO28. Для этого сверимся с 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 единицу.
Способ 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 помощью скрипта подключаемся к устройству:
set line /dev/ttyUSB0
set FLOW auto
set speed 115200
set serial 8n1
SET CARRIER-WATCH Off
connect
- создаем файл example.c:
int main(void)
{
printf("Hello world! \n");
return 0;
}
- компилируем с помощью тулчейна и получаем файл example:
- копируем получившийся файлик на флешку, вытаскиваем флешку из компьютера и вставляем в девайс;
- через терминал Linux`а устройства запускаем файл example на выполнение.
Программа управления пином GPIO
Листинг программы управления пином GPIO186:
Способ 1
#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
Цикл предыдущего кода заменить на следующий цикл:
{
//printf("SET\n");
*DATAOUT=0x4000000;
//printf("DATAOUTPUT: %X\n",*DATAOUT);
//printf("CLEAR\n");
*DATAOUT=0x0;
//printf("DATAOUTPUT: %X\n",*DATAOUT);
}
Конфигурация выводов
В процессоре 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="html4strict">...</source>
Поддерживаемые языки:
4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, algol68, apache, applescript, apt_sources, asm, asp, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, c_loadrunner, c_mac, caddcl, cadlisp, cfdg, cfm, chaiscript, cil, clojure, cmake, cobol, coffeescript, cpp, cpp-qt, csharp, css, cuesheet, d, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, f1, falcon, fo, fortran, freebasic, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, j, java, java5, javascript, jquery, kixtart, klonec, klonecpp, latex, lb, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, newlisp, nsis, oberon2, objc, objeck, ocaml, ocaml-brief, oobas, oracle11, oracle8, oxygene, oz, pascal, pcre, per, perl, perl6, pf, php, php-brief, pic16, pike, pixelbender, pli, plsql, postgresql, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, python, q, qbasic, rails, rebol, reg, robots, rpmspec, rsplus, ruby, sas, scala, scheme, scilab, sdlbasic, smalltalk, smarty, sql, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, uscript, vala, vb, vbnet, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xorg_conf, xpp, yaml, z80, zxbasic
Здесь SCMR_REGS - указатель на базовый адрес регистров SCMR: 0x48002000
[ Хронологический вид ]Комментарии
Немного поправил
Добавил проверенный сегодня второй способ управления.
Войдите, чтобы комментировать.