首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

linux 2.6下编译usb驱动和arm板进行数据通信(3)

linux 2.6下编译usb驱动和arm板进行数据通信(3)

static int lcd_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
    struct usb_lcd *dev;
    u16 bcdDevice;
    char buf[30];

    dev = (struct usb_lcd *)file->private_data;
    if (dev == NULL)
        return -ENODEV;
   
    switch (cmd) {
    case IOCTL_GET_HARD_VERSION:
        bcdDevice = le16_to_cpu((dev->udev)->descriptor.bcdDevice);
        sprintf(buf,"%1d%1d.%1d%1d",
            (bcdDevice & 0xF000)>>12,
            (bcdDevice & 0xF00)>>8,
            (bcdDevice & 0xF0)>>4,
            (bcdDevice & 0xF));
        if (copy_to_user((void __user *)arg,buf,strlen(buf))!=0)
            return -EFAULT;
        break;
    case IOCTL_GET_DRV_VERSION:
        sprintf(buf,DRIVER_VERSION);
        if (copy_to_user((void __user *)arg,buf,strlen(buf))!=0)
            return -EFAULT;
        break;
    default:
        return -ENOTTY;
        break;
    }

    return 0;
}

static void lcd_write_bulk_callback(struct urb *urb)
{
    struct usb_lcd *dev;

    dev = (struct usb_lcd *)urb->context;

    /* sync/async unlink faults aren't errors */
    if (urb->status &&
        !(urb->status == -ENOENT ||
          urb->status == -ECONNRESET ||
              urb->status == -ESHUTDOWN)) {
        dbg("USBLCD: %s - nonzero write bulk status received: %d",
            __FUNCTION__, urb->status);
    }

    /* free up our allocated buffer */
    usb_buffer_free(urb->dev, urb->transfer_buffer_length,
            urb->transfer_buffer, urb->transfer_dma);
    up(&dev->limit_sem);
}
继承事业,薪火相传
返回列表