Русский
Русский
English
Статистика
Реклама

Планшет

Планшет как жанр как я познакомилась с Huawei

14.05.2021 12:21:34 | Автор: admin

С планшетами у меня не заладилось давно: первый ноунейм мне кто-то дал погонять, и настолько он быстро издох, что я даже не запомнила, чей он был, кто производитель и чем вообще хорош. Единственное ощущение: неудобно. Дальше был вообще детектив.

В 2017 году я решила поехать в Финляндию, в местечко близ Миккели, и подумала, что неплохо бы там нафотографировать красивого и написать пару статей. На горе себе я купила Irbis: клавиатура моментально поцарапала экран, он был без слота для симки, а аккумулятор приказал долго жить и отказывался работать без розетки. Цифровой котейка сохранился могу подарить любому желающему. Может, сейчас Ирбисы стали лучше, но тогда я прокляла день, когда зашла в магазин. Но намедни произошло тут со мной нечто хорошее. Короче говоря, если есть тут люди из племени копирайтеров-дезигнеров, то я вам, кажется, "покушоц принёс" (с).

Планшет из СтарТрека - ну, типа того у меня и было в первый разПланшет из СтарТрека - ну, типа того у меня и было в первый раз

Неделю назад мне отдали б/ушный, но очень аккуратно юзанный планшет Huawei. До этого дня я ни разу не пользовалась никакой продукцией Huawei, даже наушниками. В принципе, даже не знаю, производят ли они наушники но вот планшет оценила, и поменяла своё отношение к планшетам. Оказалось, что штука довольно годная, мега-полезная, кое в чём даёт фору смартфону и компу и, в целом, удобный промежуточный нишевой вариант.

Цена

Поскольку девайсина мне досталась с чужого плеча, в первую очередь я погуглила цену. Не, ну правда: а я бы вот это купила? Итак, Huawei MatePad с тушкой в 10.4 дюйма стоит примерно 25 килорублей. Честно говоря, по первой мысли: не купила бы, дороговато. Но это я, у меня смартфон Redmi A1, без NFC-модуля 2016 года рождения, три копейки в базарный день. Так что не стоит ориентироваться на мою жмотническую натуру, цена вполне разумная. И потому вторая мысль была: да, купила бы. И во втором мнении утвердилась после недели работы на планшете.

Снимала на Redmi, качество - жуть жуткая. А на самом деле у Huawei не картинка, а мечта.Снимала на Redmi, качество - жуть жуткая. А на самом деле у Huawei не картинка, а мечта.

Комплектация

Изначально в коробке должно было быть всё, но голова от зарядки была, а шнурка нет. Понятно, что в магазинной версии есть всё. Зато к планшету отлично подошел шнур type-С от смартфона. Зарядился планшет за ночь полностью, и стал открыт для ковыряния, но 10-ваттная зарядка - это, конечно, маловато. Зато заряд при активном использовании планшета держится три дня (большой объем батареи - 7250 mah), а с учетом того, что я питаю свой старенький смартфон каждую ночь, это, я вам скажу, недурно. Кстати, только что я обнаружила, что шнур-таки был, просто в упаковке - в коробочке. Это просто я - дятел :)

Конечно, в инструкцию я заглянула уже после того, как вдоволь полазала в гаджете, но, в целом, ничего в ней, этой инструкции особенного и нет: комплектация и инструкция, как вставлять симку. А, из смешного: поскольку в планшете нет гнезда наушников, оно прилагается в отдельном пакетике в виде шнурка C-jack headpbones. Звук, кстати говоря, отпадный чистый, глубокий, это я вам как человек с пониженным восприятием басов говорю: в первый раз за долгое время послушала Крэнберриз с наслаждением: потому что, Harman/Kardon, звук как у колонок JBL, четыре динамика.

Железо и софт

Работает стабильно, не тормозит, и понятно, почему: 8 ядер в процессоре, 4 Gb оперативки, производительность поболее, чем у моего пятилетнего ленововского лаптопа. Поиграла на нем в Fornight отлично, залипла даже слегка, потому что экран откалиброван практически идеально. Почитать книжку тоже можно, и даже нужно: на смартфоне, когда читаю, даже на ночном режиме, у меня скукоживаются и вытекают глаза. А тут можно и в кровати почитать (потому что лёгкий), и глаза расслаблены. Ну, насколько это возможно при чтении вообще. В планшете есть такой режим электронная книга - сугубо рекомендую любителям многостраничных ЛитРПГ. Понравилось, что есть режим защиты зрения, поскольку глаза и так устают от компа 24/7. Из маленьких приятностей есть Kirin 810NFC.


Через Aurora Store скачала те сервисы, что мне были нужны, установилось все нормально планшет не грелся. Вёл себя как заинька. YouTube vanced порадовал меня отсутствием рекламы, а сам планшет тем, что ничего не тормозило! Я так порадовалась этому обстоятельству, что даже посмотрела от начала до конца Разрушитель со Сталонне, хотя поначалу хотела просто проверить качество видео. Если часто путешествуете и в дороге смотрите фильмы, то, кажется, Huawei MatePad one love, one choice.

Chrome летает, нареканий нет. В Серпухове и Смоленске я подключила Google Maps, ну и все отлично работало, опять же без тормозов, в то время, как родной Redmi с Яндекс.Картами чуть не довел меня до слёз: не, ну реально, я крутилась у памятника Чехову как волчок, пока наконец смартфон милостиво не подгрузился. Планшет на том же Билайне показал себя гораздо лучше. А ещё у него металлический корпус, что добавляет уверенности в будущем. Во всяком случае, в его, планшета, будущем.

Порадовали: предустановленный Сбер и Яндекс.Дзен, программка интеллектуальной клавиатуры Swiftkey (кто много пишет, журналисты там, блогеры, СММ-щики очень рекомендую: довольно грамотный корректор, подбирает эмодзи, можно водить пальцем, а не тыкать. Такая, знаете, дочь Порфирьевича) По камерам могу сказать, что фронталка размещена немножко странно: сбоку, как у смартфонов. Но если там это оправданно, но здесь все время смещается фокус, глаза убегают в сторону и надо приноровиться к съемке.

Юзабилити

Сейчас главное скажу: можно одновременно работать в трёх окнах. Ну, к примеру: в одном у меня висел Инстаграм, во втором поиск картинок, гугловский, в третьем Канва, в которой я пилила обложечку для Инсты. И прекрасно всё это на одном экране уживалось, сохранив мне кучу времени и нервов. По сути, это переносной медиацентр, и своих денег он определенно стоит.

А, да, вот: я подключила его к камере своего квадрокоптера и вышел гораздо более качественный тандем, чем со старичком Redmi: изображение видно на большом экране лучше, цвета естественнее, не виснет. Правда, похвастаться кадрами не могу, потому как если с компами роман у меня более-менее случился, то летать я пока ещё не очень умею, и потому кхм, в общем, через полгода смогу похвастаться классными снимками, а пока сорри, придётся поверить на слово. Качество съемки на высоте: чёткая, можно снимать живые картинки, цвета не искажаются.

Вот коптер, дешевый, но вполне себе летающий. И готовый в общению с планшетом.Вот коптер, дешевый, но вполне себе летающий. И готовый в общению с планшетом.

Безусловно, у меня возник вопрос: если Huawei MatePad такой хороший, почему его отдали? Ответ меня насмешил: он не влезал в дамский рюкзачок. Ну, факт, да, в рюкзачок он не влезет, как не влезет в клатч и дамскую сумку. Но, упакованный в чехол с клавиатурой, вполне комфортно себя чувствует в городском рюкзаке и шоппере. Чехла я на него не нашла, а потому, опасаясь крошек от печенек, носила красавца в боковом кармане рюкзака. Один раз он у меня упал и хоть бы хны.

Почему носила, а не ношу сейчас? Планшет я отдала маме, ей он оказался нужнее: крупный экран, удобно играть в Candy Crush (кому что нравится, не осуждайте), понятный интерфейс. Но Huawei MatePad, как по мне, не только для старых и малых в нём есть всё, что надо, крупные яркие иконки, чистый экран, можно подгрузить много полезного, легкий и прочный. Вещь особо годная для тех, кто работает с соцсетями и контентом, с чего я и начала разговор. Я лично девайс оценила: как по мне, это 4,5 из 5, и то только потому, что на 5 я ещё ничего не встречала, но, как говорится, нет идеала в этом мире.

Подробнее..

Из песочницы Планшет как основной компьютер

06.09.2020 14:11:00 | Автор: admin
На этой неделе я решила поставить небольшой эксперимент и поработать за планшетом вместо ноута. В последнее время я часто слышу утверждения о том, что планшет может полностью заменить ноутбук, и что многим для работы вообще не нужно ничего кроме iPad: он высокопроизводительный, отлично держит зарядку, на нём нет ничего лишнего и нельзя случайно установить какую-то не ту программу. В общем, отличное устройство для большинства людей, которым не требуется специализированное ПО и не хочется вникать в технические аспекты устройства которое должно просто работать.

Вводные данные: я обычно работаю за MacBook Pro с внешним экраном и клавиатурой, а сейчас решила за тем же экраном и клавиатурой поработать за iPad Pro 3-го поколения с 12.9 дюймовым дисплеем. Я не первый раз работаю за планшетом и постоянно беру его в поездки и для этого специально приобрела Smart Keyboard Folio, но первый раз я решила поработать за ним полноценно из дома с внешним 27 дюймовым дисплеем и клавиатурой с трекпадом. Я менеджер проектов, поэтому основные инструменты у меня не узко специфичные и нацелены на координацию действий команды, отслеживание задач и общение, то есть Slack, Asana, разные инструменты Google, Dropbox Paper, Zoom и Телеграм это мой ежедневный набор основных программ. Ну и помидорка, конечно.

День 1


Так как экосистема Apple работает почти всегда отлично, то никакой адаптации, кроме установки помидорки, не потребовалось. Но я сразу же столкнулась с трудностью переключения раскладки клавиатуры. На работе у меня два языка общения и я постоянно переключаюсь с русского на английский и обратно, поэтому шорткат переключения клавиатуры у меня нажимается по несколько сотен раз в час. На iPad же для этого стоит специальная клавиша с глобусом Кажется что инженеры, которые это проектировали, никогда не переключаются между языками. С внешней клавиатурой всё оказалось ещё веселее: при отсутствии клавиши с глобусом, выбор клавиатуры осуществляется удержанием клавиш ctrl+shift+space, а выбор языка клавишами вверх вниз.

image

Соотношение сторон экрана планшета отличается от внешнего монитора, что приводит к бесполезному пространству на мониторе слева и справа. Меня на самом деле это не сильно смущает, так как я не фанат глазами искать нужную информацию по всему 27 дюймовому монитору. Ну и раз мы начали про это, я сильно не люблю гугловый поиск за то, что он всю информацию прижимает к левому углу. Почему нельзя сделать посередине?

При переходе на тёмную тему уши уже не так бросались в глаза, но из-за бликов я не сторонник работы за тёмным монитором, поэтому я выбрала меньшее из зол и продолжила работать за светлым монитором.

image

Управление. Как оказалось, кнопки яркости на внешней клавиатуре регулируют яркость экрана планшета, а громкости уровень звука монитора. Настройки яркости монитора в итоге тоже нашлись в дебрях приложения Настройки.

Один из забавных моментов момент состоит в том, что при покупке какого-то приложения нужен Face ID, и ты выглядываешь из-за монитора к планшету, чтобы он тебя узнал. А ещё он стоит открытый, в отличие от компа, который у меня всегда был рядом в сложенном вертикальном состоянии, чтобы не занимать место на рабочем столе.

Следующий момент заключается в том, что не все приложения для планшета имеют тот же функционал, что их версии для компьютера или веб версии. Например, приложение Dropbox Paper в отличие от веб версии не даёт изменять настройки доступа при создании ссылки на документ.

Веселье началось во второй половине дня, когда у меня было запланировано совещание с коллегами. Хорошо, что я догадалась потестировать Zoom за 15 минут до встречи. В моем мониторе есть встроенная веб-камера, но оказалось, что камера работает только на планшете, а любое переключение между приложениями и даже сплит вью сразу прерывают моё видео. Пришлось общаться с планшета. Итог: отваливается шея, так как планшет стоял гораздо ниже монитора.

В целом ощущения под конец дня были очень приятные: классный интерфейс, ничего не отвлекает от конкретной задачи и просто невероятно круто подходит для того, чтобы на чем-то сосредоточится без раздражающих сообщений, уведомлений и кучи вкладок. Но даже к концу дня я всё также путалась с раскладкой и она сильно замедляла скорость печати, когда в предложении встречались и русские и английские слова. Кстати, в отличие от мака, планшет не запоминает какая раскладка была в последний раз при открытии определенного приложения.

Также в ходе эксперимента я оценила, насколько родные приложения круче продуманы для работы именно на планшете. Если в полноценной версии можно ругаться на интерфейс гугла, то в версии для планшета явно хромает и функционал, а у дробокса, который как раз таки подкупает дизайном, совсем мало осталось функций, а форматирование слетело, потому я даже переключилась на веб версию. VPN тоже опробован, и приложения реагируют на него должным образом.

Кстати, все внешние устройства, которые я использую во время рабочего дня: колонки и наушники вели себя прекрасно, потому что Zoom и Spotify няшки.

День 2


На следующий день мозг уже привык к странному сочетанию клавиш и переключение языка уже почти не раздражало. Думаю, что через пару дней я бы совсем привыкла.

Ближе к полудню я попробовала поставить планшет в чехле Smart Keyboard Folio прямо перед собой в качестве клавиатуры, трекпад остался на месте. Мне понравилось: Face ID работает отлично, переключение раскладки клавиатуры не требует усилий.

image

Затем пришла чреда программ для анализа наших приложений. И я обнаружила, что всё таки не все приложения одинаково хороши или плохи по принципу made by Apple/made by (name of the developer). Так, например, Google Analytics в виде приложения ведёт себя почти отлично (скролл не очень хорошо себя показал), а вот App Store Connect всё же не адаптирован под планшет и представляет из себя копию убогой версии для телефона.

SplitView показал себя замечательно: даже при уменьшении масштаба страничек и таблиц до 60-70% работать было комфортно. Из минусов: я не поняла, как открыть рядом две гугловские таблицы.

Вечером я решила также посмотреть на разные приложения, которые я использую не только для работы. Например, моё любимое приложение для разных ментальных карт и графиков Microsoft Whiteboard оказалось странным при внешнем мониторе: я всё равно рисовала, глядя на планшет. Тоже самое коснулось парочки графических редакторов. Lightroom вёл себя, как обычно, но так как полноценной версии для планшета пока нет, то для меня это было не особо актуально. Очень забавно работает Instagram: у него заблокирована ориентация для планшета, но на внешнем дисплее он повернулся на 90 градусов, однако для того, чтобы листать ленту и взаимодействовать с приложением трекпад пришлось тоже повернуть на 90 градусов ()

image

Вывод


За планшетом оказалось работать намного удобнее, чем я себе это представляла. Я думала, что уже через час сбегу обратно к своему MacBook Pro и скажу, что не буду изменять ему больше никогда, но к своему удивлению на следующий день у меня было желание продолжить работать за чудесным iPad.

Ощущения оказались очень интересными: из-за невероятно классной анимации, переходов и дизайна, кажется, что MacBook это что-то устаревшее, и ты наконец-то работаешь за устройством нового поколения. Все приложения выглядят одинаково опрятно, почти ничего не крашится (кроме гугловских документов). Забавный момент состоит в том, что на большом экране сразу видны мелкие изъяны приложений в плане дизайнерских недоработок, и я с удовольствием отметила, насколько наши приложения выглядят классно и красиво (особенно, по сравнению с Мишленовским гидом).

Синхронизация между iPhone и iPad показалась мне более бесшовной, чем между этими же устройствами и MacBook. Из огромных плюсов: гораздо быстрее синхронизируются фотографии между телефоном и планшетом, а также их загрузка в нужные документы идёт через нормальный интерфейс, а не как на маке через одно место.

Основной вывод: iPad полноценный компьютер с классным интерфейсом и, я думаю, что через пару лет его допилят до состояния для всех, а компьютеры перейдут в класс для профессионалов.
Подробнее..

USB на регистрах interrupt endpoint на примере HID

10.04.2021 12:12:31 | Автор: admin

Еще более низкий уровень (avr-vusb)
USB на регистрах: STM32L1 / STM32F1
USB на регистрах: bulk endpoint на примере Mass Storage
USB на регистрах: isochronous endpoint на примере Audio device

Продолжаем разбираться с USB на контроллерах STM32L151. Как и в предыдущей части, ничего платформо-зависимого здесь не будет, зато будет USB-зависимое. Если точнее, будем рассматривать третий тип конечной точки interrupt. И делать мы это будем на примере составного устройства клавиатура + планшет (ссылка на исходники).
На всякий случай предупреждаю: данная статья (как и все остальные) скорее конспект того, что я понял, разбираясь в этой теме. Многие вещи так и остались магией и я буду благодарен если найдется специалист, способный объяснить их.

Первым делом напомню, что протокол HID (Human Interface Device) не предназначен для обмена большими массивами данных. Весь обмен строится на двух понятиях: событие и состояние. Событие это разовая посылка, возникающая в ответ на внешнее или внутреннее воздействие. Например, пользователь кнопочку нажал или мышь передвинул. Или на одной клавиатуре отключил NumLock, после чего хост вынужден и второй послать соответствующую команду, чтобы она это исправила, также послав сигнал нажатия NumLock и включила его обратно отобразила это на индикаторе. Для оповещения о событиях и используются interrupt точки. Состояние же это какая-то характеристика, которая не меняется просто так. Ну, скажем, температура. Или настройка уровня громкости. То есть что-то, посредством чего хост управляет поведением устройства. Необходимость в этом возникает редко, поэтому и взаимодействие самое примитивное через ep0.

Таким образом назначение у interrupt точки такое же как у прерывания в контроллере быстро сообщить о редком событии. Вот только USB штука хост-центричная, так что устройство не имеет права начинать передачу самостоятельно. Чтобы это обойти, разработчики USB придумали костыль: хост периодически посылает запросы на чтение всех interrupt точек. Периодичность запроса настраивается последним параметром в EndpointDescriptor'е (это часть ConfigurationDescriptor'а). В прошлых частях мы уже видели там поле bInterval, но его значение игнорировалось. Теперь ему наконец-то нашлось применение. Значение имеет размер 1 байт и задается в миллисекундах, так что опрашивать нас будут с интервалом от 1 мс до 2,55 секунд. Для низкоскоростных устройств минимальный интервал составляет 10 мс. Наличие костыля с опросом interrupt точек для нас означает, что даже в отсутствие обмена они будут впустую тратить полосу пропускания шины.

Логичный вывод: interrupt точки предназначены только для IN транзакций. В частности, они используются для передачи событий от клавиатуры или мыши, для оповещения об изменении служебных линий COM-порта, для синхронизации аудиопотока и тому подобных вещей. Но для всего этого придется добавлять другие типы точек. Поэтому, чтобы не усложнять пример, ограничимся реализацией HID-устройства. Вообще-то, такое устройство мы уже делали в первой части, но там дополнительные точки не использовались вовсе, да и структура HID-протокола рассмотрена не была.

ConfigurationDescriptor


static const uint8_t USB_ConfigDescriptor[] = {  ARRLEN34(  ARRLEN1(    bLENGTH, // bLength: Configuration Descriptor size    USB_DESCR_CONFIG,    //bDescriptorType: Configuration    wTOTALLENGTH, //wTotalLength    1, // bNumInterfaces    1, // bConfigurationValue: Configuration value    0, // iConfiguration: Index of string descriptor describing the configuration    0x80, // bmAttributes: bus powered    0x32, // MaxPower 100 mA  )  ARRLEN1(    bLENGTH, //bLength    USB_DESCR_INTERFACE, //bDescriptorType    0, //bInterfaceNumber    0, // bAlternateSetting    2, // bNumEndpoints    HIDCLASS_HID, // bInterfaceClass:     HIDSUBCLASS_BOOT, // bInterfaceSubClass:     HIDPROTOCOL_KEYBOARD, // bInterfaceProtocol:     0x00, // iInterface  )  ARRLEN1(    bLENGTH, //bLength    USB_DESCR_HID, //bDescriptorType    USB_U16(0x0110), //bcdHID    0, //bCountryCode    1, //bNumDescriptors    USB_DESCR_HID_REPORT, //bDescriptorType    USB_U16( sizeof(USB_HIDDescriptor) ), //wDescriptorLength  )  ARRLEN1(    bLENGTH, //bLength    USB_DESCR_ENDPOINT, //bDescriptorType    INTR_NUM, //bEdnpointAddress    USB_ENDP_INTR, //bmAttributes    USB_U16( INTR_SIZE ), //MaxPacketSize    10, //bInterval  )  ARRLEN1(    bLENGTH, //bLength    USB_DESCR_ENDPOINT, //bDescriptorType    INTR_NUM | 0x80, //bEdnpointAddress    USB_ENDP_INTR, //bmAttributes    USB_U16( INTR_SIZE ), //MaxPacketSize    10, //bInterval  )  )};


Внимательный читатель тут же может обратить внимание на описания конечных точек. Со второй все в порядке IN точка (раз произведено сложение с 0x80) типа interrupt, заданы размер и интервал. А вот первая вроде бы объявлена как OUT, но в то же время interrupt, что противоречит сказанному ранее. Да и здравому смыслу тоже: хост не нуждается в костылях чтобы передать в устройство что угодно и когда угодно. Но таким способом обходятся другие грабли: тип конечной точки в STM32 устанавливается не для одной точки, а только для пары IN/OUT, так что не получится задать 0x81-й точке тип interrupt, а 0x01-й control. Впрочем, для хоста это проблемой не является, он бы, наверное, и в bulk точку те же данные посылал что, впрочем, я проверять не стану.

HID descriptor


Структура HID descriptor'а больше всего похожа на конфигурационных файл имя=значение, но в отличие от него, имя представляет собой числовую константу из списка USB-специфичных, а значение либо тоже константу, либо переменную размером от 0 до 3 байт.
Важно: для некоторых имен длина значения задается в 2 младших битах поля имени. Например, возьмем LOGICAL_MINIMUM (минимальное значение, которое данная переменная может принимать в штатном режиме). Код этой константы равен 0x14. Соответственно, если значения нет (вроде бы такого не бывает, но утверждать не буду зачем-то же этот случай ввели), то в дескрипторе будет единственное число 0x14. Если значение равно 1 (один байт) то записано будет 0x15, 0x01. Для двухбайтного значения 0x1234 будет записано 0x16, 0x34, 0x12 значение записывается от младшего к старшему. Ну и до кучи число 0x123456 будет 0x17, 0x56, 0x34, 0x12.

Естественно, запоминать все эти числовые константы мне лень, поэтому воспользуемся макросами. К сожалению, я так и не нашел способа заставить их самостоятельно определять размер переданного значения и разворачиваться в 1, 2, 3 или 4 байта. Поэтому пришлось сделать костыль: макрос без суффикса отвечает за самые распространенные 8-битные значения, с суффиксом 16 за 16-битные, а с 24 за 24-битные. Также были написаны макросы для составных значений вроде диапазона LOGICAL_MINMAX24(min, max), которые разворачиваются в 4, 6 или 8 байтов.

Как и в конфигурационных файлах, здесь присутствуют секции, называемые страницами (usage_page), которые группируют устройства по назначению. Скажем, есть страница с базовой периферией вроде клавиатур, мышек и просто кнопок, есть джойстики и геймпады (искренне рекомендую посмотреть какие именно! Там и для танков, и для космических кораблей, и для подводных лодок и для всего чего угодно), даже дисплеи есть. Правда, где искать софт, умеющий со всем этим работать, я без понятия.

Внутри каждой страницы выбирается конкретное устройство. Например, для мышки это указатель и кнопки, а для планшета стилус или палец юзера (что?!). Ими же обозначаются составные части устройства. Так, частью указателя являются его координаты по X и Y. Некоторые характеристики можно сгруппировать в коллекцию, но для чего это делается я толком не понял. В документации к полям иногда ставится пометка из пары букв о назначении поля и способе работы с ним:

CA Collection(application) Служебная информация, никакой переменной не соответствующая
CL Collection(logical) -/-
CP Collection(phisical) -/-
DV Dynamic Value входное или выходное значение (переменная)
MC Momentary Control флаг состояния (1-флаг взведен, 0-сброшен)
OSC One Shot Control однократное событие. Обрабатывается только переход 0->1


Есть, разумеется, и другие, но в моем примере они не используются. Если, например, поле X помечено как DV, то оно считается переменной ненулевой длины и будет включено в структуру репорта. Поля MC или OSC также включаются в репорт, но имеют размер 1 бит.

Один репорт (пакет данных, посылаемый или принимаемый устройством) содержит значения всех описанных в нем переменных. Описание кнопки говорит о всего одном занимаемом бите, но для относительных координат (насколько передвинулась мышка, например) требуется как минимум байт, а для абсолютных (как для тачскрина) уже нужно минимум 2 байта. Плюс к этому, многие элементы управления имеют еще свои физические ограничения. Например, АЦП того же тачскрина может иметь разрешение всего 10 бит, то есть выдавать значения от 0 до 1023, которое хосту придется масштабировать к полному разрешению экрана. Поэтому в дескрипторе помимо предназначения каждого поля задается еще диапазон его допустимых значений (LOGICAL_MINMAX), плюс иногда диапазон физических значений (в миллиматрах там, или в градусах) и обязательно представление в репорте. Представление задается двумя числами: размер одной переменной (а битах) и их количество. Например, координаты касания тачскрина в создаваемом нами устройстве задаются так:
USAGE( USAGE_X ), // 0x09, 0x30,USAGE( USAGE_Y ), // 0x09, 0x31,LOGICAL_MINMAX16( 0, 10000 ), //0x16, 0x00, 0x00,   0x26, 0x10, 0x27,REPORT_FMT( 16, 2 ), // 0x75, 0x10, 0x95, 0x02,INPUT_HID( HID_VAR | HID_ABS | HID_DATA), // 0x91, 0x02,

Здесь видно, что объявлены две переменные, изменяющиеся в диапазоне от 0 до 10000 и занимающие в репорте два участка по 16 бит.

Последнее поле говорит, что вышеописанные переменные будут хостом читаться (IN) и поясняется как именно. Описывать его флаги подробно я не буду, остановлюсь только на нескольких. Флаг HID_ABS показывает, что значение абсолютное, то есть никакая предыстория на него не влияет. Альтернативное ему значение HID_REL показывает что значение является смещением относительно предыдущего. Флаг HID_VAR говорит, что каждое поле отвечает за свою переменную. Альтернативное значение HID_ARR говорит, что передаваться будут не состояния всех кнопок из списка, а только номера активных. Этот флаг применим только к однобитным полям. Вместо того, чтобы передавать 101/102 состояния всех кнопок клавиатуры можно ограничиться несколькими байтами со списком нажатых клавиш. Тогда первый параметр REPORT_FMT будет отвечать за размер номера, а второй за количество.

Поскольку размер всех переменных задается в битах, логично спросить: а что же с кнопками, ведь их количество может быть не кратно 8, а это приведет к трудностям выравнивания при чтении и записи. Можно было бы выделить каждой кнопке по байту, но тогда бы сильно вырос объем репорта, что для скоростных передач вроде interrupt, неприятно. Вместо этого кнопки стараются расположить поближе друг к другу, а оставшееся место заполняют битами с флагом HID_CONST.

Теперь мы можем если не написать дескриптор с нуля, то хотя бы попытаться его читать, то есть определить, каким битам соответствует то или иное поле. Достаточно посчитать INPUT_HID'ы и соответствующие им REPORT_FMT'ы. Только учтите, что именно такие макросы придумал я, больше их никто не использует. В чужих дескрипторах придется искать input, report_size, report_count, а то и вовсе числовые константы.

Вот теперь можно привести дескриптор целиком:
static const uint8_t USB_HIDDescriptor[] = {  //keyboard  USAGE_PAGE( USAGEPAGE_GENERIC ),//0x05, 0x01,  USAGE( USAGE_KEYBOARD ), // 0x09, 0x06,  COLLECTION( COLL_APPLICATION, // 0xA1, 0x01,    REPORT_ID( 1 ), // 0x85, 0x01,    USAGE_PAGE( USAGEPAGE_KEYBOARD ), // 0x05, 0x07,    USAGE_MINMAX(224, 231), //0x19, 0xE0, 0x29, 0xE7,        LOGICAL_MINMAX(0, 1), //0x15, 0x00, 0x25, 0x01,    REPORT_FMT(1, 8), //0x75, 0x01, 0x95, 0x08         INPUT_HID( HID_DATA | HID_VAR | HID_ABS ), // 0x81, 0x02,     //reserved    REPORT_FMT(8, 1), // 0x75, 0x08, 0x95, 0x01,    INPUT_HID(HID_CONST), // 0x81, 0x01,                  REPORT_FMT(1, 5),  // 0x75, 0x01, 0x95, 0x05,    USAGE_PAGE( USAGEPAGE_LEDS ), // 0x05, 0x08,    USAGE_MINMAX(1, 5), //0x19, 0x01, 0x29, 0x05,      OUTPUT_HID( HID_DATA | HID_VAR | HID_ABS ), // 0x91, 0x02,    //выравнивание до 1 байта    REPORT_FMT(3, 1), // 0x75, 0x03, 0x95, 0x01,    OUTPUT_HID( HID_CONST ), // 0x91, 0x01,    REPORT_FMT(8, 6),  // 0x75, 0x08, 0x95, 0x06,    LOGICAL_MINMAX(0, 101), // 0x15, 0x00, 0x25, 0x65,             USAGE_PAGE( USAGEPAGE_KEYBOARD ), // 0x05, 0x07,    USAGE_MINMAX(0, 101), // 0x19, 0x00, 0x29, 0x65,    INPUT_HID( HID_DATA | HID_ARR ), // 0x81, 0x00,             )  //touchscreen  USAGE_PAGE( USAGEPAGE_DIGITIZER ), // 0x05, 0x0D,  USAGE( USAGE_PEN ), // 0x09, 0x02,  COLLECTION( COLL_APPLICATION, // 0xA1, 0x0x01,    REPORT_ID( 2 ), //0x85, 0x02,    USAGE( USAGE_FINGER ), // 0x09, 0x22,    COLLECTION( COLL_PHISICAL, // 0xA1, 0x00,      USAGE( USAGE_TOUCH ), // 0x09, 0x42,      USAGE( USAGE_IN_RANGE ), // 0x09, 0x32,      LOGICAL_MINMAX( 0, 1), // 0x15, 0x00, 0x25, 0x01,      REPORT_FMT( 1, 2 ), // 0x75, 0x01, 0x95, 0x02,      INPUT_HID( HID_VAR | HID_DATA | HID_ABS ), // 0x91, 0x02,      REPORT_FMT( 1, 6 ), // 0x75, 0x01, 0x95, 0x06,      INPUT_HID( HID_CONST ), // 0x81, 0x01,                      USAGE_PAGE( USAGEPAGE_GENERIC ), //0x05, 0x01,      USAGE( USAGE_POINTER ), // 0x09, 0x01,      COLLECTION( COLL_PHISICAL, // 0xA1, 0x00,                 USAGE( USAGE_X ), // 0x09, 0x30,        USAGE( USAGE_Y ), // 0x09, 0x31,        LOGICAL_MINMAX16( 0, 10000 ), //0x16, 0x00, 0x00, 0x26, 0x10, 0x27,        REPORT_FMT( 16, 2 ), // 0x75, 0x10, 0x95, 0x02,        INPUT_HID( HID_VAR | HID_ABS | HID_DATA), // 0x91, 0x02,      )    )  )};

Помимо рассмотренных ранее полей тут есть и такое интересное поле, как REPORT_ID. Поскольку, как понятно из комментариев, устройство у нас составное, хосту надо как-то определить, чьи данные он принимает. Для этого данное поле и нужно.

И еще одно поле, на которое хотелось бы обратить внимание OUTPUT_HID. Как видно из названия, оно отвечает не за прием репорта (IN), а за передачу (OUT). Расположено оно в разделе клавиатуры и описывает индикаторы CapsLock, NumLock, ScrollLock а также два экзотических Compose (флаг ввода некоторых символов, для которых нет собственных кнопок вроде , или ) и Kana (ввод иероглифов). Собственно, ради этого поля мы и заводили OUT точку. В ее обработчике будем проверять не надо ли зажечь индикаторы CapsLock и NumLock: на плате как раз два диодика и разведено.

Существует и третье поле, связанное с обменом данными FEATURE_HID, мы его использовали в первом примере. Если INPUT и OUTPUT предназначены для передачи событий, то FEATURE состояния, которое можно как читать, так и писать. Правда, делается это не через выделенные endpoint'ы, а через обычную ep0 путем соответствующих запросов.

Если внимательно рассмотреть дескриптор, можно восстановить структуру репорта. Точнее, двух репортов:
struct{  uint8_t report_id; //1  union{    uint8_t modifiers;    struct{      uint8_t lctrl:1; //left control      uint8_t lshift:1;//left shift      uint8_t lalt:1;  //left alt      uint8_t lgui:1;  //left gui. Он же hyper, он же winkey      uint8_t rctrl:1; //right control      uint8_t rshift:1;//right shift      uint8_t ralt:1;  //right alt      uint8_t rgui:1;  //right gui    };  };  uint8_t reserved; //я не знаю зачем в официальной документации это поле  uint8_t keys[6]; //список номеров нажатых клавиш}__attribute__((packed)) report_kbd;struct{  uint8_t report_id; //2  union{    uint8_t buttons;    struct{      uint8_t touch:1;   //фактнажатия на тачскрин      uint8_t inrange:1; //нажатие в рабочей области      uint8_t reserved:6;//выравнивание до 1 байта    };  };  uint16_t x;  uint16_t y;}__attribute__((packed)) report_tablet;


Отправлять их будем по нажатию кнопок на плате, причем. поскольку пишем мы всего лишь пример реализации, а не законченное устройство, делать это будем по-варварски посылая два репорта, в первом из которых нажимая клавиши, а во втором отпуская. Причем с огромной тупой задержкой между посылками. Если не посылать репорт с отпущенными клавишами, система посчитает что клавиша осталась нажатой и будет ее повторять. Естественно, ни о какой эффективности тут не идет и речи, о безопасности тоже, но для теста сойдет. Ах да, куда ж без очередных граблей! Размер структуры должен совпадать с тем, что описано в дескрипторе, иначе винда сделает вид, что не понимает чего от нее хотят. Как обычно, линукс подобные ошибки игнорирует и работает как ни в чем не бывало.

В процессе тестирования наткнулся на забавный побочный эффект: в Windows7 при нажатии на тачскрин вылезает окошко рукописного ввода. Я об этой фиче не знал.

Если к вам попало готовое устройство


и хочется посмотреть на него изнутри. Первым делом, естественно, смотрим, можно даже от обычного пользователя, ConfigurationDescriptor:
lsusb -v -d <VID:PID>

Для HID-дескриптора же я не нашел (да и не искал) способа лучше, чем от рута:
cat /sys/kernel/debug/hid/<address>/rdes

Для полноты картины сюда стоило бы добавить как смотреть подобные вещи в других ОС. Но у меня соответствующих знаний нет, может в комментариях подскажут. Желательно, конечно, без установки стороннего софта.

Заключение


Вот, собственно, и все, что я нарыл по HID. План-минимум научиться читать готовые дескрипторы, эмулировать несколько устройств одновременно и реализовать планшетный ввод выполнен. Ну и философию interrupt точек рассмотрели заодно.

Как и в плошлый раз, немножко документации оставил в репозитории на случай если дизайнеры USB-IF снова решат испортить сайт.
Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru