LINUX.ORG.RU

Реализация сообщения о подключение USB flash в QNX 6.5

 , ,


0

1

Доброго времени суток, уважаемые форумчане!) Пишу на С под QNX 6.5 и хочу реализовать следующее: Чтобы при подключении флешки появлялось сообщения о том, что флешка подключена и с ней можно работать. Аналогично, сообщение, если она отвалилась, и демонтировать флешку по нажатию кнопки. Пока сделал с использованием «жуткого велосипеда» : system(«pidin | grep -e \„devb-umass\“ > /home/umass.data»);

А потом просто повторяю в цикле эту функцию и проверяю файл /home/umass.data. Если там есть что-то, то значит драйвер запущен, следовательно, можно констотировать факт, что запоминающие устройство подключено. Если в файле что-то было, а потом он стал пустым, то логично допустить, что устройство было извлечено. Разумеется, данный подход мне не нравится и вот, что я подумал. Если при подключении флешки запускается драйвер, то могу ли я висеть на recv(), ожидая сообщение посланное от enun-devices (я ведь правильно понимаю, что он запустит devb-umass?)? А не в бесконечном цикле со sleep(). XD А может и поинтереснее способы есть?



Последнее исправление: ISoWant (всего исправлений: 1)

не обратный-ли вызов регистрировать надо а потом его обрабатывать ну или сообщение на событие сервису?

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

Не уверен, что правильно понял Вас. Могли бы Вы привести конкретный пример? Имею введу, какие функции, какие библиотеки в данном случае используются?

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

Я занимался этими вопросами довольно давно, лет десять назад. Помню что драйвера регистрировали у procnto (собственно микроядро) прерывания посредством обратного вызова процедуры/отсылки сообщения драйверу(процессу драйвера). Так что возможно Ваши познания больше и моих и посвежее. Тогда была версия 6.1. Документация к их системе довольно подробная вместе со средой разработки. Поэтому конкретно по функциям и библиотекам не помогу, но я-бы копал в сторону реализации стека USB. Имел ввиду что возможно можно регистрировать штатно обработчики событий по их коду с отсылкой сообщения «регистранту» т.е. Вашему сервису/процессу в системе.

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

Вот и я так подумал. Но как раз описание подобных возможностей в документации и книгах не нашёл

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

Рассматривал эту библиотеку, но что-то не нашёл подходящего мне способа реализовать задуманное. Там, как я понял, всё равно придется в ручную опрашивать... Имею введу, что нельзя повесить мой процесс на ожидание ответа от какой-либо функций из этой библиотеке, которая бы сообщила о подключение флешки. Та же usbd_connect(), если я правильно понял, вызывается для подключения к usb устройству, т.е. когда уже известно, что флешка подключена. Но, спасибо, посмотрю ещё раз повнимательнее, может и упустил что.

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

Из последней ссылки: A pointer to a usbd_device_ident_t structure that identifies the devices you're interested in receiving insertion/removal callbacks for (a filter): typedef struct usbd_device_ident { _uint32 vendor; _uint32 device; _uint32 dclass; _uint32 subclass; _uint32 protocol; } usbd_device_ident_t; You can set the fields to USBD_CONNECT_WILDCARD or to an explicit value. You would typically make the usbd_device_ident_t structure be a filter for devices you support from this specific class driver.

Подчеркнул то что мне показалось ключом к решению Вашей задачи.

VKraft ★★
()
31 мая 2017 г.

Отсюда пример кода, который вешает ф-ию обратного вызова на событие всовывания/высовывания флешки (QNX 6.5.0) или какого-либо устройства USB:

#include <errno.h>              // EOK
#include <sys/usbdi.h>

static struct usbd_connection *conn_usb = NULL;
static void cbinsert(struct usbd_connection *connection, usbd_device_instance_t *ins);
static void cbremove(struct usbd_connection *connection, usbd_device_instance_t *ins);

int init(void)
{
    usbd_funcs_t funcs = { _USBDI_NFUNCS, cbinsert, cbremove, NULL };
    usbd_connect_parm_t parm = {NULL, USB_VERSION, USBD_VERSION, 0, 0, NULL, 0, NULL,  &funcs,0};

    if (usbd_connect(&parm, &conn_usb) != EOK)
    {
        /* write your own error handler */
        qDebug()<<"Error usbd_connect"<<errno;
    }
}

static void cbinsert(struct usbd_connection *usb_connection,usbd_device_instance_t *usb_instance)
{
    if (usb_instance->ident.dclass == 8 && usb_instance->ident.subclass == 6)
    {
        /* USB mass storage */
        qDebug()<<"USB mass storage insert";
    } else if (usb_instance->ident.dclass == 3 && usb_instance->ident.subclass == 1)
    {
        /* USB mouse */
        qDebug()<<"USB mouse insert";
    } else
    {
        /* unknown device */
        qDebug()<<"unknown device insert";
    }
}

static void cbremove(struct usbd_connection *usb_connection, usbd_device_instance_t *usb_instance)
{
    if (usb_instance->ident.dclass == 8 && usb_instance->ident.subclass == 6)
    {
        /* USB mass storage */
        qDebug()<<"USB mass storage remove";
    } else if (usb_instance->ident.dclass == 3 && usb_instance->ident.subclass == 1)
    {
        /* USB mouse */
        qDebug()<<"USB mouse remove";
    } else
    {
        /* unknown device */
        qDebug()<<"unknown device remove";
    }
}
Так же имеет смысл посмотреть на описание Media Content Detector (mcd) service. При примонтированной флешке в каталоге «/dev/mcd/.devices» появится что-то типа этого:
       0 c---------  1 root      root         0,   0 May 31 11:26 /dev/umass0
       0 c---------  1 root      root         0,   0 May 31 11:26 /dev/umass0t11
       0 c---------  1 root      root         0,   0 May 31 11:26 /fs/usb0
Для нескольких usb-флешек строк будет соответственно их кол-ву.

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