• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > Linux USB gadget設備驅動解析(4)--編寫一個gadget驅動

    Linux USB gadget設備驅動解析(4)--編寫一個gadget驅動

    作者: 時間:2012-08-06 來源:網絡 收藏

    一、計劃

    本文引用地址:http://www.czjhyjcfj.com/article/148655.htm

    通過前面幾節的基礎,本節計劃簡單的。重在讓大家快速了解結構。

    上節中簡單介紹了zero.c程序。這個程序考慮到了多配置、高速傳輸、 OTG等因素。應該說寫的比較清楚,是我們了解架構的非常好的途徑。但把這些東西都放在一起,對很多初學人員來說還是不能快速理解。那就再把它簡化一些,針對S3C2410平臺,只實現配置、一個接口、一個端點,不考慮高速及OTG的情況。只完成單向從hoST端接收數據的功能,但要把字符結合在里面。這需要有一個host端的驅動,來完成向device端發送數據。關于在主機端一個簡單的程序,有很多的資料。相信大家很快就會完成的。

    二、功能展示

    1、PC端編寫了一個us^raNSfer.ko,能夠向device端發送數據

    2、對目標平臺編寫一個gadget驅動,名稱是g_zero.ko

    3、測試步驟

    在目標平臺(基于S3C2410)上加載gadget驅動

    # insmod g_zero.ko

    name=ep1-bulk

    smdk2410_udc: Pull-up enable

    # mknod /dev/usb_rcv c 251 0

    #

    在PC主機上加載驅動us^ransfer.ko

    #insmod us^ransfer.ko

    #mknod /dev/us^ransfer c 266 0

    連接設備,目標平臺的終端顯示:

    cONnected

    目標平臺讀取數據

    # cat /dev/usb_rcv

    PC端發送數據

    #echo “12345” > /dev/us^ransfer

    #echo “abcd” > /dev/us^ransfer

    設備端會顯示收到的數據

    # cat /dev/usb_rcv

    12345

    abcd

    三、代碼分析

    下面的代碼是在原有的zero.c基礎上做了精簡、修改的。一些結構的名稱還是保留以前的,但含義有所變化。如:loopback_config,不再表示loopback,而只是單向的接收數據。

    /*

    * zero.c -- Gadget Zero, for simple development

    * lht@farsight.com.cn

    * All rights reserved.*/

    /* #define VERBOSE_DEBUG */

    #include

    #include

    #include

    #include

    #include

    #include gadget_chips.h

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include/* size_t */

    #include/* error codes */

    #include

    #include

    #include

    /*-------------------------------------------------------------------------*/

    stATIc const char shortname[] = zero;

    staTIc const char loopback[] = loop input to output;

    static const char longname[] = Gadget Zero;

    static const char source_sink[] = source and sink data;

    #define STRING_MANUFACTURER 25

    #define STRING_PRODUCT 42

    #define STRING_SERIAL 101

    #define STRING_SOURCE_SINK 250

    #define STRING_LOOPBACK 251

    //#define DRIVER_VENDOR_NUM 0x0525 /* NetChip */

    //#define DRIVER_PRODUCT_NUM 0xa4a0 /* -USB Gadget Zero */

    #define DRIVER_VENDOR_NUM 0x5345 /* NetChip */

    #define DRIVER_PRODUCT_NUM 0x1234 /* -USB Gadget Zero */

    static int usb_zero_major = 251;

    /*-------------------------------------------------------------------------*/

    static const char *EP_OUT_NAME; /* sink */

    /*-------------------------------------------------------------------------*/

    /* big enough to hold our biggest descriptor */

    #define USB_BUFSIZ 256

    struct zero_dev { //zero設備結構

    spinlock_t lock;

    struct usb_gadget *gadget;

    struct usb_request *req; /* for control responses */

    struct usb_ep *out_ep;

    struct cdev cdev;

    unsigned char data[128];

    unsigned int data_size;

    wait_queue_head_t bulkrq;

    };

    #define CONFIG_LOOPBACK 2

    static struct usb_device_descriptor device_desc = { //設備描述符

    .bLength = sizeof device_desc,

    .bDescriptorType = USB_DT_DEVICE,

    .bcdUSB = __constant_cpu_to_le16(0x0110),

    .bDeviceClass = USB_CLASS_VENDOR_SPEC,

    .idVendor = __constant_cpu_to_le16(DRIVER_VENDOR_NUM),

    .idProduct = __constant_cpu_to_le16(DRIVER_PRODUCT_NUM),

    .iManufacturer = STRING_MANUFACTURER,

    .iProduct = STRING_PRODUCT,

    .iSerialnumber = STRING_SERIAL,

    .bNumConfigurations = 1,

    };

    static struct usb_endpoint_descriptor fs_sink_desc = { //端點描述符

    .bLength = USB_DT_ENDPOINT_SIZE,

    .bDescriptorType = USB_DT_ENDPOINT,

    .bEndpointAddress = USB_DIR_OUT, //對主機端來說,輸出

    linux操作系統文章專題:linux操作系統詳解(linux不再難懂)

    linux相關文章:linux教程



    上一頁 1 2 3 4 5 下一頁

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 双牌县| 蓬莱市| 蒙山县| 永年县| 盱眙县| 大姚县| 牙克石市| 磴口县| 黄山市| 池州市| 建平县| 环江| 台南市| 武功县| 璧山县| 正镶白旗| 那曲县| 大同市| 抚州市| 遂川县| 淅川县| 长宁县| 定边县| 文水县| 清水河县| 怀安县| 常山县| 揭西县| 富锦市| 沙湾县| 璧山县| 蒲江县| 卢湾区| 怀宁县| 金昌市| 南雄市| 珲春市| 甘南县| 郓城县| 无锡市| 全椒县|