как связать устройство в / dev / с реальным драйвером - PullRequest
4 голосов
/ 06 октября 2009

Я пытаюсь понять, как работает драйвер устройства в Linux.

  1. У меня есть узел устройства следующим образом (Major number 89, имя устройства i2c-0)

     crw-r--r--    1 0        0         89,   0 Sep 29 01:36 /dev/i2c-0
    
  2. У меня есть драйвер i2c с именем i2c.ko, и я буду делать insmod i2c.ko во время запуска.

  3. А в драйвере при инициализации будет вызываться следующая функция:

    register_chrdev(89, "i2c", &i2chtv_fops)<0    // not "i2c-0"
    

Мой вопрос: когда пользователь вызывает open("/dev/i2c-0", O_RDWR), как ядро ​​знает, какой драйвер использовать? Я заметил, что имя устройства i2c-0, но зарегистрированное имя устройства i2c. Это потому, что они используют тот же старший номер, что ядро ​​может использовать правильный драйвер?

Ответы [ 2 ]

4 голосов
/ 06 октября 2009

Старший номер указывает, какой драйвер обрабатывает какой файл устройства. Младший номер используется только самим драйвером для определения того, на каком устройстве он работает, на тот случай, если драйвер обрабатывает более одного устройства.

Добавление драйвера в вашу систему означает его регистрацию в ядре. Это синоним присвоения ему старшего номера во время инициализации модуля. Вы делаете это с помощью функции register_chrdev, определенной в linux / fs.h.

 int register_chrdev(unsigned int major, const char *name,
       struct file_operations *fops); 

где unsigned int major - это основной номер, который вы хотите запросить, const char * name - это имя устройства, которое будет отображаться в / proc / devices и struct file_operations * fops - указатель на таблицу file_operations для вашего Водитель. Отрицательное возвращаемое значение означает, что регистрация не удалась. Обратите внимание, что мы не передали младший номер в register_chrdev. Это потому, что ядро ​​не заботится о младшем числе; только наш водитель использует его.

С здесь

3 голосов
/ 06 октября 2009

Да, старшие номера выбирают драйвер, а младшие - «единицы» (что бы это ни было; для драйвера консоли это разные экраны).

-0, который вы видите - это «устройство» (если в вашей системе более одной шины i2c).

...