① 嵌入式linux gadget開發中,usb設備插入PC時,在設備端怎麼捕捉跟主機的連接和斷開
linux 本身就已經有支持熱插拔設備,並在插入和拔出後調用你指定的腳本,google里以linux hotplug做關鍵字搜索即可。
② linux怎麼對USB 埠進行上電和斷電操作
給hub發request,SetPortFeature(PORT_POWER)/ClearPortFeature(PORT_POWER)
③ linux下USB識別不了……急急急……
你用的VMware的虛擬機吧 。首先要處理全屏。如果還U盤還是檢查不到。就應該是掛載問題了。稍微有點麻煩 如果哥們想學的話。仔細看下面的解答。
插入U盤之後,按照下面的步驟:
1.fdisk -l /dev/sd*
通常這一步就能找到U盤,如果U盤有指示燈也會亮,表示被找到。
2.如果執行上一個命令沒有反應,或者某些信息顯示模塊沒有加入
可以lsmod查看一下是否有usb-storage scsi_mod sd_mod模塊。
沒有就modprobe [mole],添加所缺模塊。
然後再試就ok
3.最後就是把U盤mount上去,這里需要先在mnt目錄下面建一個usb目錄
mount /dev/sda /mnt/usb
某些系統需要指定文件系統的類型,可以用
mount -t vfat /dev/sda /mnt/usb
④ linux下無法使用usb介面設備
1.在X-Windows環境中打開「控制中心」,展開「信息→USB設備」控制台樹,查看Linux是否已經正確識別您的USB存儲器,如果沒有看到USB設備信息,那麼您就應該要檢查USB埠是否已經在BIOS中打開,或USB存儲器與電腦的物理連接有沒有連接好了。圖
2.在控制台狀態下輸入如下命令:
fdisk -l /dev/sda
注意:不要在sda後面加通配符「*」或「?」,否則運行命令後返回的信息將不正常。如果您有多個USB設備話,則設備名在Linux下分別表示為sda、sdb、sdc等。
運行上面的命令後,返回表示系統已經找到筆者的USB設備,設備名稱為/dev/sda1、可啟動(Boot下面的那個*表示是活動分區),容量8MB、文件系統為FAT12。
3.在/mnt目錄下建立一個掛裝USB存儲器的目錄:
mkdir /mnt/usb
4.然後再運行裝載設備命令,將USB設備掛裝到/mnt/usb目錄下:
mount -t msdos /dev/sda1 /mnt/usb
注意:如果在圖2中顯示您的USB設備的文件系統為FAT32,請使用mount -t vfat /dev/sda1 /mnt/usb命令裝載USB設備。
5.運行如下命令即可查看USB存儲器中的文件信息:
ls /mnt/usb
然後您就可以像對待硬碟一樣對USB存儲器中的數據進行拷貝、刪除等操作了。
如果您不習慣於在控制台下敲敲打打,還可以在KDE桌面上建立一個指向USB存儲器的快捷方式,用滑鼠完成所有的文件操作,就像在Windows中一樣簡單,建立快捷方式的操作非常簡單:用滑鼠在桌面空白處單擊滑鼠,從彈出的快捷菜單中選擇「新建/硬碟」,右鍵單擊新創建的快捷方式,選擇「屬性」菜單命令,切換到「設備」選項卡,分別輸入USB存儲器的設備名稱、安裝點和文件系統類型。以後只需要單擊該快捷方式即可方便地訪問USB存儲器了。
⑤ usbkbd.c:3:61: 致命錯誤: linux/slab.h:沒有那個文件或目錄 編譯中斷。 怎麼辦,求解救,謝謝
找不到頭文件,這個頭文件一般應該是在內核目錄里,如果找不到就下載內核頭文件來使用
查看當前內核版本 uname -r
我在ubuntu 系統里可以 用這個命令下載內核頭文件 sudo apt-get install linux-heaer2-$(uname -r)
⑥ linux系統下如何關閉USB介面
Linux主機禁用USB介面需要禁用RedHat 5X .
Linux主機的使用USB存儲器的功能。我是這樣操作的:
1.找到驅動所在的目錄:
find /lib/ -name "storage"
/lib/moles/2.6.18-92.el5/kernel/drivers/usb/storage
2.刪除或更名驅動文件:
you can change 「usb-storage.ko」 to another name in these folder
or delete 「usb-storage.ko」.( or rm /lib/moles/`uname -r`/kernel/drivers/usb/storage)
If you restore 「usb-storage.ko」 , system will connect usb without reboot.
重啟後,USB就不能用了。
⑦ 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, };