slp s4 mini assertion width что это
Через тернии разработки ПК
В преддверии выставки Computex 2015 наша компания выпустила статью о новом, еще более мощном мини-компьютере. Но так ли легко было нам, разработчикам этого продукта? Сколько бессонных ночей стоила эта разработка инженерам, сколько проблем пришлось решить и подводных камней обойти? В этой статье нам хотелось бы рассказать о самом начале этого пути, это был 2009 год, «мы выживали как могли». Я думаю, дорогой читатель, Вам будет интересно почитать, какие грабли и с какой силой нас колошматили за время создания первой платы.
Немного истории
В начале 2009 года руководство компании принимает решение создать, а точнее – возродить направление разработки вычислительной техники. История компании довольна долгая, можно лишь упомянуть, что в 80-е годы компания участвовала в разработке ПК «Ириша». И вот, 2009 год, официальное тайваньское отделение «Communication Technology» начинает вести диалог с компанией Intel и её официальным дистрибьютером на Тайване. В итоге мы получаем документы на платформу Intel PineTrail-M TigerHill – это дуэт процессора Intel Atom серий N400/D500 и чипсета NM10. Для отладки первой версии нашей платы было решено развести её в форм-факторе COM Express. Это такой модуль мезонин 95×95 мм, с длинным многоконтактным разъемом. И чтобы Вы понимали всю суровость ситуации, схема модуля и разводка были сделаны не в какой-то там новомодной Cadence или Altium, а в старом ламповом PCAD 2006.
На фотографии уже вторая ревизия этого модуля:
Пациент скорее жив…
Вот представьте. Распаяно 5 модулей. Ложатся мне на стол. Нужно срочно запускать. Я на Тайване, мой начальник в Москве. Документов от Intel – референс-схема, руководство по дизайну для разводчика и пару даташитов на чипсет и процессор. Все, больше ничего нет.
Хочу вам сказать что мой непосредственный руководитель – Сорокин Анатолий Викторович, прекрасный и опытный инженер, который изменял схемотехнику для совместимости с COM Express удалил из неё так называемый EC – Embedded Controller. Эта микросхема отвечает за запуск и контроль питаний, управление вентиляторами и т.п. вещами. Соответственно цепочка запуска питаний стала банально проста, питания просто поднимались друг за другом и в конце концов поднимался общий так называемый POWER_GOOD, сообщая чипсету о готовности всех питаний. Принципиально, этот EC абсолютно не нужен на данном модуле, он может быть установлен на материнской плате, а может быть и не установлен, заметной роли он не играет.
Плата на столе, пассивная плата (материнка) тоже наша, проста как детекторный приёмник. Два питания – +5B для периферии и +12В для COM Express модуля, запуск которых контролируется небольшим микроконтроллером. Этим же микроконтроллером опрашивается состояние кнопки Вкл, также контролируются некоторые нужные сигналы с чипсета. Это сейчас я знаю, как эта кухня работает, а тогда было ВООБЩЕ НИЧЕГО НЕ ПОНЯТНО.
Ладно, подаем питание от лабораторного источника, нажимаем кнопку включения питания, микроконтроллер поднимает +5В и +12В, дергает на 100 мсек сигнал PWRBTN# и ждет секунду от чипсета поднятия сигнала SUS_S5#. Пока он эту секунду ждал, в воздух взлетел один из танталовых конденсаторов, при пайке перепутали полярность. Хорошо, перепаиваем и проверяем остальные. Парочку пришлось перепаять.
Запускаем опять. SUS_S5# стоит в единице, ничего не происходит, ток потребления небольшой, значит, питания. Замечу, что запуск питаний это вообще самый первый шаг запуска любой платы, но у таких сложных навороченных платформ 10-15 отдельных DC/DC-преобразователей, которые должны запускаться в строгой последовательности, а некоторые даже с задержками. В нашем случае первый шаг — это преобразование +12В в два основных питания +V5A, +V3.3A. A – это основное питание, которое должно запускаться железно по кнопке включения, оно запитывает чипсет.
Разбираемся дальше. Чипсет по поднятию PWROK и VMPWRGD обязан сообщить процессору CPUPWRGOOD и поднять PLTRST# — Platform Reset. Т.е. он ему говорит – всё, питания ок, отпускаю ресет, стартуй! CPUPWRGOOG поднимается, PLTRST# — нет. Опа… Приплыли… Хорошо, что у меня остались все снятые дампы анализатора, вот он, проблемный:
Две недели мы бились с этой проблемой, чего только не перепробовали. В итоге я нашел одну из нескончаемых потенциальных проблем – один из пинов чипсета должен был быть притянут к земле, а у нас он болтался в воздухе! В общем, мы сняли чипсет с платы, установили тонкую проволочку на контакт и припаяли новый чипсет. И оно заработало! Вот так это выглядело:
Фотографий, как железо выглядит под отладкой, к сожалению, не осталось, но вот, например, плата а платформе Haswell выглядела у меня на столе так:
Отлично, теперь очередь BIOS. Пока на отладочной плате я вижу код 0x00, а это значит, что загрузка BIOS из SPI EEPROM не осуществляется. Фотография – новодел, материнка была другая, но просто показать, как оно примерно выглядело на столе:
Разбираемся дальше, встаем на SPI_CLK – клок присутствует, запросы идут, встаем на SPI_MOSI – чипсет выдает пачки запросов, встаем на SPI_MISO – ноль. Подтяжка SPI_MISO – и ура, код 0x87. Ну наконец-то. Скорее всего BIOS требует EC. Встаем анализатором на LPC, тестируем и видим запросы на адрес 0x164E и 0x164F, это однозначно EC, после запросов BIOS виснет. Такое:
Отписали в AMI, Phoenix и Insyde. Phoenix прислал бинарник, но он не запустился, Insyde вообще стал задавать тупые вопросы, а в AMI достаточно быстро поняли проблему, и их бинарник завелся с первого раза. Все, основное железо запущено, далее проверяется только периферия.
Неожиданные проблемы с аудио-кодеком
После запуска платы прошло некоторое время, мы сделали пассивку с аудио-кодеком от Realtek. Ничего не предвещало беды, HDAUDIO-интерфейс подцепил кодек, устройство увиделось операционкой, даже заработал выход на динамик, но некоторые выходы и входы просто не работали.
Отписали в Realtek, пообщались, оказалось, что BIOS, по старту должен залить в аудио-кодек так называемый VERB Table. По сути установить внутренние регистры кодека в соответствии с требованиями использования. Т.е. из всего многообразия выходов – реально может быть использован только один. Таблица эта генерится специальным приложением от Realtek HDACfg. Там указывается вся информация, вплоть до расположения, цвета и типа разъема. Ну вот, приплыли, исходников BIOS нет, AMI за бесплатно нам помогать не стала. Что делать?
Уже даже не помню как, но я отыскал в сети программку (BIOS Patcher 7.0), которая сумела разобрать мне BIOS на составные части. UEFI BIOS представлен как некая капсула, внутри находится древовидная структура из разных типов модулей. Модули в основном запакованы. Причем некоторые своей хитрой компрессией. Ладно, нашел способ распаковать все модули, нашел модуль, отвечающий за инициализацию устройств на шине HDAUDIO. Очень повезло, что таблица одного из устройств была больше моей. Заменил её на свою, и, конечно, не забыл пофиксить длину. А вот собираться оно обратно абсолютно не захотело. Мне очень помог EDK Tianocore, с помощью его утилит, а именно genffsfile, gensection, genfvimage, я вручную собрал все необходимые секции. И оно заработало!
Сейчас я с некоей гордостью, что ли, вспоминаю эти победные моменты, ведь не было ничего, ни документации по запуску платформы, ни исходников BIOS, ни вменяемой поддержки со стороны Intel. Помогала только интуиция и опыт.
Теперь это несколько проще, конечно, все исходники у нас есть, поправить что-либо в BIOS можно достаточно быстро, диалог с AMI налажен, глюки я им периодически поставляю и они их правят. Документы от Intel приходят уже полными, т.е. чтобы вы понимали, например, на платформу Broadwell их около 130-ти. В Skylake уже под 400. Но все равно, первая ревизия платы всегда в итоге дорабатывается, всегда где-то что-то не притянуто, или еще какие-то проблемы.
Теперь есть в наличии дебаггер для BIOS, можно посмотреть отладку, и он уже много раз нас выручал. В нашей команде на одного человека больше, замечательный инженер, железячник, который решает кучу проблем. Теперь у нас свои SMD-линии, и таинство опытного производства происходит буквально в соседней комнате. Теперь Intel интегрирует чипсеты в SoC и меньше проблем с разводкой. Теперь у нас много партнеров и контактов по миру. Но тогда были другие времена, “мы выживали как могли”…
На первый раз, пожалуй, всё – казалось бы, всего пара абзацев, а на практике со всем этим мучились около двух месяцев. Если Вам понравилось, то в следующих статьях мы еще расскажем о чём-то подобном, а пока задавайте вопросы в комментариях.
Slp_s4# min. assertion width [1 to 2 seconds, Initiate graphic adapter [peg/pci, Peg port configuration – Asus TS100-E5/PI4 User Manual
Page 77
South Bridge Configuration
SMBUS Controller [Enabled]
Allows you to enable or disable the SMBUS Controller.
Configuration options: [Enabled] [Disabled]
SLP_S4# Min. Assertion Width [1 to 2 seconds]
Allows you to select the SLP_S4# Min. Assertion Width.
[4 to 5 seconds] [3 to 4 seconds] [2 to 3 seconds]
DRAM RAS# to CAS# Delay [6 DRAM Clocks]
Controls the latency between the DDR SDRAM active command and the
Configuration options: [3 DRAM Clocks] [4 DRAM Clocks] [5 DRAM Clocks]
[6 DRAM Clocks]
DRAM RAS# Precharge [6 DRAM Clocks]
Controls the idle clocks after issuing a precharge command to the DDR
Configuration options: [3 DRAM Clocks] [4 DRAM Clocks] [5 DRAM Clocks]
[6 DRAM Clocks]
DRAM RAS# Activate to Precharge Delay [15 DRAM Clocks]
Configuration options: [9 DRAM Clocks] [10 DRAM Clocks]
Initiate Graphic Adapter [PEG/PCI]
Allows you to select the graphics controller as the primary boot device.
Configuration options: [PCI/PEG] [PEG/PCI]
PEG Port Configuration
Configuration options: [Auto] [Disabled]
South Bridge chipset Configuration
SLP_S4# Min. Assertion Width [1 to 2 seconds]
PEG/Onchip VGA Control
Page 15 highlights
945GC-M7 TE DRAM RAS# Precharge If an insufficient number of cycles is allowed for RAS to accumulate its charge before DRAM refresh, the refresh may be incomplete, and the DRAM may fail to retain data. Fast gives faster performance; and Slow gives more stable performance. This field applies only when synchronous DRAM is installed in the system. The Choices: 4 (default), 2, 3, 5, 6, Auto. Precharge Delay (tRAS) This item controls the number of DRAM clocks to activate the precharge delay. The Choices: 11 (default), 4/5/6/7/8/9/10/12/13/14/15, Auto. System Memory Frequency This item allows you to select the Memory Frequency. The Choices: Auto (default), 400MHz, 533MHz, and 667MHz. VGA Setting PEG/Onchip VGA Control This item allows you to enabled or disabled PEG/On-chip VGA controller. The Choices: Auto (default), Onchip VGA, PEG Port. PEG Force X1 This item allows you to enabled or disabled the PEG Force X1 The Choices: Disabled (default), Enabled. SLP S4# Assertion Width This item sets the minimum assertion width of the SLP-S4# signal to guarantee the DRAM has been safely power-cycled. The Choices: 4 to 5 Sec. (default), 3 to 4 Sec., 2 to 3 Sec., 1 to 2 Sec. System BIOS Cacheable Selecting Enabled allows you caching of the system BIOS ROM at F0000h
FFFFFh, resulting a better system performance. However, if any program writes to this memory area, a system error may result. The Choices: Enabled (default), Disabled. Video BIOS Cacheable Select Enabled allows caching of the video BIOS, resulting a better system performance. However, if any program writes to this memory area, a system error may result. The Choices: Disabled (default), Enabled. 14
Как использовать assertions в Java
Используйте assertions (утверждения или ассерты) Java для проверки корректности кода и для ускорения тестирования и отладки ваших программ.
Написание программ, которые правильно работают, может оказаться сложной задачей. Поскольку наши предположения о том, как будет вести себя код при выполнении, часто ошибочны. Использование ассертов в Java — это один из способов проверить правильность логики программирования.
В этом руководстве рассказывается об ассертах в Java. Сначала вы узнаете, что такое ассерты и как их определять и использовать в коде. Далее вы узнаете, как использовать ассерты для обеспечения выполнения предварительных и постусловий. Наконец, вы сравните ассерты с исключениями и выясните, зачем в коде нужно и то и другое.
Загрузите исходный код примеров для этой статьи. Создано Джеффом Фризеном для JavaWorld.
Что такое ассерты в Java?
До JDK 1.4 разработчики часто использовали комментарии для документирования предположений о правильном использовании методов программы. Однако комментарии бесполезны как механизм для проверки и отладки предположений. Компилятор игнорирует комментарии, поэтому нет возможности использовать их для обнаружения ошибок. Разработчики также часто не обновляют комментарии при изменении кода.
В JDK 1.4 ассерты были введены как новый механизм для тестирования и отладки кода. По сути, ассерты — это компилируемые сущности, которые выполняются в runtime, если вы включили их для тестирования программы. Вы можете запрограммировать ассерты так, чтобы они уведомляли вас об ошибках ещё до того как они произошли и программа “упала”, что значительно сокращает время на отладку неисправной программы.
Ассерты используются для определения требований, исполнение которых делают программу правильной. И делается это при помощи проверки условий (логических выражений) на true. Если же выражение выдаёт false, разработчик получает уведомление об этом. Использование утверждений может значительно повысить вашу уверенность в правильности кода.
Как написать ассерт на Java
Ассерты реализуются с помощью оператора assert и класса java.lang.AssertionError. Этот оператор начинается с ключевого слова assert и продолжается логическим выражением. Синтаксически это выражается следующим образом:
Если значение BooleanExpr истинно, ничего не происходит и выполнение продолжается. Однако, если выражение оценивается как ложное, бросается AssertionError, как, например, в этом коде:
Листинг 1: AssertDemo.java (версия 1)
ассерт здесь говорит о том, что по мнению разработчика переменная x должна быть больше или равна 0. Однако это явно не так; выполнение оператора assert приводит к выбросу AssertionError.
Это сообщение несколько загадочно, так как не указывает, что привело к AssertionError. Если вам нужно более информативное сообщение, используйте assert с таким синтаксисом:
Здесь expr любое выражение, включая вызов метода (прим.пер.: в соответствии с лучшими современными практиками рекомендуется отказаться от вызовов методов из ассертов), которое должно возвращать значение — вы не можете вызвать метод void. Удобно использовать просто строку, описывающую причину сбоя, как показано ниже:
Листинг 2: AssertDemo.java (версия 2)
Запустите этот код с включенными ассертами. На этот раз вы увидите чуть больше информации, объясняющей причину выброса AssertionError:
Предварительные условия и постусловия
Ассерты проверяют предварительные и постусловия на true, и предупреждают разработчика, когда происходит нарушение:
Предварительные условия
Вы можете обеспечить выполнение предварительных условий для общедоступных конструкторов и методов, выполнив явные проверки и выбрасывая исключения при необходимости. Для private вспомогательных методов вы можете обеспечить выполнение предварительных условий, используя ассерты. Рассмотрим листинг 3.
Листинг 3: AssertDemo.java (версия 3)
Постусловия
Постусловия обычно указываются через ассерты, независимо от того, является ли метод (или конструктор) общедоступным. Рассмотрим такой код:
Листинг 4: AssertDemo.java (версия 4)
Этот пример демонстрирует важную характеристику ассертов — их выполнение, обычно, ресурсозатратно. По этой причине в промышленной версии программы ассерты обычно отключены. В методе isSorted() необходимо сканировать весь массив, что может занять много времени в случае большого массива.
Ассерты против исключений в Java
Разработчики используют ассерты для документирования логически запрещённых ситуаций и для обнаружения ошибок в логике программы. Во время её выполнения включенный ассерт предупреждает разработчика о логической ошибке. Разработчик меняет исходный код, чтобы исправить логическую ошибку, а затем перекомпилирует этот код.
Разработчики используют механизм исключений Java для ответа на нефатальные (например, нехватку памяти) ошибки, которые могут быть вызваны факторами окружающей среды, такими как несуществующий файл, или плохо написанным кодом, например попыткой разделить на 0. Обработчик исключений часто пишется так, чтобы после ошибки программа могла продолжить работу.
Ассерты не заменяют исключения. В отличие от исключений, ассерты не поддерживают восстановление после ошибок (ассерты обычно немедленно останавливают выполнение программы — AssertionError не предназначены для перехвата); они часто отключены в промышленном коде; и они обычно не отображают удобные для пользователя сообщения об ошибках (хотя это не проблема assert). Важно знать, когда использовать исключения, а не ассерты.
Когда использовать исключения
Предположим, вы написали sqrt()метод, который вычисляет квадратный корень из своего параметра. В контексте действительных чисел невозможно извлечь квадратный корень из отрицательного числа. Следовательно, вы используете ассерт для отказа от исполнения метода, если аргумент отрицательный. Рассмотрим следующий фрагмент кода:
Неуместно использовать ассерт для проверки аргумента в этом public методе. Ассерт предназначен для обнаружения ошибок в логике программирования, а не для защиты метода от ошибочных значений параметров. Кроме того, если ассерты отключены, невозможно решить проблему отрицательного аргумента. Лучше создать исключение следующим образом:
Разработчик может выбрать, обрабатывать исключение недопустимого аргумента или пробросить его, и тогда сообщение об ошибке отображается инструментом, запускающим программу. Прочитав сообщение об ошибке, разработчик может исправить код, вызвавший исключение.
В этом руководстве вы узнали, как использовать ассерты для документирования правильной логики программы. Вы также узнали, почему ассерты не заменяют исключения, и вы видели пример, в котором использование исключения было бы более эффективным.
Этот рассказ «Как использовать ассерты в Java» был первоначально опубликован JavaWorld .
Перевод Академии Progwards
Lineage OS 18.1 Samsung — обзор операционной системы, что нового
Lineage OS 18.1 Samsung — обзор операционной системы, что нового в последней версии
Lineage OS 18.1 Samsung была создана в далеком 2016 году в качестве стандартного пользовательского ПЗУ для Android после краха проекта CyanogenMod, поддерживаемого корпорацией.
Самый последний релиз — Lineage OS 18.1 — был наконец выпущен в конце марта этого года, предлагая Android 11 более чем на 50 устройствах!
Выпуск 18.1 приносит гораздо больше, чем просто базовое обновление ОС Android, хотя — как всегда, Lineage добавляет свои собственные функции поверх открытого кода Android от Google. В новом выпуске так много всего, что нужно изучить, поэтому я решил сделать полный обзор.
Установка Lineage OS 18.1
Если вы когда-либо устанавливали пользовательский ПЗУ на телефон или планшет, процесс, скорее всего, не слишком отличается от LineageOS 18.1.
Хотя вы все равно сможете использовать TWRP с LineageOS 18.1, рекомендуется придерживаться собственного программного обеспечения для восстановления проекта.
Я использовал Google Pixel 3a XL для тестирования LineageOS 18.1, поэтому процесс установки был относительно простым.
Как только вы войдете в программное обеспечение для восстановления, вам придется загрузить последнюю версию LineageOS с помощью ADB, которая должна установить как операционную систему, так и разделы восстановления.
Я столкнулся с проблемами при установке MindTheGapps — установщик Gapps сказал, что все прошло успешно, но когда я загрузился в Lineage OS, приложений Google не было.
Выполнение еще одного сброса настроек, а также перезагрузка раздела восстановления между установкой Lineage и Gapps, в конечном итоге устранили проблему.
Процесс начальной настройки Lineage OS 18.1 очень близок к процессу настройки телефона Pixel, если вы установили пакет Gapps.
Вы входите в учетную запись Google, выбираете параметры резервного копирования и синхронизации, настраиваете соответствие голоса и выполняете несколько других различных действий.
Если вы обходитесь без приложений и сервисов Google, вас в основном просто просят указать имя, часовой пояс и другую базовую информацию.
После экрана настройки вас приветствует Trebuchet, программа запуска на главном экране по умолчанию со времен CyanogenMod.
Интерфейс и безопасность
Остальная часть Lineage OS 18.1 не выглядит и не ощущается кардинально отличающейся от телефона Pixel или Nokia под управлением Android 11.
Несмотря на то, что в Lineage OS уже было несколько дополнительных функций безопасности/конфиденциальности по сравнению со стандартным Android, Lineage OS 18.1 извлекает выгоду из многих изменений, связанных с безопасностью, которые поставляются с Android 11.
Временные разрешения не позволяют приложениям повторно получать данные о местоположении, микрофоне и камере.
Приложения также не могут получить ваше местоположение в фоновом режиме. Наконец, Android 11 знаменует собой начало перехода Google на хранилище с ограниченной областью действия, спорный API, который ограничивает доступ к файлам на вашем устройстве для сторонних приложений.
Пользовательские ПЗУ не проходят тесты Google SafetyNet, поэтому некоторые приложения отказываются запускаться, а другие скрываются от результатов поиска в Play Store (например, Netflix и Hulu).
Установка root и Magisk может исправить это, но обход SafetyNet в конечном счете является игрой в кошки-мышки между Google и разработчиками, и вероятно, в какой-то момент она тупо перестанет работать.
Я был удивлен, что Lineage OS на моем Pixel 3a XL поддерживает Widevine L1, поэтому, пока ваш любимый потоковый сервис не требует проверки SafetyNet во время работы, он должен нормально работать на LineageOS 18.1.
Как только я установил Hulu из APK (список Play Store скрыт от измененных устройств), фильмы и телешоу воспроизводятся в оригинальном качестве. Это может варьироваться в зависимости от устройства, но это мой опыт работы с Pixel 3a XL.
Особенности системы LineageOS 18.1
Lineage OS 18.1 поддерживает большинство функций, отсутствующих в предыдущих версиях LineageOS и CyanogenMod. Строка состояния может быть настроена с различными стилями часов/батареи и дополнительным монитором сетевого трафика.
Настройки кнопок Lineage OS 18.1
В Lineage OS 18.1 также есть больше возможностей для кнопок вашего телефона или планшета, чем в обычном Android (и большинстве OEM-скинов).
Кнопка питания может быть настроена на включение или выключение фонарика (невероятно полезное дополнение для моих ночных прогулок с собакой), а регулятор громкости может отвечать на звонки или управлять воспроизведением музыки. Читайте также про Phoenix OS и Sailfish OS.
Системные профили также вернулись из предыдущих версий LineageOS и CyanogenMod. Они функционируют аналогично Bixby на устройствах Samsung и ярлыкам на iPhone и iPad.
Например, вы можете отключить внешний дисплей, когда вернетесь домой, или установить громкость мультимедиа на 0%, пока вы на работе.
Системные профили отлично подходят для простой автоматизации, но функциональность в основном ограничивается изменением настроек устройства.
Системные приложения LineageOS 18.1
Операционная система Android имеет открытый исходный код, но большинство приложений, необходимых для полноценного использования смартфона, таковыми не являются.
Это приводит к тому, что проекту Lineage OS приходится обновлять или полностью заменять многие системные приложения, от которых отказался Google.
Поэтому вы не получите два приложения с часами или два почтовых клиента. В некоторых неофициальных сборках их также может не быть.
Это была опция в Chrome, но была удалена много лет назад. Однако она не поддерживает многие современные функции веб-приложений, включая push-уведомления и автономное кэширование. Читайте также про KaiOS и Tizen OS Samsung.