2016-04-11 2 views
0

Я выполняю упражнение, в котором хочу получить доступ к узлу /dev/snd/controlC0 звуковой карты из ядра, чтобы настроить элемент управления tinymix из пространства ядра вместо пространства пользователя с помощью утилиты tinymix. Теперь из потока утилиты tinymix я обнаружил, что при запуске ее выполнение вызовет функцию mixer_open() из пользовательского пространства, которое внутренне вызывает функцию ядра ядра snd_ctl_open(). Теперь, поскольку я должен делать то же самое из ядра моего модуля необходимо вызвать ту же функцию. Проблема, с которой я столкнулся, - это функция snd_ctl_open() с аргументами struct inode *inode, struct file *file. Итак, как я могу получить информацию об индексе узла в моем модуле?Как получить доступ к узлу, созданному в пространстве пользователя из ядра?

Файл mixer.c находится в коде Android AOSP по адресу external/tinyalsa/mixer.c. snd_ctl_open() находится в ядре Linux по адресу sound/core/control.c.

Я нашел один в API ядра ядра filp_open(), который может выполнить задачу выше, но может быть использован только после монтирования файловой системы. Я хочу открыть узел до монтирования файловой системы.

Короче говоря, моя цель - понять, как я могу открыть или открыть узел устройства из ядра до того, как будет установлена ​​файловая система.

+0

Этот интерфейс не предназначен для использования в пространстве ядра. Почему, по-вашему, вам нужно переместить tinymix в ядро? –

+0

Спасибо за ответ. Моя цель - включить звук на Pandaboard из ядра. Теперь для включения звука мне нужно установить некоторые настройки микшера, чтобы включить путь звука из модуля. Теперь, чтобы установить настройку микшера, мне нужно получить доступ к узлу устройства/dev/snd/controlC0 из ядра. Еще одна вещь: я не хочу использовать сам tinymix из ядра. Я просто хочу реплицировать задачу, выполняемую tinymix в моем модуле. – Hemant

+0

Почему вы не можете сделать это в драйвере машины? –

ответ

0

Спасибо за ответ scott.

Я могу получить доступ к узлу устройства /dev/controlC0, а также установить параметры управления микшером из модуля ядра. Я выполнил нижеследующий подход.

  1. Существует одна глобальная структура «static struct snd_minor *snd_minors[SNDRV_OS_MINORS]», которая определена в sound/core/sound.c. Эта структура имеет информацию о незначительном количестве всех звуковых устройств.
  2. Я нашел способ найти узел устройства и структуру указателя файла с младшего номера устройства. Итак, что я сделал, я вызываю функцию find_control_device() из моего драйвера, которая, в свою очередь, перебирает все устройства и проверяет тип устройства SNDRV_DEVICE_TYPE_CONTROL (устройство управления звуком). Функция find_control_device() возвращает младший номер устройства управления.
  3. С устройства minor no Я могу получить информацию о узле устройства и файловой структуре.
  4. Как только я получил вышеуказанную информацию, я вызываю snd_ctl_open(), который откроет узел устройства для операции.
  5. Поскольку приложение пространства пользователя взаимодействует с пространством ядра с использованием IOCTL. Чтобы установить настройку микшера, tinymix вызывает функцию snd_ctl_ioctl(). Поэтому я сделал одну функцию-обертку, которая вызовет внутренний вызов snd_ctl_ioctl() и установит значение управления микшером.

Я сделал все описанные выше действия в разделе module_init функции в driver.So как только водитель получает зарегистрироваться в дереве ядра необходимые элементы управления tinymix становятся установлены в соответствии с требованиями.

Я привел код tinymix.c из дерева кодов AOSP для управления аргументами IOCTL.

Спасибо,

Hemant

Смежные вопросы