中文字幕 另类精品,亚洲欧美一区二区蜜桃,日本在线精品视频免费,孩交精品乱子片免费

<sup id="3hn2b"></sup>

    1. <sub id="3hn2b"><ol id="3hn2b"></ol></sub><legend id="3hn2b"></legend>

      1. <xmp id="3hn2b"></xmp>

      2. 新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > Linux USB gadget設(shè)備驅(qū)動(dòng)解析(4)--編寫一個(gè)gadget驅(qū)動(dòng)

        Linux USB gadget設(shè)備驅(qū)動(dòng)解析(4)--編寫一個(gè)gadget驅(qū)動(dòng)

        作者: 時(shí)間:2012-08-06 來(lái)源:網(wǎng)絡(luò) 收藏

        一、計(jì)劃

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

        通過(guò)前面幾節(jié)的基礎(chǔ),本節(jié)計(jì)劃簡(jiǎn)單的。重在讓大家快速了解結(jié)構(gòu)。

        上節(jié)中簡(jiǎn)單介紹了zero.c程序。這個(gè)程序考慮到了多配置、高速傳輸、 OTG等因素。應(yīng)該說(shuō)寫的比較清楚,是我們了解架構(gòu)的非常好的途徑。但把這些東西都放在一起,對(duì)很多初學(xué)人員來(lái)說(shuō)還是不能快速理解。那就再把它簡(jiǎn)化一些,針對(duì)S3C2410平臺(tái),只實(shí)現(xiàn)配置、一個(gè)接口、一個(gè)端點(diǎn),不考慮高速及OTG的情況。只完成單向從hoST端接收數(shù)據(jù)的功能,但要把字符結(jié)合在里面。這需要有一個(gè)host端的驅(qū)動(dòng),來(lái)完成向device端發(fā)送數(shù)據(jù)。關(guān)于在主機(jī)端一個(gè)簡(jiǎn)單的程序,有很多的資料。相信大家很快就會(huì)完成的。

        二、功能展示

        1、PC端編寫了一個(gè)us^raNSfer.ko,能夠向device端發(fā)送數(shù)據(jù)

        2、對(duì)目標(biāo)平臺(tái)編寫一個(gè)gadget驅(qū)動(dòng),名稱是g_zero.ko

        3、測(cè)試步驟

        在目標(biāo)平臺(tái)(基于S3C2410)上加載gadget驅(qū)動(dòng)

        # insmod g_zero.ko

        name=ep1-bulk

        smdk2410_udc: Pull-up enable

        # mknod /dev/usb_rcv c 251 0

        #

        在PC主機(jī)上加載驅(qū)動(dòng)us^ransfer.ko

        #insmod us^ransfer.ko

        #mknod /dev/us^ransfer c 266 0

        連接設(shè)備,目標(biāo)平臺(tái)的終端顯示:

        cONnected

        目標(biāo)平臺(tái)讀取數(shù)據(jù)

        # cat /dev/usb_rcv

        PC端發(fā)送數(shù)據(jù)

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

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

        設(shè)備端會(huì)顯示收到的數(shù)據(jù)

        # cat /dev/usb_rcv

        12345

        abcd

        三、代碼分析

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

        /*

        * 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設(shè)備結(jié)構(gòu)

        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 = { //設(shè)備描述符

        .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 = { //端點(diǎn)描述符

        .bLength = USB_DT_ENDPOINT_SIZE,

        .bDescriptorType = USB_DT_ENDPOINT,

        .bEndpointAddress = USB_DIR_OUT, //對(duì)主機(jī)端來(lái)說(shuō),輸出

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

        linux相關(guān)文章:linux教程



        上一頁(yè) 1 2 3 4 5 下一頁(yè)

        評(píng)論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉