如何在Linux中写入CM108芯片的GPIO引脚?

C-Media的CM108有4个GPIO引脚,你可以通过一个hid接口访问。

在Windows中使用通用写入function,我可以写入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引脚。

顺便说一句:写时你需要写5byte的第一个字节是用于HID_OUTPUT_REPORT

Linux中的大多数硬件都可以作为文件访问。 如果驱动程序在文件系统上为它创建了一个硬件节点,那么你很幸运。 你将能够使用常规的文件例程写入它。 否则,你可能需要做一些组装魔术,这可能需要你编写一个内核模块来完成。