新聞中心

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

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

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

        一、計劃

        本文引用地址:http://www.104case.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 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 资溪县| 三江| 辽阳县| 闽清县| 兴化市| 岳普湖县| 荔浦县| 镇巴县| 香港| 东阿县| 永清县| 温州市| 金溪县| 蓝山县| 防城港市| 安多县| 息烽县| 图木舒克市| 铁岭市| 肇东市| 稷山县| 辉南县| 博野县| 甘泉县| 两当县| 贵定县| 上饶市| 历史| 桂东县| 通化市| 静宁县| 河源市| 迁西县| 噶尔县| 本溪市| 靖江市| 汝阳县| 贵阳市| 子洲县| 巨鹿县| 辉南县|