Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как в Linux сконфигурировать GPIO порт на чтение?
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы
Oops
Здравствуйте.
Имеется отладочная плата Memec FX12LC с ПЛИС фирмы Xilinx FX12 с
встроенным в эту ПЛИС процессором PPC405, на нее скомпилировал Linux XLNX :

http://git.xilinx.com .

Linux загружается и работает замечательно.
Необходимо организовать обмен данными по GPIO интерфейсу.
GPIO IP-ядро сконфигурировано на прием и передачу данных.
С записью данных в GPIO порты разобрался по примерам:

http://xilinx.wikidot.com/osl-gpio-driver

(такой бы примерчик и на чтение rolleyes.gif)

А вот как считывать данные через Linux?

Можно например реализовать прием как в Ethernetе, тоесть прослушивать GPIO порт, затем когда на порт приходят данные принимать их и после приема снова переходить в режим прослушки????

Спасибо!!!
sasamy
Цитата(Oops @ Apr 21 2010, 07:42) *
А вот как считывать данные через Linux?


Читайте документацию идущую с ядром - там подробно расписано linux-2.6.33/Documentation/gpio.txt, если кратко, то аналогично
Код
bash> echo 240 > /sys/class/gpio/export
bash> echo out > /sys/class/gpio/gpio240/direction
bash> echo 1 > /sys/class/gpio/gpio240/value

после этого можно так:

bash> echo in > /sys/class/gpio/gpio240/direction
bash> cat /sys/class/gpio/gpio240/value
Oops
Спасибо!!!!!!!! rolleyes.gif
Oops
Цитата(sasamy @ Apr 21 2010, 10:19) *
Читайте документацию идущую с ядром - там подробно расписано linux-2.6.33/Documentation/gpio.txt, если кратко, то аналогично
Код
bash> echo 240 > /sys/class/gpio/export
bash> echo out > /sys/class/gpio/gpio240/direction
bash> echo 1 > /sys/class/gpio/gpio240/value

после этого можно так:

bash> echo in > /sys/class/gpio/gpio240/direction
bash> cat /sys/class/gpio/gpio240/value


Здравствуйте у меня GPIO 32-ух разрядный. Дело в том что по указаным примерам записи и чтения данные записываются только в 1-й разряд 32-ух разрядного GPIO. А как зделать так чтобы данные записывались во все разряды ну и считывались соответственно?

Спасибо.
Oops
Цитата(Oops @ May 29 2010, 09:53) *
Здравствуйте у меня GPIO 32-ух разрядный. Дело в том что по указаным примерам записи и чтения данные записываются только в 1-й разряд 32-ух разрядного GPIO. А как зделать так чтобы данные записывались во все разряды ну и считывались соответственно?
Код с помощью которого я записываю и считываю данные в 32-ух разрядный GPIO

Запись в GPIO попытка 1:

Код
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>

#define ERROR printf("--  gpio_write <value> \n--  va1ue = 1 or 0 \n");

int str_to_int(char str[],int len){   //преобразуется строка в число
    int a=0,i;
    for (i=0;i<len-3;i++){
    switch(str[i]){
          case '0': a=0;break;
        case '1': a=1;break;
        default : a=2;
        }
    }
    return(a);
}

int main(int argc, char *argv[])
{
    int valuefd, exportfd, directionfd, c;

    if((c>1)&&(argc<1)){ERROR;return 0;}

    c=str_to_int(argv[1],sizeof(argv[1]));
    
    if(c==2){ERROR;return 0;}

    printf("GPIO test running...\n");

    // The GPIO has to be exported to be able to see it
    // in sysfs

    exportfd = open("/sys/class/gpio/export", O_WRONLY);
    if (exportfd < 0)
    {
        printf("Cannot open GPIO to export it\n");
        exit(1);
    }

    write(exportfd, "192", 4);  // 192 - номер моего GPIO чипа
    close(exportfd);

    printf("GPIO exported successfully\n");

    // Update the direction of the GPIO to be an output

    directionfd = open("/sys/class/gpio/gpio192/direction", O_RDWR);
    if (directionfd < 0)
    {
        printf("Cannot open GPIO direction it\n");
        exit(1);
    }

    write(directionfd, "out", 4);   // конфигурирую на выход
    close(directionfd);

    printf("GPIO direction set as output successfully\n");

    // Get the GPIO value ready to be toggled

    valuefd = open("/sys/class/gpio/gpio192/value", O_RDWR);
    if (valuefd < 0)
    {
        printf("Cannot open GPIO value\n");
        exit(1);
    }

    printf("GPIO value opened, now toggling...\n");

    // toggle the GPIO as fast a possible forever, a control c is needed
    // to stop it

    if(c==1){
    write(valuefd,"1111111111111111111111111111111", 32);  // записываю в GPIO 32x еденицы
    printf(" GPIO out is high \n");
    }
    if(c==0){
    write(valuefd,"0000000000000000000000000000000", 32); // записываю в GPIO 32x нули
    printf(" GPIO out is low \n");
    }

    close(valuefd);

    return 0;
}


Запись в GPIO попытка 2:

Код
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>

int main(int argc, char *argv[])
{
    int valuefd, exportfd, directionfd;

    printf("GPIO test running...\n");

    // The GPIO has to be exported to be able to see it
    // in sysfs

    exportfd = open("/sys/class/gpio/export", O_WRONLY);
    if (exportfd < 0)
    {
        printf("Cannot open GPIO to export it\n");
        exit(1);
    }

    write(exportfd, "192", 4);
    close(exportfd);

    printf("GPIO exported successfully\n");

    // Update the direction of the GPIO to be an output

    directionfd = open("/sys/class/gpio/gpio192/direction", O_RDWR);
    if (directionfd < 0)
    {
        printf("Cannot open GPIO direction it\n");
        exit(1);
    }

    write(directionfd, "out", 4);
    close(directionfd);

    printf("GPIO direction set as output successfully\n");

    // Get the GPIO value ready to be toggled

    valuefd = open("/sys/class/gpio/gpio192/value", O_RDWR);
    if (valuefd < 0)
    {
        printf("Cannot open GPIO value\n");
        exit(1);
    }

    printf("GPIO value opened, now toggling...\n");

    // toggle the GPIO as fast a possible forever, a control c is needed
    // to stop it

    write(valuefd,argv[1], sizeof(argv[1])); // argv[1] либо 32 нуля, либо 32 еденицы.

    printf(" GPIO out is high \n");

    close(valuefd);

    return 0;
}


В обоих попытка меняется значение только 1-го разряда GPIO 32x ((

Когда GPIO проверяю без операционной системы Linux, написал тестовую прогу на C библиотеках. То все работает как надо, переключаются все разряды GPIO 32x.

Что нужно сделать в Linux чтобы в GPIO 32x работали все выводы?

Спасибо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.