Наш процессор на mini240, а именно S3C2440A имеет 130 входов/выходов, которые раскиданы по 9-ти портам
Цитата:
— Port A(GPA): 25-output port
— Port B(GPB): 11-input/out port
— Port C(GPC): 16-input/output port
— Port D(GPD): 16-input/output port
— Port E(GPE): 16-input/output port
— Port F(GPF): 8-input/output port
— Port G(GPG): 16-input/output port
— Port H(GPH): 9-input/output port
— Port J(GPJ): 13-input/output port
(более подробно смотри даташит)
Итак, запускаем mini и из консоли набираем
Код:
cd /sys/class/gpio
просмотрев содержимое каталога обнаружим там следующее.
export gpiochip128 gpiochip192 gpiochip32 gpiochip96
gpiochip0 gpiochip160 gpiochip224 gpiochip64 unexportэти каталоги соответствуют портам нашего процессора:
просмотреть какая папка какому порту соотвествует можно следуюшим образом:
Код:
[root@EmbedSky gpio]# cd ./gpiochip0
[root@EmbedSky gpiochip0]# cat label
GPIOA
[root@EmbedSky gpio]# cd ./gpiochip32
[root@EmbedSky gpiochip32]# cat ./label
GPIOB
[root@EmbedSky gpio]# cd ./gpiochip64
[root@EmbedSky gpiochip64]# cat label
GPIOC
[root@EmbedSky gpio]# cd ./gpiochip96
[root@EmbedSky gpiochip96]# cat label
GPIOD
[root@EmbedSky gpio]# cd ./gpiochip128
[root@EmbedSky gpiochip128]# cat label
GPIOE
[root@EmbedSky gpio]# cd ./gpiochip160
[root@EmbedSky gpiochip160]# cat label
GPIOF
[root@EmbedSky gpio]# cd ./gpiochip192
[root@EmbedSky gpiochip192]# cat label
GPIOG
[root@EmbedSky gpio]# cd ./gpiochip224
[root@EmbedSky gpiochip224]# cat label
GPIOH
Итого 8 портов (порт J кудато потерялся, ну и ладно
)
т.к. процессор 32х разрядный, то по-умолчанию каждый порт имеет 32 пина, начиная с нулевого PORTA (0-31) POTRB (32-63) и т.д. и число в конце названия каждой папки обозначает первый (базовый) пин соответствующего порта. (для удобства подсчета)
но физически пинов меньше.
Посмотрим на разводку нашего 34х пинового разьема в даташите или в приложенном ниже файле и выберем необходмый нам порт и пин.
Вложение:
gpio.png [ 11.83 КиБ | Просмотров: 7467 ]
К примеру возьмем 11й пин разьема
GPF2 (2й пин порта F)
Затем расчитаем вычислим его порядковый номер
(база)160 + 2 = 162Теперь в консоли подключим соответствующий пин следующей командой:
Код:
echo 162 > /sys/class/gpio/export
В результате выполнения которой в папке
gpio появилась подпапка нашего пина
gpio162Заходим в нее и видим следующее:
direction edge subsystem uevent valueНас интересуют файлы direction и value который соответствуют направлению пина и его значению.
Теперь читая из файла и записывая в файл можно управлять пином.
Код:
[root@EmbedSky gpio162]# cat direction
out
[root@EmbedSky gpio162]# cat value
0
[root@EmbedSky gpio162]# echo in > ./direction
[root@EmbedSky gpio162]# cat direction
in
[root@EmbedSky gpio162]# echo out > ./direction
[root@EmbedSky gpio162]# echo 1 > ./value
[root@EmbedSky gpio162]# cat value
1
[root@EmbedSky gpio162]# echo 0 > ./value
[root@EmbedSky gpio162]# cat value
0
[root@EmbedSky gpio162]# echo in > ./direction
[root@EmbedSky gpio162]# cat ./direction
in
[root@EmbedSky gpio162]# cat ./value
1
[root@EmbedSky gpio162]# echo 0 > ./value
[root@EmbedSky gpio162]# cat ./value
1
[root@EmbedSky gpio162]# echo out > ./direction
[root@EmbedSky gpio162]# echo 1 > ./value
[root@EmbedSky gpio162]# cat value
1
Как из Си или других языков программирования читать и писать файлы смотрим соответствующий ФАКи
После того как мы поработали с пином, почистим за собой, выполнив команду
Код:
echo 162 > /sys/class/gpio/unexport
При этом папка нашего пина исчезнет из каталога /sys/class/gpio
Программка на C дергающая 3пин порта B с частотой 1 Гц
Код:
// Blink pin 3 on port B at 1 Hz
// Just add an LED and see the light! ;)
//
//Created by Dingo_aus, 7 January 2009
//email: dingo_aus [at] internode <dot> on /dot/ net
//
//Created in AVR32 Studio (version 2.0.2) running on Ubuntu 8.04
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
FILE *fp;
int main(int argc, char** argv)
{
printf("\n**********************************\n"
"* Welcome to PIN Blink program *\n"
"* ....blinking pin 3 on port B *\n"
"* ....rate of 1 Hz............ *\n"
"**********************************\n");
//create a variable to store whether we are sending a '1' or a '0'
char set_value[4];
//Integer to keep track of whether we want on or off
int toggle = 0;
//Using sysfs we need to write "37" to /sys/class/gpio/export
//This will create the folder /sys/class/gpio/gpio37
if ((fp = fopen("/sys/class/gpio/export", "ab")) == NULL)
{
printf("Cannot open export file.\n");
exit(1);
}
//Set pointer to begining of the file
rewind(fp);
//Write our value of "37" to the file
strcpy(set_value,"37");
fwrite(&set_value, sizeof(char), 2, fp);
fclose(fp);
printf("...export file accessed, new pin now accessible\n");
//SET DIRECTION
//Open the LED's sysfs file in binary for reading and writing, store file pointer in fp
if ((fp = fopen("/sys/class/gpio/gpio37/direction", "rb+")) == NULL)
{
printf("Cannot open direction file.\n");
exit(1);
}
//Set pointer to begining of the file
rewind(fp);
//Write our value of "out" to the file
strcpy(set_value,"out");
fwrite(&set_value, sizeof(char), 3, fp);
fclose(fp);
printf("...direction set to output\n");
//SET VALUE
//Open the LED's sysfs file in binary for reading and writing, store file pointer in fp
if ((fp = fopen("/sys/class/gpio/gpio37/value", "rb+")) == NULL)
{
printf("Cannot open value file.\n");
exit(1);
}
//Set pointer to begining of the file
rewind(fp);
//Write our value of "1" to the file
strcpy(set_value,"1");
fwrite(&set_value, sizeof(char), 1, fp);
fclose(fp);
printf("...value set to 1...\n");
//Run an infinite loop - will require Ctrl-C to exit this program
while(1)
{
//Set it so we know the starting value in case something above doesn't leave it as 1
strcpy(set_value,"1");
if ((fp = fopen("/sys/class/gpio/gpio37/value", "rb+")) == NULL)
{
printf("Cannot open value file.\n");
exit(1);
}
toggle = !toggle;
if(toggle)
{
//Set pointer to begining of the file
rewind(fp);
//Write our value of "1" to the file
strcpy(set_value,"1");
fwrite(&set_value, sizeof(char), 1, fp);
fclose(fp);
printf("...value set to 1...\n");
}
else
{
//Set pointer to begining of the file
rewind(fp);
//Write our value of "0" to the file
strcpy(set_value,"0");
fwrite(&set_value, sizeof(char), 1, fp);
fclose(fp);
printf("...value set to 0...\n");
}
//Pause for one second
sleep(1);
}
return 0;
}
ЗЫ Принимается любая разумная критика.
Карта портов и пинов mini2440 Вложение:
GPIO1.png [ 40.26 КиБ | Просмотров: 7748 ]
Вложение:
GPIO2.png [ 39.61 КиБ | Просмотров: 7374 ]
Желтым обозначены пины - выведеные на 34pin разьем
Синим обозначены пины - идущие на экран (к примеру пином GPG4 можно дергать питание и вырубить экран, а можно попробовать заюзать ШИМ)Смотрите внимательно и не конфигурируйте жизненно-важные пины!!!
Про ПОРТЫ A, C, D лучше вообще забыть