Raspberry - кросскомпиляция windows, gpio, i2c, spi

Тема в разделе "Raspberry Pi", создана пользователем Pitekantrop, 4 мар 2022.

  1. Pitekantrop

    Pitekantrop Нерд

    Подскажите путь решения проблемы. Хост windows.
    Установил toolcnain:
    https://gnutoolchains.com/raspberry
    Попробовал с UART поработать. Все компилируется и работает.
    Теперь стоит задача поработать с GPIO, I2C, SPI.
    Вроде существует неплохая библиотека wiringP.
    Но как ее приспособить к выше названному toolcnain?
    Или может есть какой другой более простой путь для кросскомпиляции? :
     
  2. b707

    b707 Гуру

    что значит "поработать с GPIO" ?
    У вас каша в голове. как мне кажется. Не путайте процесс компиляции софта и его запуск на контроллере.
    "Кросс-компиляция" - это значит что вы компилируете проект на винде. Но только компилируете.
    Запускать его все равно нужно будет на малинке. И работать с GPIO он будет точно так же, как из софта. собранного на самой малине, никакие дополнительные библиотеки тут не нужны.
     
  3. Pitekantrop

    Pitekantrop Нерд

    Я именно так и делаю. Компилирую на windows , а запускаю на малинке. И на малинке идет нормальный обмен
    по UART с внешним компом.
     
  4. Pitekantrop

    Pitekantrop Нерд

    Попробовал вот этот код:
    Код (C++):
    /*

    Example of programming GPIO from C or C++ using the sysfs interface on
    a Raspberry Pi.

    Will toggle GPIO24 (physical pin 18) at a 100 millisecond rate for 10
    seconds and then exit.

    Jeff Tranter <jtranter@ics.com>

    */


    #include <errno.h>
    #include <fcntl.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/stat.h>
    #include <sys/types.h>
    #include <unistd.h>

    int main()
    {
        // Export the desired pin by writing to /sys/class/gpio/export

        int fd = open("/sys/class/gpio/export", O_WRONLY);
        if (fd == -1) {
            perror("Unable to open /sys/class/gpio/export");
            exit(1);
        }

        if (write(fd, "24", 2) != 2) {
            perror("Error writing to /sys/class/gpio/export");
            exit(1);
        }

        close(fd);

        // Set the pin to be an output by writing "out" to /sys/class/gpio/gpio24/direction

        fd = open("/sys/class/gpio/gpio24/direction", O_WRONLY);
        if (fd == -1) {
            perror("Unable to open /sys/class/gpio/gpio24/direction");
            exit(1);
        }

        if (write(fd, "out", 3) != 3) {
            perror("Error writing to /sys/class/gpio/gpio24/direction");
            exit(1);
        }

        close(fd);

        fd = open("/sys/class/gpio/gpio24/value", O_WRONLY);
        if (fd == -1) {
            perror("Unable to open /sys/class/gpio/gpio24/value");
            exit(1);
        }

        // Toggle LED 50 ms on, 50ms off, 100 times (10 seconds)

        for (int i = 0; i < 100; i++) {
            if (write(fd, "1", 1) != 1) {
                perror("Error writing to /sys/class/gpio/gpio24/value");
                exit(1);
            }
            usleep(50000);

            if (write(fd, "0", 1) != 1) {
                perror("Error writing to /sys/class/gpio/gpio24/value");
                exit(1);
            }
            usleep(50000);
        }

        close(fd);

        // Unexport the pin by writing to /sys/class/gpio/unexport

        fd = open("/sys/class/gpio/unexport", O_WRONLY);
        if (fd == -1) {
            perror("Unable to open /sys/class/gpio/unexport");
            exit(1);
        }

        if (write(fd, "24", 2) != 2) {
            perror("Error writing to /sys/class/gpio/unexport");
            exit(1);
        }

        close(fd);

        // And exit
        return 0;
    }

    Из вот отсюда: https://www.ics.com/blog/how-control-gpio-hardware-c-or-c

    Получаю сообщение что pin занят. Под root аналогично.

    Хотя на python ногой махать могу(светодиодиком)


    p.s.
    буду очень благодарен если дадите примеры работы на С без дополнительных библиотек для малинки:
    работа с GPIO, I2C, SPI
     
  5. parovoZZ

    parovoZZ Гуру

    а сможешь? Потому как там ось и прямая запись в регистры невозможна. Только через их отображение в ОЗУ.
    https://elinux.org/RPi_GPIO_Code_Samples
    В принципе, можно посмотреть в исходниках библиотеки wiringPI как оно там программируется.
     
  6. Pitekantrop

    Pitekantrop Нерд

    Я понимаю это. Вот попробовал по ссылке выше запустить работу с ногами - компиляция проходит, а на малине при запуске пишет ошибки.
     
  7. Un_ka

    Un_ka Гуру

    Автор отказался от её поддержки. Лучше поищите библиотеки для linux под конкретный интерфейс. У них есть будущее в отличие от нас неё. Лучше с ООП.