Mostrando las entradas con la etiqueta GNU/Linux. Mostrar todas las entradas
Mostrando las entradas con la etiqueta GNU/Linux. Mostrar todas las entradas

domingo, 20 de febrero de 2022

Preventing keyboard and mouse from waking up suspended computer

 Scenario

Laptop computer, Linux environment, external keyboard, monitor and mouse connected.

After suspension an insignificant movement wakes up the system. Sometimes mices have high resolution, so a very minor movement wakes up the laptop

ACPI

The first solution I found was via ACPI setup, but ditn't like it.

mabeett@nowhere:~$ cat /proc/acpi/wakeup
Device	S-state	  Status   Sysfs node
GLAN	  S4	*disabled
XHC	  S3	*enabled   pci:0000:00:14.0
XDCI	  S4	*disabled
HDAS	  S4	*disabled  pci:0000:00:1f.3
mabeett@nowhere:~$

udev device tailored made

So, again, udev might be my friend. The quick-fast way is generating rule for the device as mentioned in arch wiki.

mabeett@nowhere:~$ lsusb -v   | egrep -i  'Leno|mouse|keyb'
Bus 001 Device 007: ID 17ef:608d Lenovo 
  idVendor           0x17ef Lenovo
      bInterfaceProtocol      2 Mouse
Bus 001 Device 005: ID 17ef:6099 Lenovo 
  idVendor           0x17ef Lenovo
      bInterfaceProtocol      1 Keyboard

mabeett@nowhere:~$ cat 50-non-power-on-mouse.rules 
## mouse 
ACTION=="add", SUBSYSTEM=="usb", DRIVERS=="usb", ATTRS{idVendor}=="17ef", ATTR{idProduct}=="608d", ATTR{power/wakeup}="disabled"
# keyboard
ACTION=="add", SUBSYSTEM=="usb", DRIVERS=="usb", ATTRS{idVendor}=="17ef", ATTR{idProduct}=="6099", ATTR{power/wakeup}="disabled"

But I don't like it since I might change keyboard/mouse and with the change I should add a new rule. Then, I explored.

udev for HID devices

Forgetting the path for the device:

mabeett@nowhere:~$ dmesg  | grep Lenovo |  grep -i mouse | grep -P  "usb.+?:"
[    2.873048] usb 1-3.3: Product: Lenovo USB Optical Mouse
[    2.879777] input: PixArt Lenovo USB Optical Mouse as /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3.3/1-3.3:1.0/0003:17EF:608D.0005/input/input14
[    2.888588] hid-generic 0003:17EF:608D.0005: input,hidraw4: USB HID v1.11 Mouse [PixArt Lenovo USB Optical Mouse] on usb-0000:00:14.0-3.3/input0
mabeett@nowhere:~$ 

There it is a path for exploring dev with udevadm info -a -p ${PATH}

mabeett@nowhere:~$ udevadm info -a -p /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3.3/1-3.3:1.0/0003:17EF:608D.0005/input/input14

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3.3/1-3.3:1.0/0003:17EF:608D.0005/input/input14':
    KERNEL=="input14"
    SUBSYSTEM=="input"
    DRIVER==""
    ATTR{properties}=="0"
    ATTR{uniq}==""
    ATTR{name}=="PixArt Lenovo USB Optical Mouse"
    ATTR{inhibited}=="0"
    ATTR{phys}=="usb-0000:00:14.0-3.3/input0"

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3.3/1-3.3:1.0/0003:17EF:608D.0005':
    KERNELS=="0003:17EF:608D.0005"
    SUBSYSTEMS=="hid"
    DRIVERS=="hid-generic"
    ATTRS{country}=="00"

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3.3/1-3.3:1.0':
    KERNELS=="1-3.3:1.0"
    SUBSYSTEMS=="usb"
    DRIVERS=="usbhid"
    ATTRS{bInterfaceSubClass}=="01"
    ATTRS{supports_autosuspend}=="1"
    ATTRS{bInterfaceProtocol}=="02"
    ATTRS{bNumEndpoints}=="01"
    ATTRS{bInterfaceClass}=="03"
    ATTRS{authorized}=="1"
    ATTRS{bInterfaceNumber}=="00"
    ATTRS{bAlternateSetting}==" 0"

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3.3':
    KERNELS=="1-3.3"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bDeviceClass}=="00"
    ATTRS{idProduct}=="608d"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bMaxPower}=="100mA"
    ATTRS{quirks}=="0x0"
    ATTRS{speed}=="1.5"
    ATTRS{removable}=="unknown"
    ATTRS{tx_lanes}=="1"
    ATTRS{ltm_capable}=="no"
    ATTRS{bcdDevice}=="0100"
    ATTRS{urbnum}=="42757"
    ATTRS{version}==" 2.00"
    ATTRS{busnum}=="1"
    ATTRS{authorized}=="1"
    ATTRS{product}=="Lenovo USB Optical Mouse"
    ATTRS{devpath}=="3.3"
    ATTRS{devnum}=="7"
    ATTRS{idVendor}=="17ef"
    ATTRS{bmAttributes}=="a0"
    ATTRS{maxchild}=="0"
    ATTRS{manufacturer}=="PixArt"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{rx_lanes}=="1"
    ATTRS{bMaxPacketSize0}=="8"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{configuration}==""
    ATTRS{bDeviceProtocol}=="00"

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-3':
    KERNELS=="1-3"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
   [...]

The device
/devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3.3/1-3.3:1.0
indicates being detected as USB-HID device (
DRIVERS=="usbhid"
), but the path with the
power/wakeup
path is one level up:
/devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3.3'
The approach is to invoke ../ in the attribute:
mabeett@nowhere:~$ cat /etc/udev/rules.d/52-non-power-on-hid.rules
# Disables USB HID devices (as mouse/keyboard) wakeup from suspend

ACTION=="add", SUBSYSTEM=="usb", DRIVER=="usbhid", TAG+="usb_hid_donot_wakeup"
ACTION=="add", SUBSYSTEM=="usb", DRIVER=="usbhid", ATTR{../power/wakeup}="disabled"
With this rule any HID connnected device will be disabled for wakeup.
The tag is going to be used for debugging porpouses.
I may see all the mathched/confugured devices at /run interface
mabeett@nowhere:~$ ls /run/udev/tags/usb_hid_donot_wakeup/
+usb:1-3.3:1.0

References

lunes, 11 de abril de 2011

Linux: udev para varios dispositivos USB

Las computadoras de escritorio relativamente nuevas y notebooks no traen puerto paralelo. Así que una de las maneras de solucionarlo es usando una placa pci-paralelo o un adaptador USB.
El escenario y problema
Tengo a CUPS con dos impresoras conectadas al USB, una vía un adaptador a paralelo y la otra es una chorro de tinta que ya es USB. La corro de tinta es Hewlett Packard y el backend para cups es hplib así que la URI es algo como hp:/usb/DeskJet_840C?serial=NumeroDeSerie la referencia es absoluta al aparato, solucionado. Pero con el adaptador se usa el backend parallel, la URI es parallel:/dev/usblp0 y ahí empieza el problema: la HP también tiene un archivo en /dev/usblpN, y a veces le toca un N=0 y otras N=1
Implementación
La encontré con udev. En el directorio /etc/udev/rules.d/ se agregan las reglas locales para renombrar los dispositivos o crear enlaces simbólicos.
Para poder encontar algunos datos que permitan individualizar al periférico:
matias@melezca:~$ udevadm info -q path -n /dev/usblp1
/devices/pci0000:00/0000:00:12.0/usb4/4-5/4-5:1.0/usb/lp1

matias@melezca:~$ udevadm info -a -p /devices/pci0000:00/0000:00:12.0/usb4/4-5/4-5:1.0/usb/lp1

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

looking at device '/devices/pci0000:00/0000:00:12.0/usb4/4-5/4-5:1.0/usb/lp1':
KERNEL=="lp1"
SUBSYSTEM=="usb"
DRIVER==""

looking at parent device '/devices/pci0000:00/0000:00:12.0/usb4/4-5/4-5:1.0':
KERNELS=="4-5:1.0"
SUBSYSTEMS=="usb"
DRIVERS=="usblp"
ATTRS{bInterfaceNumber}=="00"
ATTRS{bAlternateSetting}==" 1"
ATTRS{bNumEndpoints}=="02"
ATTRS{bInterfaceClass}=="07"
ATTRS{bInterfaceSubClass}=="01"
ATTRS{bInterfaceProtocol}=="02"
ATTRS{modalias}=="usb:v067Bp2305d0200dc00dsc00dp00ic07isc01ip02"
ATTRS{supports_autosuspend}=="1"

looking at parent device '/devices/pci0000:00/0000:00:12.0/usb4/4-5':
KERNELS=="4-5"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{configuration}==""
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bmAttributes}=="a0"
ATTRS{bMaxPower}=="100mA"
ATTRS{urbnum}=="19"
ATTRS{idVendor}=="067b"
ATTRS{idProduct}=="2305"
ATTRS{bcdDevice}=="0200"
ATTRS{bDeviceClass}=="00"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="00"
ATTRS{bNumConfigurations}=="1"
ATTRS{bMaxPacketSize0}=="8"
ATTRS{speed}=="12"
ATTRS{busnum}=="4"
ATTRS{devnum}=="3"
ATTRS{version}==" 1.00"
ATTRS{maxchild}=="0"
ATTRS{quirks}=="0x0"
ATTRS{authorized}=="1"
ATTRS{product}=="IEEE-1284 Controller"

looking at parent device '/devices/pci0000:00/0000:00:12.0/usb4':
KERNELS=="usb4"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{configuration}==""
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bmAttributes}=="e0"
ATTRS{bMaxPower}==" 0mA"
ATTRS{urbnum}=="55"
ATTRS{idVendor}=="1d6b"
ATTRS{idProduct}=="0001"
ATTRS{bcdDevice}=="0206"
ATTRS{bDeviceClass}=="09"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="00"
ATTRS{bNumConfigurations}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{speed}=="12"
ATTRS{busnum}=="4"
ATTRS{devnum}=="1"
ATTRS{version}==" 1.10"
ATTRS{maxchild}=="5"
ATTRS{quirks}=="0x0"
ATTRS{authorized}=="1"
ATTRS{manufacturer}=="Linux 2.6.32-30-generic ohci_hcd"
ATTRS{product}=="OHCI Host Controller"
ATTRS{serial}=="0000:00:12.0"
ATTRS{authorized_default}=="1"

looking at parent device '/devices/pci0000:00/0000:00:12.0':
KERNELS=="0000:00:12.0"
SUBSYSTEMS=="pci"
DRIVERS=="ohci_hcd"
ATTRS{vendor}=="0x1002"
ATTRS{device}=="0x4397"
ATTRS{subsystem_vendor}=="0x1002"
ATTRS{subsystem_device}=="0x4397"
ATTRS{class}=="0x0c0310"
ATTRS{irq}=="18"
ATTRS{local_cpus}=="00000000,0000000f"
ATTRS{local_cpulist}=="0-3"
ATTRS{modalias}=="pci:v00001002d00004397sv00001002sd00004397bc0Csc03i10"
ATTRS{numa_node}=="0"
ATTRS{broken_parity_status}=="0"
ATTRS{msi_bus}==""

looking at parent device '/devices/pci0000:00':
KERNELS=="pci0000:00"
SUBSYSTEMS==""
DRIVERS==""

matias@melezca:~$
Con esa información es suficiente para generar un archivo de reglas locales con esta información:
matias@melezca:~$ cat /etc/udev/rules.d/80-melezca.rules
# Creado 20110410
# Adaptador puerto paralelo para que tenga un symlink y lo tome siempre con el mismo nombre cups
SUBSYSTEM=="usb", ATTRS{idVendor}=="067b", ATTRS{idProduct}=="2305", ATTRS{bcdDevice}=="0200", SYMLINK+="usb2Parallel"
matias@melezca:~$
No elegí renombrar porque no tiene mucho sentido forzar un nombre.
El backend para la impresora queda como:
DeviceURI parallel:/dev/usb2Parallel
Y problema solucionado.
Observaciones (?)
Con udev alcanzaría para individualizar cualquier dispositivo y usar una referencia fija.
Es vital para varios dispositicos con el mismo rol en puerto USB
Referencias
http://en.wikipedia.org/wiki/Udev
http://www.reactivated.net/writing_udev_rules.html

domingo, 14 de septiembre de 2008

Placa WireLess Realtek 8185L

La historia
Necesitaba comprar una placa wireless que sea compatible con GNU/Linux, a quién le toque se ahorra algunos varios minutos consultado: La primera lista la conocí de haber preguntado en la lista del Lugmen, pero modelo que me ofrecían no aparecía. El segundo lo conocí buscando los drivers para mi placa. Cansado entonces de tantas vueltas me decidí por una edimax EW-7326Ig con chipset Realtek.

Drivers para placa chipset Realtek 8185L
Entonces la placa en cuestión es:
 MAbeeTT@nowhere someplace/ $: lspci -nn | grep -i 8185
03:05.0 Ethernet controller [0200]: Realtek Semiconductor Co., Ltd. RTL-8185 IEEE 802.11a/b/g Wireless LAN Controller [10ec:8185] (rev 20) 
MAbeeTT@nowhere someplace/ $: lspci -vv -d 10ec:8185
03:05.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8185 IEEE 802.11a/b/g Wireless LAN Controller (rev 20)
        Subsystem: Realtek Semiconductor Co., Ltd. RTL-8185 IEEE 802.11a/b/g Wireless LAN Controller
        Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B-
        Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR-
        Latency: 64 (8000ns min, 16000ns max), Cache Line Size: 32 bytes
        Interrupt: pin A routed to IRQ 21
        Region 0: I/O ports at cc00 [size=256]
        Region 1: Memory at fdeff000 (32-bit, non-prefetchable) [size=512]
        Capabilities: <access denied>

Tenemos varias alternativas:
  • Ndiswrapper: Ndiswrapper es un proyecto que haciendo uso de la API de los drivers para windows los implementa en el kernel linux sin emulación.

    Para hacer andar el drivers de windows bajo ndiswrapper no hay que hacer otra cosa que instalarlo, si uno quiere evadir la línea de comando alcanza con instalar ndisgtk.
    Como el driver está hecho para windows arrastra un problema propio de windows, cada cierto volumen de información transferido se interrumpe la conexión. He probado sin ninguna opción de seguridad, WPA, WPA2, WEP y es indistinto. No deja de ser una opción práctica para quien no le gusa mucho juaquear

  • Drivers de Realtek: Bajé los drivers de Realtek pero no estaba preparando las cabeceras del kernel versión 2.6.24 que viene en ubuntu 8.04 así que tiraba algunos errores de compilación. Urgando encontré éste interesante HOWTO de Will Daniels. En líneas generales lo que uno tiene que hacer es bajarse el driver del sitio de él, en la parte de los scripts de compilación se aplica un parche. Luego uno agrega los módulos a /lib/modules/ e indica los módulos a cargar en /etc/modules. Para WPA la versión de nm-applet no escribe /etc/modules/interfaces de la manera en que el driver lo necesita así que hay que seguir más pasos por acá

Futuro
Un dato interesante es que hay versiones backports del kernel en ubuntu que incluyen al driver en el paquete Debian, pero no era una opción que me entusiasme, por ahora. De hecho en kernel.org la versión 2.6.26 (y posiblemente alguna anterior) ya incluye el driver.

domingo, 20 de enero de 2008

Primeros adornos Open Source

Este sábado me sorprendió una llamada al teléfono celular, resultó ser Santiago, "tengo algo para vos que creo que te va a gustar". En el viaje la intriga me incomodaba.

La sorpresa fue más grande cuando me tocó abrir el paquete:

Resulta que en su trabajo (Lugar en el que yo trabajé tambíen) habían pasado unos desarrolladores de Mozilla (traductores para ser más precisos). Mi amigo les adoró los pines de la mochila, entonces le dejaron algunos y la pulserita.

Esta tarde pensaba que estos son mis primeros addons del mundo material. Desde hace mucho tiempo he querido dar con las remeras del LugMen pero no se han dado las condiciones de dinero ni presencia.

Otra observación es que yo uso de manera predilecta Debian: ¿cómo es que tengo logos propietarios conmigo?. Pero bueh... no se puede cumplir con todas al mismo tiempo.

De nuevo: Gracias Santi.

domingo, 9 de diciembre de 2007

Escuchando múscica con MPD III - Ahora icecast

Antes les expliqué Cómo instalar mpd, y luego algo de usarlo en modo usuario. Ahora les muestro lo que encontré y configuré probando un poco: icecast.

La idea:

Icecast es un servidor de streamings que soporta Ogg Vorbis y Mp3. Mi idea es usarlo como un elemento de interfaz entre la supuesta computadora del armario y un cliente que dispondría del los parlantitos, que podría ser un laptop o un desktop, que podría estar dentro una red local o bien Internet. Para Icecast mpd sería un cliente fuente (source client) y el programa que corre en la computadora laptop sería un oyente (listener), que puede ser mplayer, xmms, rhythmbox, winamp.

Debo agregar unos parámetros al archivo de configuración de mpd:


################# SHOUT STREAMING ########################
#
# Set this to allow mpd to stream its output to icecast2
# (i.e. mpd is a icecast2 source)
#
audio_output {
        type            "shout"
        name            "my cool stream"
        host            "localhost"
        port            "8000"
        mount           "mpd.ogg"
        password        "hackme"
#       quality         "5.0"
        bitrate         "128"
        format          "44100:16:2"

# Optional Paramters
        description     "here's my long descriptiion"
} # end of audio_output

De los parámetros:

  • type: es el tipo de salida DEBE ser shout.
  • name: es el nombre que tendrá el stream
  • port: puerto que usará icecast, yo escogí el 8000 porque tengo un apache para experimentos, pero podría tenerlo andando en el 80 o cualquier otro.
  • mount: es el punto de montaje del streaming, para acceder al streaming se usará luego ip_del_servidor:puerto/mounto_montaje.ogg. Escogí ponerle extensión .ogg al punto de montaje porque algunos programas clientes se atontan sin la extensión.
  • password: para que icecast no le de lugar a cualquier persona.
  • quality: calidad de codificación del stream Ogg es valido cualquier vvalor con un decimal entre 0 y 10. Solo vale poner el parámetro quality o bitrate; pero no ambos.
  • bitrate: el bitrate de encodeo en kbps.
  • format: usa la forma sample_rate:bits:channels donde sample_rate es el nivel de muestreo, bits los bits por muestreo y channels el número de canales.
  • description: la descripción del streaming.

Hasta ahora los datos colocados en description y name sólo se ven en la interfaz web de icecast.

Como es lógico mientras mayor es la calidad de salida más ancho de banda consumido, más recarga de la red y más uso de CPU.

Icecast

Por otro lado hay que instalar icecast:

apt-get install icecast2

La configuración de icecast es sencilla, el archivo de configutación es /etc/icecast2/icecast.xml, al menos se puede dejar algo andando sin tocar demasiadas cosas, me basé en el archivo que viene en el paquete Debian icecast_minimal.xml:

<!-- This config file contains a minimal set of configurable parameters,
     and mostly just contains the things you need to change.  We created
     this for those who got scared away from the rather large and heavily
     commented icecast.xml.dist file. -->
<icecast>
    <limits>
        <sources>2</sources>
    </limits>
    <authentication>
       
<source-password>hackme</source-password>
       
<relay-password>hackme</relay-password>
        <admin-user>admin</admin-user>
       
<admin-password>hackme</admin-password>
    </authentication>
    <directory>
       
<!--  <yp-url-timeout>15</yp-url-timeout> -->
       
<!-- <yp-url>http://dir.xiph.org/cgi-bin/yp-cgi</yp-url> -->

    </directory>
    <hostname>localhost</hostname>
    <listen-socket>
        <port>8000</port>
    </listen-socket>
    <fileserve>1</fileserve>
    <paths>
        <logdir>./log</logdir>
        <webroot>./web</webroot>
        <adminroot>./admin</adminroot>
        <alias source="/"
dest="/status.xsl"/>
    </paths>
    <logging>
       
<accesslog>access.log</accesslog>
        <errorlog>error.log</errorlog>
        <loglevel>3</loglevel>
<!-- 4 Debug, 3 Info, 2 Warn, 1 Error -->
    </logging>
     <security>
        <chroot>0</chroot>
        <changeowner>
            <user>icecast2</user>
            <group>icecast</group>
        </changeowner>
    </security>
</icecast>

Se puede hacer una configuración más completa: con una contraseña por cliente fuente, limitar la cantidad de oyentes por fuente, etc.

Como se puede ver está la misma contraseña para el server y como pueden apreciar también no me tomé la seguridad en serio ya que sólo estoy experimentando.

Icecast tiene una interfaz web cuyo usuario y contraseña están en el archivi de configuración, a través de ella se puede ver las estadísticas del servidor, echar clientes, cambiarlos de canal

Para que cada vez que arranque la computadora del armario corra todo esto automáticamente al inicio del sistema alcanza con tocar los archivos /etc/default de los paquetes correspondientes.

Para elegir la lista, cambiar de temas, etc alcanza con cualquier cliente de mpd y con la configuración que permita al cliente acceder al comando de la lista

Varias salidas al mismo tiempo.

Una cosa interesante es que se pueden tener activas más de una salida al mismo tiempo; por ejemplo se puede tener la salida ALSA lista y al mismo tiempo la salida para icecast. Algunos clientes como gmpc permiten activar o desactivar cada una de las salidas

Referencias:

sábado, 1 de diciembre de 2007

Escuchando múscica con MPD II

Ateriormente les conté de mpd y un cliente ncmpc, ahora les cuento cómo es que escogí mi configuración para poder ejecutarlo como usuario:

Cree un directorio ~/.mpd que alojara a los archivos "errors.log" "mpd.log" "state" "tag_cache" y al directorio "playlists". Cambié los parámetros apropiados:

 music_directory         "/var/lib/mpd/music"
 playlist_directory      "/home/MAbeeTT/.mpd/playlists"

 db_file                 "/home/MAbeeTT/.mpd/tag_cache"
 log_file                "/home/MAbeeTT/.mpd/mpd.log"
 error_file              "/home/MAbeeTT/.mpd//errors.log"
 pid_file                "/var/run/mpd/pid"

Del directorio de la sumidero de la música no toqué nada y tampoco del archivo pid, como al archivo del pid solo accede root o el grupo de mpd le cambio permisos al archivo o me agrego al grupo.

Fuerzo a usar salida Alsa:

audio_output {
        type            "alsa"
        name            "my ALSA device"
#       device          "hw:0,0" # optional
        format          "44100:16:2" #optional
}

Agrego normalización de volumen, para achatar un poco la diferencia de columenes de grabación:

 volume_normalization  yes

Mezclador:

mixer_type              "alsa"
mixer_device            "default"
mixer_control           "PCM"

Archivo de estado

state_file         "/home/matias01/.mpd/state"

Éste es sirve para recrear el estado de la sesión al volver a ejecutar el programa.

bind_to_address "localhost" ya que aún no me compro la notebook :-P.

Con esta sencilla configuración al apagar el sistema se ejecutará /etc/init.d/mpd stop y cerrará el programa ordenadamente "pausando" el tema en reproducción para continuar luego en el punto que estaba. Esto es muy útil con esos temas que son extracciones en bruto de los CDs que duran como 75 minutos. Si se inicia a mpd desde /etc/init.d/mpd start se inicia el programa según /etc/mpd.conf indique.

El lector atento notará que no he mostrado parámetros de configuración de uso de puertos no habituales para el cliente ni contraseña de acceso límite de conexiones, pero eso se deja a criterio de quien lee.

Referencias

Página man de ncmpc: man ncmpc

Página man de mpd: man mpd

Página man de mpd.conf: man mpd.conf

viernes, 16 de noviembre de 2007

Escuchando múscica con MPD

Introducción
Cuando me inicié con Mandrake Linux (Sí: tenemos algo obscuro en nuestro pasado), una de las primeras cosas que me propuse hacer de las habituales fue escuchar música y empecé con xmms.

El inconveniente de este reproductor era que es dependiente de la interfaz gráfica, si se cae la interfaz gráfica (no es que me suceda a menudo sino que ocasionalmente presiono Ctrl+Alt+Backspace :-P) se cae xmms, la lista de reproducción vuelve al principio etc. A veces es irrisorio levantar la interfaz gráfica para escuchar música.

Di varias vueltas hasta llegar a dos reproductores de audio: cplay que muy sencillo que usa python y es un frontend de otros programas. El que voy a tratar ahora es mpd que es un tanto más completo que cplay.

La idea:
Imaginemos que tenemos una computadora en un armario; llena de música, pero en un armario, sin teclado, sin monitor, pero con Debian y un juego de parlantes o amplificador conectado.

MPD trabaja como cualquier otro reproductor de audio pero de una manera un poco más ambiciosa: es un demonio, indexa la música y luego ella puede ser buscada para ser reproducida, claro que esa parte del manejo de la lista y la reproducción puede ser comandada remotamente.

Instalación y configuración
Alcanza con escribir como root: apt-get install mpd El archivo de configuración de mpd para andar como servicio es /etc/mpd.conf y si lo ejecuta el usuario será ~/.mpdconf o /etc/mpd.conf La sitaxis del archivo es sencilla: alcanza con leer los comentarios en inglés. Un parámetro importante es "bind_to_address" que Debian trae por defecto seteao a escuchar solo a localhost.

Es importante también elegir audio_output, mixer_type, mixer_device, y mixer_control para que salga por alsa que en mi caso se escucha mucho mejor.

Lo que hice en primer término para no tocar demasiado la configuración fue colocar enlaces sinbólicos que apuntan a los directorios que contienen música en /var/lib/mpd/music/. Una cosa interesante es que se pueden configurar varios dispositivos de salida, cuando tenga varias placas de sonido les cuento :-(

Clientes
Hay varios clientes para mpd, inclusive que corren bajo windows ( pueden buscar en el sitio web de mpd); en mi debian estaban disponibles:
  • mpc: bueno; interfaz de linea de comando.
  • gmpc: GNOME/GTK 2.2, bueno, el de interfaz grafica que más me gustó.
  • mpdcon.app: a controller for GNUstep (MPDCon). No me gustó en absoluto.
  • glurp: a GTK 2.4 graphical client. Bueno pero no le encunetro nada intersante; le encontre para activarle/desactivarle las salidas.
  • ncmpc: an ncurses-based console interface. Bueno, parecido al cplay, este es que terminé usando.
  • pympd: python, con plugins interesante solamente.
El que más me gustó fue ncmpc, es bastante parecido a cplay, teclas de comando son:
  • 2: lista de reproducción;
  • 3: Navegador de archivos;
  • [espacio]: agregar a la lista de reproducción;
  • P: pausa
  • Tema anterior/siguiente
  • Ctrl-U: actualizar la base de datos;
  • / buscar;
  • h ayuda.

En ncmpc se puede configurar las teclas de comando, los colores, la presentación de los temas y otras cosas, para sarber más man ncmpc.

Retirar el modo server
Si es que no tienen la máquina en el armario como me pasa a mí notarán que al iniciarse se ejecutará mpd y continuará con la lista en curso, esto es algo muy bueno para no tener que escoger música y no repetirla; pero no es útil tener corriendo al demonio si uno no desea escuchar. Para no iniciar mpd en el init alcanza con configurar /etc/default/mpd.

Si luego el usuario levanta mpd se ejecutará leyendo el archivo de configuración citado antes y tal vez quejándose de algo, para detener la ejecución del programa mpd --kill.

Bueno, en las que sigue les cuento como ejecutar como usuario y cómo cantarle a la red

Referencias

sábado, 3 de noviembre de 2007

Resucitando mi pendrive

[Este era un post de mi anterior Blog (http://mabett.wordpress.com) , lo transcribo ahora...] Introducción:

Hace más de un año que se me murió pendrive (o llavero USB, o memory key, o dispositivo USB provisto de una memoria Flash). Aparentemente lo conecté a alguna PC en un ciber con puerto frontal y los cables mal conectados al motherboard; lo que lo llevó a mejor vida por algún tiempo. Ni bien me percaté de la desgracia continué utilizando, otro que me regalaron (gracias caraé :-D).

Fui parcialmente feliz "con el sustituto" hasta que un ¿buen? día lo extravié en un ciber de la Calle Paso de los Andes cuya desatención al preguntar por mi pertenencia me obliga a recomendarles que si pueden no asistir...

Así me vi en la disyuntiva de volver a utilizar disquetes de 1.44" o intentar arreglar mis inmóviles 512MB. La duda duró unos 0.112 segundos:

El aparato es un Memorex TravelDrive 512 (Rev 1.0B P/N:32507751):

Síntomas:

  • Un día lo conecté en algún lugar del planeta y no anduvo;
  • En mi computadora de ese entonces andaba, pero en la de la mayoría de los cibers no;
  • El comportamiento en las otras computadoras era una intermitencia de la luz que indica la lectura/escritura en la memoria, bajo windows "Error código 10", que no es más que "no se reconoce dispositivo" y bajo GNU/Linux error en el router USB.

Diagnóstico:

  • Está roto :-D.

Lo que tenían en común todas las otras computadoras que no la mía de ese entonces era el puerto USB 2.0, así que había "algo" en el USB 2.0 que en mi pendrive no.

Con mi computadora actual que sí tiene USB 2.0 algo tenía que hacer para emular las condiciones de la anterior. Lo necesario fue "desmontar" los drivers USB 2.0: en mi Debian:

root@nowhere someplace/ # rmmod ehci_hcd
y probablemente también retiré algún otro módulo. Al conectarlo /var/log/kern dice:
usb 1-5.2: new full speed USB device using ohci_hcd and address 12
usb 1-5.2: not running at top speed; connect to a high speed hub
scsi11 : SCSI emulation for USB Mass Storage devices
usb-storage: device found at 12
usb-storage: waiting for device to settle before scanningJun 14 14:39localhost kernel:   Vendor:           Model: Memorex TD 2B     Rev: PMAP
Type:   Direct-Access                      ANSI SCSI revision: 00
SCSI device sdb: 1015808 512-byte hdwr sectors (520 MB)
sdb: Write Protect is off
sdb: Mode Sense: 03 00 00 00
sdb: assuming drive cache: write through

A pesar del quejido de la velocidad de escritura el dispositivo trabajó correctamente, para probar si funciona lo monté de la manera usual y nos coloqué en el punto de montaje hice:

MAbeeTT@nowhere someplace/ $: while ((1)); do dd if=/dev/zero of=archivo_nulo.dmp; rm -f archivo_nulo.dmp ; done
y cada dd arrojó:
dd: escribiendo en «archivo_nulo.dmp»: No queda espacio en el dispositivo
551889+0 records in
551888+0 records out
282566656 bytes (283 MB) copied, 3,02966 seconds, 93,3 MB/s
con los 496 MB en vez de 283, si es que el dispositivo está vacío.

Desmonté el sistema de archivos desconecté el dispositivo, cargué el driver ehci y los que retiré junto a él y /var/log/kern arrojó:

usb-storage: device found at 103
usb-storage: waiting for device to settle before scanning
kernel: usb 1-6: USB disconnect, address 103
usb 1-5: new full speed USB device using ohci_hcd and address 16
hub 1-5:1.0: USB hub found
hub 1-5:1.0: 4 ports detected
hub 1-5:1.0: hub_port_status failed (err = -110)
hub 1-5:1.0: cannot reset port 1 (err = -110)
last message repeated 3 times
hub 1-5:1.0: Cannot enable port 1.  Maybe the USB cable is bad?
hub 1-5:1.0: cannot disable port 1 (err = -110)

El cable NO estaba mal. Lo que vemos es que la computadora vé algo pero ese algo se desconecta y luego lo vuelve a ver, se desconecta y pregunta por el cable.

Este comportamiento es similar bajo windows pero no se leer los logs de ese sitema.

Noté que había uno de los 8 conectores USB de mi gabinete que me daba más tiempo en ese lazo infinito así que conecté el pendrive ahí y usé usbview (GTK1), copié la descripción de dispositivo a un archivo de texto e hice lo mismo en USB 1.1; la diferencia es:

MAbeeTT@nowhere someplace/ $: diff -u memorex1.1.txt memorex2.0.txt
--- memorex1.1.txt      2007-06-02 18:09:22.000000000 -0300
+++ memorex2.0.txt      2007-06-02 15:54:00.000000000 -0300
@@ -1,7 +1,7 @@
Memorex TD 2B
Manufacturer:
Serial Number: 074C0C020739
-Speed: 12Mb/s (full)
+Speed: 480Mb/s (high)
USB Version:  2.00
Device Class: 00(>ifc )
Device Subclass: 00
@@ -29,12 +29,12 @@
Direction: in
Attribute: 2
Type: Bulk
-                       Max Packet Size: 64
+                       Max Packet Size: 512
Interval: 0ms
Endpoint Address: 02 Direction: out Attribute: 2 Type: Bulk - Max Packet Size: 64 + Max Packet Size: 512 Interval: 0ms Como era de esperar no hay nada relevante.

Fue entonces cuando me decidí a destriparlo:

Como se puede apreciar en la foto el controlador USB-Flash es un Phison, así que buscando en mi buscador favorito y en la wikipedia dí con la página del fabricante del integrado. Como era de esperar también la hoja de datos no estaba disponible on-line; así que lo solicité en el feedback de la empresa; por fortuna me lo enviaron.

Con el datasheet ya supe que patas no tocar; así que empecé por medir con mi multímetro todas las patas de alimentacion respecto a masa con el aparato funcionando correcta e intermitentemente.

Las patas que trabajaban a la par de la intermitencia eran las 1, 33 y 35. Según la hoja de datos debe trabajar entre 3 y 3,6Volt. El dispositivo que se conecta es "AH33 316GB". Preguntando en la lug-electronica me supieron desburrar de qué regulador se trata.

Con la hoja de datos del regulador no me quedó más que buscar uno y esperar no destruir todo el resto de los dispositivos de montaje superficial.

Las fiambrerías de electrónica de Mendoza no tienen reguladores de 3,3Volt así que la solución aparente era armar un regulador con un LM317L y apretar todo lo más que se pueda. Otra hoja de datos.

Armado una vez el circuito del regulador hay que calibrarlo para que entregue entre 3 y 3,6Volt; yo cometí la torpeza de colocarle un preset de 5k en vez de una R de 3K y un preset de 2K (para oscilar entre 2 y 5v y NO entre 0 y 5V que resta precisión, cualquier ínfimo movimiento al preset cambia notablemente el voltaje de salida). En realidad después de unas semanas el preset me empezó a molestar así que tomé la iniciativa de colocar el su lugar una resisencia cercana al valor de ajuste del preset.

Probando el circuito en el pendrive, con y sin el regulador. Cama arriba, cama abajo como Homero Simpson y todo bien.

Me quedaba qué hacer para integrar el circuito al pendrive; naturalmente dentro de la carcaza no cabría así que se me ocurrió perforarla para pasar los cables y apoyarla parte plana con parte plana. Se me ocurrió cubrir todo con cinta aisladora (PVC negro), y por sugerencia de mi viejo protegí el circuito con plástico de envase descartable de gaseosa (PET), y calentandolo para moldearlo. Cinta aisladora y a ser feliz.

Para hacer pruebas de lectura escritura, conectar montar y:

MAbeeTT@nowhere someplace/ $: while ((1)); do dd if=/dev/zero of=archivo_nulo.dmp; dd if=archivo_nulo.dmp of=/dev/null ; rm -f archivo_nulo.dmp ; done

y lo dejé un rato largo.

Agradecimientos

  • Phison: por la hoja de datos.
  • Memorex: por no borrar Phison del integrado :-D .
  • Hector Armando Maza, por el aporte con la hoja de datos, a la Lugmen por la lista de correo lug-electronica y a los chicos que participaron con el thread.
  • mi viejo, por la idea del plástico.

Algunas fotos de como quedó: