| Категория >  Новости > Bluetooth для андроида. Портируем с Linux на Android драйвер USB-адаптера - «Новости» Bluetooth для андроида. Портируем с Linux на Android драйвер USB-адаптера - «Новости»5-01-2022, 00:01. Автор: Becker | 
| точки зрения программиста, центральный компонент подсистемы Bluetooth в Android — системная служба Bluetooth (представляющая собой приложение для Android), которая через Binder IPC дает приложениям доступ к услугам Bluetooth-профилей, а сама использует при этом JNI-интерфейсы, реализованные на уровне HAL и ведущие к компонентам стека Bluetooth и расширениям поставщика (в двоичных библиотеках). Архитектура подсистемы Bluetooth в Android 7 Эту схему можно продолжить вниз по системной иерархии, и тогда станет видно, что библиотеки HAL используют интерфейс  Нижний уровень подсистемы Bluetooth в Android Осталось выяснить, на каком именно уровне у нас проблема, которая мешает адаптеру взять и заработать. Операционная система Android — это ядро Linux, поверх которого работает гипервизор виртуальных машин Dalvik. Начинать анализ разумно с нижнего уровня, последовательно убеждаясь в том, что есть физическое подключение, операционная система и драйвер видят адаптер, он доступен на уровне HAL и так далее — до момента, когда он должен работать. Чтобы исследовать ОС и вносить в нее изменения, нужен доступ к командной оболочке с правами суперпользователя. Об основах использования консоли Android можно прочитать в статье «Консольный Android». warningВмешательство в операционную систему с правами суперпользователя может нарушить работоспособность устройства и вывести его из строя. Принимая решение выполнить описанные в статье рекомендации, исследователь берет на себя полную ответственность за возможные негативные последствия своих действий. РекогносцировкаВ системных сообщениях  
 Строка 1 говорит о том, что ядро Linux собрано с поддержкой стека Bluetooth, строка 2 сообщает о регистрации в ядре семейства протоколов Bluetooth. Сразу после этого инициализируются слои сокетов HCI, L2CAP и SCO (3–6). Затем активируются драйверы, предназначенные для взаимодействия с адаптерами Bluetooth, подключаемыми по шинам UART и USB (7–13). К сожалению, последний «понимает» только контроллеры Realtek, а наш адаптер CSR этим драйвером не поддерживается. Последний блок сообщений (14–21) информирует об инициализации высокоуровневых протоколов RFCOMM, BNEP и HIDP стека Bluetooth. Строки 23–25 соответствуют реакции операционной системы на подключение USB-адаптера и говорят о том, что на физическом уровне он опознается шиной USB. Интересно, где же находится драйвер адаптера? Команда  Я изучил файловую систему ТВ‑приставки и нашел следующие компоненты, имеющие отношение к подсистеме Bluetooth: /app/Bluetooth/Bluetooth.apk/system/lib/libbluetooth_jni.so/system/lib/hw/audio.a2dp.default.so/system/lib/hw/bluetooth.default.so/system/lib/hw/bluetooth_rtk.default.so/system/lib/libbt-vendor_uart.so/system/lib/libbt-vendor_usb.so/system/lib/rtkbt/.../system/vendor/libbt-vendor.so/system/etc/bluetooth/bt_did.conf/system/etc/bluetooth/bt_stack.conf/system/etc/bluetooth/bt_vendor.conf/system/etc/bluetooth/rtkbt.conf/system/etc/bluetooth/rtkbt_plugins.confСледующие команды, последовательно примененные к файлам библиотек, помогут нам понять их зависимость друг от друга: $ strings /system/lib/hw/название-библиотеки.so | grep '.conf'Добавив эти компоненты на схему, я получил следующую картину. Взаимосвязь компонентов подсистемы Bluetooth в операционной системе исследуемой ТВ‑приставки Собранной информации достаточно, чтобы предположить, что драйверы на ТВ‑приставке не поддерживают Bluetooth-адаптеры на контроллерах CSR. Поскольку ядро имеет поддержку модулей, можно попытаться исправить дело, собрав соответствующий модуль с необходимым драйвером. Модуль ядра с драйвером USB-адаптераВ качестве платформы для сборки я использовал 64-битную ОС Bodhi Linux 6.0.0 (основанную на Ubuntu 20.04 LTS). У нее есть минималистичный установочный образ, в который входят инструменты метапакета build essential. Для наших работ достаточно виртуальной машины с оперативной памятью 1 Гбайт и накопителем 20 Гбайт. После установки системы и синхронизации с репозиторием надо установить дополнительные пакеты  Создадим каталог для работы: Чтобы собрать модуль драйвера, нужны исходники ядра Linux той версии, которая используется в операционной системе ТВ‑приставки, в данном случае 3.10.104. К счастью, на GitHub быстро нашелся репозиторий с ядрами Linux, адаптированными для устройств на платформе Rockchip. Забираем исходники из него: Теперь надо распаковать полученный архив в рабочий каталог и проверить, соответствует ли версия ядра ожиданиям: 
 Чтобы посмотреть, какие конфигурации доступны для платформы Rockchip, выполним команду 
 Вариант для операционной системы Chromium OS отбрасываем, остается  
 В нашей приставке стоит чип RK3229. Он 32-разрядный, поэтому нам актуален второй вариант. Для конфигурирования ядра, как написано в  Далее в только что созданный файл .config надо добавить строку  Исходные тексты ядра сконфигурированы и готовы к сборке модуля. Собирать будем с помощью инструментов Linaro. Их нужно извлечь из архива gcc-linaro-4.9.4-2017.01-x86_64_arm-eabi.tar.xz в каталог  ARCH=arm CROSS_COMPILE=arm-eabi- make modulesЧерез непродолжительное время модуль ядра будет сформирован в файле  
 Неудача: нам сообщили, что файл имеет неправильный формат. Детальное описание проблемы можно найти в сообщениях ядра: 
 Оказывается, собранная версия не имеет атрибута  $ make olddefconfigЗаписываем новый модуль на ТВ‑приставку и запускаем: # insmod /system/lib/modules/btusb.koПроверяем результат: 
 
 Неужели получилось? Пока что все говорит о том, что модуль заработал. Для проверки воспользуемся командой  
 В выводе должны появиться строки, соответствующие подключенному адаптеру. Потом адаптер надо отключить и снова выполнить  Альтернативный способ проверки — наблюдение за содержимым каталога  Из файла  На этом этапе возникает соблазн раздобыть утилиты hciconfig и hcitool, чтобы продолжить настраивать подсистему Bluetooth над ядром Linux, но это тупиковый путь. Наша задача — заставить работать Bluetooth в Android. А для этого надо принять, что задача обеспечить работу драйвера на уровне ядра выполнена, и обратиться к нашей схеме за следующей целью. Ей оказалась «библиотека производителя»  wwwДля автоматизации описанной выше работы — получения исходных текстов ядра, его настройки и сборки модуля — можешь воспользоваться моими сценариями на bash. Библиотека взаимодействия с драйверомС библиотекой  Перейти обратно к новости |