标签: driver

如何为Windows平台的USB设备编程驱动程序?

我正在寻找一种通过USB接口读取接线电压并返回数据的设备.我将如何编程来解释这些数据以及我将使用哪种语言?

编辑:如果有帮助,该项目将为不支持全面ODB2数据端口的旧引擎开发数字转速计.因此,它将读取直流电路上的电压并具有精确的图形界面.我完全不知道从哪里开始,但我决心让它发挥作用!这是为了窗户.

windows usb driver

10
推荐指数
3
解决办法
2万
查看次数

如何使自定义USB设备在Windows中显示为COM端口?

我开发了一个USB设备,通过简单但专有的界面和一些自定义Linux驱动程序与linux通信.我的目标是在没有编写Windows驱动程序的情况下将其移植到Windows.我想要做的是找到一个开源或内置类驱动程序的Windows,看起来像Windows中的COM端口.然后我将定制嵌入式软件以匹配虚拟COM端口期望看到的协议和描述符.

我的想法是,我可以将我的设备插入Windows机器,并且会出现相对高速的COM端口,而我不得不为它开发Windows驱动程序.

我一直在看USB CDC(通信设备类)文档,它看起来很有希望,但我不知道哪个子接口最好用,以便它显示为COM端口.

这里有没有人做过这样的工作或者可以提供一些见解?特别:

  1. 是否有"内置"到Windows的虚拟COM驱动程序,或者我需要第三方驱动程序.
  2. 我应该使用哪个CDC子类进行简单的RS232仿真(不需要调制解调器AT命令等)
  3. 有没有更好的选择来做我想做的事情.

谢谢

windows embedded usb serial-port driver

10
推荐指数
1
解决办法
5417
查看次数

从字符设备读取时无休止地循环

对于家庭作业,我写了一个字符设备驱动程序.它似乎工作正常.我可以读写它.问题是,当我读取设备时,它无休止地循环,反复打印出消息缓冲区的内容.

这似乎应该是相当直接的.只需使用copy_to_user(),但事实证明这是非常有问题的.

无论如何,这是代码.我认为问题出在gdev_read()函数中.printk用作调试和谈话点,因为我必须在课堂上展示项目.

/*
 * Implement a generic character pseudo-device driver
 */

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/types.h>
#include <linux/vmalloc.h>
#include <asm/uaccess.h>

/* you need these, or the kernel will be tainted */
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("A simple sample character device driver");

/*
 * function prototypes
 */
int init_module(void);
void cleanup_module(void);
static ssize_t gdev_read(struct file *, char *, size_t, loff_t *);
static ssize_t gdev_write(struct file *, const char *, size_t, loff_t *);
static int gdev_open(struct inode *, struct …
Run Code Online (Sandbox Code Playgroud)

kernel loops driver device

10
推荐指数
1
解决办法
3702
查看次数

如何在Linux内核中使用生物请求读取扇区

如何创建自己的生物请求以从磁盘驱动器读取扇区?

我正在尝试以下但它冻结了系统.

static void read_bio()
{
    struct bio *b;
    struct page *p;

    b = bio_alloc(GFP_KERNEL, 1);
    if (!b) {
        printk(KERN_INFO "bio allocation failed\n");
    }
    bio_init(b);

    b->bi_sector = 10000;
    b->bi_bdev = bd;    /* "/dev/sda1" */
    b->bi_end_io = bio_end_clone;

    p = alloc_page(GFP_KERNEL);
    if (!p) {
        printk(KERN_INFO "page allocation failed\n");
    }
    bio_add_page(b, p, PAGE_SIZE, 0);
    b->bi_private = p;

    bio_get(b);
    submit_bio(READ, b);
    printk(KERN_DEBUG "submit read request\n");
}
Run Code Online (Sandbox Code Playgroud)

linux kernel driver

10
推荐指数
1
解决办法
2685
查看次数

Windows 8远程显示驱动程序模型

我正在尝试将当前的XPDM镜像驱动程序移植到Windows 8.Microsoft
在Windows 8下完全禁用镜像驱动程序,但在MSDN上它说

基于镜像驱动程序体系结构的远程显示驱动程序模型也可以从Windows 8开始运行.有关详细信息,请参阅远程显示驱动程序.

并在远程显示驱动程序页面上,它说:

远程显示驱动程序基于Windows 2000镜像驱动程序模型,用于在远程会话中呈现桌面.

但是,我可以在网站上找到"远程显示驱动程序"的更多信息,除了这个和MSDN上的这个链接.我唯一的信息是它基于Win2K镜像驱动程序模型,但我不知道应该做些什么来使它与Windows 8兼容.

我试图将XPDM镜像驱动程序代码库移植到Visual Studio 2012中,并且我使用了相同的inf文件.代码可以在Windows 8上成功编译和部署,但内核不会加载显示驱动程序.
显示驱动程序名为accdrv.dll,微型端口驱动程序为mirror.sys.调试内核时,只加载mirror.sys.

有没有可以找到"远程显示驱动程序"信息的地方?所以我可以继续这项工作吗?

driver wdk

10
推荐指数
0
解决办法
1162
查看次数

如何在Linux设备驱动程序中设置errno?

我正在设计一个Linux角色设备驱动程序.我想在ioctl()系统调用中发生错误时设置errno.

long my_own_ioctl(struct file *file, unsigned int req, unsigned long arg)
{
    long ret = 0;
    BOOL isErr = FALSE;

    // some operation
    // ...

    if (isErr) {
        // set errno
        // ...                 <--- What should I do?
        ret = -1;
    }

    return ret;
}
Run Code Online (Sandbox Code Playgroud)

我该怎么做才能实现这一目标?提前谢谢你!


请允许我更详细地解释我的申请.

我的设备位于/ dev/myCharDev中.我的用户空间应用程序是这样的:

#define _COMMAND                    (1)
#define _ERROR_COMMAND_PARAMETER    (-1)

int main()
{
    int fd = open("/dev/myCharDec", O_RDONLY);
    int errnoCopy;

    if (fd) {
        if (ioctl(fd, _COMMAND, _ERROR_COMMAND_PARAMETER) < 0) {      // should cause error in …
Run Code Online (Sandbox Code Playgroud)

linux ioctl driver errno device-driver

10
推荐指数
2
解决办法
5969
查看次数

dma vs中断驱动的i/o

我对DMA和中断I/O之间的差异有点不清楚.(目前正在阅读操作系统概念,第7版).

具体来说,我不确定在任何一种情况下中断何时发生,并且在两种情况下在哪些点上CPU都可以自由地进行其他工作.我一直在阅读的东西,但不一定和解:

中断驱动

  1. 控制器通过驱动程序初始化
  2. 控制器检查由驱动程序加载的寄存器以决定操作
  3. 从/向外设和控制器缓冲区的数据传输随之发生.
  4. 控制器发出中断时(每个字节读取?读取每个字?当缓冲区填满时?传输完成时?
  5. 这是我的理解,该CPU是没有做任何事情时外围< - >控制器I/O正在发生,并且控制器< - > MM I/O都发生?
  6. 当传输完成或块填满时,CPU必须初始化从控制器缓冲区到MM的传输

DMA

  1. 与上面相同,除了控制器能够在没有CPU干预的情况下将数据从其缓冲区直接传输到MM.
  2. 这是否意味着CPU仅在整个传输完成时中断,或者在控制器缓冲区填满时是否仍然中断?
  3. 唯一的区别是CPU不再需要等待控制器< - > MM I/O,但是当控制器缓冲区填满时仍然必须中断?或者DMA是否也将其隐藏在CPU中?

architecture operating-system driver interrupt dma

10
推荐指数
2
解决办法
2万
查看次数

如何使用Linux获得Touchscreen Rawdata的坐标

我们有一个3米的微触摸显示屏.它通过usb与我的debian系统相连,并被认为是人机界面(hid).我正在尝试访问并推送实时信息......如果它被触及我想知道哪里(x,y)并将它通过netcat传递给另一台主机.

不幸的是,我只能使用原始数据

cat /dev/input/event2 | hexdump
Run Code Online (Sandbox Code Playgroud)

要么 evtest

你得到的hexcode似乎没有记录......

有人知道如何获取这些信息吗?必须有一种从十六进制代码中提取它的方法.不幸的是我不知道如何解释hexcode.我找不到其记录的任何来源......

有没有办法让内核能够实时提供我想要的信息?作为一个解决方案,可能有一个X-Server可以告诉我的解决方案?触摸屏的行为类似于X中的鼠标.我实际上已经尝试通过xlib获取鼠标的x,y位置.但它太慢了,不会告诉我是否有人在接触......

提前致谢!

evtest样本输出:

Event: time 1425319271.595631, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value 51
Event: time 1425319271.595631, type 3 (EV_ABS), code 53 (ABS_MT_POSITION_X), value 10304
Event: time 1425319271.595631, type 3 (EV_ABS), code 54 (ABS_MT_POSITION_Y), value 30629
Event: time 1425319271.595631, type 3 (EV_ABS), code 48 (ABS_MT_TOUCH_MAJOR), value 893
Event: time 1425319271.595631, type 3 (EV_ABS), code 49 (ABS_MT_TOUCH_MINOR), value 414
Event: time 1425319271.595631, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 1
Event: …
Run Code Online (Sandbox Code Playgroud)

linux driver touchscreen raw-input linux-kernel

10
推荐指数
1
解决办法
2万
查看次数

CreateFileA无法在Windows中打开HID设备

编辑:此处报告的问题:https://github.com/signal11/hidapi/issues/276

Inkling是Wacom的笔设备.(InklingReader)是一个开源项目,可以从中获取实时数据.

我正在尝试整理InklingReader以使用HIDAPI而不是libusb (因为它在更高级别工作:HID而不是原始USB,所以更紧凑和更合适.此外,libusb在最近的OSX上失败).

HID API是一个小型lib:一个.h,一个(每个平台).c.

我的代码看起来像这样:

    unsigned short  inklingVendorId = 0x056a, inklingProductId = 0x0221;
    if (hid_init() == FAIL) return;   
    handle = hid_open(inklingVendorId, inklingProductId, nullptr);
Run Code Online (Sandbox Code Playgroud)

在Windows上hid_open失败.单步执行揭示了这里的失败点:

// path = "\\\\?\\hid#vid_056a&pid_0221&mi_00&col01#8&1ea90857&0&0000#"
//        "{4d1e55b2-f16f-11cf-88cb-001111000030}"
//
static HANDLE open_device(const char *path, BOOL enumerate)
{
    HANDLE handle;
    DWORD desired_access = (enumerate)? 0: (GENERIC_WRITE | GENERIC_READ);
    DWORD share_mode = FILE_SHARE_READ|FILE_SHARE_WRITE;

    // enumerate = 0
    handle = CreateFileA(path,
        desired_access,
        share_mode,
        NULL,
        OPEN_EXISTING,
        FILE_FLAG_OVERLAPPED,/*FILE_ATTRIBUTE_NORMAL,*/
        0); …
Run Code Online (Sandbox Code Playgroud)

windows usb driver hid hidapi

10
推荐指数
1
解决办法
2298
查看次数

在哪里可以找到从gpusGenerateCrashLog调用堆栈创建的日志?

在我的OpenGL渲染引擎中,当我按下一个开始发出一些新的OpenGL调用的键后,我正在崩溃1帧.

以下是崩溃的调用堆栈,它是一个CVDisplayLink线程.

0   libsystem_kernel.dylib          0x00007fff94d89f06 __pthread_kill + 10
1   libsystem_pthread.dylib         0x00007fff88d3e4ec pthread_kill + 90
2   libsystem_c.dylib               0x00007fff980246e7 abort + 129
3   libGPUSupportMercury.dylib      0x00007fff983a3e5c gpusGenerateCrashLog + 158
4   com.apple.driver.AppleIntelHD5000GraphicsGLDriver   0x000000010f750d4b gpusKillClientExt + 9
5   libGPUSupportMercury.dylib      0x00007fff983a5204 gpusSubmitDataBuffers + 162
6   com.apple.driver.AppleIntelHD5000GraphicsGLDriver   0x000000010f2ac3f2 IntelCommandBuffer::getNew(GLDContextRec*) + 48
7   com.apple.driver.AppleIntelHD5000GraphicsGLDriver   0x000000010f399849 intelSubmitCommands + 171
8   com.apple.driver.AppleIntelHD5000GraphicsGLDriver   0x000000010f3996c2 gldPresentFramebufferData + 142
9   GLEngine                        0x000000010f0ddc81 glSwap_Exec + 97
10  com.apple.GLEngineProfiler      0x000000010d759265 0x10d60b000 + 1368677
11  com.apple.opengl                0x00007fff8ed15ffe CGLFlushDrawable + 66
12  com.apple.AppKit                0x00007fff8846509f -[NSOpenGLContext flushBuffer] + …
Run Code Online (Sandbox Code Playgroud)

opengl macos gpu driver osx-elcapitan

10
推荐指数
1
解决办法
395
查看次数