Блог о Gentoo и около-линуксовым штукам

Показаны сообщения с ярлыком gentoo. Показать все сообщения
Показаны сообщения с ярлыком gentoo. Показать все сообщения

7 января 2019 г.

Пара слов о Gentoo, openJDK, JavaFX и idea

03:30 Опубликовал Дмитрий Исаенко , 9 коммент.
Сегодня разберёмся как с Gentoo поставить OpenJDK 11 или любой последней версии, настроить idea на работу с ней. Поставим и настроим JavaFX (openJFX SDK). Прикрутим её к IDEA и обозначим подводные камни при сборке всё-в-одном-jar для десктопного приложения используя Maven.

Итак, в списке доступных без плясок Gentoo Java VM есть icedtea (версии 8, т. е. условно тот самый openJDK 8) и страшно бесящий при обновлении oracle-jdk (его блобы нужно каждый раз качать с офф-сайта oracle и ложить в distfiles). OpenJDK как бы и доступен, но обёртки в виде 'eselect' прописывающие все полезные переменные окружения а-ля $JAVA_HOME спрятаны в USE-флаг 'gentoo-vm', который замаскирован. Если интересны подробности таких стрессов, можно почитать что пишут по этому поводу (даже) в самом ebuild:
$ vim -R /usr/portage/dev-java/openjdk/openjdk-11.0.1_p13.ebuild 
C openJFX вообще всё странно. Пакета нет, хотя в багзилле тикету пошел четвёртый год https://bugs.gentoo.org/547918. Intellij Idea традиционно обновляется один-два раза в год.. впрочем это уже другая печальная история со счастливым workaround.

Начинаем!

Для начала включим пакету gentoo-vm USE:
# echo 'dev-java/openjdk-bin gentoo-vm' >> /etc/portage/package.use/all
Теперь ставим собственно JDK (binary):
# emerge  openjdk-bin
Выбираем его для пользователя (нужно зайти в терминал пользователем):
$ eselect java-vm list 
Available Java Virtual Machines:
 [1]   icedtea-bin-8   system-vm
 [2]   openjdk-bin-11

$ eselect java-vm set user 2
Проверяем:
$ eselect java-vm list
Available Java Virtual Machines: 
  [1]   icedtea-bin-8  system-vm
  [2]   openjdk-bin-11  user-vm
Посмотрим переменные для пользователя:
$ file $JAVA_HOME 
/home/username/.gentoo/java-config-2/current-user-vm: symbolic link to /usr/lib/jvm//openjdk-bin-11 

IntelliJ IDEA

Сначала качаем JavaFX SDK: http://gluonhq.com/download/javafx-11-0-1-sdk-linux/
И разархивируем, например, в домашнюю папку.

Заходим в idea. Открываем RunEdit Configuration...
Переходим в TemplatesApplication
И прописываем для 'VM Options:'
--module-path /home/<USERNAME>/javafx-sdk-11.0.1/lib --add-modules=javafx.controls,javafx.fxml


Такое же можно (нужно) прописать для уже существующих записей в 'Application'.

Maven

Для десктоп-приложений можно засунуть всё что касается JavaFX прямо в приложение. Для этого прописываем в POM зависимости:
<dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>11</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-media</artifactId>
            <version>11</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>11</version>
            <scope>compile</scope>
</dependency>
На счёт необходимости засовывания "javafx-media" я не уверен.
И на этом всё!

p.s.
А теперь немного не по теме. При переходе с 8ки на 11ку (в которой уже давно есть понятие модулей), мой готовый JAR со всеми зависимостями отказался запускаться выдавая:
Error: JavaFX runtime components are missing, and are required to run this application
Тут конечно можно сделать всё нормально, через испоьзование более в новых языковых конструктов (ключевые слова: modules, module-info.java) а можно добавить надстройку над основным классом (который с main() и который наследуется от Application).
package simplepackage;

public class Main {
    public static void main(String[] args){ MainFX.main(args); }
}
Где MainFX — класс, наследуемый от Application.

Ну и прописать его в манифесте основным. Для POM выглядит это так:
<plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-assembly-plugin</artifactId>
 <version>3.1.0</version>
 <configuration>
  <archive>
<manifest>
 <mainClass>simplepackage.Main</mainClass>
</manifest>
  </archive>
  <descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
  </descriptorRefs>
 </configuration>
 <executions>
  <execution>
<id>make-assembly</id> <!-- this is used for inheritance merges -->
<phase>package</phase> <!-- bind to the packaging phase -->
<goals>
 <goal>single</goal>
</goals>
  </execution>
 </executions>
</plugin>
И никаких проблем.

UPD: Как теперь быть с падающим Android-studio?

После перехода на JDK11 у меня начал падать android-studio поставленый из портажей. Код ошибки приводить не буду, но чтобы исправить можно сделать так:

Сначала смотрим что у нас в /usr/lib/jvm/
ls /usr/lib/jvm/
Далее пишем алиас для android-studio:
$ vim ~/.bashrc
alias android-studio="JAVA_HOME=/usr/lib/jvm/icedtea-bin-8 JDK_HOME=/usr/lib/jvm/icedtea-bin-8 JAVAC=/usr/lib/jvm/icedtea-bin-8/bin/javac android-studio"
После этого студия начинает работать как надо. В новом терминале разумеется.

Ссылки:
https://wiki.openjdk.java.net/display/OpenJFX/Using+an+IDE#UsinganIDE-UsingIntelliJIDEA
https://stackoverflow.com/questions/52467561/intellij-cant-recognize-javafx-11-with-openjdk-11/52470141#52470141

1 марта 2018 г.

Заметки о вытаскивании дорожек из mkv и создании mka

00:50 Опубликовал Дмитрий Исаенко , 3 коммент.
Есть задача — вытащить аудио-дорожку из одного mkv файла и сделать из неё mka файл. Таким образом можно было бы использовать экспортированный дубляж в другом, более качественном видео-файле. Итак, нам понадобится mkvtoolnix. Ставим:
# emerge media-video/mkvtoolnix
Далее получаем информацию о файле-доноре. В нём ищем информацию о звуковых дорожках внутри матрёшки.
$ mkvinfo ./anime.mkv
+ Заголовок EBML
|+ Версия EBML: 1
...
...
| + Дорожка
|  + Номер дорожки: 2 (идентификатор дорожки для mkvmerge и mkvextract: 1)
|  + UID дорожки: 16263157260285453471
|  + Тип дорожки: audio
|  + Идентификатор кодека: A_MPEG/L3
|  + Продолжительность по умолчанию: 24.000ms (41.667 кадров/полей в секунду для видеодорожки)
|  + Язык: und
|  + Audio track
|   + Частота дискретизации: 48000
|   + Каналы: 2
|+ EbmlVoid (размер: 1095)
|+ Кластер
Тут важно обратить внимание на то, что подсвечено красным. В данном примере используется mp3 файл который имеет идентификатор 1 для mkvextract. Сейчас мы этим и воспользуемся. Вытаскиваем аудиодорожку в файл file.mp3.
$ mkvextract tracks ./anime.mkv 1:file.mp3
Извлечение дорожки 1 с CodecID 'A_MPEG/L3' в файл 'file.mp3'. Формат контейнера: MPEG-1 Audio Layer 2/3
Обработано: 100%
Также можем наверстать скриптик, который сделает рекурсивный обход всех файлов в папке и извлечёт из них заданые дорожки:
# vim script.sh
#!/bin/bash
for f in *.mkv
do
    mkvextract tracks "$f" 1:"$f".mp3
done

# chmod +x script.sh
# script.sh
Теперь воспользуемся GUI обёрткой над mkvtoolnix (mkvtoolnix-gui). Вы же собрали пакет с флагом qt5, верно? ;)
Выбираем файл (правой кнопкой клик на поле «Исходные файлы». Далее ставим нужный язык в одноимённом поле и жмём «Выполнить сборку».
На выходе получаем mka-файл. В моём случае подгонка по таймлайнам не требовалась, так что всё сразу заработало.

На этом всё!

14 декабря 2017 г.

ovpnWrapper

05:07 Опубликовал Дмитрий Исаенко , , , Нет комментариев
При использовании OpenVPN удобнее всего выдавать пользователю один файл со всеми настройками, ключами и необходимыми сертификатами. К счастью, их легко встроить в файл .ovpn. 
Итак встраивать, как известно, нужно:
ca.crt
client.crt
client.key
Не плохо было бы автоматизировать процесс. Для этого и написан ovpnWrapper. Это достаточно простой скрипт на python для генерирования и/или агрегирования всех необходимых файлов в один. (Ссылка в конце.)
Используется он в паре с easyrsa3 (семантика более ранних версий не поддерживается). Его нужно поместить в ту же папку, что и easyrsa и немного настроить.

Рассмотрим поближе.
В первой строке необходимо указать путь до интерпретатора python 3. 
#!/usr/bin/python3.5
Далее нам интересна строка, где мы указываем путь до папки, в которой хотим хранить сгенерированные файлы .ovpn.
ovpnFolder = os.environ['HOME']+"/ovpn/"
Как видно, по-умолчанию она указывает на папку ovpn/ в домашней директории.
Исправим serverCA, который определяет полный путь к файлу ca.crt
serverCA = '/etc/openvpn/server/ca.crt'
Исправим также commonTLS который должен указывать на нужный файл  (добавлено в версии 0.2. Если вам это не нужно, используйте 0.1)
commonTLS = '/etc/openvpn/server/tls.ta'
И последнее, но не по значимости, head. Тут указываются все предопределённые настройки.
head = "\
client                                     \n\
tls-client                                 \n\
dev tun                                    \n\
proto udp                                  \n\
remote your.host.name.located.here.! 1194  \n\
cipher AES-256-CBC                         \n\
resolv-retry infinite                      \n\
nobind                                     \n\
persist-tun                                \n\
persist-key                                \n\
verb 3                                     \n\                                                                                                                                                                                          
" 
Теперь меняем права файлику:
# chmod +x ovpnWrapper.sh
И запускаем, передавая в качестве единственного параметра имя для файлов-сертификата, ключа и сгенерированного .ovpn.
# ./ovpnWrapper.sh client42
Он проверит, не существует ли уже сгенерированных ключа+сертификата клиента, и если нет, то создаст их. Если есть — просто создаст .ovpn файл в указанной выше директории.
Всё что требуется, читать вывод скрипта (Будьте бдительны: английский).
Вообще у меня easyrsa на каком-то этапе ругался на openssl-1.1.0f но всё что нужно генерировал.

На этом всё. Приложение качать отсюда: https://github.com/developersu/ovpnWrapper/releases/

6 октября 2017 г.

Про сабвуфер в Dell Vostro 5470

14:26 Опубликовал Дмитрий Исаенко , Нет комментариев
Итак, проблема в том, что в linux он просто не работает. Исправить это - можно и нужно.

Для начала убедимся, что у нас в ядре включена опция CONFIG_SND_HDA_RECONFIG.

Symbol: SND_HDA_RECONFIG [=y]    
  Type  : boolean           
  Prompt: Allow dynamic codec reconfiguration       
   Location:   
     -> Device Drivers     
       -> Sound card support (SOUND [=y])          
         -> Advanced Linux Sound Architecture (SND [=m])       
  (1)       -> HD-Audio     
  Defined at sound/pci/hda/Kconfig:49 
  Depends on: SOUND [=y] && !M68K && !UML && SND [=m] && SND_HDA [=m]     
  Selected by: SND_HDA_PATCH_LOADER [=n] && SOUND [=y] && !M68K && !UML && SND [=m] && SND_HDA [=m]
Теперь поставим пакет alsa-tools:
# emerge alsa-tools 
Из него нам понадобиться hdajackretask. Запускаем его и выбираем Realtek ALC290. Далее жмём "Show unconnected pins" и находим 0x17.
Теперь выбираем "Override" и выставляем "Internal Speaker (LFE)"

В конце жмём "Install boot override" и "Apply now". Проверяем, перезагружаемся и проверяем. Тебер саб должен работать.

29 августа 2017 г.

OpenArena dedicated server @ Gentoo + Raspberry Pi

23:31 Опубликовал Дмитрий Исаенко , , Нет комментариев
Как делать сервер на коленке за 5 секунд.

Gentoo

Сначала ставим игрулю:
emerge games-fps/openarena 
Открываем порты на свой ПК:


Создаём конфиг:
$vim ~/.openarena/baseoa/oa1.cfg
sets sv_hostname "developer.su dedicated server"
sets sv_maxclients 10
//sv_master1 "dpmaster.deathmask.net"
seta sv_maxPing 150
seta sv_minPing 0
sv_pure 1
seta sv_maxRate 25000
sets sv_fps 25
sets sv_allowdownload 1

//sv_privateClients "2" // slots substracted from sv_maxclients
//sv_privatePassword " "

seta capturelimit 8
seta timelimit 15
seta fraglimit 35

seta bot_minplayers 3
//seta g_spskill 3.0

//set rconPassword "" // for remote ingame servercontrol

seta g_motd "Have fun"
seta g_quadfactor 3
seta g_inactivity 0
seta g_allowvote 1

//If you want to use unlagged functionality (since 0.7.6)
g_delagHitscan 1

//You might want to count pushing players over the side of a map as kills. In that case: 
seta g_awardPushing 1

//Special modes since 0.7.6:
//g_instantgib 1
//g_rockets 1
//g_vampire 0.25 //25%
//g_regen 5 //5 health per sec.

//Gametypes
// 0 = Free For All
// 1 = Tourney
// 3 = Team Deathmatch
// 4 = Capture The Flag
// 8 = Elimination
// 9 = CTF Elimination
// 10 = Last Man Standing
// 11 = Double Domination
// 12 = Domination
seta g_gametype 0

set d1 "map aggressor; set nextmap vstr d2"
set d2 "map oa_dm1; set nextmap vstr d3"
set d3 "map oa_dm2; set nextmap vstr d4"
set d4 "map oa_dm3; set nextmap vstr d5"
set d5 "map oa_dm4; set nextmap vstr d6"
set d6 "map kaos2; set nextmap vstr d7"
set d7 "map oa_dm5; set nextmap vstr d8"
set d8 "map oa_rpg3dm2;set nextmap vstr d9"
set d9 "map oa_shouse; set nextmap vstr d1"
wait
vstr d1 // start loop at d1

Запускаем всё это дело
$ openarena-ded +exec oa1.cfg
И потом жмём Enter. Без этого не сработает.

Raspberry Pi (Raspbian) 

Сначала ставим необходимые пакеты:
# aptitude install openarena-oacmp1 openarena-server
Важно установить не только сервер, но и карты (oacmp1). Все остальные зависимости подтянуться автоматически.

Далее копируем вышеприведенный конфиг сюда:
# vim /etc/openarena-server/server.cfg
Запускаем
# systemctl start openarena-server
Добавляем в автозагрузку:
# systemctl enable openarena-server

13 августа 2017 г.

Заметки о proftpd

07:23 Опубликовал Дмитрий Исаенко Нет комментариев
Что нужно для быстрой развёртки:
1. Удалить ACL. Если в системе не используется, то вообще никаких проблем.
# echo 'net-ftp/proftpd openssl -acl' >> /etc/portage/package.use
2. Поставить:
# emerge net-ftp/proftpd
3. Добавить пользователя для анонимусов:
# echo ftp:x:21:21:added by portage for ftpbase:/home/ftp:/sbin/nologin >> /etc/passwd
# echo 'ftp:x:21:' >> /etc/group
4. Добавить имя хоста в /etc/hosts
# hostname
myAwesomeHost
# vim /etc/hosts
127.0.0.1 localhost myAwesomeHost
5. Поправить (или не править, он и так хорош) конфиг
# vim /etc/proftpd/proftpd.conf

ServerName "ProFTPD Server on vostro"

ServerType standalone
DefaultServer on
RequireValidShell off
AuthPAM off
AuthPAMConfig ftp

Port 21

Umask 022

MaxInstances 30

User ftp
Group ftp

DefaultRoot ~

AllowOverwrite on
<limit site_chmod="">
  DenyAll
</limit><anonymous>
  User anonymous
  Group anonymous
  AnonRequirePassword   off
  RequireValidShell     off

  # Clients can login with the username "anonymous" and "ftp".
  UserAlias anonymous ftp

  # Limit the maximum number of parallel anonymous logins to 10.
  MaxClients 10

  # Prohibit the WRITE command for the anonymous users.
  <limit write="">
    DenyAll
  </limit>
</anonymous>
6. Добавить в автозагрузку и запустить
# rc-update add proftpd default
# /etc/etc/init.d/proftpd start

23 апреля 2017 г.

ECM to ISO в Linux

18:56 Опубликовал Дмитрий Исаенко , , Нет комментариев
В последнее время покачиваю образы с old-games.ru, а там формат bin.ecm. Сегодня будет рецепт конвертации в каноничный ISO.
Для начала, как обычно, надо поставить себе нативный ecm. Похоже, проект уже загнулся и сайт их не работает. Так что в SRC_URL будет линка на интернет архив. Но в любом случае это работает, так что переживать не о чем :)
Добавим ebuild в домашний оверлей:
# mkdir /usr/local/portage/app-cdr/
# mkdir /usr/local/portage/app-cdr/ecm
# vim ecm-1.0.0.ebuild

# Copyright 1999-2010 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $

EAPI=2

inherit versionator
MY_P=$(delete_all_version_separators ${P})

DESCRIPTION="ECM prepares CD images (BIN, ISO, etc.) so that they'll compress far better"
HOMEPAGE="http://www.neillcorlett.com/ecm/"
SRC_URI="https://web.archive.org/web/20091021035854/http://www.neillcorlett.com/downloads/${MY_P}.zip"

LICENSE="GPL-2"
SLOT="0"
KEYWORDS="~amd64 ~x86"
IUSE=""

DEPEND="app-arch/unzip"

src_unpack() {
        mkdir "${S}"
        unzip -d "${S}" "${DISTDIR}"/${MY_P}.zip
}

src_compile() {
        gcc ${CFLAGS} -o ecm ecm.c || die "ecm compilation failed"
        gcc ${CFLAGS} -o unecm unecm.c || die "unecm compilation failed"
}

src_install() {
        dobin ecm unecm
        dodoc format.txt readme.txt
}                      

# chown -R portage:portage /usr/local/portage/
# repoman manifest
# eix update 
И установим его, плюс ещё bchunk, который тоже понадобиться
# emerge app-cdr/ecm app-cdr/bchunk
Теперь открываем какой-нибудь архив с сайта, и делаем следующее:
# unecm image.bin.ecm 
# bchunk <image.bin> <image.cue> <image_name>
# mount -o loop ./image_name.iso /media/something/
Готово!

См.также: https://github.com/developersu/loperOverlay

29 марта 2017 г.

loperIRCLogBot

07:47 Опубликовал Дмитрий Исаенко , Нет комментариев
loperIRCLogBot - очередной бот для записи логов на канале IRC. Написан на С. Использует слегка модифицированную libircclient. Он может заходить на 1 сервер, 1 канал и писать всё что там происходит. Может собираться под openWRT и наверное под много чего ещё. В общем все подробности чуть ниже. Этот пост (наверное) будет обновляться по мере выхода новых версий.
Написанное верно для версии: 1.1.
А теперь документация в виде FAQ.
Он работает под Windows?
Нет.

А если я его соберу под Windows?
Всё ещё нет.

OS X, BSD, AIX?
Не знаю, может быть. Попробуй и расскажи потом.

Как собирать?
$ make

Оно не работает, и тут нет ./configure. Что мне делать? Почему это происходит со мной?
Измени Makefile и ./files/Makefile. Они там простые. Я не особо разбираюсь в том, что есть ./configure поэтому его там нет.

При компиляции я вижу "warning:". Это норма?
Ну, вроде того. Я тоже иногда вижу подобное. Надо будет найти время и что-то с этим сделать.

Где исполняемый файл? Что запускать?
$ ./bin/loperIRCLogBot

Что с лицензиями?
Исходный код, который фактически является лишь файлом loperIRCLogBot.c распространяется под лицензией GNU General Public License v.3. Ты можешь прочесть текст лицензии в файле LICENSE, (распространяется вместе с кодом) или посетив сайт https://www.gnu.org/ (там он определённо должен быть). Также приложение использует (немного) модифицированную libircclient написанную George Yunaev. Libircclient распространяется под лицензией GNU Lesser General Public License v.3 или более поздней.

Можно ли (собрать и) использовать эту программу вместе с динамической библиотекой libircclient, которая у меня уже установлена?
Нет. Эта маленькая модификация, которая нужна для работы loperIRCLogBot не позволяет использовать оригинальную немодифицированную библиотеку. Посмотри на патч в директории ./files (в нём вся суть).

Где указывать настройки и как?
В файле ./bin/bot.conf. Ты можешь сгенерировать шаблон выполнив 
$ ./loperIRCLogBot -g
Файл настроек должен храниться (и будет сгенерирован) в той же директории, что и исполняемый файл. Пока это единственный вариант.
Из файла настроек приложение читает лишь первые 15 строк, так что удостоверься, что ты не прописал ничего важного ниже первых 15 строк.
Вот пример:
server:          irc.example.com
channel:         #channel
port:            6667
nick:            awesome_nick_here
username:        usrname
realname:        realname
password:        0 
maxNickLength:   30
logPath:         0 
link:            http://localhost:8080/logs/
reJoin:          yes
'server' должен быть установлен в описанном выше формате. Никаких irc://, слэшей и бэкслешей быть не должно.
'channel' это канал, к которому нужно подключиться. Должен начинаться с символа решетки '#'.
'port' порт сервера
'nick' ник на сервере. Ограничен параметром 'maxNickLength'. Т.е. длина ника не должна превышать число символов, определённое в maxNickLength.
'username'  имя пользователя, которое устанавливается вторым параметром в нике-сервера. Например nick!~[USERNAME]@ip_adress
'realname' это реальное имя. Не спрашивай, просто поставь тут что-то, ладно?
'password' это пароль от ника. Он передаётся серверу в виде '/nickserv IDENTIFY [password]'. Если установлен '0', то пароль не передаётся.
'maxNickLength' это максимальная длина ника. Различные серверы ограничивают максимальную длину ника. Значения в '30' символов тут будет достаточно. Максимально допустимое значение - 128, но я не уверен что тебе следует использовать максимальное значение, потому, что если сервер не поддерживает ники подобной длины, то программа может выполняться неправильно.
'logPath' путь к директории ./logs где хранятся логи. Если '0' то они все будут храниться  в той же папке, что и исполняемый файл. Обрати внимание, что путь должен быть абсолютным, а не относительным. Недопустимо указывать что-то типа ~/logs или ../../logs.
'link' это ссылка, которая будет служить ответом, когда кто-то на канале начинает своё сообщения с ника бота. Если '0', то в ответ никакой ссылки они не получат. Только смайлик.
'reJoin' определяет, следует ли автоматически заходить на канал после кика. Если 'yes' то следует, если 'no' то нет.

Есть ли какие-то ещё опции у приложения?
Да. Когда ты запускаешь приложение, ему можно передать следующие ключи:
-g, --genconf — создаёт шаблон конфигурационного файла. ОСТОРОЖНО! Это действие перезапишет существующий конфигурационный файл.
-n, --nomessage — подавляет вывод сообщений (на stdin, stderr).
-v, --version — показывает версию программы.
--help — показывает помощь по ключам.
Обратите внимание, что '-n' просто отключает вывод сообщений. Там нет всяких специфичных для демонов опций. Пока.

Можно как-то зайти больше чем на один канал?
Неа.

Если пропадёт соединение, сможет ли бот переподключиться? Если да, то когда это произойдёт?
Да. Через 20 минут. Возможно раньше. Зависит от активности на канале и пингов от сервера. Предсказание этого сейчас реализовано крайне криво.

29 августа 2016 г.

Vostro 5470: про Optimus и кнопки настройки яркости

05:32 Опубликовал Дмитрий Исаенко , , 1 коммент.
Сегодня будем разбираться, как избавиться от чёрного экрана при запуске SDDM (замена KDM) в Dell Vostro 5470. Тут я не ставлю целью добиться максимального энергосбережения, т.к. KDE всё равно использует для отрисовки графики OpenGL, ведь суть optimus - использовать для отрисовки 3D как раз nvidia чип, а не встроенный intel. Также мы рассмотрим тему оживления кнопок настроек яркости, а в конце ещё и заставим кнопку suspend уводить ноутбук в ждущий режим.

Итак, чтобы настроить работу Nvidia Optimus нужно, кроме того, что описано в wiki, добавить в настройки sddm строку modesetting. Эта фича не работает в случае, если прописать её в ~/.xinitrc как некоторые советуют. И это ключевой момент.
# vim /usr/share/sddm/scripts/Xsetup
xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto
Касательно xorg.conf. В моём случае выглядит как-то так:
# cat /etc/X11/xorg.conf
Section "ServerLayout"
        Identifier "layout"
        Screen 0 "nvidia"
        Inactive "intel"
EndSection

Section "Device"
        Identifier "nvidia"
        Driver "nvidia"
        BusID "PCI:09:00:0"
EndSection

Section "Screen"
        Identifier "nvidia"
        Device "nvidia"
EndSection

Section "Device"
        Identifier "intel"
        Driver "modesetting"
        BusID "PCI:00:02:00"
        Option "AccelMethod"  "none"
EndSection
 
Section "Screen"
        Identifier "intel"
        Device "intel"
EndSection 
Теперь по драйверам. Используется проприетарные nvidia-drivers и интеловские драйвера. В make.conf имеется следующее:
VIDEO_CARDS="nvidia intel i965 modesetting"
Что касается настроек в ядре:
> Device Drivers > Graphics support >
<*> /dev/agpgart (AGP Support)  --->         ##есть подозрение, что это совершенно не нужно
      {*}   Intel 440LX/BX/GX, I8xx and E7x05 chipset support
-*- VGA Arbitration
(16)  Maximum number of GPUs
[*] Laptop Hybrid Graphics - GPU switching support
<*> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support)  --->
      [*]   Enable legacy fbdev support for your modesetting driver
<M> Intel 8xx/9xx/G3x/G4x/HD Graphics
    Frame buffer Devices  --->
      [*] Enable Video Mode Handling Helpers
      [*] VESA VGA graphics support
-*- Backlight & LCD device support  --->
      <*>   Lowlevel LCD controls
      <*>     Platform LCD controls
      {*}   Lowlevel Backlight controls
      <*>     Generic (aka Sharp Corgi) Backlight Driver
    Console display driver support  --->
      -*- VGA text console   
      [*]   Enable Scrollback Buffer in System RAM
      (64)    Scrollback Buffer Size (in KB)      
      (80) Initial number of console screen columns      
      (25) Initial number of console screen rows  
      -*- Framebuffer Console support      
      -*-   Map the console to the primary display device
      [ ]   Framebuffer Console Rotation   
      [*]   Support for the Framebuffer Console Decorations
[*] Bootup logo  --->

Ну-с, вроде всё. Теперь перейдём к теме яркости. Почему-то у меня из коробки не работают кнопки увеличения и уменьшения яркости. Т.е. они, конечно, работают как кнопки, но яркость не меняют. Проверим для начала, определяет ли система нажатие на эти кнопки. Для этого запустим acpi_listen и пожмакаем. Должно появиться примерно следующее:
# acpi_listen 
video/brightnessdown BRTDN 00000087 00000000 K
video/brightnessdown BRTDN 00000087 00000000
video/brightnessup BRTUP 00000086 00000000
video/brightnessup BRTUP 00000086 00000000 K
^C
Если этого не произошло, идём смотреть ядро:
Device Drivers > X86 Platform Specific Device Drivers
    <*>   Dell Laptop Extras
    <*>   Dell Latitude freefall driver (ACPI SMO88XX)
    <M>   Intel PMC IPC Driver

Power management and ACPI options >
    [*] Suspend to RAM and standby         
    [*] Hibernation (aka 'suspend to disk')
    ()  Default resume partition           
    [ ] Opportunistic sleep                
    [ ] User space wakeup sources interface
    -*- Device power management core functionality
    [ ]   Power Management Debug Support   
    [ ] Enable workqueue power-efficient mode by default
    [*] ACPI (Advanced Configuration and Power Interface) Support  --->
      --- ACPI (Advanced Configuration and Power Interface) Support 
      [ ]   AML debugger interface (EXPERIMENTAL)
      [ ]   Deprecated power /proc/acpi directories
      [*]   Allow supported ACPI revision to be overriden
      < >   EC read/write access through /sys/kernel/debug/ec
      <*>   AC Adapter
      <*>   Battery
      {*}   Button
      {*}   Video
      {*}   Fan
      [*]   Dock
      <*>   Processor
      < >   Processor Aggregator
      <*>   Thermal Zone
      -*-   NUMA support
      [ ]   ACPI tables override via initrd
      [ ]   Debug Statements
      [ ]   PCI slot detection driver
      -*-   Container and Module Devices
      <*>   Smart Battery System
      < >   Hardware Error Device
      < >   Allow ACPI methods to be inserted/replaced at run time
      <M>   ACPI NVDIMM Firmware Interface Table (NFIT)
      [ ]   ACPI Platform Error Interface (APEI)
      [ ]   PMIC (Power Management Integrated Circuit) operation region support  ----
    [*] SFI (Simple Firmware Interface) Support  ----
        CPU Frequency scaling  --->        
        CPU Idle  --->                     
    [*] Cpuidle Driver for Intel Processors
        Memory power savings  --->
          <*> Intel chipset idle memory power saving driver
Это должно помочь.

Также, у вас должен быть в системе следующий путь:
/sys/class/backlight/intel_backlight/
В директории /sys/class/backlight вы также можете обнаружить под-директорию dell_backlight . Скорее всего вы что-то перемудрили с настройками. В целом - то, что эта папка есть, нет ничего страшного, ведь что там не меняй - подсведка меняться не будет.

Если кнопки определились, то пропишем правило скрипту ACPI. Тут привожу скрипт(ы) в полном варианте. Изменённые секции выделены красным.
# vim /etc/acpi/default.sh 
#!/bin/sh
# /etc/acpi/default.sh
# Default acpi script that takes an entry for all actions

set $*

group=${1%%/*}
action=${1#*/}
device=$2
id=$3
value=$4

log_unhandled() {
        logger "ACPI event unhandled: $*"
}

case "$group" in
        button)
                case "$action" in
                        power)
                                /etc/acpi/actions/powerbtn.sh
                                ;;

                        *)      log_unhandled $* ;;
                esac
                ;;

        ac_adapter)
                case "$value" in

                        *)      log_unhandled $* ;;
                esac
                ;;

        video)
                case "$action" in
                        brightnessdown)

                                /etc/acpi/actions/brightness.sh -

                                ;;

                        brightnessup)

                                /etc/acpi/actions/brightness.sh +

                                ;;

                        *)      log_unhandled $* ;;
                esac
                ;;

        *)      log_unhandled $* ;;
esac
Ну и сделаем для этого ещё один скрипт:
# vim /etc/acpi/actions/brightness.sh 

#!/bin/bash
bl_dev=/sys/class/backlight/intel_backlight/
step=10   #set 

case $1 in
        -) echo $(($(< $bl_dev/brightness) - $step)) >$bl_dev/brightness ;;
        +) echo $(($(< $bl_dev/brightness) + $step)) >$bl_dev/brightness ;;
esac
И тут вы можете заметить, что т.к. в acpi_listen одно нажатие кнопки определялось двумя ивентами ACPI, то и изменение яркости будет происходить с двойной силой. Итого, устанавливая step=10 он фактически будет отрабатывать 20-ку. Ну и ладно. Я вот ставил step=1 и сначала думал, что изменение яркости вообще не происходит. 10 - это норма ;)
# chmod +x /etc/acpi/actions/brightness.sh 

А чтобы два раза не вставать, настроим заодно и поведение кнопки sleep. Я постоянно пользуюсь утилитой pm-suspend и хотел бы отправлять в сон ноут по одному клику. Для начала установим пакет, содержащий pm-suspend.
# emerge sys-power/pm-utils
Посмотрим, как эта кнопка определяется системой:
# acpi_listen 
button/sleep SBTN 00000080 00000000 K
^C
Всё вроде хорошо. Осталось модифицировать наш скрипт.
# cat /etc/acpi/default.sh    
#!/bin/sh
# /etc/acpi/default.sh
# Default acpi script that takes an entry for all actions

set $*

group=${1%%/*}
action=${1#*/}
device=$2
id=$3
value=$4

log_unhandled() {
        logger "ACPI event unhandled: $*"
}

case "$group" in
        button)
                case "$action" in
                        power)
                                /etc/acpi/actions/powerbtn.sh
                                ;;

                        # if your laptop doesnt turn on/off the display via hardware
                        # switch and instead just generates an acpi event, you can force
                        # X to turn off the display via dpms.  note you will have to run
                        # 'xhost +local:0' so root can access the X DISPLAY.
                        #lid)
                        #       xset dpms force off
                        #       ;;

                        sleep)
                                /usr/sbin/pm-suspend
                                ;;

                        *)      log_unhandled $* ;;
                esac
                ;;

        ac_adapter)
                case "$value" in
                        # Add code here to handle when the system is unplugged
                        # (maybe change cpu scaling to powersave mode).  For
                        # multicore systems, make sure you set powersave mode
                        # for each core!
                        #*0)
                        #       cpufreq-set -g powersave
                        #       ;;

                        # Add code here to handle when the system is plugged in
                        # (maybe change cpu scaling to performance mode).  For
                        # multicore systems, make sure you set performance mode
                        # for each core!
                        #*1)
                        #       cpufreq-set -g performance
                        #       ;;

                        *)      log_unhandled $* ;;
                esac
                ;;

        video)
                case "$action" in
                        brightnessdown)

                                /etc/acpi/actions/brightness.sh -
                                ##echo $group -  $action - $device - $id - $id>> /tmp/1.sh

                                ;;

                        brightnessup)

                                /etc/acpi/actions/brightness.sh +
                                ##echo $group -  $action - $device - $id - $id>> /tmp/1.sh

                                ;;

                        *)      log_unhandled $* ;;
                esac
                ;;

        *)      log_unhandled $* ;;
esac

На этом всё.

Ссылки:
https://wiki.archlinux.org/index.php/acpid
https://wiki.gentoo.org/wiki/ACPI

20 марта 2016 г.

Делаем IR приёмник для LIRC (igorplugusb)

16:51 Опубликовал Дмитрий Исаенко , , Нет комментариев
Сегодня будем делать инфракрасный приёмник. В таком качестве мною был выбран распространённый igorplugusb — старая, не лишенная недостатков, но очень простая в создании схема. Прекрасный пример реализации я нашел на сайте JumpTruck, который в свою очередь почти без изменений списан с проекта Дика Стрифланда (Dick Streefland). Но не смотря на это, готовые схемы мне не понравились. Мне хотелось micro-usb штекер и миниатюрную плату, поэтому я решил переделать реализацию под себя. 
Для новой разводки был использован бесплатный (условно) Eagle cad, который прекрасно подходит для разработки небольших схем и обладает огромным набором библиотек компонентов. В конечном итоге у меня получилось следующее (кликабельно):



Скачать их, вместе с прошивкой и самую-малость-кривым-PDF для лазерного утюга можно отсюда: https://cloud.mail.ru/public/CH4D/Sw3D5nLh5

Честно говоря, я не помню уже какие сторонние библиотеки были использованы, так что в архиве лежат, на всякий случай, все.

Если вы в первый раз используете Eagle (у меня это версия 7.4.0), то после установки и первого запуска он предложит вам создать папку по-умолчанию для проектов и всего-такого-прочего. В неё-то и надо скопировать директории IR3 и lib.

Теперь о том, что касается компонентов (нагло содрано):
Комп. Значение Корпус Описание
C1 27pf 0603 Керамический конденсатор
C2 27pf 0603 Керамический конденсатор
C3 0.1uf 0603 Керамический конденсатор
C4 4,7uf 0603 Конденсатор (тут у автора была ошибка - нужен именно 4,7uf)
C5 100uf E2,5-6 Электролит. конденсатор
D1 3,6V SOD80C Стабилитрон 3.6V
D2 3,6V SOD80C Стабилитрон 3.6V
IC1 ATtiny2313 DIL20 ATTINY2313-20PU
LED1 LED3MM 3mm LED (синенький)
Q1 12MHz HC49U70 Кварц
R1 68 0805 (или 0603) 68Ом резистор
R2 1k5 0603 1,5КОм резистор
R3 68 0805 (или 0603) 68Ом резистор
R4 330 0603 330Ом резистор
R5 22k 0603 22КОм резистор
R6 100 0603 100Ом резистор
R7 4,7КОм 0603 4,7КОм резистор
U$1 TSOP4838 782-TSOP4838 IR приёмник 38kHz
X1 Micro-usb USB-MICRO-SMD micro-usb разъём

Теперь несколько слов о прошивке. Я использовал, как и Jumptruck, прошивку main.hex из папки IR из пакета 1,4. Сейчас на сайте доступен для скачивания архив 1.7 — что там внутри и как оно работает я не знаю. Если есть желание проверить, то пожалуйста.

Прошивал я своим программатором usbasp через avrdude. Тут проблем у вас возникнуть не должно. Как настроить окружение я писал в одной из предыдущих публикаций. Тут же традиционно показываю выкладку:
 # avrdude -c usbasp -pt2313 -U flash:w:main.hex                     

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.01s

avrdude: Device signature = 0x1e910a
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "main.hex"
avrdude: input file main.hex auto detected as Intel Hex
avrdude: writing flash (2006 bytes):

Writing | ################################################## | 100% 18.64s


avrdude: 2006 bytes of flash written
avrdude: verifying flash memory against main.hex:
avrdude: load data flash data from input file main.hex:
avrdude: input file main.hex auto detected as Intel Hex
avrdude: input file main.hex contains 2006 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 8.66s


avrdude: verifying ...
avrdude: 2006 bytes of flash verified
avrdude: safemode: Fuses OK

avrdude done.  Thank you.

 # avrdude -pt2313 -U hfuse:w:0xdb:m -U lfuse:w:0xef:m -c usbasp

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.01s

avrdude: Device signature = 0x1e910a
avrdude: reading input file "0xdb"
avrdude: writing hfuse (1 bytes):

Writing | ################################################## | 100% 0.02s

avrdude: 1 bytes of hfuse written
avrdude: verifying hfuse memory against 0xdb:
avrdude: load data hfuse data from input file 0xdb:
avrdude: input file 0xdb contains 1 bytes
avrdude: reading on-chip hfuse data:

Reading | ################################################## | 100% 0.00s

avrdude: verifying ...
avrdude: 1 bytes of hfuse verified
avrdude: reading input file "0xef"
avrdude: writing lfuse (1 bytes):

Writing | ################################################## | 100% 0.02s

avrdude: 1 bytes of lfuse written
avrdude: verifying lfuse memory against 0xef:
avrdude: load data lfuse data from input file 0xef:
avrdude: input file 0xef contains 1 bytes
avrdude: reading on-chip lfuse data:

Reading | ################################################## | 100% 0.00s

avrdude: verifying ...
avrdude: 1 bytes of lfuse verified

avrdude: safemode: Fuses OK

avrdude done.  Thank you.

Перейдём к настройке LIRC. 

Для начала, необходимо правильно сконфигурировать ядро. Для этого включим следующие необходимые фичи через menuconfig.
Device Drivers -> Multimedia Support
  [*]   Remote Controller support
  [*]   Remote controller decoders  ---> 
      <M>   LIRC interface driver
      <M>     Enable IR to LIRC bridge
      <M>   Enable IR raw decoder for the NEC protocol
      <M>   Enable IR raw decoder for the RC-5 protocol
      <M>   Enable IR raw decoder for the RC6 protocol
      <M>   Enable IR raw decoder for the JVC protocol
      <M>   Enable IR raw decoder for the Sony protocol
      <M>   Enable IR raw decoder for the Sanyo protocol
      <M>   Enable IR raw decoder for the Sharp protocol
      <M>   Enable IR raw decoder for the MCE keyboard/mouse protocol
      <M>   Enable IR raw decoder for the XMP protocol
  [*]   Remote Controller devices  --->
         IgorPlug-USB IR Receiver
  Input device support  --->
      <*>   Event interface  (не знаю на сколько это актуально)

После того, как мы настроили ядро и перезагрузились, при подключении устройства в dmesg должно появиться следующее:
[57672.609962] usb 1-5.2: new low-speed USB device number 9 using xhci_hcd
[57672.699435] usb 1-5.2: New USB device found, idVendor=03eb, idProduct=0002
[57672.699438] usb 1-5.2: New USB device strings: Mfr=0, Product=2, SerialNumber=0
[57672.699439] usb 1-5.2: Product: USBtiny IR/LCD
[57672.700146] Registered IR keymap rc-hauppauge
[57672.700217] input: IgorPlug-USB IR Receiver as /devices/pci0000:00/0000:00:14.0/usb1/1-5/1-5.2/1-5.2:1.0/rc/rc0/input20
[57672.700250] rc0: IgorPlug-USB IR Receiver as /devices/pci0000:00/0000:00:14.0/usb1/1-5/1-5.2/1-5.2:1.0/rc/rc0
[57672.700309] input: MCE IR Keyboard/Mouse (igorplugusb) as /devices/virtual/input/input21
[57672.700452] rc rc0: lirc_dev: driver ir-lirc-codec (igorplugusb) registered at minor = 0
Соответсвенно в /dev теперь есть устройство /dev/lirc0.

Теперь самое интересное - заставить всё это дело работать. Версия lirc-0.9.0-r5, которая есть сейчас в portage безумно устарела и, строго говоря, не работает. Поэтому я решил написать ebuild для более свежей, но не последней версии 0.9.3a.

Вот выкладка:
$ cat lirc-0.9.3a.ebuild    
# Copyright 1999-2016 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$

EAPI=4

inherit eutils systemd flag-o-matic autotools

DESCRIPTION="decode and send infra-red signals of many commonly used remote controls"
HOMEPAGE="http://www.lirc.org/"

MY_P=${PN}-${PV/_/}

if [[ "${PV/_pre/}" = "${PV}" ]]; then
        SRC_URI="mirror://sourceforge/lirc/${MY_P}.tar.bz2"
else
        SRC_URI="http://www.lirc.org/software/snapshots/${MY_P}.tar.bz2"
fi

LICENSE="GPL-2"
SLOT="0"
KEYWORDS="amd64 ppc ppc64 x86"
IUSE="doc static-libs X audio irman ftdi inputlirc iguanair"

S="${WORKDIR}/${MY_P}"


REQUIRED_USE="
        iguanair? ( irman )
"
DEPEND="
        doc? ( app-doc/doxygen )
"

RDEPEND="
        X? (
                x11-libs/libX11
                x11-libs/libSM
                x11-libs/libICE
        )
        audio? ( 
                >media-libs/portaudio-18 
                media-libs/alsa-lib
        )
        irman? ( media-libs/libirman )

        iguanair? ( app-misc/iguanaIR )

        ftdi? ( dev-embedded/libftdi:0 )

        inputlirc? ( app-misc/inputlircd )
"

pkg_setup() {

        # set default configure options
        LIRC_DRIVER_DEVICE="/dev/lirc0"

        filter-flags -Wl,-O1
}

src_prepare() {
        # Rip out dos CRLF
        edos2unix contrib/lirc.rules
}

src_configure() {
        econf \
                $(use_enable static-libs static) \
                $(use_with X x)
}


src_install() {
        emake DESTDIR="${D}" install

        newinitd "${FILESDIR}"/lircd lircd
        newinitd "${FILESDIR}"/lircmd lircmd
        newconfd "${FILESDIR}"/lircd.conf.4 lircd

        insinto /etc/modprobe.d/
        newins "${FILESDIR}"/modprobed.lirc lirc.conf

        newinitd "${FILESDIR}"/irexec-initd irexec
        newconfd "${FILESDIR}"/irexec-confd irexec

        systemd_dounit "${FILESDIR}"/irexec.service
        systemd_dounit "${FILESDIR}"/lirc.service
        systemd_dounit "${FILESDIR}"/lircm.service

        if use doc ; then
                dohtml doc/html/*.html
                insinto /usr/share/doc/${PF}/images
                doins doc/images/*
        fi

        keepdir /etc/lirc
        if [[ -e "${D}"/etc/lirc/lircd.conf ]]; then
                newdoc "${D}"/etc/lirc/lircd.conf lircd.conf.example
        fi

        use static-libs || rm "${D}/usr/$(get_libdir)/liblirc_client.la"
}

pkg_preinst() {

        local dir="${EROOT}/etc/modprobe.d"
        if [[ -a "${dir}"/lirc && ! -a "${dir}"/lirc.conf ]]; then
                elog "Renaming ${dir}/lirc to lirc.conf"
                mv -f "${dir}/lirc" "${dir}/lirc.conf"
        fi

        # copy the first file that can be found
        if [[ -f "${EROOT}"/etc/lirc/lircd.conf ]]; then
                cp "${EROOT}"/etc/lirc/lircd.conf "${T}"/lircd.conf
        elif [[ -f "${EROOT}"/etc/lircd.conf ]]; then
                cp "${EROOT}"/etc/lircd.conf "${T}"/lircd.conf
                MOVE_OLD_LIRCD_CONF=1
        elif [[ -f "${D}"/etc/lirc/lircd.conf ]]; then
                cp "${D}"/etc/lirc/lircd.conf "${T}"/lircd.conf
        fi

        # stop portage from touching the config file
        if [[ -e "${D}"/etc/lirc/lircd.conf ]]; then
                rm -f "${D}"/etc/lirc/lircd.conf
        fi

}

pkg_postinst() {

        # copy config file to new location
        # without portage knowing about it
        # so it will not delete it on unmerge or ever touch it again
        if [[ -e "${T}"/lircd.conf ]]; then
                cp "${T}"/lircd.conf "${EROOT}"/etc/lirc/lircd.conf
                if [[ "$MOVE_OLD_LIRCD_CONF" = "1" ]]; then
                        elog "Moved /etc/lircd.conf to /etc/lirc/lircd.conf"
                        rm -f "${EROOT}"/etc/lircd.conf
                fi
        fi

        einfo "The new default location for lircd.conf is inside of"
        einfo "/etc/lirc/ directory"
}

Ну и листинги всего остального, что есть в папке (чего уж мелочиться):
$ ls 
files  lirc-0.9.3a.ebuild  Manifest  metadata.xml

$ cat metadata.xml 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">
<pkgmetadata>
  <maintainer type="project">
    <email></email>
  </maintainer>
  <use>
    <flag name="audio">Build alsa-lib and portaudio required for some receivers</flag>
    <flag name="ftdi">Build libftdi required by FTDI driver</flag>
    <flag name="iguanair">Build libiguanair required by iguanaIR</flag>
    <flag name="inputlirc">Build inputlirc</flag>
    <flag name="irman">Build libirman required by Irman</flag>
  </use>
</pkgmetadata>
$ cat files/irexec-confd
# Options to pass to the irexec process
IREXEC_OPTS="/etc/lircrc"

# User to execute irexec as.
# Warning: Running irexec as root can open security holes
#IREXEC_USER="root"

# Use this to disable the warning printed when starting irexec as root
# IREXEC_DISABLE_ROOT_WARNING=yes 
$ cat files/irexec-initd 
#!/sbin/runscript
# Copyright 2003 Martin Hierling <mad@cc.fh-lippe.de>
# Distributed under the terms of the GNU General Public License v2
# $Id$

: ${IREXEC_USER:=root}

depend() {
        need lirc
}

start() {
        if [ "x${IREXEC_USER}" = "xroot" -a "x${IREXEC_DISABLE_ROOT_WARNING}" != "xyes" ]; then
                ewarn "Warning: Running irexec as root can open security holes"
        fi

        ebegin "Starting irexec"
        start-stop-daemon --start --chuid ${IREXEC_USER} --user ${IREXEC_USER} --chdir / \
                --exec /usr/bin/irexec -- --daemon ${IREXEC_OPTS}
        eend $? "Failed to start irexec."
}

stop() {
        ebegin "Stopping irexec"
        start-stop-daemon --stop --exec /usr/bin/irexec --user ${IREXEC_USER}
        eend $? "Failed to stop irexec."
}
 $ cat files/irexec.service 
[Unit]
Description=IR Exec
After=lirc.service
Wants=lirc.service

[Service]
ExecStart=/usr/bin/irexec

[Install]
WantedBy=multi-user.target
$ cat files/lircd
#!/sbin/runscript
# Copyright 1999-2014 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$

PIDFILE=/var/run/lirc/${SVCNAME}.pid
: ${LIRCD_SYMLINKFILE:=/dev/lircd}
: ${LIRCD_SOCKET:=/var/run/lirc/lircd}

depend() {
        need localmount
        use modules
        provide lirc
}

start() {
        local retval

        ebegin "Starting lircd"

        for retval in ${LIRCD_SET_SYSCLASSRCS} ; do
                if [ -e /sys/class/rc/${retval}/protocols ] && \
                grep -qs 'lirc' /sys/class/rc/${retval}/protocols ; then
                        einfo "Setting lirc protocol active for ${retval}"
                        echo lirc >/sys/class/rc/${retval}/protocols
                fi
        done

        checkpath -q -d -m 0755 -o root:root /var/run/lirc
        rm -Rf ${LIRCD_SOCKET} && ln -s ${LIRCD_SOCKET} ${LIRCD_SYMLINKFILE}
        if [ $? -ne 0 ]; then
                eend $? "Unable to create symbolic link ${LIRCD_SYMLINKFILE}"
                return 1
        fi

        start-stop-daemon --start --quiet --pidfile "${PIDFILE}" --exec /usr/sbin/lircd -- \
                -P "${PIDFILE}" ${LIRCD_OPTS}
        retval=$?

        if [ ${retval} -ne 0 ]; then
                rm -Rf ${LIRCD_SOCKET}
        fi

        eend ${retval}
}

stop() {
        ebegin "Stopping lircd"
        rm -f ${LIRCD_SYMLINKFILE}
        start-stop-daemon --stop --quiet --pidfile "${PIDFILE}" --exec /usr/sbin/lircd
        eend $?
}
 $ cat files/lircd.conf.4 
# Options to pass to the lircd process

# for devices with lirc-kernel-module
#LIRCD_OPTS="-d /dev/lirc0"
#LIRCD_OPTS="-d /dev/lirc"

# for devices using the input-layer
#LIRCD_OPTS="-H devinput -d /dev/input/by-path/pci-0000:00:0a.0--event-ir"
# This should work, Bug #235107
#LIRCD_OPTS="-H devinput -d name=*DVB*"

# set default protocol to 'lirc' for in-kernel IR decoding
# for the following entries in /sys/class/rc/
# (space-separated list if there is more than one)
LIRCD_SET_SYSCLASSRCS="rc0"

# If running mulitple instances of lircd, the following
# can be used to override the default socket path and
# socket symlink
#LIRCD_SOCKET="/var/run/lirc/lircd"
#LIRCD_SYMLINKFILE="/dev/lircd"
$ cat files/lircmd 
#!/sbin/runscript
# Copyright 1999-2004 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$

depend() {
        need lircd
}

start() {
        ebegin "Starting lircmd"
        start-stop-daemon --start --quiet --exec /usr/sbin/lircmd
        eend $?
}

stop() {
        ebegin "Stopping lircmd"
        start-stop-daemon --stop --quiet --exec /usr/sbin/lircmd
        eend $?
}
$ cat files/lirc.service 
[Unit]
Description=Linux Infrared Remote Control
After=network.target

[Service]
ExecStart=/usr/sbin/lircd --nodaemon --driver=default --device=/dev/lirc0

[Install]
WantedBy=multi-user.target
$ cat files/modprobed.lirc 
#
# For first serial receivers:
#
#options lirc_serial irq=4 io=0x3f8
#options lirc_sir irq=4 io=0x3f8

#
# Detach first serial port from serial-driver.
# Use this when you have your serial-port-driver statically
# compiled into your kernel, or as a module but loaded before
# the lirc-module.
# 
#install lirc_serial setserial /dev/ttyS0 uart none; modprobe --ignore-install lirc_serial
#
#install lirc_sir    setserial /dev/ttyS0 uart none; modprobe --ignore-install lirc_sir


#
# For parallel receivers:
#
#options lirc_parallel irq=7 io=0x3bc

Таким образом, всё что вам нужно сделать - так это добавить ебилд в локальный репозиторий, выполнить repoman manifest и установить пакет.
# emerge lirc

Скачать zip можно отсюда: https://cloud.mail.ru/public/2Mdy/yGnm7BVgX
Да, я тут подумал, что так жить нельзя, и решил завести себе аккаунт на GitHub. Так что теперь ебилды можно будет качать и отсюда: https://github.com/developersu/loperOverlay

Теперь добавим демон lircd в автозагрузку:
# rc-update add lircd default
И запустим его:
# /etc/init.d/lircd start
 * Starting lircd ...
 * Setting lirc protocol active for rc0        [ ok ]
Проверить, что всё работает как надо можно коммандой mode2. Когда она запущена нужно поклацать пультом и диод замигает, а в консоли вы увидите примерно следующее:
# mode2 
Using device: /dev/lirc0
Using device: /dev/lirc0
Warning: Running as root.
pulse 9045
space 4607
pulse 511
space 1706
pulse 511
space 597
pulse 597
space 511
pulse 597
space 511
pulse 597
space 511
pulse 597
space 597
pulse 597
space 511
pulse 597
space 511
pulse 597
space 511
pulse 597
space 1621
pulse 682
space 1706
pulse 597
space 511
pulse 597
space 597
pulse 597
space 1706
pulse 597
space 1706
pulse 597
space 1621
pulse 682


О том, как настроить конкретный пульт для управление системой в KDE мы поговорим в следующий раз.

На этом у меня всё.

Источники:
https://dicks.home.xs4all.nl/avr/usbtiny/
http://jumptuck.com/2008/10/26/usb-ir-receiver/
http://gentoo-en.vfose.ru/wiki/LIRC

25 февраля 2016 г.

Смотрим торренты стримом в peerflix

12:22 Опубликовал Дмитрий Исаенко Нет комментариев
Задумался на днях о том, как бы смотреть фильмы из торрентов не дожидаясь каждый раз пока они полностью загрузятся. И вот набрёл на одну такую программу, которая позволяет это делать. Называется она peerflix. На вход ей передаётся файл .torrent (его можно не скачивать — распарсит даже URL), а на выходе запускает smplayer. Я почи уверен, что можно там запускать и VLC и всё что душе угодно, но разбираться как всегда лень. Так что вот вам, в уже привычном для всех стиле, короткая записка как это всё быстро развернуть и начать "смотреть фильмы уже сегодня"!
Как обычно, в основном дереве этого пакета нет. Если вообще не хотите париться, то вот линка на список оверлеев: https://gpo.zugaina.org/media-tv/peerflix
Я как обычно забил на это дело и добавил ebuild в свой локальный оверлей. Таким образом:
# cd /usr/local/portage/
# mkdir -p media-tv/peerflix
# cd media-tv/peerflix
# wget http://data.gpo.zugaina.org/jorgicio/media-tv/peerflix/peerflix-0.32.2.ebuild
# chown portage:portage -R /usr/local/portage/
# repoman manifest
# eix-update 
# echo media-tv/peerflix ~amd64 >> /etc/portage/package.accept_keywords
# emerge -a peerflix
Смотреть любимые фильмяшки можно так:
peerflix fat_as_your_mom.torrent -g -d
Это дело отлично заменяет fs.to,ex.ua,cxz.to и всякие там futuron.tv. На этом у меня всё ;)

Ссылки: https://github.com/mafintosh/peerflix

14 февраля 2016 г.

Crossdev окружение для AVR

18:43 Опубликовал Дмитрий Исаенко , , Нет комментариев
Сегодня хочется поговорить о том, как настроить crossdev окружение в Gentoo, которое необходимо для компиляции под микроконтроллеры AVR. По аналогичной схеме собираются тулчейны и для других популярных архитектур, к примеру MIPS или различных веток ARM.

Перед началом работы размаскируем последнюю версию crossdev и установим её:
# echo "sys-devel/crossdev ~amd64" >>  /etc/portage/package.accept_keywords
Теперь создадим и настроим отдельный оверлей, для пакетов crossdev.
# mkdir /usr/local/crossdev-overlay
# cd /usr/local/crossdev-overlay
# mkdir -p /usr/local/crossdev-overlay/{profiles,metadata}
# echo 'crossdevLocalOverlay' > profiles/repo_name
# vim metadata/layout.conf
masters = gentoo
thin-manifests = true
# chown  -R portage:portage /usr/local/crossdev-overlay
Также следует описать оверлей в repos.conf:
# vim /etc/portage/repos.conf/crossdev.conf
[crossdevLocalOverlay]
location = /usr/local/crossdev-overlay
priority = 10
masters = gentoo
auto-sync = no
Тут есть один важный нюанс. Если у нас в системе уже был один локальный оверлей, а для crossdev мы хотим использовать отдельный, то следует существующему оверлею назначить более высокий приоритет. Сделать это можно изменив его настройки там же, в директории repos.conf. В моём случае это выглядело так:
#echo 'priority = 13' >> /etc/portage/repos.conf/local.conf
Соберём окружение для AVR, явно указав версии необходимого нам ПО. У меня всё заработало со следующими параметрами GCC, binutils и libc:
USE="multilib -cxx" crossdev --g 4.6.2 --b 2.21.1-r1 --l 1.7.0 -S -s1 --target avr
USE="multilib cxx" crossdev --g 4.6.2 --b 2.21.1-r1 --l 1.7.0 -S -s4 --target avr 
Если не вышло, можно попробовать проще:
crossdev -s4 --stable --portage --verbose --target avr
Теперь нужно создать ссылку на ldscripts, иначе ничего не соберётся (эта проблема существует уже лет 6, но никто не шевелится её исправлять):
ln -s /usr/x86_64-pc-linux-gnu/avr/lib/ldscripts/ /usr/avr/lib/ldscripts
Осталось установить avrdude:
# emerge avrdude
Попробуем помирать диодиком на PC5:
# vim me.cpp
#define F_CPU 8000000L
#include <avr/io.h>
#include <util/delay.h>

void sleep(uint8_t millisec)
{
        while(millisec)
        {
              _delay_ms(1);
                millisec--;
        }
}

int main(void)
{
while (1) {

DDRC |=1<<PC5;
               PORTC &= ~(1<<PC5);
               sleep(100);

               PORTC |=(1<<PC5);
               sleep(100);
}
}
Теперь скомпилируем и прошьём (я использую программатрор от Thomas Fischl).
# avr-gcc  -O2 -mmcu=atmega8  me.cpp -o me.elf
# avr-objcopy -O ihex me.elf me.hex
# avrdude -c usbasp -p m8 -U hfuse:w:0xd9:m -U lfuse:w:0xe1:m
# avrdude -c usbasp -p m8 -U flash:w:me.hex:i
Вот и всё. Схему приводить тут не вижу смысла, но если кому интересно — смотрите на иконку к этой публикации. Удачи!


Полезные ссылки:
https://wiki.gentoo.org/wiki/Overlay/Local_overlay
http://gentoo-en.vfose.ru/wiki/Crossdev 

14 января 2016 г.

Горячее извлечение и подключение жестких дисков в Linux

12:59 Опубликовал Дмитрий Исаенко Нет комментариев
Коротко об извлечении HDD/SSD по-горячему для десктопщиков. Иногда даже у пользователей ПК возникает необходимость извлечь жесткий диск не отключая питание, или же наоборот — подключить новый.

Отключаем!
Сделать это достаточно просто. Для начала следует отмонтировать все подключенные партиции диска, который вы пытаетесь извлечь (пусть это будет диск sdc с одной подключенной партицией sdc1):
umount /dev/sdc1
а затем выполнить комманду:
echo 1 > /sys/block/sdc/device/delete 
Всё. Теперь диск можно безопасно извлечь.

Подключаем!
Для обнаружения диска, который вы только что подключили нужно указать системе, что необходимо просканировать контроллеры SATA на наличие новых подключенных устройств. Это делается с помощью следующей комманды:
echo "- - -" > /sys/class/scsi_host/host0/scan
Как правило в системе есть несколько хостов, именуемых соотвественно как hostX, где вместо X будет стоять соответсвующий порядковый номер. Как определить нужный — не знаю. Я пошел эксперементальным путём, чего и вам советую.

20 декабря 2015 г.

Грубый бекап контактов из Android

16:52 Опубликовал Дмитрий Исаенко , Нет комментариев
Бывает, что надо вытащить из полу-трупа телефона все контакты, которые в нём остались. Желательно в формате VCF. У меня вот такой аппарат не подключался к Wifi и никак не хотел синхронизироваться с гуглом. Очевидно, что будь у меня возможность синхронизации, проще всего было бы сделать экспорт из https://google.com/contacts. Ещё хороший вариант — сделать экспорт через стандартные средства в разделе контактов телефона, выбрав пункт 'Импорт/Экспорт контактов', но такая опция в последнее время встречается всё реже и есть не на всех андроедофонах.
В общем я задался целью получить файлик VCF со всеми данными. Для этого я сначала скачал файл базы данных sqlite. Это получилось сделать прямо на телефоне через Total Commander скопировав необходимый файл на карту памяти.
/data/data/com.android.providers.contacts/databases/contacts2.db
После этого я скопировал этот же файл на ПК.
Далее нам понадобится конвертер, благо распространяется он в виде обычного bash-скрипта. Скачать его можно отсюда: https://github.com/stachre/dump-contacts2db.
Теперь всё что остаётся сделать, так это поместить файл с базой и скрипт в одну директорию и запустить его:
$ chmod +x dump-contacts2db.sh
$ dump-contacts2db.sh contacts2.db > contacts2.vcf
В общем это всё. В интернете куча похожих рецептов связанных как с использованием dbconverter.sh, так и с помощью онлайн-конвертеров. С первым у меня не получилось из-за каких-то специфических заточек на использование в Ubuntu (просто не захотел разбираться), а онлайн конвертерам я не доверяю. На этом у меня всё.

12 ноября 2015 г.

Skype глушит все программы?

00:24 Опубликовал Дмитрий Исаенко , Нет комментариев
/Быстропост/ Что делать, если после установки скайпа он, при своей работе, глушит все другие аудиопотоки?
Комментим следующую строчку:
# vim /etc/pulse/default.pa
...
#load-module module-role-cork
...
Если вдруг не помогло, изменим в другом месте:
# vim /etc/pulse/daemon.conf
flat-volumes = no;
После всего этого перезагружаем пульсу. Должно помочь.

28 июля 2015 г.

lm sensors [перевод]

04:04 Опубликовал Дмитрий Исаенко , Нет комментариев
Это вольный перевод статьи lm sensors взятой из gentoo wiki.

lm_sensors является набором утилит для мониторинга работы аппаратного обеспечения в пространстве пользователя. Он полезен для отслеживания температуры, оборотов вентиляторов и напряжения.
    1. Установка
Перед тем, как lm_sensors начнут работать как полагается, следует убедиться, что ядро Linux содержит необходимые модули или вкомпилированные бинарники для того, чтобы предоставить lm_sensors данные о сенсорах, которые необходимые для работы. Есть вероятность что эти модули уже были собраны как отдельные модули или же включены в ядро. Также не стоит исключать, что ядро не содержит этих модулей или фич. Если что-то упущено, тогда пользователю придётся взять на себя заботу об устранении этих недочётов.
В любом случае необходимо будет провести обнаружение аппаратного обеспечения материнской платы, путём её сканирования командой sensors-detect. Как только определение оборудования было проведено, программа выдаст вывод в котором будет (или не будет) включена конфигурация ядра. Этот шаг будет пройден после установки в процессе настройки приложения (см. в секции ниже).
Альтернативным вариантом может служить проверка своего оборудования в соответствующем разделе на официальном сайте. Есть возможность включить все драйверы и просто дать sensors-detect делать свою работу.

        1.1. Ядро
Необходимо включить поддержку I2С а также некоторые другие опции:
Device Drivers  --->
    -*- I2C support  --->
        <*>   I2C device interface
    <*> Hardware Monitoring support  --->
 
        Select a driver, e.g.:
        [*] Intel Core/Core2/Atom temperature sensor (coretemp)

        1.2. USE-флаги
           1.2.1. Глобально
Система Portage знает о существовании USE-флага lm_sensors который включает поддержку lm_sensors в других пакетах. Включение этого USE-флага автоматически повлечёт за собой установку sys-apps/lm_sensors как только будет выполнена команда emerge --change-use:
vim /etc/portage/make.conf
USE="lm_sensors"

           1.2.2. Локально
Локальный USE-флаг включает:
Optional USE flags for sys-apps/lm_sensors:
USE-флаг по-умолчанию Описание
sensord No Включает sensord - демон, который может использоваться для переодической записи лога данных от сенсора аппаратных чипов мониторинга здоровья.
static-libs No Собрать статические версии динамических библиотек

        1.3. Установка
После установки USE-флага в файл /etc/portage/make.conf, как это было описано вышe, необходимо обновить систему чтобы изменения вступили в силу:
root #emerge --ask --changed-use --deep @world


    2. Настройка
Если все драйверы были включены в ядро (не в виде модулей), пропустите следующий пункт.

        2.1. Модули
ВНИМАНИЕ
Использование приложения sensors-detect может привести к зависанию системы. Уделите особое внимание прочтению официальной документации перед тем, как запускать lm_sensors на IBM Thinkpad.

Программа sensors-detect может быть использована для того, чтобы найти сенсоры и соответствующие модули ядра:
root #sensors-detect
Следуйте инструкциям и положительно ответьте на серию вопросов о обнаружении оборудования, а также разрешите приложению перезаписать сгенерированный файл /etc/conf.d/lm_sensors.

        2.2. Сервисы (OpenRC)
Для авто-запуска lm_sensors при загрузке системы добавьте демон в уровень запуска 'default':
root #rc-update add lm_sensors default

    3. Использование
        3.1. Вызов (OpenRC)
Запустите lm_sensors используя команду:
root #/etc/init.d/lm_sensors start


        3.2. Тестирование
Удостоверимся что всё работает:
user $sensors

coretemp-isa-0000
Adapter: ISA adapter
Core 0:       +48.0°C  (high = +100.0°C, crit = +100.0°C)
Core 1:       +48.0°C  (high = +100.0°C, crit = +100.0°C)

    4. Возможные проблемы
См. lm_sensors FAQ (английский).

p.s.
Лично я столкнулся с проблемой сразу же. При запуске демона мне выдавало сообщение:
# /etc/init.d/lm_sensors restart
 * MODULE_0 is not set in /etc/conf.d/lm_sensors, try running sensors-detect

После того, как я изменил в файле /etc/conf.d/lm_sensors строку HWMON_MODULES=" на MODULE_0=" всё заработало как надо.
---
Содержимое распространяется в соответствии с лицензией CC-BY-SA-3.0, т.к. права на оригинальный текст принадлежат '© 2001–2015 Gentoo Foundation, Inc.' и распространяются согласно этой же лицензии.

30 июня 2015 г.

/media вместо /run/media/../

00:07 Опубликовал Дмитрий Исаенко Нет комментариев
Очень короткая заметка о изменении точки монтирования съёмных носителей.
Для того, чтобы установить точку монтирования в /media необходимо записать в правило для udev:
vim /etc/udev/rules.d/99-udisks2.rules 

ENV{ID_FS_USAGE}=="filesystem|other|crypto", ENV{UDISKS_FILESYSTEM_SHARED}="1"

После этого просто перезапускаем демон.

1 июня 2014 г.

Пара слов о EFI^w Simple Framebuffer

05:30 Опубликовал Дмитрий Исаенко , Нет комментариев


Комрад, сегодня мы настроим фреймбуфер!

Долгое время я никак не мог понять, почему же у меня на VT дисплеях ничерта не отображается. Вот использовал я встроенную графику от intel, и всё было нормально, но стоило вставить GTX 760 - и всё. Путой чёрный экран вместо VT (TTY). И при всём при этом Xorg работал нормально. Естественно проблема была во фреймбуфере.. Как подсказала мне одна статья, "The frame buffer support is optional but if you don't select it consoles won't work". И таки да! Не работает. Настраиваю как там написано - и всё равно ничерта!

Короче говоря, примерно с ядра 3.12 появилась опция CONFIG_X86_SYSFB.
Ищите её где-то тут:
Bus options -->
   [*] Mark VGA/VBE/EFI FB as generic system framebuffer
Также, как бы я не пытался, EFI FB никак не хотел работать, поэтому следом за X86_SYSFB сразу включаем Simple Framebuffer:
Device Drivers -->
   Graphics support  --->
       <*> Support for frame buffer devices  --->
             [*]   Simple framebuffer support
Без этого - чёрный экран. А так - хоть какой-то вывод, но есть.

Осталось разобраться с тем, как втюхать туда 1920x1080.

Удачи!

Спасибо: http://www.gossamer-threads.com/lists/gentoo/user/287563?page=last

24 мая 2014 г.

Переключение между драйверами nouveau и nvidia-drivers

05:31 Опубликовал Дмитрий Исаенко , , Нет комментариев
Это перевод статьи Nouveau & nvidia-drivers switching. Распространяется под лиценцией Creative Commons Attribution Share Alike. Пожалуйста, поместите этот перевод в wiki, если сочтёте это необходимым.

Переключение между бинарным драйвером nVidia и открытым драйвером noveau может быть несколько мудрёным, однако осуществимым. Эта статья объяснит как может быть осуществлено такое переключение на различных уровнях (т.е. на этапе загрузки, в runlevel и т.п.).
Переключение с использованием двух ядер
При загрузке
Этот метод предполагает следующее:

  • Два ядра: одно с включённым в него драйвером nouveau, другое — без (или с nouveau в виде модуля).
  • Ядро без nouveau будет иметь суффикс -nvidia
  • Загрузчик GRUB
Предполагается, что у вас уже есть ядро с nouveau и вы собираетесь собрать ещё одно, которое будет использоваться с драйвером nvidia. Начнём с добавления суффикса -nvidia в имя ядра:


Конфигурация ядра
 
General setup  --->
    (-mykernel-nvidia) Local version - append to kernel release
Теперь убедимся, что драйвер noveau отключен или собран как модуль:

Конфигурация ядра
 
Device Drivers  --->
    Graphics support  --->
        <*> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) --->
            <M> Nouveau (nVidia) cards
Теперь пересоберите и установите ядро. Также убедитесь, что вы обновили GRUB и новое ядро добавлено в его список выбора. Обратите внимание, что ядра с одинаковой версией и разными именами считаются уникальными. Поэтому если вы хотите установить ядро не из дерева portage для использования совместно с nouveau-ядром, вам следует скопировать из ядра nouveau конфигурационный файл /usr/src/linux/.config
Portage использует переменную VIDEO_CARDS для включения поддержки различных видеокарт в пакетах. Установка значения VIDEO_CARDS в nvidia nouveau будет подгружать корректный драйвер:

Файл: /etc/portage/make.conf
 
 VIDEO_CARDS="nvidia nouveau"
После этой настройки следует обновить систему, чтобы изменения вступили в силу:

root # emerge --ask --changed-use --deep world

Добавьте nvidia и nouveau модули в blacklist т.к. вы не хотите чтобы udev загруджал их автоматически:
root # echo -e "blacklist nouveau\nblacklist nvidia" >> /etc/modprobe.d/nvidia-n-nouveau.conf 

В конце мы будем использовать local.d скрипт, приведённый ниже для переключения драйвера в зависимости от ядра, с которым вы загружаетесь:
Файл: /etc/local.d/nvidia.start
 
#!/bin/bash

depend() {
 need localmount
 before xdm
}

if [[ $(uname -r) == *-nvidia ]] ; then
 modprobe -q nvidia
 if [[ $(eselect opengl show) != nvidia ]] ; then
  eselect opengl set nvidia &>/dev/null
 fi
cat > /etc/X11/xorg.conf.d/01-nvidia.conf << EOF
Section "Device"
  Identifier   "Device0"
  Driver       "nvidia"
  Option       "NoLogo" "True"
EndSection
EOF
else
 modprobe -q nouveau
 if [ -f /etc/X11/xorg.conf.d/01-nvidia.conf ] ; then
  rm /etc/X11/xorg.conf.d/01-nvidia.conf
 fi
 if [[ $(eselect opengl show) != xorg-x11 ]] ; then
  eselect opengl set xorg-x11 &>/dev/null
 fi
fi
Скопируйте этот скрипт в /etc/local.d/nvidia.start
root # chmod +x /etc/local.d/nvidia.start


Переключение с использованием одного ядра и hprofile
Другим методом является переключение между двумя профилями hprofiles с использованием всего одного ядра: /etc/init.d/hprofile должен быть модифицирован с добавлением нескольких строк для переключения vga. Внимание! hprofile должен быть добавлен в boot runlevel.

22 января 2014 г.

Pssshhhh ALSA!

05:22 Опубликовал Дмитрий Исаенко , Нет комментариев
Привет!

Настало время настраивать ALSA!

Цель:
1. Настроить звук на конкретном примере.
2. Настроить вывод звука через две звуковые карты одновременно.
3. Настроить программное усиление HDMI выхода
4. Добавить ещё один ползунок громкости для HDMI
5. Сделать всё хорошо

Сдердства:
alsa (kernel level)
phonon

Оборудование:
Материнская: Sabertooth Z87 с Intel HD audio ALC1150
Процессор: Core i7 4770K

1. Ядро
Device Drivers -> 
     Sound Card Support ->
           <M> Advanced Linux Sound Architecture ->
                <M>   Sequencer support
                <M>   OSS Mixer API
                <M>   OSS PCM (digital audio) API
                <M>   Intel HD Audio  --->
                      (2048) Pre-allocated buffer size for HD-audio driver //почему нет?
                      [*]   Build hwdep interface for HD-audio driver         //пусть будет:)
                      [*]   Build Realtek HD-audio codec support                //нужно
                      [*]   Build Analog Device HD-audio codec support     //не нужно?
                      [*]   Build HDMI/DisplayPort HD-audio codec support //нужно

# make && make modules install && cp arch/x86/boot/bzImage /boot && rc-update add alsasound boot
# useradd -a -G audio пользователь

2. Выясним, а что у нас наопределялось
# aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: MID [HDA Intel MID], device 3: HDMI 0 [HDMI 0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: MID [HDA Intel MID], device 7: HDMI 1 [HDMI 1]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: MID [HDA Intel MID], device 8: HDMI 2 [HDMI 2]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: PCH [HDA Intel PCH], device 0: ALC1150 Analog [ALC1150 Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: PCH [HDA Intel PCH], device 1: ALC1150 Digital [ALC1150 Digital]
  Subdevices: 1/1
  Subdevice #0: subdevice #0 
# cat /proc/asound/cards 
 0 [MID            ]: HDA-Intel - HDA Intel MID
                      HDA Intel MID at 0xf7e34000 irq 16
 1 [PCH            ]: HDA-Intel - HDA Intel PCH
                      HDA Intel PCH at 0xf7e30000 irq 22

Итого:
  •  2 звуковые карты, 0 и 1 (или MID и PCH).
  • Первая, вообще говоря, MIDI устройство (привет странным названиям alsa!) но на самом деле HDMI, вторая - PCH, (т.е. ALC1150).
  • На первой звуковой карте доступно три устройства вывода звука
  • На второй - два.
 Заметьте, в случае, когда в настройках ALSA не указано какое устройтво следует использовать, автоматически используется нулевое.
 Также в конфигурационном файле указывайте устройство по номеру, на случай если вдруг в новых драйверах опомнятся, и переименуют MID в какой-то HDMI.

Перейдём к вкусному.
Настройки для alsa могут хранится глобально(в /etc/asound.conf) и локально($HOME/.asoundrc), что позволяет с лёгкостью определить настройки вывода только через hdmi для конкретного пользователя и наглядно продемонстрировать кто в доме хозяин.

Но будем реалистами, настроим всё для всех!
# cat /etc/asound.conf
################## Микшер ALC1150 #######################
pcm.dmix_1      {
        type dmix               # тип - микшер. Возможно не нужен, но наличие аппаратного микширования под вопросом
        ipc_key 56754164        # Случайный набор цифр (для инициализации ключа стркутуры)
        ipc_perm 0660           # права доступа к структуре IPC
        ipc_gid audio           # группа пользователей.. вообще следует покопаться в документации и проверить
        ipc_key_add_uid true    # присвоить UID. Какая-то магия, всё по заветам офф-документации

        slave {                 # определим параметры устройства сразу, без выноса в отдельную сущность(разницы, ну никакой)
                channels 2      # количество каналов. Сделайте 6 или 5.1 если нужно
                pcm {
                        format S32_LE     # формат сэмплирования. Если вам не плевать, поищите документацию на кодек и вишите что-то адекватное.
                        rate 48000        # частота сэмплирования.. Может стоит остановиться на 44100, но опять же смотрите технические спецификации.
                        type hw           # тип сущности - устройство. Говорит что мы собираемся сделать алиас для устройства.
                        card 1            # номер карты
                        device 0          # номер устройства
                        subdevice 0       # под-устройтво? Если вы видели когда-то что эта опция не 0, дайте знать.
                     }
                period_size 1024          # размер для периода. Если звук заикается, поиграйтесь с этими двумя параметрами.
                periods 8                 # количество периодов. Более подробнее смотрите документацию. В итоге получился размер буфера 1024*8=8192 байт.
        }
       bindings {               # биндинги! Чёрт пойми зачем они тут описаны, в целом и без этого-то работает. 
                 0 0
                 1 1
# настройки для многоканального звука
#                2 2
#                3 3
#                4 4
#                5 5
                }

}
##################  Микшер HDMI #######################
# HDMI 0
pcm.hdmi_generic {                       # параметры устройства вынесенные в отдельную сущность
        format S32_LE
        rate 48000 
        type hw
        card 0 
        device 7 
        channels 2
}
################ Добавим софтварный контроль уровнем громкости в HDMI ####
pcm.control_hdmi
{
        type softvol                     # Вот так декларируется новый ползунок в вашем микшере
        slave {
                pcm "dmix_2"             # используем созданное устройтво dmix_2 (ниже)
        }

        control {                        # Cобственно сами параметры этого ползунка
                name "evil"              # имя для него
                card 0                   # и номер карты. Можно указать ещё номер устройства, если у вас несколько выходов HDMI и вы хотите раздельно ими управлять
        }
        min_dB  -20.0                    # Софтварное усиление. Минимальный порог
        max_dB 20.0                      # ну и максимальный. Будьте бдительны, не перестарайтесь
        resolution 10                    # шаг, с которым будет осуществлятся увеличение/уменьшение громкости
}

# HDMI 0 dmix
pcm.dmix_2                               # микшер для HDMI, ничего интересного..
{
        type dmix
        ipc_key 88896452
        ipc_perm 0660
        ipc_gid audio
        ipc_key_add_uid true
        slave {
                pcm "hdmi_generic"      # см.выше
                period_size 1024
                periods 8
        }
        bindings {
                0 0
                1 1
        }
}
################## Остальное #########
pcm.!default {                         # Устройтво вывода по-умолчанию. Именно его будут использовать всякие flash player и mplayer без параметров
        type plug                      # тип - plug! Да!
        slave.pcm "both"               # что мы будем использовать из всего того, что тут написанно - both, см. ниже
}

################# Настройка вывода на две карты одновременно
pcm.both {
    type route;
    slave.pcm {
        type multi;
        slaves.a.pcm "dmix_1";       # Декларируем что и с чем будем соединять - сущность первая - микшер ALC1150
        slaves.b.pcm "control_hdmi"; # сущность вторая - контрол для HDMI с предусилением.

        slaves.a.channels 2;         # 2 канала в первом устройстве 
        slaves.b.channels 2;         # 2 канала во втором устройстве 

        bindings.0.slave a;          # тут много букв. Всё должно быть ясно по контексту, или.. Верьте в магию!
        bindings.0.channel 0;
        bindings.1.slave a;
        bindings.1.channel 1;
        
        bindings.2.slave b;
        bindings.2.channel 0;
        bindings.3.slave b;
        bindings.3.channel 1;

    }
        ttable.0.0 1;
        ttable.1.1 1;
        ttable.0.2 1;
        ttable.1.3 1;

        hint {                     # вариативно. Если хотите что бы Phonon отображал устройство в своём списке выбора - включите.
             show on
             description "Duplicate"
        }
}

 Всё что вам осталось - выбрать в настройках Phonon устройство default и использовать его по своему усмотрению.
 Таже не забудьте "Выбрать главный канал" в настройках kmix для HDA Intel MID

 Всё готово! Вперёд на встречу приключениям!

p.s. если вдруг с первого раза не получилось и у вас почему-то не удаляеся добавленый контрол, воспользуйтесь следующей хитростью:

 rm /var/lib/alsa/asound.state*
 chmod -x /usr/sbin/alsactl 
 init 6
 chmod +x /usr/sbin/alsactl