ubuntuusers.de

Lenovo G555 alternativer Soundtreiber?

Status: Gelöst | Ubuntu-Version: Ubuntu 10.04 (Lucid Lynx)
Antworten |

lucid-dream

Avatar von lucid-dream

Anmeldungsdatum:
17. Juni 2010

Beiträge: 483

Wohnort: hölle

Hallo Forumleser, bin mit diesem Notebook eigentlich zufrieden und es läuft fast alles wie es soll nur ist neulich aufgefallen dass der Kopfhöreranschluss parallel mit den Lautsprechern läuft, wenn man welche anschließt. Hab schon probiert alles auf ALSA umzustellen ohne den erhofften Erfolg.

hwinfo --sound ergab folgende Ausgabe:

~$ hwinfo --sound 20: PCI 14.2: 0403 Audio device [Created at pci.318] UDI: /org/freedesktop/Hal/devices/pci_1002_4383 Unique ID: 5Dex.j3SXOQfquFE SysFS ID: /devices/pci0000:00/0000:00:14.2 SysFS BusID: 0000:00:14.2 Hardware Class: sound Model: "ATI SBx00 Azalia (Intel HDA)" Vendor: pci 0x1002 "ATI Technologies Inc" Device: pci 0x4383 "SBx00 Azalia (Intel HDA)" SubVendor: pci 0x17aa "Lenovo" SubDevice: pci 0x3938 Driver: "HDA Intel" Driver Modules: "snd_hda_intel" Memory Range: 0x92400000-0x92403fff (rw,non-prefetchable) IRQ: 16 (80497 events) Module Alias: "pci:v00001002d00004383sv000017AAsd00003938bc04sc03i00" Driver Info #0: Driver Status: snd_hda_intel is active Driver Activation Cmd: "modprobe snd_hda_intel" Config Status: cfg=new, avail=yes, need=no, active=unknown

Sagt mir aber überhaupt nichts ob man da was ändern könnte um die Lautsprecher bei aktivem Kopfhörer lautlos zu stellen. Die Fn+rechts und links Tasten steuern nur die Gesamtlautstärke. Unter Multimedia-System habe ich im Audio-Bereich alles auf Pulsaudio und Vorgabe eingestellt.

Moderiert von tomtomtom:

Ins passende Forum verschoben. Bitte beachte die Themenstickies.

Skittles

Avatar von Skittles

Anmeldungsdatum:
6. April 2006

Beiträge: 599

Wohnort: Bochum

http://ubuntuforums.org/showthread.php?t=1043568&page=14 funktioniert, ich musste allerdings (unter Arch) einen Pfad anpassen. Ich hab das Skript dann compiliert und in die rc.local gepackt, muss allerdings nach jedem Systemstart ein mal den Stecker der Boxen neu reinstecken. Ich hoffe, dass da mit neueren Alsaversionen sich irgendwann mal was ändert.

lucid-dream

(Themenstarter)
Avatar von lucid-dream

Anmeldungsdatum:
17. Juni 2010

Beiträge: 483

Wohnort: hölle

Danke für diesen Hinweis aber ehrlich gesagt weiss ich nichts damit anzufangen und von compilieren hab ich keinen Schimmer, ich werde es mal mit OpenSuSe 11.2 probieren vll läuft es ja dort besser.

Skittles

Avatar von Skittles

Anmeldungsdatum:
6. April 2006

Beiträge: 599

Wohnort: Bochum

lucid-dream schrieb:

Danke für diesen Hinweis aber ehrlich gesagt weiss ich nichts damit anzufangen und von compilieren hab ich keinen Schimmer, ich werde es mal mit OpenSuSe 11.2 probieren vll läuft es ja dort besser.

Es ist kein ubuntuspezifisches Problem, ich habe dasselbe Problem mit Arch Linux, ein Wechsel zu opensuse wird nichts bringen. So schwer ist das an sich nicht. Du nimmst den Quelltext, speicherst ihn als main.cpp und machst dann das, was da steht.

lucid-dream

(Themenstarter)
Avatar von lucid-dream

Anmeldungsdatum:
17. Juni 2010

Beiträge: 483

Wohnort: hölle

WICHTIG! Diese Anleitung wurde unter ubuntu 10.04/linux mint 9 Isadora und mit dem Chip Conexant ID 5069 auf einem Lenovo G555 getestet, ich empfehle daher vor jedem Eingriff ein Backup der folgenden Dateien zu machen! Bei Unsicherheit besser im Foum oder einem der Supportchanel im IRC oder Jabber Hilfe erbitten.

  1. Alt+F2 drücken > Inhalt kopieren

    gedit ./main.cpp

    > Ausführen.

Diesen Code habe ich aus dem Beitrag: http://ubuntuforums.org/showpost.php?s=592a0098b8ec4def993796541172b3d0&p=9178795&postcount=131 Vielen Dank nochmal an "xtrman"

/* 
 * File:   main.cpp
 * Author: xtr
 *
 * Created on April 26, 2010, 5:26 PM
 */

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/io.h>
#include <sys/types.h>
#include <sys/fcntl.h>
#include <syslog.h>
#include <signal.h>

#include <stdint.h>
typedef uint8_t u8;
typedef uint16_t u16;
typedef uint32_t u32;
typedef uint64_t u64;

#define HDA_VERB(nid,verb,param)    ((nid)<<24 | (verb)<<8 | (param))
#define HDA_IOCTL_VERB_WRITE        _IOWR('H', 0x11, struct hda_verb_ioctl)

struct hda_verb_ioctl {
    u32 verb;    /* HDA_VERB() */
    u32 res;    /* response */
};

void daemonize()
{
    pid_t pid, sid;

    /* Fork off the parent process */
    pid = fork();
    if (pid < 0) {
            exit(EXIT_FAILURE);
    }
    /* If we got a good PID, then
       we can exit the parent process. */
    if (pid > 0) {
            exit(EXIT_SUCCESS);
    }

    /* Change the file mode mask */
    umask(0);

    /* Open any logs here */
    openlog("pinsensed", LOG_PID, LOG_DAEMON);
    /* Create a new SID for the child process */
    sid = setsid();
    if (sid < 0) {
            /* Log any failure here */
            exit(EXIT_FAILURE);
    }

    /* Change the current working directory */
    if ((chdir("/")) < 0) {
            /* Log any failure here */
            exit(EXIT_FAILURE);
    }


    /* Close out the standard file descriptors */
    close(STDIN_FILENO);
    close(STDOUT_FILENO);
    close(STDERR_FILENO);

}

bool done = false;

void trpsig(int)
{
    done = true;
}

int main(int argc, char** argv) {
    daemonize();
    signal(SIGTERM, &trpsig);

    int fd, state;
    struct hda_verb_ioctl val;
    syslog(LOG_INFO, "Daemon started.");
    fd = open("/dev/snd/hwC0D0", O_RDWR);
    if (fd < 0) {
        syslog(LOG_ERR, "Failed to open snd device.");
            exit(EXIT_FAILURE);
    }
    val.verb = HDA_VERB(0x19, 0x0f09, 0x0);
        if (ioctl(fd, HDA_IOCTL_VERB_WRITE, &val) < 0)
            syslog(LOG_ERR, "Failed to write hda verb.");
    state = val.res >> 31;
    syslog(LOG_INFO, "Starting input value: %0x", state);
    while(!done)
    {
        sleep(1);
        val.verb = HDA_VERB(0x19, 0x0f09, 0x0);
        if (ioctl(fd, HDA_IOCTL_VERB_WRITE, &val) < 0)
            syslog(LOG_ERR, "Failed to write hda verb.");

        if(state != (val.res >> 31))
        {
            state = (val.res >> 31);
            syslog(LOG_INFO, "New input value: %0x", state);
            if(state == 0x1)
                val.verb = HDA_VERB(0x1f, 0x701, 0x1);
            else
                val.verb = HDA_VERB(0x1f, 0x701, 0x0);
            if (ioctl(fd, HDA_IOCTL_VERB_WRITE, &val) < 0)
                syslog(LOG_ERR, "Failed to write hda verb.");
        }
    }
    close(fd);
    syslog(LOG_INFO, "Daemon stopped.");
    exit(EXIT_SUCCESS);
}

2. Diesen ganzen Inhalt aus dem Codefenster kopieren und in die leere main.cpp Datei im gedit einfügen. Speichern und gedit schließen.

3. Alt+F2 drücken > Inhalt kopieren

sudo apt-get install g++

> Im Termial ausführen markieren > Ausführen > Paswwort eingeben und mit j bestätigen.

4. Alt+F2 drücken > Inhalt kopieren

g++ main.cpp -o pinsensed

> Ausführen.

5. Alt+F2 drücken > Inhalt kopieren

sudo ./pinsensed

> Im Termial ausführen markieren > Ausführen > wenn verlangt Paswwort eingeben und mit j bestätigen.

Nun könnt ihr testen ob die Lautsprecher stumm werden wenn ihr die Kopfhörer anschließt, um es zu automatisieren muss man folgendes machen.

6. Alt+F2 drücken > Inhalt kopieren

sudo gedit /etc/rc.local

> Im Termial ausführen markieren > Ausführen > wenn verlangt Paswwort eingeben.

7. Den Inhalt kopieren >

/home/user/pinsensed &

user bitte mit dem Eigenen Anmeldenamen ersetzen! > unter diese Zeile # By default this script does nothing. einfügen

8. Speichern und gedit schließen.

9. System neustarten und testen, einen Haken hat die Sache aber nach dem Aufwachen aus dem Suspendmode muss man die Kopfhörer erneut trennen und anschließen.

Falls jemand Fehler findet bitte ich um eine Antwort zur Not könnt ihr euch auch an die hilfsbereiten Personen im IRC #ubuntu-de wenden.

Viel Erfolg.

Dieser Beitrag darf und soll meiner Meinung geändert werden um in den Wikis anderen Usern speziell mit dem HDA Soundchip als verständliche Anleitung zu dienen.

Skittles

Avatar von Skittles

Anmeldungsdatum:
6. April 2006

Beiträge: 599

Wohnort: Bochum

Das Problem löst sich übrigens mit dem Kernel 2.6.35 in Luft aus und dieser Workaround wird nicht mehr benötigt, falls es noch mal wer über die Suche finden sollte.

lucid-dream

(Themenstarter)
Avatar von lucid-dream

Anmeldungsdatum:
17. Juni 2010

Beiträge: 483

Wohnort: hölle

Das nenne ich mal Gute Neuigkeiten da ich ein linux-Anfänger bin, finde ich über die Paketverwaltung in mint 9 nur ein linux kernel mit 2.6.32.24.25 ich weiß auch nicht so recht welcher kernel gemeint ist. Ich hoffe dafür ist keine Neuinstallation oder ein Distributionswechsel notwendig.

lucid-dream

(Themenstarter)
Avatar von lucid-dream

Anmeldungsdatum:
17. Juni 2010

Beiträge: 483

Wohnort: hölle

Das mit dem dem neuen Kernel 2.6.35 stimmt nicht ganz ich habe die Ubuntu 10.10 Alpha 3 Version getestet und da war das Soundproblem (Kopfhörer) immer noch vorhanden.

lucid-dream

(Themenstarter)
Avatar von lucid-dream

Anmeldungsdatum:
17. Juni 2010

Beiträge: 483

Wohnort: hölle

Mir ist ebenfalls aufgefallen das unter ubuntu 10.10 (Codec: ) ein ganz anderer Codec erkannt wird als in 10.04 (Codec: Conexant ID 5069) liegt das an dem neuen alsa-Treiber 1.0.23? Nach dem konfigurieren und installieren des aktuellen alsa-Treibers funktioniert auch der Kopfhörerausgang auch unter 10.10. Seltsam ist es dennoch.

lucid-dream

(Themenstarter)
Avatar von lucid-dream

Anmeldungsdatum:
17. Juni 2010

Beiträge: 483

Wohnort: hölle

Diese Anleitung funktioniert bis jetzt nur für ubuntu 10.04!

Im Anhang ist die Datei "pinsensed" schon vorhanden, runter laden, mit Schritt 4. und 5. testen oder folgende Schritte befolgen.

Im gnome-terminal folgendes eingeben

1.

gedit ~/main.cpp

Diesen Code habe ich aus dem Beitrag. Vielen Dank nochmal an "xtrman". Diesen ganzen Inhalt aus dem Codefenster als main.cpp speichern.

/* 
 * File:   main.cpp
 * Author: xtr
 *
 * Created on April 26, 2010, 5:26 PM
 */

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/io.h>
#include <sys/types.h>
#include <sys/fcntl.h>
#include <syslog.h>
#include <signal.h>

#include <stdint.h>
typedef uint8_t u8;
typedef uint16_t u16;
typedef uint32_t u32;
typedef uint64_t u64;

#define HDA_VERB(nid,verb,param)    ((nid)<<24 | (verb)<<8 | (param))
#define HDA_IOCTL_VERB_WRITE        _IOWR('H', 0x11, struct hda_verb_ioctl)

struct hda_verb_ioctl {
    u32 verb;    /* HDA_VERB() */
    u32 res;    /* response */
};

void daemonize()
{
    pid_t pid, sid;

    /* Fork off the parent process */
    pid = fork();
    if (pid < 0) {
            exit(EXIT_FAILURE);
    }
    /* If we got a good PID, then
       we can exit the parent process. */
    if (pid > 0) {
            exit(EXIT_SUCCESS);
    }

    /* Change the file mode mask */
    umask(0);

    /* Open any logs here */
    openlog("pinsensed", LOG_PID, LOG_DAEMON);
    /* Create a new SID for the child process */
    sid = setsid();
    if (sid < 0) {
            /* Log any failure here */
            exit(EXIT_FAILURE);
    }

    /* Change the current working directory */
    if ((chdir("/")) < 0) {
            /* Log any failure here */
            exit(EXIT_FAILURE);
    }


    /* Close out the standard file descriptors */
    close(STDIN_FILENO);
    close(STDOUT_FILENO);
    close(STDERR_FILENO);

}

bool done = false;

void trpsig(int)
{
    done = true;
}

int main(int argc, char** argv) {
    daemonize();
    signal(SIGTERM, &trpsig);

    int fd, state;
    struct hda_verb_ioctl val;
    syslog(LOG_INFO, "Daemon started.");
    fd = open("/dev/snd/hwC0D0", O_RDWR);
    if (fd < 0) {
        syslog(LOG_ERR, "Failed to open snd device.");
            exit(EXIT_FAILURE);
    }
    val.verb = HDA_VERB(0x19, 0x0f09, 0x0);
        if (ioctl(fd, HDA_IOCTL_VERB_WRITE, &val) < 0)
            syslog(LOG_ERR, "Failed to write hda verb.");
    state = val.res >> 31;
    syslog(LOG_INFO, "Starting input value: %0x", state);
    while(!done)
    {
        sleep(1);
        val.verb = HDA_VERB(0x19, 0x0f09, 0x0);
        if (ioctl(fd, HDA_IOCTL_VERB_WRITE, &val) < 0)
            syslog(LOG_ERR, "Failed to write hda verb.");

        if(state != (val.res >> 31))
        {
            state = (val.res >> 31);
            syslog(LOG_INFO, "New input value: %0x", state);
            if(state == 0x1)
                val.verb = HDA_VERB(0x1f, 0x701, 0x1);
            else
                val.verb = HDA_VERB(0x1f, 0x701, 0x0);
            if (ioctl(fd, HDA_IOCTL_VERB_WRITE, &val) < 0)
                syslog(LOG_ERR, "Failed to write hda verb.");
        }
    }
    close(fd);
    syslog(LOG_INFO, "Daemon stopped.");
    exit(EXIT_SUCCESS);
}

Nun muss g++ installiert werden und danach

2.

sudo apt-get install g++

pinsensed erstellt werden und

3.

g++ main.cpp -o pinsensed

zum testen im terminal ausführbar machen.

4.

chmod +x ./pinsensed

5.

sudo ./pinsensed

Um dauerhaft pinsensed zu aktivieren muss man einen Eintrag in die /etc/rc.local machen.

6.

gksudo gedit /etc/rc.local

Den Eintrag in die rc.local unter diese Zeile "# By default this script does nothing." einfügen und

7.

/home/user/pinsensed &

user bitte mit dem Eigenen Anmeldenamen ersetzen!

System neu starten und testen, einen Haken hat die Sache aber, nach dem Aufwachen aus dem Suspend-mode, Neustart oder Hochfahren muss man die Kopfhörer erneut trennen und anschließen.

Viel Erfolg.

pinsensed (7.6 KiB)
Download pinsensed
main.cpp (2.8 KiB)
Download main.cpp

lucid-dream

(Themenstarter)
Avatar von lucid-dream

Anmeldungsdatum:
17. Juni 2010

Beiträge: 483

Wohnort: hölle

Hab neulich eine Anleitung zum upgrade der Alsa-Pakete unter ubuntu 10.04 gefunden, diese habe ich als script zusammengefasst und auf aktuelle alsa-Pakete geändert. Dazu wird der alsa Treiber extra für hda-intel erstellt kann aber bei anderer Soundkarte #auskommentiert werden.

1
2
3
4
5
6
#normal
cd alsa-driver*
sudo ./configure --with-cards=hda-intel
#auskommentiert
cd alsa-driver*
sudo ./configure #--with-cards=hda-intel

Nach dem runter laden und im Benutzerordner speichern des scriptes muss es noch mit

chmod +x ~/upgrade-alsa

im Terminal ausführbar gemacht werden. Danach zum starten des scriptes folgendes eingeben

./upgrade-alsa

und schon wird man gebeten das Passwort einzugeben weil am Anfang noch andere Pakete zum compilieren benötigt werden und für die eigentliche Installation unabdingbar wäre. Nach dem alles installiert worden ist sollte man noch kontrollieren ob man früher einen Eintrag in die Datei /etc/modprobe.d/alsa-base.conf erstelt hatte und diesen #auskommentiert.

###/etc/modprobe.d/alsa-base.conf###
#options snd-hda-intel model=ideapad
#options snd-hda-intel model=thinkpad

Ebenfalls den Eintrag in der Datei /etc/rc.local #auskommentieren nicht vergessen falls dieser jemals gemacht wurde.

#/home/user/pinsensed &

Nach dem Neustart funktionieren nun die Kopfhörer und Mikrobuchsen leider nicht mehr das Onboardmicro, weiteres aufgefallen ist mir der leise Pegel der Mikrobuchse diese lässt sich auch nicht verändern.

Falls man aber alles nutzen möchte klappt es bis jetzt nur mit der alsa Version 1.0.22 der pinsensed Datei und dem Eintrag dieser in der /etc/rc.local. Um wieder die alte alsa Version zu installieren bitte folgendes befogen

sudo apt-get install alsa alsa-base alsa-utils --reinstall  && sudo /sbin/alsa-utils reset && sudo /sbin/alsa-utils start && sudo alsactl store

Viel Erfolg beim Testen.

upgrade-alsa (853 Bytes)
Download upgrade-alsa

Die-drei-Fragezeichen

Avatar von Die-drei-Fragezeichen

Anmeldungsdatum:
1. November 2009

Beiträge: Zähle...

Kann diese Lösung nur bestätigen.

Vielen Dank nochmal an lucid-dream

Gruß ???

Laptop: Lenovo G555

lucid-dream

(Themenstarter)
Avatar von lucid-dream

Anmeldungsdatum:
17. Juni 2010

Beiträge: 483

Wohnort: hölle

Hab das script nochmal überarbeitet. Ich habe dieses script unter ubuntu 10.04.3/10.10 32/64Bit mit aktuellen Updates getestet! Nach dem ubuntu10.04 script ändert sich unter ubuntu 10.04.3 der Codec-Name von ID 5069 auf CX20585. Den Tipp für dieses Vorgehen habe ich aus diesem Beitrag.

Wichtig vor dem Ausführen des ubuntu10.04 scripts bitte bei Verwendung der pinsensed Datei die Zeile

/home/user/pinsensed &

in der

gksudo gedit /etc/rc.local

Datei löschen denn diese wird danach nicht mehr benötigt.

In der Datei

gksudo gedit /etc/modprobe.d/alsa-base.conf

die letzte Zeile falls vorhanden

options snd-hda-intel model=xxxx

löschen und das System neu starten!

ubuntu 10.04.3

Ist das System auf dem aktuellen Stand und neu gestartet kann man nun mit dem ubuntu10.04 script fortfahren und nach der Installation das System wieder neu starten.

ubuntu 10.10

Hier muss das System ebenfalls auf dem aktuellen Stand und neu gestartet sein, um mit dem ubuntu10.10 script fortfahren zu können und nach der Installation das System neu starten nicht vergessen.

Nach erfolgreicher Installation unter beiden Systemen ubuntu 10.04.3 und ubuntu 10.10 sollte uns im Falle des lenovo G555 folgendes Menü von alsamixer erwarten.

ubuntu10.10 (140 Bytes)
Download ubuntu10.10
ubuntu10.04 (140 Bytes)
Download ubuntu10.04
Bilder

Die-drei-Fragezeichen

Avatar von Die-drei-Fragezeichen

Anmeldungsdatum:
1. November 2009

Beiträge: Zähle...

Gute Neuigkeiten für alle Lenovo G555 Nutzer.

Der Sound funktioniert nach dem Upgrade auf 11.04 ohne irgendwelche Veränderungen einwandfrei! 😀

Ich würde allen raten, die nicht im System rumfuschen wollen, ein Upgrade zu laden und dann ohne Probleme den Sound zu genießen.

LG ???

lucid-dream

(Themenstarter)
Avatar von lucid-dream

Anmeldungsdatum:
17. Juni 2010

Beiträge: 483

Wohnort: hölle

update mit dem neuen kernel 3.0.0-15-generic funktioniert nun auch der sound und micro sowie das automatische umschalten zwischen lautsprechern und kopfhörern bzw. onboard-mic und plugin aber es wird zum erstellen des (wlan bcm 4313) wl modules ein anderer treiber von bcmwl-kernel-source benötigt daher folgende anleitung:

getestet nur unter ubuntu 10.04 lucid amd64!

download diesen treiber http://packages.ubuntu.com/oneiric/bcmwl-kernel-source amd64/i386

1
2
3
4
5
6
7
sudo apt-get install linux-image-3.0.0-15-generic linux-headers-3.0.0-15
sudo dpkg -i /pfad/zum/treiber/*.deb
echo -e "blacklist bcma\nblacklist brcmsmac\nblacklist mac80211" | sudo tee -a /etc/modprobe.d/blacklist-bcm.conf
#neustarten und neuen kernel 3.0.0-15 booten falls das wl modul nicht geladen wird 
sudo modprobe wl
#nach erfolgreichem bauen und laden des wl modules für den kernel 3.0.0-15 alten kernel löschen falls nicht weiter benötigt
sudo apt-get purge linux-image-2.6.32-33-generic linux-headers-2.6.32-33
Antworten |