亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        嵌入式Linux的USB驅動設計

        2011-05-21 00:41:08李麗宏郝志剛
        電子設計工程 2011年11期
        關鍵詞:描述符驅動程序端點

        李麗宏,郝志剛

        (太原理工大學 信息工程學院,山西 太原 030024)

        隨著計算機外圍硬件的擴展,各種外圍設備使用不同的總線接口,導致計算機外部各種總線繁多,管理困難,USB總線可以解決這些問題,因此而誕生。USB總線提供統(tǒng)一的外沒的接口方式,并且支持熱插拔,方便了廠商開發(fā)設備和用戶使用設備。USB(通用串行總線)是由Microsoft,Compad,Inter和NEC等推出的外圍總線接口,目前已發(fā)展到2.0標準最高支持480 Mb/s的速率,最多可以支持127個外設。

        嵌入式Linux是一款源代碼完全免費的新興操作系統(tǒng),用戶可以用戶可以通過網絡等其他途徑免費獲得,并可以任意修改其源代碼,這是其他的操作系統(tǒng)做不到的。正是由于這一點,Linux得到了廣泛的應用。

        1 Linux中USB設備驅動程序框架及數(shù)據結構

        1.1 USB的體系結構

        USB接口標準支持外部設備和主機之間進行數(shù)據傳送。在USB結構中主機預設各種類型外設使用的總線寬度。當外設和主機在運行時,USB總線允許使用,設置,添加和拆除外設。

        在USB體系結構中一個USB系統(tǒng)可以分成USB設備、USB主機和USB互聯(lián)3個部分。USB互聯(lián)是USB設備和USB主機之間進行連接通信的操作[1],主要包括:

        1)總線拓撲結構:USB主機和USB設備之間的連接方式;

        2)數(shù)據流模式:描述USB通信系統(tǒng)數(shù)據如何從產生方傳遞到使用方;

        3)USB調度:USB總線是一個共享連接,對可以使用的連按進行調度以支持同步數(shù)據傳輸,并避兔優(yōu)先級判斷的開銷。

        圖1 USB體系拓撲結構圖Fig.1 USB system topological structure

        USB的物理連接是有層次的星型結構,如圖1所示。從圖中可以看出USB集線器在一個節(jié)點上連接多個設備,每條線段都是點點連接,每個USB集線器在星形的中心。從主機到設備或者USB集線器,或USB集線器到設備都是點點連接。

        1.2 USB驅動程序的結構

        USB總線在技術層面上是非常簡單的,它是一個單主方式實現(xiàn)的,主機輪詢各種不同的外圍設備,USB另外一個重要的特性是它只擔當設備和主控制器之間通訊通道的角色,對所發(fā)送的數(shù)據沒有任何特殊的內容和結構上的要求。

        Linux支持兩種類型的USB驅動,宿主系統(tǒng)[2]上的驅動程序和設備上的驅動程序。宿主USB驅動程序控制插入其中的USB設備,而USB設備的驅動程序控制設備如何作為一個USB設備和主機通訊。這里主要討論設備驅動。

        圖2 USB驅動程序層次圖Fig.2 USB driver hierarchical graph

        USB的基本通信的形式基本通過端點的東西。USB端點[3]只能往一個方向傳輸數(shù)據,從主機到設備或從設備到主機。USB端點分別具有不同的傳輸數(shù)據的方式,他們有4種類型,分別是:1)控制端點用來控制對USB設備不同部分的訪問。他們用于配置設備,獲取設備信息,獲取設備的狀態(tài)報告,發(fā)送命令到設備。它是一種非周期性的可靠的傳輸。2)中斷端點就是設備傳輸數(shù)據時以一個固定的速率來傳輸少量的數(shù)據。這些端點是鼠標和USB鍵盤所使用的主要傳輸方式。它通常用于發(fā)送數(shù)據到USB設備以控制設備,一般不用來傳輸大量數(shù)據。USB協(xié)議保證這些傳輸有足夠的保留帶寬來傳輸數(shù)據。3)等時端點同樣可以傳輸大批量的數(shù)據,但數(shù)據是否到達沒有保障,這些端點用于可以應付數(shù)據丟失的情況,這類設備更注重于保持一定的恒定的數(shù)據流,實時的數(shù)據收集都使用這類端點。4)批量端點傳輸大量的數(shù)據。這些端點通常比中斷端點大的多他們常用于需要確保沒有數(shù)據丟失的傳輸設備。USB協(xié)議不保證這些傳輸始終可以在特定的時間內完成。如果總線上的空間不足以發(fā)送整個批量包。它將被分割為多個包進行傳輸。

        當一個USB設備連接到主機時,主機會給這個設備分配一個1~127之間的唯一的設備號同時讀取該設備的描述符,該設備描述符是描述設備信息及其屬性的數(shù)據結構,USB以一種層次化的結構定義設備的描述符,設備描述符給出了USB設備的一般信息,包括對設備及所有設備配置起全程作用的信息,一個USB設備只能有一個設備描述符,配置描述符中的信息與設備特定的配置相關,一個USB設備可以有一個或多個配置描述符,每個配置描述符又由一個或多個接口描述符組成,接口描述符的信息是與設備驅動程序的開發(fā)密切相關,可以一個接口對應一個設備驅動程序也可以多個接口對應一個設備驅動程序,接口描述符由零個或多個端點描述符組成,端點描述符定義了在一個給定的設備里實現(xiàn)的實際寄存器.這些描述符定義了每個寄存器的功能和特定的信息如端點要求的傳輸類型、傳輸方向、帶寬要求、查詢間隔等。另外,還有一個可選的字符串描述符,它以UNCOND碼的格式給出了一些可讀的信息,這些信息通常是有關設備生產廠商、設備名設備序列號等,通過這些不同層次的描述符.主機設備驅動程序就可以知道具體設備的相關信息,從而對設備進行相應控制。

        1.3 USB驅動程序框架

        1.3.1 基本數(shù)據結構

        usb-skel設備使用自定義結構usb_skel記錄設備驅動用到的所有描述符,該結構定義如下:struct usb_skel{

        struct usb_device*udev; //USB設備描述符

        struct usb_interface*interface; //USB接口描述符

        struct semaphore limit_sem; //互斥信號量

        unsigned char* bulk_in_buffer;//數(shù)據接收緩沖區(qū)

        size_t bulk_in_size; //數(shù)據接收緩沖區(qū)大小

        _u8 bulk_in_endpointAddr; //入端點地址

        _u8 bulk_out_endpointAddr;//出端點地址

        struct kref kref;

        };

        1.3.2 驅動程序初始化和注銷

        同其他所有的Linux設備驅動程序一樣,usb-skel驅動使用 module_init()宏初始化函數(shù),使用 module_exit()宏注銷函數(shù)。usb-skel驅動的初始化函數(shù)usb_skel_init()函數(shù),定義如下:

        static int_init usb_skel_init(void)

        {

        int result;

        result-usb_register(&skel_driver);//注冊 USB 設備驅動if(result)

        err(“usb_register failed.Error number%d”,result);return result;

        }

        sb_skel_init()函數(shù)調用內核提供的 usb_register()函數(shù)注冊了一個usb_driver類型的結構變量,該變量定義如下:static struct usb_driver skel_driver={

        .name= “skeleton”, //USB 設備名稱

        .probe=skel_probe, //USB設備初始化函數(shù)

        .disconnect=skel_disconnect,//USB設備注銷函數(shù)

        .id_table=skel_table, //USB設備ID映射表};

        其中usb_skel設備的USB ID映射表定義如下:static struct usb_device_id skel_table[]={

        {USB_DEVICE(USB_SKEL_VENDOR_ID,USB_SKEL_PRODUCT_ID)};

        在USB驅動中調用usb_deregister()函數(shù)注銷usb-skel設備驅動,函數(shù)定義如下:

        static void_exit usb_skel_exit(void)

        usb_deregister(&skel_driver); //注銷 USB設備};

        1.3.3 初始化設備

        從skel_driver結構可以知道usb-skel設備的初始化函數(shù)是skel_probe()函數(shù),設備初始化主要是探測設備類型,分配USB設備用到的urb資源[5],注冊USB設備操作函數(shù)等。skel_class結構變量記錄了usb-skel設備信息,定義如下:

        static struct usb_class_driver skel_class={

        .name= “skel%d”, //設備名稱

        .fops= &skel_fops,//設備操作函數(shù)

        .minor_base=USB_SKEL_MINOR_BASE,};

        name變量使用%d通配符表示一個整型變量,當一個usb-skel類型的設備連接到USB總先后會2按照子設備編號自動設置設備名稱。Fops設備操作函數(shù)結構變量,定義如下:

        static struct file_operations skel_fops={

        .owener=THIS_MODULE,

        .read=skel_read, //讀操作

        .write=skel_write, //寫操作

        .open=skel_open, //打開操作

        .release=skel_release, //關閉操作};

        1.3.4 設備注銷

        skel_disconnect()函數(shù)在注銷設備時被調用,定義如下:static void skel_disconnect(struct usb_interface*interface){

        struct usb_skel*dev;

        int minor=interface->minor;

        lock_kernel(); //在操作之前加鎖

        dev=usb_get_intfdata(interface);//獲得USB設備接口描述

        usb_set_intfdata(interface,NULL); //設置USB設備接口描述無效

        usb_deregister_dev(interface,&skel_class);//注銷 USB設備操作描述

        unlock kernel(); //操作完畢解鎖

        kref_put(&dev->kref,skel_delete); //減小引用計數(shù)

        info(“USB Skeleton#%d now disconnected”,minor);};

        2 USB串口驅動

        2.1 驅動初始化函數(shù)

        usb_serial_init()函數(shù)是一個典型的USB設備驅動初始化函數(shù),定義如下:

        static int_int usb_setial_init(viod){

        int i;

        int result;

        usb_tty_driver=alloc_tty_driver(SERIAL_TTY_MINORS);//申請tty設備驅動描述

        if(!usb_tty_driver)

        return-ENOMEM;

        result=bus_reqister(&usb_serial_bus_type);//注冊總線

        if(result)

        {

        err(“Regist bus driver failed”);

        qoto exit_bus;

        }

        usb_tty_driver=>owener=THIS_MODULE;

        usb_tty_driver->driver_name= “usbserial”;//串口驅動名稱

        usb_tty_driver->devfs_name= “usb/tts”;//設備文件系統(tǒng)存放路徑

        usb_tty_driver->name= “ttyUSB”; //串口設備名稱

        usb_tty_driver->major=SERIAL_TTY_MAJOR;//串口設備主設備號

        usb_tty_driver->minor_start=0;//串口設備從設備號起始ID

        usb_tty_driver->type= TTY_DRIVER_TYPE_SERIAL;//設備類型

        usb_tty_driver->subtype = SERIAL_TYPE_NORAML;//設備子類型

        usb_tty_driver->flags=TTY_DREVER_REAL_RAW |TTY_DRIVER_NO_DEVFS;//設備初始化標志

        usb_tty_driver->init_terminos=tty_stb_termios;//串口設備描述

        usb_tty_driver->init_termios.c_cflag =B9600 |CSB |CREAD|HUPCL|CLOCAL;//串口設備初始化參數(shù)

        tty_set_operations(usb_tty_driver,&serial_ops); //串口設備操作函數(shù)

        result=tty_register_driver(usb_tty_driver);//注冊串口驅動

        if(result)

        {

        err(“Regist tty driver failed”);

        goto exit_reg_driver;

        }

        result=usb_register(&usb_serial_driver);//注冊USB驅動

        if(result<0)

        {

        err(“Register driver failed”);

        goto exit_tty;

        }return result;exit_generic:

        usb_deregister(&usb_serial_driver);//注銷串口設備exit_tty:

        tty_unregister_driver(usb_tty_driver);//注銷USB串口設備exit_reg_driver:

        bus_unregister(&usb_serial_bus_type);//注銷總線exit_bus:

        err(“Error Code:%d”,result);put_tty_driver(usb_tty_driver);return result;

        }

        函數(shù)首先調用alloc_tty_driver()函數(shù)分配一個串口驅動描述符;然后設置串口驅動的屬性,包括驅動的主從設備號、設備類型、串口初始化參數(shù)等;串口驅動描述符設置完畢后,調用usb_register()函數(shù)注冊USB串口設備。

        2.2 驅動釋放函數(shù)

        static void__exit usb_serial_exit(void){

        usb_serial_console_exit();

        usb_serial_generic_deregister();

        usb_deregister(&usb_serial_driver);//注銷 USB 設備驅動

        tty_unregister_driver(usb_tty_driver);//注銷串口設備

        put_tty_driver(usb_tty_driver);//減少引用計數(shù)

        bus_unregister(&usb_serial_bus_type);//注銷總線}

        2.3 串口操作函數(shù)

        USB串口設備驅動使用了一個tty_operations類型的結構,該結構包含了串口的所有操作,定義如下:

        static sturct tty_operations serial_ops=

        {

        .open=serial_open, //打開串口

        .close=serial_close, //關閉串口

        .write=serial_write, //串口寫操作

        .write_room=serial_write_room,

        .ioctl=serial_ioctl, //I/O控制操作

        .set_termios=serial_set_termios, //設置串口參數(shù)

        .throttle=serial_throttle,

        .unthrottle=serial_unthrottle,

        .break_ctl=serial_break, //break信號處理

        .chars_in_buffer=serial_chars_in_buffer, //緩沖處理

        .read_pros=serial_read_proc, //串口讀操作

        .tiocmget=serial_tiocmget, //獲取I/O控制參數(shù)

        .tiocmset=serial_tiocmset, //設置I/O控制參數(shù)};

        按上述的步驟和方法通過Insmod命令成功實現(xiàn)了USB驅動程序的加載[4],成功的通過USB串口進行了數(shù)據的讀寫。

        3 結論

        新出的Linux2.6[6]內核加入了對USB2.0[7]的支持,重新定義了usb_class_driver結構體。同時對探測函數(shù)probe和usb_submit_urb做了修改,包含了advanced linux sound Archiecture可以更安全的使用USB設備。

        [1]弓雷.arm嵌入式linux系統(tǒng)開發(fā)詳解[M].北京:清華大學出版社,2010.

        [2]Corbet J,Rubini A,Kroah-Hartma.G.Linux 設備驅動程序[M].魏永明,耿岳,鐘書毅,譯.北京:中國電力出版社,2006.

        [3]韋東山.嵌入式Linux應用開發(fā)完全手冊[M].北京:人民郵電大學出版社,2008.

        [4]楊水清.ARM嵌入式Linux系統(tǒng)開發(fā)技術詳解[M].北京:電子工業(yè)出版社,2008.

        [5]季春志.基于Linux平臺USB視頻設備驅動技術的研究與實現(xiàn)[D].合肥:合肥工業(yè)大學,2009.

        [6]博韋,西斯特.深入分析Linux內核[M].陳莉君,張瓊聲,張宏偉,譯.北京:中國電力,2009.

        [7]熊玉朋,陳興欣,龐俊銳.一種新型移動保密存儲設備[J].現(xiàn)代電子技術,2010(5):89-91.XIONG Yu-peng,CHEN Xing-xin,PANG Jun-rui.New Removable Privacy Storage Equipment[J].Modern Electronics Technique,2010(5):89-91.

        猜你喜歡
        描述符驅動程序端點
        非特征端點條件下PM函數(shù)的迭代根
        基于結構信息的異源遙感圖像局部特征描述符研究
        測繪學報(2022年12期)2022-02-13 09:13:01
        不等式求解過程中端點的確定
        Linux單線程并發(fā)服務器探索
        參數(shù)型Marcinkiewicz積分算子及其交換子的加權端點估計
        利用CNN的無人機遙感影像特征描述符學習
        基丁能雖匹配延拓法LMD端點效應處理
        基于PDIUSBD12的USB接口設計應用研究
        驅動程序更新與推薦
        驅動程序更新與推薦
        亚洲精品二区在线观看| 在线综合亚洲欧洲综合网站| 欧美视频二区欧美影视| 午夜无码亚| 久草中文在线这里只有精品| 男人的天堂av网站| 男人边吃奶边做好爽免费视频| 色综合色综合久久综合频道| 日本少妇又色又紧又爽又刺激| 亚洲色偷偷综合亚洲avyp| 国产一女三男3p免费视频 | 成人a级视频在线播放| 在线播放无码高潮的视频| 亚洲欧美在线视频| 国产亚洲av夜间福利在线观看| 又粗又黑又大的吊av| 亚洲不卡中文字幕无码| 国产精品女同学| 日本视频一中文有码中文| 香港台湾经典三级a视频| 9191在线亚洲精品| 午夜av福利亚洲写真集| av天堂精品久久综合网| 人妻av中文字幕无码专区| 女同性恋精品一区二区三区| 国产午夜精品视频观看| 无码中文亚洲av影音先锋| 在线看亚洲十八禁网站| 国产蜜臀精品一区二区三区| 黄色av一区二区在线观看| 国产男女猛烈视频在线观看| 亚洲三级在线播放| 无人视频在线播放免费| 香港三级日本三级a视频| 成年女人免费v片| 中文字幕丰满人妻被公强| 日韩夜夜高潮夜夜爽无码 | √新版天堂资源在线资源| 日韩成人免费一级毛片| 亚洲香蕉久久一区二区| 亚洲自偷精品视频自拍|