Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: User USB Driver  (Прочитано 1918 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн LonelyUser

  • Автор темы
  • Новичок
  • *
  • Сообщений: 5
  • Ubuntu 9.04 x32
    • Просмотр профиля
User USB Driver
« : 24 Мая 2009, 14:27:44 »
Добро всем времени суток. Возникла такая проблемка. Было значит у меня устройство собранное на usb, в винде работал с ним радовался, но так как обстоятельства вынудили перейти на Ubuntu, чему я ОЧЕНЬ РАД, потребовалось написать собственный драйвер под него, по скольку оно вообще никак не реагировало в системе и никаких признаков жизни не подавало, повторюсь в винде работает. Значит пошарил я по инету, загуглил вопрос, нашел следующее:http://www.opennet.ru/base/dev/write_linux_driver.txt.html. Прочел, благо знания языка хорошие, приступил писать, и в итоге получил примерно следующее#include <linux/kernel.h>
#include <linux/usb.h>

#define DEV_NAME       "HID-I/O"

#define PRODUCT_ID_0       0x05df
#define VENDOR_ID_0        0x16c0

#define PRODUCT_ID_1       0x21fe
#define VENDOR_ID_1        0x03eb

static struct usb_device_id hid_io_table [] = {
{ USB_DEVICE(VENDOR_ID_0, PRODUCT_ID_0) },
{ USB_DEVICE(VENDOR_ID_1, PRODUCT_ID_1) },
{ }          // терминирующий элемент списка
};

struct usb_device *_usb_dev_; /* the usb device */
struct usb_interface *_interface_; /* interface of this device */

static int hid_io_probe(struct usb_interface *interface, const struct usb_device_id *id)
{
    printf( "hid.io.probe\n");

    // assign global parameters
    _usb_dev_ = usb_get_dev(interface_to_usbdev(interface));
    _interface_ = interface;

    /* save our data pointer in this interface device */
    usb_set_intfdata(_interface_, _usb_dev_);



    return 0;
}

static void hid_io_disconnect(struct usb_interface *interface)
{
printf("hid.io.disconnect\n");

usb_set_intfdata(_interface_, NULL);
usb_put_dev(_usb_dev_);
}

static struct usb_driver hid_io_driver = {
.name =   DEV_NAME,
.probe =  hid_io_probe,
.disconnect = hid_io_disconnect,
.id_table =  hid_io_table,
};

static int __init hid_io_init(void)
{

return usb_register(&hid_io_driver); // регистрируем драйвер
}

static void __exit hid_io_exit(void)
{
usb_deregister(&hid_io_driver); // выгружаем драйвер
}

module_init (hid_io_init);
module_exit (hid_io_exit);

MODULE_DESCRIPTION("HID-I/O");
MODULE_LICENSE("GPL");
После чего надо это дело было скомпилировать. Погуглил. Получилась такая команда gcc -I /usr/src/linux-headers-2.6.28-11/include/ IO-drv.c Но после ее введения появляется куча ошибок в основном связанные с синтаксисом, странно перепроверил, ошибок нет, все делал по статье, и по примеру. Что происходит не знаю. Помогите.
« Последнее редактирование: 24 Мая 2009, 14:44:05 от LonelyUser »

Оффлайн ubuntar

  • Участник
  • *
  • Сообщений: 129
  • Qui quaerit, reperit
    • Просмотр профиля
Re: User USB Driver
« Ответ #1 : 24 Мая 2009, 18:11:23 »
Я не программист,но что-то мне кажется,что в примере,найденном вами,комментарии         static int __init my_module_init(void)
        {
          // регистрируем драйвер
          return usb_register(&my_driver);
        }

        static void __exit my_module_exit(void)
        {
          // выгружаем драйвер
          usb_deregister(&my_driver);
        }
Подразумевают некий объёмный код.Вы его пропустили?Поделитесь плиз.

Оффлайн LonelyUser

  • Автор темы
  • Новичок
  • *
  • Сообщений: 5
  • Ubuntu 9.04 x32
    • Просмотр профиля
Re: User USB Driver
« Ответ #2 : 24 Мая 2009, 22:31:26 »
Да нет тут все так и должно быть. Ошибок в коде нет.

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: User USB Driver
« Ответ #3 : 25 Мая 2009, 08:42:43 »
1)  не хватает заголовочных файлов
2) кривая сборка
почитай сначала как вообще драйвера (модули ядра) разрабатываются и компилируются
http://www.freesoftwaremagazine.com/articles/drivers_linux

Ммм... и еще printf таки придется выкинуть. Ядро не располагает стандартной библиотекой языка Си.

Для замены printf можно использовать printk

для сборки вашего примера надо:
1) заменить printf'ы на printk
2) добавить в самое начало
#include <linux/module.h>
3) создать файл Makefile содержащий
Код: (Makefile) [Выделить]
obj-m := IO-drv.o
4) выполнить примерно следующую команду
make -C /usr/src/linux-headers-`uname -r` M=`pwd` modules
Остальное по вышеприведенной ссылке
« Последнее редактирование: 25 Мая 2009, 09:06:00 от Yurror »

Оффлайн LonelyUser

  • Автор темы
  • Новичок
  • *
  • Сообщений: 5
  • Ubuntu 9.04 x32
    • Просмотр профиля
Re: User USB Driver
« Ответ #4 : 25 Мая 2009, 13:12:09 »
Ога. Спасибо. Все скомпилировалось. Курю статью.

 

Страница сгенерирована за 0.019 секунд. Запросов: 21.