C-Media 的 CM108 有 4 个 GPIO 引脚,您可以通过隐藏接口访问。
使用 Windows 中的通用写入功能,我能够写入 gpio 引脚。
但是我试图在 Linux 中做同样的事情但没有成功。
linux 内核将该设备检测为 hidraw 设备。
注意:我能够从设备读取,只是不能写入。(我以 root 身份运行该应用程序只是为了确保它不是权限问题)。
我得到了这个工作,这里是如何。
我需要创建一个新的 linux hid 内核模块。(没那么难)/*
/*
* Driver for the C-Media 108 chips
*
* Copyright (C) 2009 Steve Beaulac <steve@sagacity.ca>
*
* 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");
使用了这个makefile
obj-m += cm108.o
并编译模块
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
我必须修改 modules.order 文件,以便在通用 hid linux 模块之前查询我的模块。
该模块确保 hidraw 使用接口 2。
然后我可以使用 fopen 对 CM108 芯片的 GPIO 引脚进行读写。
顺便说一句:写入时您需要写入 5 个字节,第一个字节用于 HID_OUTPUT_REPORT
Linux 中的大多数硬件都可以作为文件访问。如果驱动程序在文件系统上为它创建了一个硬件节点,那么你很幸运。您将能够使用常规文件例程对其进行写入。否则,您可能需要做一些汇编魔术,这可能需要您编写一个内核模块来完成它。
下面是如何在 Linux 上写入 CM108/CM119 GPIO 引脚的完整示例。
https://github.com/wb2osz/direwolf/blob/dev/cm108.c
您不需要以 root 身份运行或编写自己的设备驱动程序。
我有相反的问题。我试图弄清楚如何在 Windows 上做同样的事情。