linux之我是usb
A. linux那些事兒 之 戲說USB我是誰
這是遵照花小錢做大事的原則從ldd3里拿出來的,懶得再去查了,畢竟結果都差不多。上面顯示的是包含一個USB介面的USB滑鼠導出的結果。目錄樹里的
/sys/devices/pci0000:00/0000:00:09.0/usb2/2-1
表示的是滑鼠,下層目錄
/sys/devices/pci0000:00/0000:00:09.0/usb2/2-1/2-1:1.0
表示了滑鼠的USB介面。Sysfs里的usb設備都是類似的表示,設備的目錄下包括了表示設備介面的目錄。目錄里的各個文件表示的設備或介面的描述,大都對應了設備描述符、介面描述符等的相應值,可以通過這些值獲得感興趣的信息。新名詞就像任小強的理論一樣層出不窮,什麼是設備描述符還有介面描述符?不過我們這里要暫時忽略它的存在,先關心關心USB設備在sysfs里是如何命名的,弄清它是誰,也就是說上面路徑的含義。
USB系統中的第一個USB設備是root hub,前面已經說了它是和host controller綁定在一起的。這個root hub通常包含在PCI設備中,是連接PCI匯流排和USB匯流排的bridge,控制著連接到其上的整個USB匯流排。所有的root hub,內核的usb core都分配有獨特的編號,上面貼出來的例子里,就是usb2,因為它注冊在第二個hub。
USB匯流排上的每個設備都以root hub的編號作為其名字的第一個號碼。這個號碼後跟著一個「-」字元還有設備所插入的埠號。因此,上面例子中的USB滑鼠的設備名就是2-1。因為該USB滑鼠具有一個介面,導致了另外一個USB設備被添加到sysfs路徑中。因為物理USB設備和單獨的USB介面在sysfs中都將表示為單獨的設備。USB介面的命名是設備名直到該介面,上面就是2-1後面跟一個「:」和USB配置(Configuration)的編號,然後是一個「.」和該介面的編號。因此上面的滑鼠USB介面就是2-1:1.0,表示使用第一個配置,介面編號為0。
不過,sysfs並沒有展示USB設備的所有部分,設備可能包含的可選配置都沒有顯示,不過這些可以通過usbfs找到,該文件系統被掛在到/proc/bus/usb目錄,從/proc/bus/usb/device文件可以直到系統中存在的所有USB設備的可選配置。
這里說到了USB設備的配置,有必要先說一下,還是花小錢做大事,直接拿復旦人甲兄弟的描述了。一個設備可以有一種或者幾種配置,這能理解吧?沒見過具體的usb設備?那麼好,手機見過吧,每個手機都會有多種配置,或者說「設定」,比如,我的這款,Nokia6300,手機語言,可以設定為English,繁體中文,簡體中文,一旦選擇了其中一種,那麼手機里邊所顯示的所有的信息都是該種語言/字體。還有最簡單的例子,操作模式也有好幾種,標准,無聲,會議,etc。基本上如果我設為「會議」,那麼就是只振動不發聲,要是設為無聲,那麼就啥動靜也不會有,只能憑感覺了,以前去公司面試的話通常就是設為無聲,因為覺得振動也不好,讓人家面試官聽到了還是不合適。那麼usb設備的配置也是如此,不同的usb設備當然有不同的配置了,或者說需要配置哪些東西也會不一樣。好了,關於配置,就說這么多,更多的我們暫時也不需要了解了。
B. 在linux下 如何找到 插入的USB設備所對應的設備文件呢
插入USB設備後,我的設備是U盤。fdisk -l查看u盤設備在哪個分區,比如是/dev/sdb 然後掛載這個分區到/mnt目錄下就可以訪問該U盤設備了 。其他的USB設備沒用過。
C. 怎樣寫linux下的USB設備驅動程序
USB驅動程序基礎
在動手寫USB驅動程序這前,讓我們先看看寫的USB驅動程序在內核中的結構,如下圖:
USB通信最基本的形式是通過端點(USB端點分中斷、批量、等時、控制四種,每種用途不同),USB端點只能往一個方向傳送數據,從主機到設備或者從設備到主機,端點可以看作是單向的管道(pipe)。所以我們可以這樣認為:設備通常具有一個或者更多的配置,配置經常具有一個或者更多的介面,介面通常具有一個或者更多的設置,介面沒有或具有一個以上的端點。驅動程序把驅動程序對象注冊到USB子系統中,稍後再使用製造商和設備標識來判斷是否已經安裝了硬體。USB核心使用一個列表(是一個包含製造商ID和設備號ID的一個結構體)來判斷對於一個設備該使用哪一個驅動程序,熱插撥腳本使用它來確定當一個特定的設備插入到系統時該自動裝載哪一個驅動程序。
上面我們簡要說明了驅動程序的基本理論,在寫一個設備驅動程序之前,我們還要了解以下兩個概念:模塊和設備文件。
模塊:是在內核空間運行的程序,實際上是一種目標對象文件,沒有鏈接,不能獨立運行,但是可以裝載到系統中作為內核的一部分運行,從而可以動態擴充內核的功能。模塊最主要的用處就是用來實現設備驅動程序。Linux下對於一個硬體的驅動,可以有兩種方式:直接載入到內核代碼中,啟動內核時就會驅動此硬體設備。另一種就是以模塊方式,編譯生成一個.ko文件(在2.4以下內核中是用.o作模塊文件,我們以2.6的內核為准,以下同)。當應用程序需要時再載入到內核空間運行。所以我們所說的一個硬體的驅動程序,通常指的就是一個驅動模塊。
設備文件:對於一個設備,它可以在/dev下面存在一個對應的邏輯設備節點,這個節點以文件的形式存在,但它不是普通意義上的文件,它是設備文件,更確切的說,它是設備節點。這個節點是通過mknod命令建立的,其中指定了主設備號和次設備號。主設備號表明了某一類設備,一般對應著確定的驅動程序;次設備號一般是區分不同屬性,例如不同的使用方法,不同的位置,不同的操作。這個設備號是從/proc/devices文件中獲得的,所以一般是先有驅動程序在內核中,才有設備節點在目錄中。這個設備號(特指主設備號)的主要作用,就是聲明設備所使用的驅動程序。驅動程序和設備號是一一對應的,當你打開一個設備文件時,操作系統就已經知道這個設備所對應的驅動程序。對於一個硬體,Linux是這樣來進行驅動的:首先,我們必須提供一個.ko的驅動模塊文件。我們要使用這個驅動程序,首先要載入它,我們可以用insmod
xxx.ko,這樣驅動就會根據自己的類型(字元設備類型或塊設備類型,例如滑鼠就是字元設備而硬碟就是塊設備)向系統注冊,注冊成功系統會反饋一個主設備號,這個主設備號就是系統對它的唯一標識。驅動就是根據此主設備號來創建一個一般放置在/dev目錄下的設備文件。在我們要訪問此硬體時,就可以對設備文件通過open、read、write、close等命令進行。而驅動就會接收到相應的read、write操作而根據自己的模塊中的相應函數進行操作了。
USB驅動程序實踐
了解了上述理論後,我們就可以動手寫驅動程序,如果你基本功好,而且寫過linux下的硬體驅動,USB的硬體驅動和pci_driver很類似,那麼寫USB的驅動就比較簡單了,如果你只是大體了解了linux的硬體驅動,那也不要緊,因為在linux的內核源碼中有一個框架程序可以拿來借用一下,這個框架程序在/usr/src/~(你的內核版本,以下同)/drivers/usb下,文件名為usb-skeleton.c。寫一個USB的驅動程序最基本的要做四件事:驅動程序要支持的設備、注冊USB驅動程序、探測和斷開、提交和控制urb(USB請求塊)(當然也可以不用urb來傳輸數據,下文我們會說到)。
驅動程序支持的設備:有一個結構體struct
usb_device_id,這個結構體提供了一列不同類型的該驅動程序支持的USB設備,對於一個只控制一個特定的USB設備的驅動程序來說,struct
usb_device_id表被定義為:
/* 驅動程序支持的設備列表 */
static struct usb_device_id
skel_table [] = {
{ USB_DEVICE(USB_SKEL_VENDOR_ID, USB_SKEL_PRODUCT_ID)
},
{ } /* 終止入口 */
};
MODULE_DEVICE_TABLE (usb,
skel_table);
對於PC驅動程序,MODULE_DEVICE_TABLE是必需的,而且usb必需為該宏的第一個值,而USB_SKEL_VENDOR_ID和USB_SKEL_PRODUCT_ID就是這個特殊設備的製造商和產品的ID了,我們在程序中把定義的值改為我們這款USB的,如:
/*
定義製造商和產品的ID號 */
#define USB_SKEL_VENDOR_ID 0x1234
#define
USB_SKEL_PRODUCT_ID
0x2345
這兩個值可以通過命令lsusb,當然你得先把USB設備先插到主機上了。或者查看廠商的USB設備的手冊也能得到,在我機器上運行lsusb是這樣的結果:
Bus
004 Device 001: ID 0000:0000
Bus 003 Device 002: ID 1234:2345 Abc Corp.
Bus 002 Device 001: ID 0000:0000
Bus 001 Device 001: ID
0000:0000
得到這兩個值後把它定義到程序里就可以了。
注冊USB驅動程序:所有的USB驅動程序都必須創建的結構體是struct
usb_driver。這個結構體必須由USB驅動程序來填寫,包括許多回調函數和變數,它們向USB核心代碼描述USB驅動程序。創建一個有效的struct
usb_driver結構體,只須要初始化五個欄位就可以了,在框架程序中是這樣的:
static struct usb_driver skel_driver
= {
.owner = THIS_MODULE,
.name = "skeleton",
.probe = skel_probe,
.disconnect = skel_disconnect,
.id_table = skel_table,
};
D. Linux下如何測試及使用USB轉串口線
如果有,則不需要再裝驅動。另外如果有的話最好再用dmesg | grep usb查找如果看到: 「drivers/usb/serial/usb-serial.c: USB Serial support registered for Generic」 就說明設備已被識別,然後往下看 drivers/usb/serial/usb-serial.c: USB Serial support registered for PL-2303 usb 2-2: PL-2303 converter now attached to ttyUSB0 (or usb/tts/0 for devfs)如果沒有則需要驅動程序,一般硬體廠商都會提供,如果真的沒有的話就只有到網上下載了,一般2.6內核以上的都支持。 安裝完畢後再輸入這個命令瞧瞧,是否安裝成功。說明我的usb轉串口晶元是PL-2303,對應系統設備是 dev/usb/ttUSB0,最後只需在minicom配置文件里將埠改成/dev/usb/ttyUSB0就可以使用了:) 3、檢測步驟,檢測步驟如下,只是需要主意的是設置串口設備的時候可能不是ttyS2了,有可能是ttyUSB0或者ttyUSB1等之類的,我這里就是ttyUSB0(我用的是Fedora Core 8)。 因此,最好請您先看一下/dev下面的文件。 USB轉串口安裝 型號PL2303h 1、插入USB轉串口到主機, 2、啟動 Linux,打開終端,檢查是否存在設備/dev/ttyUSB0,如果沒有就建立一個: mknod /dev/ttyUSB0 c 188 0 如果有多個USB口,可以類推,建立/dev/ttyUSB[1-n],注意從設備號要累加, 如:mknod /dev/ttyUSB[1-n] c 188 [1-n] 3、輸入命令:#setserial /dev/ttyS0 -aP (COM-1) 顯示內容:/dev/ttyS0, Line 0, UART: 16550A, Port: 0x3f8, irq: 4 Baud_base: 115200, clos_delay: 50, divisor: 0 closing_wait: 3000, closing_wait2: infinite Flags: spd_normal skip_test 4、輸入命令:#setserial /dev/ttyS2 -a (COM-3) 顯示內容:/dev/ttyS2, Line 2, UART: unknown, Port: 0x3e8, irq: 4 Baud_base: 115200, clos_delay: 50, divisor: 0 closing_wait: 3000, closing_wait2: infinite Flags: spd_normal skip_test 第3、4步操作的目的主要是對主機自帶串口及PCI擴展串口的區別。區別在於4顯示的內容中UART:未知unknow。不過若您檢測這一步的時候 UART為16550A而不是unknow,證明你的系統已經認識了擴展的串口,不需要進一步設置,直接跳入第8步測試就可以了。 5、設置好了後是不是需要測試一下是否能夠通訊呢?最好的辦法是兩台pc相連。如果pc為windows操作系統就用超級終端,是linux呢就用minicom吧 6、裝有linux的機器,首先需要設置一下監聽的串口參數,輸入命令 #minicom -s 進入界面後有個框彈出來,如果你學過英文的話,就會知道選擇哪個的。應該是第三個吧,串口參數設置。
E. linux 中USB介面怎麼掛載
1.USB移動存儲設備通常被識別為sda1,具體可以通過fdisk -l命令查詢。一般外掛點的子目錄都是建立在/mnt裡面的 使用mkdir /mnt/usb 建立一個掛載點,然後mount /dev/sda1 /mnt/usb 進行掛載
2.1. 先別插U盤,/sbin/lsmod看是否有usb-storage。如果沒有的話:
cd /lib/moles/2.4.20-8/kernel/drivers/usb
for v in *.o storage/*.o ; do /sbin/insmod $v ; done 2. 這里再/sbin/lsmod,應該有usbcore、usb-ohci(或usb-uhci,根據主板晶元組而不同)、usb-storage、scsi_mod等。其中usb-storage的狀態應該為 (unused)。
3. 插入U盤,不停的/sbin/lsmod,這期間usb-storage的狀態應為Initializing,持續時間大約半分鍾,其實就相當於Windows在右下角不停的彈汽球:)
4. 初始化結束後, /sbin/fdisk -l,應該能看到/dev/sda1設備。這時,執行mount /dev/sda1 /mnt/udisk 才能成功。如果是MSDOS格式,又想看到中文,可以 mount -t vfat /dev/sda1 /mnt/udisk -o iocharset=gb2312。
(為方便可以/etc/fstab加一行,以後就可以 mount /mnt/udisk就行了)。
F. Linux下如何自己手動使用命令掛載/卸載USB設備
Linux系統下通常都會自動掛載USB設備,如果沒有自動掛載的話就需要自己手動掛載USB設備了,那麼Linux下要如何掛載USB設備呢?不需要的時候又要如何卸載呢?一起來了解下吧。
在掛載之前需要確定下列三種信息
1、要掛載對象的文件系統類型
2、要掛載對象的設備名稱
3、確定掛載點
掛載時使用mount命令:
格式:mount [-參數] [設備名稱] [掛載點]
我們常見的USB設備格式是:FAT32格式、NFTS格式等。
ext2 linux目前常用的文件系統
msdos MS-DOS的fat,就是fat16
vfat windows98常用的fat32
nfs 網路文件系統
iso9660 CD-ROM光碟標准文件系統
ntfs windows NT 2000的文件系統
hpfs OS/2文件系統
掛u盤之前,運行命令cat /proc/partitions,看看現在系統中有哪些分區。
插上u盤以後,再次運行上述命令,看看多出來什麼分區。
1) 插入U盤
2) 輸入 fdisk -l /dev/sda 查看輸出結果,比如我的是這樣的:
代碼如下:
# fdisk -l /dev/sda《/p》 Disk /dev/sda: 131 MB, 131104768 bytes
3 heads, 32 sectors/track, 2667 cylinders
Units = cylinders of 96 * 512 = 49152 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 * 1 2668 128016 6 FAT16
3) 看了上面的輸出就知道U盤所在的設備了,比如我的就是/dev/sdb1,接著便是掛載了
假設我將U盤掛載到/mnt/usb目錄(沒有的話,新建)中,就是mount -t msdos /dev/sdb1 /mnt/usb
如果是fat32
代碼如下:
mount -t vfat /dev/sdb1 /mnt/usb
如果是ext2格式,就用命令:
代碼如下:
mount -t ext2 /dev/sda1 /mnt/usb
4) 打開/mnt/usb 就可以看到你的U盤里的東西了!
代碼如下:
cd /mnt/usb
5) 卸載命令則為:
代碼如下:
umount /mnt/usb。
上面就是Linux下掛載及卸載USB設備的方法介紹了,掛載USB介面設備後就能夠查看移動盤的內容了,而不需要使用的時候也可將其卸載,你學會了嗎?
G. linux下usb驅動,求教,該怎麼處理
系統中沒有USB驅動,只能自己安裝了。安裝具體如下:事先需要插入一張系統光碟(因為所有的系統光碟中都集成了大部分的各種各樣的驅動)到光碟機。再把USB移動硬體插入USB介面,也就是先把USB插入電腦上。之後右下角會提示新硬體被發現,但些此時沒有驅動肯定是用不起的。在彈出的對話框中選擇更新驅動的路徑,這個路徑當然就是剛才放入光碟機中的光碟了。此時電腦會自動搜索光碟中符合USB硬體的驅動。如果沒有自動彈出更新驅動對話框:右擊「我的電腦」-屬性-硬體-設備管理器。剛插入的新硬體因為沒有驅動所以在此對話框中就會顯示一個黃色的問號。再在黃色問號的上邊右擊-選擇更新驅動此時電腦就會自動偵測電腦中符合USB的驅動(當然這個自動就是電腦自動到插入光碟中去搜索)。
H. linux 怎麼通過usb通信
USB驅動程序基礎 在動手寫USB驅動程序這前,讓我們先看看寫的USB驅動程序在內核中的結構,如下圖: USB驅動程序存在於不同的內核子系統和USB硬體控制器之間,USB核心為USB驅動程序提供了一個用於訪問和控制USB硬體的介面,而不必考慮系統當前存在的各種不同類型的USB硬體控制器。USB是一個非常復雜的設備,linux內核為我們提供了一個稱為USB的核心的子系統來處理大部分的復雜性,USB設備包括配置(configuration)、介面(interface)和端點(endpoint),USB設備綁定到介面上,而不是整個USB設備。如下圖所示: USB通信最基本的形式是通過端點(USB端點分中斷、批量、等時、控制四種,每種用途不同),USB端點只能往一個方向傳送數據,從主機到設備或者從設備到主機,端點可以看作是單向的管道(pipe)。所以我們可以這樣認為:設備通常具有一個或者更多的配置,配置經常具有一個或者更多的介面,介面通常具有一個或者更多的設置,介面沒有或具有一個以上的端點。驅動程序把驅動程序對象注冊到USB子系統中,稍後再使用製造商和設備標識來判斷是否已經安裝了硬體。USB核心使用一個列表(是一個包含製造商ID和設備號ID的一個結構體)來判斷對於一個設備該使用哪一個驅動程序,熱插撥腳本使用它來確定當一個特定的設備插入到系統時該自動裝載哪一個驅動程序。 上面我們簡要說明了驅動程序的基本理論,在寫一個設備驅動程序之前,我們還要了解以下兩個概念:模塊和設備文件。 模塊:是在內核空間運行的程序,實際上是一種目標對象文件,沒有鏈接,不能獨立運行,但是可以裝載到系統中作為內核的一部分運行,從而可以動態擴充內核的功能。模塊最主要的用處就是用來實現設備驅動程序。Linux下對於一個硬體的驅動,可以有兩種方式:直接載入到內核代碼中,啟動內核時就會驅動此硬體設備。另一種就是以模塊方式,編譯生成一個.ko文件(在2.4以下內核中是用.o作模塊文件,我們以2.6的內核為准,以下同)。當應用程序需要時再載入到內核空間運行。所以我們所說的一個硬體的驅動程序,通常指的就是一個驅動模塊。 設備文件:對於一個設備,它可以在/dev下面存在一個對應的邏輯設備節點,這個節點以文件的形式存在,但它不是普通意義上的文件,它是設備文件,更確切的說,它是設備節點。這個節點是通過mknod命令建立的,其中指定了主設備號和次設備號。主設備號表明了某一類設備,一般對應著確定的驅動程序;次設備號一般是區分不同屬性,例如不同的使用方法,不同的位置,不同的操作。這個設備號是從/proc/devices文件中獲得的,所以一般是先有驅動程序在內核中,才有設備節點在目錄中。這個設備號(特指主設備號)的主要作用,就是聲明設備所使用的驅動程序。驅動程序和設備號是一一對應的,當你打開一個設備文件時,操作系統就已經知道這個設備所對應的驅動程序。對於一個硬體,Linux是這樣來進行驅動的:首先,我們必須提供一個.ko的驅動模塊文件。我們要使用這個驅動程序,首先要載入它,我們可以用insmod xxx.ko,這樣驅動就會根據自己的類型(字元設備類型或塊設備類型,例如滑鼠就是字元設備而硬碟就是塊設備)向系統注冊,注冊成功系統會反饋一個主設備號,這個主設備號就是系統對它的唯一標識。驅動就是根據此主設備號來創建一個一般放置在/dev目錄下的設備文件。在我們要訪問此硬體時,就可以對設備文件通過open、read、write、close等命令進行。而驅動就會接收到相應的read、write操作而根據自己的模塊中的相應函數進行操作了。 USB驅動程序實踐 了解了上述理論後,我們就可以動手寫驅動程序,如果你基本功好,而且寫過linux下的硬體驅動,USB的硬體驅動和pci_driver很類似,那麼寫USB的驅動就比較簡單了,如果你只是大體了解了linux的硬體驅動,那也不要緊,因為在linux的內核源碼中有一個框架程序可以拿來借用一下,這個框架程序在/usr/src/~(你的內核版本,以下同)/drivers/usb下,文件名為usb-skeleton.c。寫一個USB的驅動程序最基本的要做四件事:驅動程序要支持的設備、注冊USB驅動程序、探測和斷開、提交和控制urb(USB請求塊)(當然也可以不用urb來傳輸數據,下文我們會說到)。 驅動程序支持的設備:有一個結構體struct usb_device_id,這個結構體提供了一列不同類型的該驅動程序支持的USB設備,對於一個只控制一個特定的USB設備的驅動程序來說,struct usb_device_id表被定義為: /* 驅動程序支持的設備列表 */ static struct usb_device_id skel_table [] = { { USB_DEVICE(USB_SKEL_VENDOR_ID, USB_SKEL_PRODUCT_ID) }, { } /* 終止入口 */ }; MODULE_DEVICE_TABLE (usb, skel_table); 對於PC驅動程序,MODULE_DEVICE_TABLE是必需的,而且usb必需為該宏的第一個值,而USB_SKEL_VENDOR_ID和USB_SKEL_PRODUCT_ID就是這個特殊設備的製造商和產品的ID了,我們在程序中把定義的值改為我們這款USB的,如: /* 定義製造商和產品的ID號 */ #define USB_SKEL_VENDOR_ID 0x1234 #define USB_SKEL_PRODUCT_ID 0x2345 這兩個值可以通過命令lsusb,當然你得先把USB設備先插到主機上了。或者查看廠商的USB設備的手冊也能得到,在我機器上運行lsusb是這樣的結果: Bus 004 Device 001: ID 0000:0000 Bus 003 Device 002: ID 1234:2345 Abc Corp. Bus 002 Device 001: ID 0000:0000 Bus 001 Device 001: ID 0000:0000 得到這兩個值後把它定義到程序里就可以了。 注冊USB驅動程序:所有的USB驅動程序都必須創建的結構體是struct usb_driver。這個結構體必須由USB驅動程序來填寫,包括許多回調函數和變數,它們向USB核心代碼描述USB驅動程序。創建一個有效的struct usb_driver結構體,只須要初始化五個欄位就可以了,在框架程序中是這樣的: static struct usb_driver skel_driver = { .owner = THIS_MODULE, .name = "skeleton", .probe = skel_probe, .disconnect = skel_disconnect, .id_table = skel_table, };