2009-05-22 5 views
2

Das CM108 von C-Media hat 4 GPIO-Pins, auf die Sie über eine versteckte Schnittstelle zugreifen können.Wie schreibe ich an den GPIO Pin des CM108 Chip in Linux?

Mit der generischen Schreibfunktion in Windows konnte ich auf die gpio-Pins schreiben.

Allerdings versuche ich das gleiche in Linux ohne Erfolg zu tun.

Der Linux-Kernel erkennt das Gerät als Hidraw-Gerät.

Hinweis: Ich konnte vom Gerät lesen, einfach nicht schreiben. (Ich habe die App als root ausgeführt, um sicherzustellen, dass es sich nicht um ein Berechtigungsproblem handelt).

+0

Haben Sie überprüfen, ob der Linux-Treiber unterstützt auf das Gerät überhaupt schreibt? – lothar

Antwort

0

Die meiste Hardware in Linux ist als Datei zugänglich. Wenn der Treiber einen Hardware-Knoten für das Dateisystem erstellt hat, haben Sie Glück. Sie können mit regulären Dateiroutinen dazu schreiben. Andernfalls müssen Sie möglicherweise etwas Montagezauber machen, was möglicherweise erfordert, dass Sie dafür ein Kernel-Modul schreiben.

+0

Richtig, ich öffne das Gerät mit dem offenen Systemanruf und schreibe dann mit dem Systemaufruf zum Schreiben. Ich verbinde das Gerät/Dev/Hidraw. – SjB

+0

Ich habe den USB-Bus mit "Sniffer für USB (auf Win32)" und dem Kernel-Debug in Linux überwacht. Ich kann das bei den Paketen sehen, dass ich nicht mit der richtigen Schnittstelle unter Linux rede. Windows senden Sie die Nachricht an Schnittstelle 2 und Linux an Schnittstelle 0. Die seltsame Sache ist, dass Linux meldet die HID auf Schnittstelle 2 (mit lsusb -v) – SjB

+0

Also, ich denke, dass Sie das Problem isoliert haben. Ich vermute, dass der Standard 'fopen' standardmäßig auf das Öffnen von Interface 0 eingestellt ist. Manchmal erstellt ein USB-Gerät mehrere/dev-Einträge. Vielleicht möchten Sie eine neue Frage erstellen, um speziell danach zu fragen - Zugriff auf andere Schnittstellen. – sybreon

2

Ich habe das funktioniert, hier ist wie.

Ich musste einen neuen Linux Hid Kernel Mod erstellen. (Es ist nicht so schwer war)/*

/* 
* Driver for the C-Media 108 chips 
* 
* Copyright (C) 2009 Steve Beaulac <[email protected]> 
* 
* This program is free software; you can redistribute it and/or 
* modify it under the terms of the GNU General Public License as 
* published by the Free Software Foundation, version 2. 
*/ 

/* 
* This driver is based on the cm109.c driver 
*/ 

#include <linux/device.h> 
#include <linux/hid.h> 
#include <linux/module.h> 

#define DRIVER_VERSION "20090526" 
#define DRIVER_AUTHOR "Steve Beaulac" 
#define DRIVER_DESC "C-Media 108 chip" 

#define CM108_VENDOR_ID 0x0d8c 
#define CM108_PRODUCT_ID 0x000c 

#ifdef CONFIG_USB_DYNAMIC_MINORS 
#define CM108_MINOR_BASE 0 
#else 
#define CM108_MINOR_BASE 96 
#endif 

/* 
* Linux interface and usb initialisation 
*/ 

static int cm108_hid_probe(struct hid_device *hdev, const struct hid_device_id *id) 
{ 
    int ret; 

    ret = hid_parse(hdev); 
    if (ret) { 
     dev_err(&hdev->dev, "parse failed\n"); 
     goto error; 
    } 

    ret = hid_hw_start(hdev, HID_CONNECT_HIDRAW); 
    if (ret) { 
     dev_err(&hdev->dev, "hw start failed\n"); 
     goto error; 
    } 
    return 0; 

error: 
    return ret; 
} 

static struct hid_device_id cm108_device_table[] = { 
    { HID_USB_DEVICE (CM108_VENDOR_ID, CM108_PRODUCT_ID) }, 
    /* you can add more devices here with product ID 0x0008 - 0x000f */ 
    { } 
}; 
MODULE_DEVICE_TABLE (hid, cm108_device_table); 

static struct hid_driver hid_cm108_driver = { 
    .name = "cm108", 
    .id_table = cm108_device_table, 
    .probe = cm108_hid_probe, 
}; 

static int hid_cm108_init(void) 
{ 
    return hid_register_driver(&hid_cm108_driver); 
} 

static void hid_cm108_exit(void) 
{ 
    hid_unregister_driver(&hid_cm108_driver); 
} 

module_init(hid_cm108_init); 
module_exit(hid_cm108_exit); 

MODULE_AUTHOR(DRIVER_AUTHOR); 
MODULE_DESCRIPTION(DRIVER_DESC); 
MODULE_LICENSE("GPL"); 

Dieses Make-Datei verwendet

obj-m += cm108.o 

und kompilieren Sie das Modul

make -C /lib/modules/`uname -r`/build/ M=`pwd` EXTRAVERSION="-generic" modules 

sudo make -C /lib/modules/`uname -r`/build/ M=`pwd` EXTRAVERSION="-generic" modules_install 

depmod -a 

hatte ich die modules.order-Datei zu ändern, so dass meine Modul würde vor dem generischen HID-Linux-Modul abgefragt werden.

Diese Module stellen Sie sicher, dass die hidraw Schnittstelle verwendet 2.

Dann kann ich fopen verwenden, um die GPIO-Pin des CM108 Chip zu lesen und zu schreiben.

BTW: beim Schreiben Sie 5Byte großen das erste Byte verwendet wird schreiben müssen für die HID_OUTPUT_REPORT

Verwandte Themen