реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Как в Linux сконфигурировать GPIO порт на чтение?
Oops
сообщение Apr 21 2010, 04:27
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 129
Регистрация: 28-08-08
Из: г.Омск
Пользователь №: 39 870



Здравствуйте.
Имеется отладочная плата 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 порт, затем когда на порт приходят данные принимать их и после приема снова переходить в режим прослушки????

Спасибо!!!

Сообщение отредактировал Oops - Apr 21 2010, 04:38
Go to the top of the page
 
+Quote Post
sasamy
сообщение Apr 21 2010, 07:19
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858



Цитата(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
Go to the top of the page
 
+Quote Post
Oops
сообщение Apr 21 2010, 10:10
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 129
Регистрация: 28-08-08
Из: г.Омск
Пользователь №: 39 870



Спасибо!!!!!!!! rolleyes.gif
Go to the top of the page
 
+Quote Post
Oops
сообщение May 29 2010, 06:53
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 129
Регистрация: 28-08-08
Из: г.Омск
Пользователь №: 39 870



Цитата(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. А как зделать так чтобы данные записывались во все разряды ну и считывались соответственно?

Спасибо.
Go to the top of the page
 
+Quote Post
Oops
сообщение May 29 2010, 10:54
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 129
Регистрация: 28-08-08
Из: г.Омск
Пользователь №: 39 870



Цитата(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 работали все выводы?

Спасибо.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 16:16
Рейтинг@Mail.ru


Страница сгенерированна за 0.01387 секунд с 7
ELECTRONIX ©2004-2016