Невозможно отучить людей изучать самые ненужные предметы.
Введение в CSS
Преимущества стилей
Добавления стилей
Типы носителей
Базовый синтаксис
Значения стилевых свойств
Селекторы тегов
Классы
CSS3
Надо знать обо всем понемножку, но все о немногом.
Идентификаторы
Контекстные селекторы
Соседние селекторы
Дочерние селекторы
Селекторы атрибутов
Универсальный селектор
Псевдоклассы
Псевдоэлементы
Кто умеет, тот делает. Кто не умеет, тот учит. Кто не умеет учить - становится деканом. (Т. Мартин)
Группирование
Наследование
Каскадирование
Валидация
Идентификаторы и классы
Написание эффективного кода
Вёрстка
Изображения
Текст
Цвет
Линии и рамки
Углы
Списки
Ссылки
Дизайны сайтов
Формы
Таблицы
CSS3
HTML5
Блог для вебмастеров
Новости мира Интернет
Сайтостроение
Ремонт и советы
Все новости
Справочник от А до Я
HTML, CSS, JavaScript
Афоризмы о учёбе
Статьи об афоризмах
Все Афоризмы
Помогли мы вам |
Эту схему можно продолжить вниз по системной иерархии, и тогда станет видно, что библиотеки HAL используют интерфейс hci0
для доступа к HCI-сокетам ядра операционной системы, которые через драйвер позволяют взаимодействовать с аппаратным Bluetooth-модулем, подключенным к системной плате шиной SDIO, UART или USB.
Осталось выяснить, на каком именно уровне у нас проблема, которая мешает адаптеру взять и заработать.
Операционная система Android — это ядро Linux, поверх которого работает гипервизор виртуальных машин Dalvik. Начинать анализ разумно с нижнего уровня, последовательно убеждаясь в том, что есть физическое подключение, операционная система и драйвер видят адаптер, он доступен на уровне HAL и так далее — до момента, когда он должен работать.
Чтобы исследовать ОС и вносить в нее изменения, нужен доступ к командной оболочке с правами суперпользователя. Об основах использования консоли Android можно прочитать в статье «Консольный Android».
Вмешательство в операционную систему с правами суперпользователя может нарушить работоспособность устройства и вывести его из строя. Принимая решение выполнить описанные в статье рекомендации, исследователь берет на себя полную ответственность за возможные негативные последствия своих действий.
В системных сообщениях dmesg
упоминания о Bluetooth встречаются в следующих контекстах:
[
[
[
[
[
[
. . .[
[
[
[
[
[
[
. . .[
[
[
[
[
[
[
[
. . .[
[
[
Строка 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.
Интересно, где же находится драйвер адаптера? Команда lsmod
выдала список из двух модулей, среди которых rtk_btusb
не оказалось. Значит, он интегрирован в ядро Linux. Но список непустой, а значит, ядро собрано с поддержкой модулей. Запомним это на будущее.
Я изучил файловую систему ТВ‑приставки и нашел следующие компоненты, имеющие отношение к подсистеме 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-адаптеры на контроллерах CSR. Поскольку ядро имеет поддержку модулей, можно попытаться исправить дело, собрав соответствующий модуль с необходимым драйвером.
В качестве платформы для сборки я использовал 64-битную ОС Bodhi Linux 6.0.0 (основанную на Ubuntu 20.04 LTS). У нее есть минималистичный установочный образ, в который входят инструменты метапакета build essential. Для наших работ достаточно виртуальной машины с оперативной памятью 1 Гбайт и накопителем 20 Гбайт. После установки системы и синхронизации с репозиторием надо установить дополнительные пакеты unzip
, python2
и libncurses5
и создать символическую ссылку на интерпретатор:
Создадим каталог для работы:
Чтобы собрать модуль драйвера, нужны исходники ядра Linux той версии, которая используется в операционной системе ТВ‑приставки, в данном случае 3.10.104. К счастью, на GitHub быстро нашелся репозиторий с ядрами Linux, адаптированными для устройств на платформе Rockchip. Забираем исходники из него:
Теперь надо распаковать полученный архив в рабочий каталог и проверить, соответствует ли версия ядра ожиданиям:
$ cd kernel-release-3.10
$ head Makefile
VERSION = 3
PATCHLEVEL = 10
SUBLEVEL = 104
Чтобы посмотреть, какие конфигурации доступны для платформы Rockchip, выполним команду
$ make help | grep rockchip
rockchip_chromium_defconfig - Build for rockchip_chromium
rockchip_defconfig
- Build for rockchip
Вариант для операционной системы Chromium OS отбрасываем, остается rockchip_defconfig
. Ищем нужный конфиг:
$ find ./arch -name 'rockchip_defconfig'
./arch/arm64/configs/rockchip_defconfig
./arch/arm/configs/rockchip_defconfig
В нашей приставке стоит чип RK3229. Он 32-разрядный, поэтому нам актуален второй вариант. Для конфигурирования ядра, как написано в kernel-release-3.
и kernel-release-3.
, надо выполнить команды
arch/arm/configs/rockchip_defconfig android/configs/android-base.cfg android/configs/android-recommended.cfg
Далее в только что созданный файл .config надо добавить строку CONFIG_MODULES=y
(после строки CONFIG_MODULES
), чтобы включить поддержку модулей ядром, а также строку CONFIG_BT_HCIBTUSB=m
(после строки CONFIG_BT_HCIBTUSB
) — для сборки драйвера USB-адаптеров Bluetooth как модуля ядра. После этого выполним команду
Исходные тексты ядра сконфигурированы и готовы к сборке модуля. Собирать будем с помощью инструментов Linaro. Их нужно извлечь из архива gcc-linaro-4.9.4-2017.01-x86_64_arm-eabi.tar.xz в каталог tvbox
, после чего из подкаталога kernel-release-3.
выполняем команду
ARCH=arm CROSS_COMPILE=arm-eabi- make modules
Через непродолжительное время модуль ядра будет сформирован в файле kernel-release-3.
. Этот файл надо записать на ТВ‑приставку в каталог /
и попробовать запустить:
#
insmod: failed to load btusb.ko: Exec format error
Неудача: нам сообщили, что файл имеет неправильный формат. Детальное описание проблемы можно найти в сообщениях ядра:
#
btusb: version magic '3.10.104 SMP preempt ARMv7 p2v8 ' should be '3.10.104 SMP preempt mod_unload ARMv7 p2v8 '
Оказывается, собранная версия не имеет атрибута mod_unload
. Придется вернуться к исходным текстам и в файл .config после строки #
добавить параметр CONFIG_MODULE_UNLOAD=y
, а затем повторить сборку:
$ make olddefconfig
$ make modules
Записываем новый модуль на ТВ‑приставку и запускаем:
# insmod /system/lib/modules/btusb.ko
Проверяем результат:
#
usbcore: registered new interface driver btusb
#
Module Size Used by
btusb 14685 0 [permanent]
Неужели получилось? Пока что все говорит о том, что модуль заработал. Для проверки воспользуемся командой rfkill
(она становится доступной после установки BusyBox). Сначала надо выполнить команду rfkill
без подключенного модуля и запомнить ее вывод (если он не пустой). Затем подключить модуль и повторить выполнение команды:
#
0: hci0: bluetooth
Soft blocked: no
Hard blocked: no
В выводе должны появиться строки, соответствующие подключенному адаптеру. Потом адаптер надо отключить и снова выполнить rfkill
. Теперь строки, соответствующие адаптеру, должны исчезнуть из вывода. Только такое динамичное поведение говорит о работоспособности драйвера.
Альтернативный способ проверки — наблюдение за содержимым каталога /
. При подключении адаптера Bluetooth в нем должен создаваться подкаталог rfkillN
(где N
— номер устройства), а при отключении — исчезать.
Из файла /
, который содержит команды, выполняемые при загрузке системы для инициализации коммуникационных устройств, можно узнать, что файлам /
надо назначить владельца bluetooth:
, а файлу state
— еще и права доступа 0664
. Сделаем это и попытаемся активировать Bluetooth в настройках Android. Увы, но бегунок элемента управления снова возвращается в положение «Выкл.».
На этом этапе возникает соблазн раздобыть утилиты hciconfig и hcitool, чтобы продолжить настраивать подсистему Bluetooth над ядром Linux, но это тупиковый путь. Наша задача — заставить работать Bluetooth в Android. А для этого надо принять, что задача обеспечить работу драйвера на уровне ядра выполнена, и обратиться к нашей схеме за следующей целью. Ей оказалась «библиотека производителя» libbt-vendor.
— именно она должна обеспечить интерфейс между драйвером ядра и подсистемой Bluetooth в Android.
Для автоматизации описанной выше работы — получения исходных текстов ядра, его настройки и сборки модуля — можешь воспользоваться моими сценариями на bash.
С библиотекой libbt-vendor.
дело оказалось несколько сложнее, чем с драйвером. На сайте с исходниками Android обнаружились только материалы по библиотекам для адаптеров на чипах Realtek и Broadcom. Единственный вселяющий надежду репозиторий на GitHub с описанием «A libbt-vendor.so for usb bluetooth on Android» датирован сентябрем 2014 года и содержит единственный коммит — форк какого‑то давно исчезнувшего источника.
|
|