LINUX.ORG.RU

Spi из QT приложения

 ,


0

1

Добрый день.Шаг за шагом пытаюсь разобраться с SPI на своей плате(CM-FX6, на плате Linux Ubuntu). Исходные данные которые есть сейчас: -настроил SPIdev для своих ног(через терминал отправлял байтик с помощью: echo -ne "\xAA">/dev/spidev1.0) -Qt Creator + Qt embedded + GDB

Такой вопрос: можно ли подружить spidev с приложением в QT(нужны прерывания по приему)?(Опыта написания драйверов под линукс вообще 0) Видел что пишут свой модуль SPI и потом встраивают в ядро, но как этот модуль дружить со своим приложением(я пока не понимаю).

Ты можешь считать кол-во байт в SPI буфере? Так то можно запилить вектор прервываний, если у тебя не 0 байт.

aiqu6Ait ★★★★
()
Ответ на: комментарий от aiqu6Ait

А смогу ли я вообще использовать этот spidev у себя в приложении и если знаете ссылки какие нибудь, киньте пожалуйста?или нужно писать драйвер как под микроконтроллер(Регистры,биты)?

NikishinRoman
() автор топика

https://www.raspberrypi.org/documentation/hardware/raspberrypi/spi/README.md

На RPi вот как организованно. Слушай, а ты в регистры напрямую можешь писать и читать из них? Если да - то все просто будет. Прерывание по SPI - это один бит в векторе прерываний, его можно активировать.

Запись в регистр - это запись по адресу регистра, ничего более, анологично - с чтением. По поводу интеграции твоего драйвера в ОС ничего сказать не могу - я под железо пишу отдельно, под ОС - отдельно.

aiqu6Ait ★★★★
()
Последнее исправление: aiqu6Ait (всего исправлений: 1)
Ответ на: комментарий от NikishinRoman

Мне просто нужен пинок в нужную сторону....просто надо переодически отправлять n-количество байт и принимать ответ который пришел и обработать...Вот само общение с SPI интересует из моего приложения!

NikishinRoman
() автор топика
Ответ на: комментарий от aiqu6Ait

К сожалению Segmentation fault при чтении регистра...

#define GPIOBASE 0x20E0000UL volatile unsigned int* gpio;

unsigned int gp; gpio = (unsigned int*)GPIOBASE; gp = *gpio;

NikishinRoman
() автор топика

Люди как-то без прерываний работают в своих user-space программах, разве нет? Если у тебя мастер то нужны ли прерывания вообще? Вроде записал и смотришь ответ...

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

В принципе тут должно все успевать. Мне бы ссылочку на примерчик как использовать в userspace этот spidev.

Пытался юзать пример(первый) с этой статьи http://habrahabr.ru/post/123266/

но вываливаюсь в fprintf(stderr, "Usage: %s <spidev>\n", argv[0]); exit(1);

NikishinRoman
() автор топика

гуголь сказал (https://www.kernel.org/doc/Documentation/spi/spidev), что spidev - это драйвер. и у его девайсов есть open/close, read/write в халф-дуплексе. кроме того, есть IOCTL'ы для настройки режимов чтения/записи и разных прочих настроек. что ещё требуется сверх этого? зачем тебе свой модуль в ядре? подключайся к девайсу и используй.

Iron_Bug ★★★★★
()

По поводу прерываний - их можно захватывать только из kernel space (т.е. только самим ядром или модулем ядра). Из юзерспейса можно только проверить факт того, что прерывание вообще было.

А что, разве под линуксом готовых хедеров для SPI нет? (просто я работал из под линукса только с I2C)

RiseOfDeath ★★★★
()
Последнее исправление: RiseOfDeath (всего исправлений: 1)
Ответ на: комментарий от RiseOfDeath

Интересует такой вопрос. #include <fcntl.h> #include <unistd.h> #include <sys/ioctl.h> #include <linux/types.h> #include <linux/spi/spidev.h>

Не видно этих файлов.К последним двум указал абсолютный путь...а где взять другие хедеры?

NikishinRoman
() автор топика
Ответ на: комментарий от NikishinRoman

Хрен его знает... они вроде бы «стандартные».

Если быть точным - эти хедеры должны идти вместе с компилятором.

Покрайней мере в arm-none-linux-gnueabi они есть.

RiseOfDeath ★★★★
()
Последнее исправление: RiseOfDeath (всего исправлений: 6)
Ответ на: комментарий от NikishinRoman

Начнем с простого. Чем вы компилируете?

Точнее не так. Скопируйте текст ошибки. Опишите где у вас лежит компилятор, как настроен «комплект» которым вы компилируете.

RiseOfDeath ★★★★
()
Последнее исправление: RiseOfDeath (всего исправлений: 1)
Ответ на: комментарий от NikishinRoman

Не понял, причём тут Qt?

Заходишь в каталог своего тулчейна и делаешь:

find . -name spidev.h

Должно найти всё что нужно. Если тулчейн конечно, под твою железку и ядро.

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 1)
Ответ на: комментарий от EXL

Впринцыпе не при чем, но если он не правильно настроит «комплекты» (Kits) в QtCreator, то разумеется среда будет запускать не тот компилятор и искать не те либы или вовсе пошлет его в пешее эротическоечитать маны.

RiseOfDeath ★★★★
()
Последнее исправление: RiseOfDeath (всего исправлений: 4)
Ответ на: комментарий от RiseOfDeath

У меня настроен комплект для моей платы.Компилятор arm-linux-gnueabihf-.

Сделал только что такой код. Осциллом заципился на ноги.Увидел свои байтики.Но мне не нравится, что Creator подчеркивает зеленым мои инклуды и пишит Not Search file or directory.

#include <iostream>
#include <stdint.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include </mnt/RootCM-FX6/usr/include/linux/types.h>

#include "/mnt/RootCM-FX6/usr/include/linux/spi/spidev.h"

static uint8_t mode = SPI_MODE_0;
static uint8_t bits = 0;
static uint32_t speed = 200000;

int main()
{
    const char* PathSpi;
    PathSpi = "/dev/spidev1.0";
    int ret = 0;
    int fd = 0;
    uint8_t tx[] = { 0xAA, 0xAA };
    uint8_t rx[] = {0, 0 };


    fd = open(PathSpi,O_RDWR);
    ret = ioctl(fd, SPI_IOC_WR_MODE, &mode);
    ret = ioctl(fd, SPI_IOC_RD_MODE, &mode);
    ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
    ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits);
    ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);

    struct spi_ioc_transfer tr;
         tr.tx_buf = (unsigned long)tx;
         tr.rx_buf = (unsigned long)rx;
         tr.len = 2;
         tr.delay_usecs = 0;
         tr.speed_hz = 0;
         tr.bits_per_word = bits;

         ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);


    return 0;

}

NikishinRoman
() автор топика
Ответ на: комментарий от NikishinRoman

#include </mnt/RootCM-FX6/usr/include/linux/types.h>
#include «/mnt/RootCM-FX6/usr/include/linux/spi/spidev.h»

Так делать не нужно. Эти заголовочные файлы должны быть в твоём тулчейне и вызываться по

#include <linux/types.h>
#include <linux/spi/spidev.h>

или по

#include <types.h>
#include <spi/spidev.h>

Проверь, что за пути отображаются при наведении курсора на stdint.h, fcntl.h и unistd.h Эти файлы тоже должны быть из твоего тулчейна, а не из /usr/include компа, например.

EXL ★★★★★
()
Ответ на: комментарий от NikishinRoman

Но при этом собирается без ошибок? Странно как-то. Какую систему сборки используешь? Попробуй открыть/закрыть файл исходника.

EXL ★★★★★
()
Ответ на: комментарий от NikishinRoman

Бывает при изменениях комплектов.

EXL ★★★★★
()
Ответ на: комментарий от anonymous

хм, это уже не каноничный SPI. это какое-то нестандартное расширение протокола. SPI - это действительно 4 провода и нудная бодяга с пересылкой битов.

Iron_Bug ★★★★★
()

Вместо прерывания для юзерспейса юзается poll()...

Хотя у Qt с этим будут грабли (нужно делать отдельно поток на i/o - иначе интерфейс умрет).

NiTr0 ★★★★★
()
Ответ на: комментарий от NiTr0

Везде надо делать отдельный поток на все, что может выполнится не мгновенно. (ну или, по крайней мере, отдельный опток на ГУЙ)

RiseOfDeath ★★★★
()
Последнее исправление: RiseOfDeath (всего исправлений: 1)
9 сентября 2015 г.
Ответ на: комментарий от NikishinRoman

тоже брал этот кусок из примера, компилит с ошибкой

У меня Qt ругается на строку: fd = open(PathSpi,O_RDWR); вроде хидеры те же самые подключены.

rain62ster
()

А для чего ты это делаешь можешь сказать? Для чего плата вообще и куда байтики пишешь?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.