usb程序怎么写

usb驱动怎么写

1. 怎么做usb的驱动

你用的是笔记本吗?从本人的维修经验来看无法识别,一是电脑无法识别USB设备。

二是USB设备不能被电脑识别。我们先要判断是电脑的问题还是USB设备的问题。我们可以用其他的USB设备来测试电脑有没有问题。

如果是电脑的问题。你的电脑是不是被病毒破坏。USB2.0的驱动是不是安装完好或版本不兼容。有没有软件冲突(先解决软件问题)一般情况出来一个安装驱动程序的提示。

如果是电脑硬件问题。我们先用万用表测量USB的四条线(红+5V 白DATA-数据- 绿DATA-数据- 黑 地线)万用表红表笔对地黑表笔测量(白线和渌线。的阻值不相差50欧,这两条线都是从南桥出来的,如果阻值变化过大则可以判断是南桥问题。说明USB在南桥内部的模块烧毁。

在来看看外面的USB设备现在很多都要驱动程序。即使没有驱动程序也不会出来无法识别的情况。出现无法识别的情况有几种。一USB数据线不通或接触不良一般都接触那个地方因为时间长可能里面生锈有胀东西还可能有东西在里面挡住了。二 USB线不通。红线不通什么反应也不会有,白线不通无法识别。绿线不通也是无法识别。白线和绿线不可以接反。也是无法识别。黑线不通也没有反应,这个测量的方法上面已经讲到。

注意.红线5V电压低也可导致无法识别.

三 USB机板内部问题。1晶振不良,不起振。2晶振电容不良(20P)有两个

3复位电容电阻不良。复位电压偏底偏高 4三端IC不良为IC提供电压不够5.

主IC不良

祝你好运!

2. 电脑自带的USB驱动上面写的什么

是不想用还是其它问题,如果涉及安全问题建议屏蔽usb端口

釜底抽薪:屏蔽USB控制器

通过修改BIOS设置,可以直接屏蔽主板上的USB控制器,这个方法几乎适用于所有计算机。这里笔者以目前使用最为广泛的Award BIOS为例进行说明。启动计算机时按键盘的Del键进入BIOS设置界面,用方向键定位到“Integrated Peripherals”项,按回车打开,把其中“USB Controller”设置为“Disabled”。

另外为了防止非法用户更改该设置,请务必加上BIOS密码,然后保存退出,计算机会自动重启,以后计算机上所有的USB接口即告失效。

这个方法虽然简单有效,但副作用也非常明显,因为在屏蔽USB接口之后,不但闪存盘之类的移动存储设备不能用,而且连USB接口的外设,例如USB鼠标、键盘、打印机等都将无法使用,很不方便。

温柔一刀:修改注册表停用USB驱动

在“开始”/“运行”中输入“Regedit”,按回车即可打开注册表编辑器,找到“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\UsbStor”主键,双击名为“Start”的DWORD值,将“数值数据”改为4。

注意右边的“基数”默认为“十六进制”,该设置切勿更改,单击“确定”即可修改完成。

现在试试看,插上闪盘,闪盘的工作指示灯不亮,而系统也没有任何反应,这证明我们的修改成功了。为了防止非法用户用同样的方法解锁,最好把Regedit.exe程序改名或者直接删除。

小提示:“Start”值是一个控制USB存储设备驱动程序工作状态的开关,可设为以下三种值,设为2时表示自动,设为3时表示手动(这是默认设置),设为4则为停用

3. 如何写一个Android USB接口驱动

说到 android 驱动是离不开 Linux 驱动的。

Android 内核采用的是 Linux2.6 内核 (最近Linux 3.3 已经包含了一些 Android 代码)。但 Android 并没有完全照搬 Linux 系统内核,除了对Linux 进行部分修正,还增加了不少内容。

android 驱动 主要分两种类型:Android 专用驱动 和 Android 使用的设备驱动(linux)。 Android 专有驱动程序: 1)Android Ashmem 匿名共享内存; 为用户空间程序提供分配内存的机制,为进程间提供大块共享内存,同时为内核提供回收和管理这个内存。

2)Android Logger 轻量级的LOG(日志) 驱动; 3)Android Binder 基于 OpenBinder 框架的一个驱动; 4)Android Power Management 电源管理模块; 5)Low Memory Killer 低内存管理器; 6)Android PMEM 物理内存驱动; 7)USB Gadget USB 驱动(基于 gaeget 框架); 8)Ram Console 用于调试写入日志信息的设备; 9)Time Device 定时控制设备; 10)Android Alarm 硬件时钟; Android 上的设备驱动: 1)Framebuff 显示驱动; 2)Event 输入设备驱动; 3)ALSA 音频驱动; 4)OSS 音频驱动; 5)v412摄像头:视频驱动; 6)MTD 驱动; 7)蓝牙驱动; 8)WLAN 设备驱动; Android 专有驱动程序 1.Android Ashmem 为用户空间程序提供分配内存的机制,为进程间提供大块共享内存,同时为内核提供回收和管理这个内存。 设备节点:/dev/ashmen .主设备号 10. 源码位置: include/linux/ashmen.h Kernel /mm/ashmen.c 相比于 malloc 和 anonymous/named mmap 等传统的内存分配机制,其优势是通过内核驱动提供了辅助内核的内存回收算法机制(pin/unoin) 2.Android Logger 无论是底层的源代码还上层的应用,我们都可以使用 logger 这个日志设备看、来进行调试。

设备节点: /dev/log/main /dev/log/event /dev/log/radio 源码位置:include/linux/logger.h include/linux/logger.c 3.Android Binder IPC Binder 一种进程间通信机制。他的进程能够为其它进程提供服务 ----- 通过标准的 Linux 系统调用 API。

设备节点 :/dev/binder 源码位置:Kernel/include/linux/binder.h Kernel/drivers/misc/binder.c 4.Android Power Management 一个基于标准 linux 电源管理的轻量级 Android 电源管理系统,在 drivers/android/power.c kernel/power/ 5.Low Memory Killer 它在用户空间中指定了一组内存临界值,当其中某个值与进程描述中的 oom_adj 值在同一范围时,该进程将被Kill掉(在parameters/adj中指定oome_adj 的最小值)。它与标准的Linux OOM机制类似,只是实现方法不同 源码位置:drivers/misc/lowmemorykiller.c 6.Android PMEM PMEM 主要作用就是向用户空间提供连续的物理内存区域。

1.让 GPU 或 VPU 缓冲区共享 CPU 核心。 2.用于 Android service 堆。

源码位置:include/linux/android_pmem.h drivers/android/pmem.c 7.USB Gadget 基于标准 Linux USB gaeget 驱动框架的设备驱动。 源码位置:drivers/usb/gadet/ 8.Ram Console 为了提供调试功能,android 允许将调试日志信息写入这个设备,它是基于 RAM 的 buffer. 源码位置: drivers/staging/android/ram_console.c 9.Time Device 定时控制,提供了对设备进行定时控制的功能。

源码位置:drivers/staging/android/timed_output.c(timed_gpio.c) 10.Android Alarm 提供一个定时器,用于把设备从睡眠状态唤醒,同时它还提供了一个即使在设备睡眠时也会运行的时钟基准。 设备节点:/dev/alarm 源码位置:drivers/trc/alarm.c Android 设备驱动 1. Framebuffer 帧缓存设备 Framebuffer 驱动在 Linux 中是标准的显示设备的驱动。

对于 PC 系统,它是显卡的驱动 ; 对于嵌入式 SOC 处理器系统,它是 LCD 控制器或者其他显示控制器的驱动。它是一个字符设备,在文件系统中设备节点通常是 /dev/fbx 。

每个系统可以有多个显示设备 , 依次用 /dev/fbO 、/dev/fb l 等来表示。在 Android 系统中主设备号为 29 ,次设备号递增生成。

Android 对 Framebuffer 驱动的使用方式是标准的 , 在 / dev / graphie / 中的 Framebuffer 设备节点由 init 进程自动创建 , 被 libui 库调用 。 Android 的 GUI 系统中 , 通过调用 Framebuffer 驱动的标准接口,实现显示设备的抽象。

Framebuff的结构框架和实现 : linux LCD驱动(二)--FrameBuffer Linux LCD驱动(四)--驱动的实现 2.Event输入设备驱动 Input 驱动程序是 Linux 输入设备的驱动程序 , 分为游戏杆 (joystick) 、鼠标 (mouse 和 mice)和事件设备 (Event queue)3 种驱动程序。其中事件驱动程序是目前通用的程序,可支持键盘 、鼠标、触摸屏等多种输入设备。

Input 驱动程序的主设备号是 l3 ,每一种 Input 设备从设备号占 用5 位 , 3 种从设备号分配是 : 游戏杆 0 ~ 61 ; Mouse 鼠标 33 ~ 62 ; Mice 鼠标 63 ; 事件设备 64 ~ 95 ,各个具体的设备在 misc 、touchscreen 、keyboard 等目录中。 Event 设备在用户空问使用 read 、ioctl 、poll 等文件系统的接口操作, read 用于读取输入信息, ioctl 用于获取和设置信息, poll 用于用户空间的阻塞,当内核有按键等中断时,通过在中断中唤醒内核的 poll 实现。

4. 怎样写Linux下的USB设备驱动程序

写一个USB的驱动程序最 基本的要做四件事:驱动程序要支持的设备、注册USB驱动程序、探测和断开、提交和控制urb(USB请求块) 驱动程序支持的设备:有一个结构体struct usb_device_id,这个结构体提供了一列不同类型的该驱动程序支持的USB设备,对于一个只控制一个特定的USB设备的驱动程序来说,struct usb_device_id表被定义为:/* 驱动程序支持的设备列表 */ static struct usb_device_id skel_table [] = { { USB_DEVICE(USB_SKEL_VENDOR_ID, USB_SKEL_PRODUCT_ID) }, { } /* 终止入口 */ }; MODULE_DEVICE_TABLE (usb, skel_table); 对 于PC驱动程序,MODULE_DEVICE_TABLE是必需的,而且usb必需为该宏的第一个值,而USB_SKEL_VENDOR_ID和 USB_SKEL_PRODUCT_ID就是这个特殊设备的制造商和产品的ID了,我们在程序中把定义的值改为我们这款USB的,如:/* 定义制造商和产品的ID号 */#define USB_SKEL_VENDOR_ID 0x1234#define USB_SKEL_PRODUCT_ID 0x2345 这两个值可以通过命令lsusb,当然你得先把USB设备先插到主机上了。

或者查看厂商的USB设备的手册也能得到,在我机器上运行lsusb是这样的结果:Bus 004 Device 001: ID 0000:0000 Bus 003 Device 002: ID 1234:2345 Abc Corp. Bus 002 Device 001: ID 0000:0000 Bus 001 Device 001: ID 0000:0000 得到这两个值后把它定义到程序里就可以了。注册USB驱动程序:所 有的USB驱动程序都必须创建的结构体是struct usb_driver。

这个结构体必须由USB驱动程序来填写,包括许多回调函数和变量,它们向USB核心代码描述USB驱动程序。创建一个有效的 struct usb_driver结构体,只须要初始化五个字段就可以了,在框架程序中是这样的:static struct usb_driver skel_driver = { .owner = THIS_MODULE, .name = "skeleton", .probe = skel_probe, .disconnect = skel_disconnect, .id_table = skel_table,}; 探测和断开:当 一个设备被安装而USB核心认为该驱动程序应该处理时,探测函数被调用,探测函数检查传递给它的设备信息,确定驱动程序是否真的适合该设备。

当驱动程序因 为某种原因不应该控制设备时,断开函数被调用,它可以做一些清理工作。探测回调函数中,USB驱动程序初始化任何可能用于控制USB设备的局部结构体,它 还把所需的任何设备相关信息保存到一个局部结构体中,提交和控制urb:当驱动程序有数据要发送到USB设备时(大多数情况是在驱动程序的写函数中),要分配一个urb来把数据传输给设备: /* 创建一个urb,并且给它分配一个缓存*/ urb = usb_alloc_urb(0, GFP_KERNEL); if (!urb) { retval = -ENOMEM; goto error; } 当urb被成功分配后,还要创建一个DMA缓冲区来以高效的方式发送数据到设备,传递给驱动程序的数据要复制到这块缓冲中去: buf = usb_buffer_alloc(dev->udev, count, GFP_KERNEL, &urb->transfer_dma); if (!buf) { retval = -ENOMEM; goto error; } if (copy_from_user(buf, user_buffer, count)) { retval = -EFAULT; goto error; } 当数据从用户空间正确复制到局部缓冲区后,urb必须在可以被提交给USB核心之前被正确初始化: /* 初始化urb */ usb_fill_bulk_urb(urb, dev->udev, usb_sndbulkpipe(dev->udev, dev->bulk_out_endpointAddr), buf, count, skel_write_bulk_callback, dev); urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; 然后urb就可以被提交给USB核心以传输到设备了: /* 把数据从批量OUT端口发出 */ retval = usb_submit_urb(urb, GFP_KERNEL); if (retval) { err("%s - failed submitting write urb, error %d", __FUNCTION__, retval); goto error; } 当urb被成功传输到USB设备之后,urb回调函数将被USB核心调用,在我们的例子中,我们初始化urb,使它指向skel_write_bulk_callback函数,以下就是该函数:static void skel_write_bulk_callback(struct urb *urb, struct pt_regs *regs) { struct usb_skel *dev; dev = (struct usb_skel *)urb->context; if (urb->status && !(urb->status == -ENOENT || urb->status == -ECONNRESET || urb->status == -ESHUTDOWN)) { dbg("%s - nonzero write bulk status received: %d", __FUNCTION__, urb->status); } /* 释放已分配的缓冲区 */ usb_buffer_free(urb->dev, urb->transfer_buffer_length, urb->transfer_buffer, urb->transfer_dma); } 有时候USB驱动程序只是要发送或者接收一些简单的数据,驱动程序也可以不用urb来进行数据的传输,这是里涉及到两个简单的接口函数:usb_bulk_msg和usb_control_msg ,在这个USB框架程序里读操作就是这样的一个应用:/* 进行阻塞的批量读以从设备获取数据 */ retval = usb_bulk_msg(dev->udev, usb_rcvbulkpipe(dev->udev, dev->bulk_in_endpointAddr), dev->bulk_in_buffer, min(dev->bulk_in_size, count), &count, HZ*10); /*如果读成功,复制到用户空间 */ if (!retval) { if (copy_to_user(buffer, dev->bulk_in_buffer, count)) retval = -EFAULT; else retval = count; } usb_bulk_msg接口函数的定义如下:int usb_bulk_msg(struct usb_device *usb_dev,unsigned int pipe,void *data,int len,。

usb驱动怎么写

怎么写usb驱动

1. 怎么做usb的驱动

你用的是笔记本吗?从本人的维修经验来看无法识别,一是电脑无法识别USB设备。

二是USB设备不能被电脑识别。我们先要判断是电脑的问题还是USB设备的问题。我们可以用其他的USB设备来测试电脑有没有问题。

如果是电脑的问题。你的电脑是不是被病毒破坏。USB2.0的驱动是不是安装完好或版本不兼容。有没有软件冲突(先解决软件问题)一般情况出来一个安装驱动程序的提示。

如果是电脑硬件问题。我们先用万用表测量USB的四条线(红+5V 白DATA-数据- 绿DATA-数据- 黑 地线)万用表红表笔对地黑表笔测量(白线和渌线。的阻值不相差50欧,这两条线都是从南桥出来的,如果阻值变化过大则可以判断是南桥问题。说明USB在南桥内部的模块烧毁。

在来看看外面的USB设备现在很多都要驱动程序。即使没有驱动程序也不会出来无法识别的情况。出现无法识别的情况有几种。一USB数据线不通或接触不良一般都接触那个地方因为时间长可能里面生锈有胀东西还可能有东西在里面挡住了。二 USB线不通。红线不通什么反应也不会有,白线不通无法识别。绿线不通也是无法识别。白线和绿线不可以接反。也是无法识别。黑线不通也没有反应,这个测量的方法上面已经讲到。

注意.红线5V电压低也可导致无法识别.

三 USB机板内部问题。1晶振不良,不起振。2晶振电容不良(20P)有两个

3复位电容电阻不良。复位电压偏底偏高 4三端IC不良为IC提供电压不够5.

主IC不良

祝你好运!

2. 如何写一个Android USB接口驱动

说到 android 驱动是离不开 Linux 驱动的。

Android 内核采用的是 Linux2.6 内核 (最近Linux 3.3 已经包含了一些 Android 代码)。但 Android 并没有完全照搬 Linux 系统内核,除了对Linux 进行部分修正,还增加了不少内容。

android 驱动 主要分两种类型:Android 专用驱动 和 Android 使用的设备驱动(linux)。 Android 专有驱动程序: 1)Android Ashmem 匿名共享内存; 为用户空间程序提供分配内存的机制,为进程间提供大块共享内存,同时为内核提供回收和管理这个内存。

2)Android Logger 轻量级的LOG(日志) 驱动; 3)Android Binder 基于 OpenBinder 框架的一个驱动; 4)Android Power Management 电源管理模块; 5)Low Memory Killer 低内存管理器; 6)Android PMEM 物理内存驱动; 7)USB Gadget USB 驱动(基于 gaeget 框架); 8)Ram Console 用于调试写入日志信息的设备; 9)Time Device 定时控制设备; 10)Android Alarm 硬件时钟; Android 上的设备驱动: 1)Framebuff 显示驱动; 2)Event 输入设备驱动; 3)ALSA 音频驱动; 4)OSS 音频驱动; 5)v412摄像头:视频驱动; 6)MTD 驱动; 7)蓝牙驱动; 8)WLAN 设备驱动; Android 专有驱动程序 1.Android Ashmem 为用户空间程序提供分配内存的机制,为进程间提供大块共享内存,同时为内核提供回收和管理这个内存。 设备节点:/dev/ashmen .主设备号 10. 源码位置: include/linux/ashmen.h Kernel /mm/ashmen.c 相比于 malloc 和 anonymous/named mmap 等传统的内存分配机制,其优势是通过内核驱动提供了辅助内核的内存回收算法机制(pin/unoin) 2.Android Logger 无论是底层的源代码还上层的应用,我们都可以使用 logger 这个日志设备看、来进行调试。

设备节点: /dev/log/main /dev/log/event /dev/log/radio 源码位置:include/linux/logger.h include/linux/logger.c 3.Android Binder IPC Binder 一种进程间通信机制。他的进程能够为其它进程提供服务 ----- 通过标准的 Linux 系统调用 API。

设备节点 :/dev/binder 源码位置:Kernel/include/linux/binder.h Kernel/drivers/misc/binder.c 4.Android Power Management 一个基于标准 linux 电源管理的轻量级 Android 电源管理系统,在 drivers/android/power.c kernel/power/ 5.Low Memory Killer 它在用户空间中指定了一组内存临界值,当其中某个值与进程描述中的 oom_adj 值在同一范围时,该进程将被Kill掉(在parameters/adj中指定oome_adj 的最小值)。它与标准的Linux OOM机制类似,只是实现方法不同 源码位置:drivers/misc/lowmemorykiller.c 6.Android PMEM PMEM 主要作用就是向用户空间提供连续的物理内存区域。

1.让 GPU 或 VPU 缓冲区共享 CPU 核心。 2.用于 Android service 堆。

源码位置:include/linux/android_pmem.h drivers/android/pmem.c 7.USB Gadget 基于标准 Linux USB gaeget 驱动框架的设备驱动。 源码位置:drivers/usb/gadet/ 8.Ram Console 为了提供调试功能,android 允许将调试日志信息写入这个设备,它是基于 RAM 的 buffer. 源码位置: drivers/staging/android/ram_console.c 9.Time Device 定时控制,提供了对设备进行定时控制的功能。

源码位置:drivers/staging/android/timed_output.c(timed_gpio.c) 10.Android Alarm 提供一个定时器,用于把设备从睡眠状态唤醒,同时它还提供了一个即使在设备睡眠时也会运行的时钟基准。 设备节点:/dev/alarm 源码位置:drivers/trc/alarm.c Android 设备驱动 1. Framebuffer 帧缓存设备 Framebuffer 驱动在 Linux 中是标准的显示设备的驱动。

对于 PC 系统,它是显卡的驱动 ; 对于嵌入式 SOC 处理器系统,它是 LCD 控制器或者其他显示控制器的驱动。它是一个字符设备,在文件系统中设备节点通常是 /dev/fbx 。

每个系统可以有多个显示设备 , 依次用 /dev/fbO 、/dev/fb l 等来表示。在 Android 系统中主设备号为 29 ,次设备号递增生成。

Android 对 Framebuffer 驱动的使用方式是标准的 , 在 / dev / graphie / 中的 Framebuffer 设备节点由 init 进程自动创建 , 被 libui 库调用 。 Android 的 GUI 系统中 , 通过调用 Framebuffer 驱动的标准接口,实现显示设备的抽象。

Framebuff的结构框架和实现 : linux LCD驱动(二)--FrameBuffer Linux LCD驱动(四)--驱动的实现 2.Event输入设备驱动 Input 驱动程序是 Linux 输入设备的驱动程序 , 分为游戏杆 (joystick) 、鼠标 (mouse 和 mice)和事件设备 (Event queue)3 种驱动程序。其中事件驱动程序是目前通用的程序,可支持键盘 、鼠标、触摸屏等多种输入设备。

Input 驱动程序的主设备号是 l3 ,每一种 Input 设备从设备号占 用5 位 , 3 种从设备号分配是 : 游戏杆 0 ~ 61 ; Mouse 鼠标 33 ~ 62 ; Mice 鼠标 63 ; 事件设备 64 ~ 95 ,各个具体的设备在 misc 、touchscreen 、keyboard 等目录中。 Event 设备在用户空问使用 read 、ioctl 、poll 等文件系统的接口操作, read 用于读取输入信息, ioctl 用于获取和设置信息, poll 用于用户空间的阻塞,当内核有按键等中断时,通过在中断中唤醒内核的 poll 实现。

3. 怎样写Linux下的USB设备驱动程序

写一个USB的驱动程序最 基本的要做四件事:驱动程序要支持的设备、注册USB驱动程序、探测和断开、提交和控制urb(USB请求块) 驱动程序支持的设备:有一个结构体struct usb_device_id,这个结构体提供了一列不同类型的该驱动程序支持的USB设备,对于一个只控制一个特定的USB设备的驱动程序来说,struct usb_device_id表被定义为:/* 驱动程序支持的设备列表 */ static struct usb_device_id skel_table [] = { { USB_DEVICE(USB_SKEL_VENDOR_ID, USB_SKEL_PRODUCT_ID) }, { } /* 终止入口 */ }; MODULE_DEVICE_TABLE (usb, skel_table); 对 于PC驱动程序,MODULE_DEVICE_TABLE是必需的,而且usb必需为该宏的第一个值,而USB_SKEL_VENDOR_ID和 USB_SKEL_PRODUCT_ID就是这个特殊设备的制造商和产品的ID了,我们在程序中把定义的值改为我们这款USB的,如:/* 定义制造商和产品的ID号 */#define USB_SKEL_VENDOR_ID 0x1234#define USB_SKEL_PRODUCT_ID 0x2345 这两个值可以通过命令lsusb,当然你得先把USB设备先插到主机上了。

或者查看厂商的USB设备的手册也能得到,在我机器上运行lsusb是这样的结果:Bus 004 Device 001: ID 0000:0000 Bus 003 Device 002: ID 1234:2345 Abc Corp. Bus 002 Device 001: ID 0000:0000 Bus 001 Device 001: ID 0000:0000 得到这两个值后把它定义到程序里就可以了。注册USB驱动程序:所 有的USB驱动程序都必须创建的结构体是struct usb_driver。

这个结构体必须由USB驱动程序来填写,包括许多回调函数和变量,它们向USB核心代码描述USB驱动程序。创建一个有效的 struct usb_driver结构体,只须要初始化五个字段就可以了,在框架程序中是这样的:static struct usb_driver skel_driver = { .owner = THIS_MODULE, .name = "skeleton", .probe = skel_probe, .disconnect = skel_disconnect, .id_table = skel_table,}; 探测和断开:当 一个设备被安装而USB核心认为该驱动程序应该处理时,探测函数被调用,探测函数检查传递给它的设备信息,确定驱动程序是否真的适合该设备。

当驱动程序因 为某种原因不应该控制设备时,断开函数被调用,它可以做一些清理工作。探测回调函数中,USB驱动程序初始化任何可能用于控制USB设备的局部结构体,它 还把所需的任何设备相关信息保存到一个局部结构体中,提交和控制urb:当驱动程序有数据要发送到USB设备时(大多数情况是在驱动程序的写函数中),要分配一个urb来把数据传输给设备: /* 创建一个urb,并且给它分配一个缓存*/ urb = usb_alloc_urb(0, GFP_KERNEL); if (!urb) { retval = -ENOMEM; goto error; } 当urb被成功分配后,还要创建一个DMA缓冲区来以高效的方式发送数据到设备,传递给驱动程序的数据要复制到这块缓冲中去: buf = usb_buffer_alloc(dev->udev, count, GFP_KERNEL, &urb->transfer_dma); if (!buf) { retval = -ENOMEM; goto error; } if (copy_from_user(buf, user_buffer, count)) { retval = -EFAULT; goto error; } 当数据从用户空间正确复制到局部缓冲区后,urb必须在可以被提交给USB核心之前被正确初始化: /* 初始化urb */ usb_fill_bulk_urb(urb, dev->udev, usb_sndbulkpipe(dev->udev, dev->bulk_out_endpointAddr), buf, count, skel_write_bulk_callback, dev); urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; 然后urb就可以被提交给USB核心以传输到设备了: /* 把数据从批量OUT端口发出 */ retval = usb_submit_urb(urb, GFP_KERNEL); if (retval) { err("%s - failed submitting write urb, error %d", __FUNCTION__, retval); goto error; } 当urb被成功传输到USB设备之后,urb回调函数将被USB核心调用,在我们的例子中,我们初始化urb,使它指向skel_write_bulk_callback函数,以下就是该函数:static void skel_write_bulk_callback(struct urb *urb, struct pt_regs *regs) { struct usb_skel *dev; dev = (struct usb_skel *)urb->context; if (urb->status && !(urb->status == -ENOENT || urb->status == -ECONNRESET || urb->status == -ESHUTDOWN)) { dbg("%s - nonzero write bulk status received: %d", __FUNCTION__, urb->status); } /* 释放已分配的缓冲区 */ usb_buffer_free(urb->dev, urb->transfer_buffer_length, urb->transfer_buffer, urb->transfer_dma); } 有时候USB驱动程序只是要发送或者接收一些简单的数据,驱动程序也可以不用urb来进行数据的传输,这是里涉及到两个简单的接口函数:usb_bulk_msg和usb_control_msg ,在这个USB框架程序里读操作就是这样的一个应用:/* 进行阻塞的批量读以从设备获取数据 */ retval = usb_bulk_msg(dev->udev, usb_rcvbulkpipe(dev->udev, dev->bulk_in_endpointAddr), dev->bulk_in_buffer, min(dev->bulk_in_size, count), &count, HZ*10); /*如果读成功,复制到用户空间 */ if (!retval) { if (copy_to_user(buffer, dev->bulk_in_buffer, count)) retval = -EFAULT; else retval = count; } usb_bulk_msg接口函数的定义如下:int usb_bulk_msg(struct usb_device *usb_dev,unsigned int pipe,void *data,int len,。

怎么写usb驱动

转载请注明出处育才学习网 » usb程序怎么写

知识

罗梅芬用日文怎么写(罗钰潇日语怎么写)

阅读(21418)

本文主要为您介绍罗梅芬用日文怎么写,内容包括伊蕾娜日语怎么写,王雪菲用日文怎么说,张佳怡在日语中怎么写啊怎么读啊。罗 ら ラ ra钰 ぎょく ギョク gyoku潇 しょう シヨウ shou第一列:日语汉字,写法同汉字,都要用繁体,这三个都挺难写的,看

知识

邓先生的英文怎么写(1~40的英文怎么说)

阅读(10433)

本文主要为您介绍邓先生的英文怎么写,内容包括“邓先生”用英语怎么写,1~40的英文怎么说,漂亮英文beautiful缩写怎么写。1 one 2 two 3 three 4 four 5 five 6 six 7 seven 8 eight 8 nine 10 te

知识

一个人布满皱纹怎么写(描写人物皱纹的句子)

阅读(9502)

本文主要为您介绍一个人布满皱纹怎么写,内容包括描写人物皱纹的句子,描写人物皱纹的句子,皱纹怎么描写。、老人脸上布满了皱纹,那一条条曲折不均的像是墙上斑驳的印迹,爬满了面容,留下了岁月的痕迹。2、外祖父是一位年过六旬的白发老人。在他

知识

登录接口怎么写(php登录的接口怎么写)

阅读(7753)

本文主要为您介绍登录接口怎么写,内容包括php登录的接口怎么写,网页登陆接口怎么做,网站登录接口程序怎么做。PHP 接口 接口 使用接口(interface),你可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。我们可以通过int

知识

档案奖惩情况怎么写(奖惩情况怎么写)

阅读(9592)

本文主要为您介绍档案奖惩情况怎么写,内容包括奖惩情况怎么写,个人简历及奖惩情况怎么填写,个人简历里面奖惩情况怎么写。在简历里的“奖励”部分,列出与你所获得的并与你的求职目标相关的荣誉、奖励和奖金。你既可以按时间顺序排列,也可以按

知识

头孢克肟拼音怎么写(头孢克肟的肟念什么)

阅读(7995)

本文主要为您介绍头孢克肟拼音怎么写,内容包括头孢克肟片全名拼音,头孢克肟片全名拼音,头孢克肟的肟念什么。肟[wò] :是含有羰基的醛、酮类化合物与羟胺作用而生成的有机化合物,可以参与许多有机化学反应,例如经典的Beckmann重排就是肟为底

知识

一库搜用日语怎么写(日语一库是什么意思)

阅读(7980)

本文主要为您介绍一库搜用日语怎么写,内容包括日语大神来,看动漫里的主人公说一句:恰,一库搜这是什么意思,一库一库;一搜库这两个日语是什么意思怎么写,看片都有“一库”(日语)是什么意。一库的意思就是“出发,出去”的意思。日语「行く」的音译

知识

外租无人机广告怎么写(植保无人机广告语)

阅读(6990)

本文主要为您介绍外租无人机广告怎么写,内容包括求一个无人机创意广告词谢谢巨友们了,求一关于无人机的广告标语,求一关于无人机的广告标语我们公司是做无人机的,新成立的公司,求。DJI大疆创新研发的的MG-1农业植保机专为农村作业环境设计,

知识

河南话que怎么写(河南话的nenna怎么写)

阅读(6524)

本文主要为您介绍河南话que怎么写,内容包括que怎么写,河南话的nenna怎么写,que怎么写。尿一壶(niào yī hú)关系密切,观点一致。例:“他俩今天尿一壶啦。”●尿(niào)⑴、从尿道排泄的液体。⑵、排泄小便。⑶、不放

知识

国学经文的论文怎么写(国学征文该怎么写)

阅读(7103)

本文主要为您介绍国学经文的论文怎么写,内容包括国学征文该怎么写,弟子规的400论文,关于国学经典的征文怎么写。“子曰:“温故而知新,可以为师”……小时,总是觉得国学就是没用的,古人写的话,我们还需要背,每次老师教给我们时,我总是会让思想开一

知识

化学实验总结怎么写(化学实验报告小结怎么写)

阅读(5386)

本文主要为您介绍化学实验总结怎么写,内容包括化学实验总结怎么写,化学实验报告小结怎么写,化学实验小结怎么写。化学实验报告的书写: 一般情况下化学实验报告是根据实验步骤和顺序从七方面展开来写的: 1.实验目的:即本次实验所要达到的目标或

知识

蝴蝶豌豆拼音怎么写(豌豆的拼音是什么)

阅读(5819)

本文主要为您介绍蝴蝶豌豆拼音怎么写,内容包括蝴蝶怎么拼音的,豌豆的拼音是什么,蝴蝶的拼音是什么。豌豆的拼音是[wān dòu]。豌豆是豆科一年生攀援草本,高0.5-2米。全株绿色,光滑无毛,被粉霜。叶具小叶4-6片,托叶心形,下缘具

知识

海绵宝宝用英文怎么说(海绵宝宝用英文怎么说)

阅读(6504)

本文主要为您介绍海绵宝宝用英文怎么说,内容包括海绵宝宝用英语怎么说,海绵宝宝用英文怎么说,海绵宝宝英文名是什么。1. SPONGEBOB SQUAREPANTS 近期很夯的一步卡通影片《海绵宝宝》(SpongeBob SquarePants)是一系

知识

茶盏怎么用(茶盏在茶道中干嘛用)

阅读(5412)

本文主要为您介绍茶盏怎么用,内容包括茶盏怎么用我要写一篇200字左右的茶盏的使用说明,求指教,茶盏在茶道中干嘛用,问一下斗笠盏如何使用现在是不是很少有人使用它,它的意义。苏东坡的名句"从来佳茗似佳人",典型地代表了唐宋及以后的文人墨客,

知识

thinkpad小红点怎么用(怎么学习使用thinkpad小红点)

阅读(7572)

本文主要为您介绍thinkpad小红点怎么用,内容包括怎么学习使用thinkpad小红点,thinkpad小红点怎么用,求教:THINKPAD的小红点使用方法。Thinkpad 小红点最高效的使用方法为:左手拇指按左键,无操作时在左键待命2、右手拇指按右键,同时兼按空格键及