新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于USB接口的OTG应用技术开发

基于USB接口的OTG应用技术开发

作者:时间:2012-03-31来源:网络收藏

usb驱动程序由主机驱动程序,usb子系统,usb设备驱动程序组成。在linux操作系统中,存在一个连接usb设备驱动程序和主控制器驱动程序的子系统usbcore,它通过定义一些数据结构,宏和功能函数来抽象所有的硬件设备。usbcore提供了为硬件处理的所有下层接口。包含所有usb设备驱动和主机控制的通用程序,可称为upperapi和lowerapi。usb子系统提供与设备驱动程序的接口,读取并解释usb设备描述符,配置描述符。为usb设备分配唯一的地址,使用默认的配置来配置设备,支持基本的usb命令请求,连接设备与相应的驱动程序,转发设备驱动程序的数据包。

设备驱动程序是内核的一部分,它完成以下的功能:

(1)对设备初始化和释放。

(2)把数据从内核传送到硬件和从硬件读取数据。

(3)读取应用程序传送给设备文件的数据和会送应用程序请求的数据。

(4)监测和处理设备出现的错误。

用户对设备的访问,主要有以下的函数:

open 打开函数,read、write读写函数,ioltrl设备控制函数,用户各类设备的特殊控制。设备驱动程序的设计就是实现上述四个函数与外加一个设备初始化的函数,这些函数在设备驱动程序中可以skel_init()、skel_open()、skel_read()、skel_ioctrl()等调用。声明一个称之为file operation的结构体将用户级的open等函数与设备skel_open()等函数联系起来。

static struct file_operations skel_fops = {
.owner = this_module,
.read = skel_read,
.write = skel_write,
.open = skel_open,
.release = skel_release,
};
打开设备:
static int skel_open(struct inode *inode, struct file *file)
{ struct usb_skel *dev;
struct usb_interface *interface;
int subminor;
int retval = 0;
subminor = iminor(inode);
interface = usb_find_interface(skel_driver, subminor);
if (!interface) {
err ("%s - error, cant find device for minor %d", __function__, subminor);
retval = -enodev;
goto exit;
}
dev = usb_get_intfdata(interface);
if (!dev) {
retval = -enodev;
goto exit;
}
/* increment our usage count for the device */
kref_get(dev->kref);
/* save our object in the files private structure */
file->private_data = dev;
exit:
return retval;
}

read 函数与write 函数稍有不同:程序并没有用urb 将数据从设备传送到驱动程序,而是用usb_bulk_msg 函数代替,这个函数能够在不需要创建urbs 和操作urb函数的情况下来发送数据给设备,或者从设备来接收数据。调用usb_bulk_msg函数并传递一个存储空间,用来缓冲和放置驱动收到的数据,若没收到数据,就失败并返回一个错误信息。

static ssize_t skel_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos)
{ struct usb_skel *dev;
int retval = 0;
dev = (struct usb_skel *)file->private_data;
/* do a blocking bulk read to get data from the device */
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 the read was successful, copy the data to userspace */
if (!retval) {
if (copy_to_user(buffer, dev->bulk_in_buffer, count))
retval = -efault;
else
retval = count;
}
return retval;
}

skel_disconnect函数
当我们释放设备文件句柄时,这个函数会被调用。

static void skel_disconnect(struct usb_interface *interface)
{ struct usb_skel *dev;
int minor = interface->minor;
lock_kernel();
dev = usb_get_intfdata(interface);
usb_set_intfdata(interface, null);
/* give back our minor */
usb_deregister_dev(interface, skel_class);
unlock_kernel();
/* decrement our usage count */
kref_put(dev->kref, skel_delete);
info("usb skeleton #%d now disconnected", minor);
}


结束语

本文是在基于arm9开发板linux操作系统下实现usb接口的otg应用技术,实现了双角色设备的开发。随着otg技术的发展,usb的应用将会更为广泛,并且移动设备间的直接数据传输成为可能。


上一页 1 2 3 下一页

关键词: USB接口 OTG

评论


相关推荐

技术专区

关闭