當前位置:首頁 » 操作系統 » linux內核usb驅動

linux內核usb驅動

發布時間: 2022-08-29 10:02:53

linux下usb轉串口的驅動怎麼裝啊

Linux發行版自帶usb
to
serial驅動,以模塊方式編譯驅動,在內核源代碼目錄下運行Make
MenuConfig選擇Devces
drivers-->USB
seupport-->
<M>USB
Serial
Converter
support
-->
<M>
USB
driver
for
GSM
and
CDMA
modems
&
[*]USB
Generic
Serial
Driver,保存退出。運行make
moles,編譯成功後可找到usbtoserial.ko及option.ko兩個驅動(2.6以上內核版本模塊驅動用.ko表示)。

❷ 怎樣寫linux下的USB設備驅動程序

寫一個USB的驅動程序最 基本的要做四件事:驅動程序要支持的設備、注冊USB驅動程序、探測和斷開、提交和控制urb(USB請求塊)
驅動程序支持的設備:有一個結構體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,
};
探測和斷開:當 一個設備被安裝而USB核心認為該驅動程序應該處理時,探測函數被調用,探測函數檢查傳遞給它的設備信息,確定驅動程序是否真的適合該設備。當驅動程序因 為某種原因不應該控制設備時,斷開函數被調用,它可以做一些清理工作。探測回調函數中,USB驅動程序初始化任何可能用於控制USB設備的局部結構體,它 還把所需的任何設備相關信息保存到一個局部結構體中,
提交和控制urb:當驅動程序有數據要發送到USB設備時(大多數情況是在驅動程序的寫函數中),要分配一個urb來把數據傳輸給設備:
/* 創建一個urb,並且給它分配一個緩存*/
urb = usb_alloc_urb(0, GFP_KERNEL);
if (!urb) {
retval = -ENOMEM;
goto error;
}
當urb被成功分配後,還要創建一個DMA緩沖區來以高效的方式發送數據到設備,傳遞給驅動程序的數據要復制到這塊緩沖中去:
buf = usb_buffer_alloc(dev->udev, count, GFP_KERNEL, &urb->transfer_dma);
if (!buf) {
retval = -ENOMEM;
goto error;
}

if (_from_user(buf, user_buffer, count)) {
retval = -EFAULT;
goto error;
}
當數據從用戶空間正確復制到局部緩沖區後,urb必須在可以被提交給USB核心之前被正確初始化:
/* 初始化urb */
usb_fill_bulk_urb(urb, dev->udev,
usb_sndbulkpipe(dev->udev, dev->bulk_out_endpointAddr),
buf, count, skel_write_bulk_callback, dev);
urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
然後urb就可以被提交給USB核心以傳輸到設備了:
/* 把數據從批量OUT埠發出 */
retval = usb_submit_urb(urb, GFP_KERNEL);
if (retval) {
err("%s - failed submitting write urb, error %d", __FUNCTION__, retval);
goto error;
}
當urb被成功傳輸到USB設備之後,urb回調函數將被USB核心調用,在我們的例子中,我們初始化urb,使它指向skel_write_bulk_callback函數,以下就是該函數:
static void skel_write_bulk_callback(struct urb *urb, struct pt_regs *regs)
{
struct usb_skel *dev;

dev = (struct usb_skel *)urb->context;

if (urb->status &&
!(urb->status == -ENOENT ||
urb->status == -ECONNRESET ||
urb->status == -ESHUTDOWN)) {
dbg("%s - nonzero write bulk status received: %d",
__FUNCTION__, urb->status);
}

/* 釋放已分配的緩沖區 */
usb_buffer_free(urb->dev, urb->transfer_buffer_length,
urb->transfer_buffer, urb->transfer_dma);
}
有時候USB驅動程序只是要發送或者接收一些簡單的數據,驅動程序也可以不用urb來進行數據的傳輸,這是里涉及到兩個簡單的介面函數:usb_bulk_msg和usb_control_msg ,在這個USB框架程序里讀操作就是這樣的一個應用:
/* 進行阻塞的批量讀以從設備獲取數據 */
retval = usb_bulk_msg(dev->udev,
usb_rcvbulkpipe(dev->udev, dev->bulk_in_endpointAddr),
dev->bulk_in_buffer,
min(dev->bulk_in_size, count),
&count, HZ*10);

/*如果讀成功,復制到用戶空間 */
if (!retval) {
if (_to_user(buffer, dev->bulk_in_buffer, count))
retval = -EFAULT;
else
retval = count;
}
usb_bulk_msg介面函數的定義如下:
int usb_bulk_msg(struct usb_device *usb_dev,unsigned int pipe,
void *data,int len,int *actual_length,int timeout);
其參數為:
struct usb_device *usb_dev:指向批量消息所發送的目標USB設備指針。
unsigned int pipe:批量消息所發送目標USB設備的特定端點,此值是調用usb_sndbulkpipe或者usb_rcvbulkpipe來創建的。
void *data:如果是一個OUT端點,它是指向即將發送到設備的數據的指針。如果是IN端點,它是指向從設備讀取的數據應該存放的位置的指針。
int len:data參數所指緩沖區的大小。
int *actual_length:指向保存實際傳輸位元組數的位置的指針,至於是傳輸到設備還是從設備接收取決於端點的方向。
int timeout:以Jiffies為單位的等待的超時時間,如果該值為0,該函數一直等待消息的結束。
如果該介面函數調用成功,返回值為0,否則返回一個負的錯誤值。
usb_control_msg介面函數定義如下:
int usb_control_msg(struct usb_device *dev,unsigned int pipe,__u8 request,__u8requesttype,__u16 value,__u16 index,void *data,__u16 size,int timeout)
除了允許驅動程序發送和接收USB控制消息之外,usb_control_msg函數的運作和usb_bulk_msg函數類似,其參數和usb_bulk_msg的參數有幾個重要區別:
struct usb_device *dev:指向控制消息所發送的目標USB設備的指針。
unsigned int pipe:控制消息所發送的目標USB設備的特定端點,該值是調用usb_sndctrlpipe或usb_rcvctrlpipe來創建的。
__u8 request:控制消息的USB請求值。
__u8 requesttype:控制消息的USB請求類型值。
__u16 value:控制消息的USB消息值。
__u16 index:控制消息的USB消息索引值。
void *data:如果是一個OUT端點,它是指身即將發送到設備的數據的指針。如果是一個IN端點,它是指向從設備讀取的數據應該存放的位置的指針。
__u16 size:data參數所指緩沖區的大小。
int timeout:以Jiffies為單位的應該等待的超時時間,如果為0,該函數將一直等待消息結束。
如果該介面函數調用成功,返回傳輸到設備或者從設備讀取的位元組數;如果不成功它返回一個負的錯誤值。
這兩個介面函數都不能在一個中斷上下文中或者持有自旋鎖的情況下調用,同樣,該函數也不能被任何其它函數取消,使用時要謹慎。
我們要給未知的USB設備寫驅動程序,只需要把這個框架程序稍做修改就可以用了,前面我們已經說過要修改製造商和產品的ID號,把0xfff0這兩個值改為未知USB的ID號。
#define USB_SKEL_VENDOR_ID 0xfff0
#define USB_SKEL_PRODUCT_ID 0xfff0
還 有就是在探測函數中把需要探測的介面端點類型寫好,在這個框架程序中只探測了批量(USB_ENDPOINT_XFER_BULK)IN和OUT端點,可 以在此處使用掩碼(USB_ENDPOINT_XFERTYPE_MASK)讓其探測其它的端點類型,驅動程序會對USB設備的每一個介面進行一次探測, 當探測成功後,驅動程序就被綁定到這個介面上。再有就是urb的初始化問題,如果你只寫簡單的USB驅動,這塊不用多加考慮,框架程序里的東西已經夠用 了,這里我們簡單介紹三個初始化urb的輔助函數:
usb_fill_int_urb :它的函數原型是這樣的:
void usb_fill_int_urb(struct urb *urb,struct usb_device *dev,
unsigned int pipe,void *transfer_buff,
int buffer_length,usb_complete_t complete,
void *context,int interval);
這個函數用來正確的初始化即將被發送到USB設備的中斷端點的urb。
usb_fill_bulk_urb :它的函數原型是這樣的:
void usb_fill_bulk_urb(struct urb *urb,struct usb_device *dev,
unsigned int pipe,void *transfer_buffer,
int buffer_length,usb_complete_t complete)
這個函數是用來正確的初始化批量urb端點的。
usb_fill_control_urb :它的函數原型是這樣的:
void usb_fill_control_urb(struct urb *urb,struct usb_device *dev,unsigned int pipe,unsigned char *setup_packet,void *transfer_buffer,int buffer_length,usb_complete_t complete,void *context);
這個函數是用來正確初始化控制urb端點的。
還有一個初始化等時urb的,它現在還沒有初始化函數,所以它們在被提交到USB核心前,必須在驅動程序中手工地進行初始化,可以參考內核源代碼樹下的/usr/src/~/drivers/usb/media下的konicawc.c文件。

❸ 請問Linux內核里,USB鍵盤和滑鼠的驅動都是哪些文件

usbhid和usbmouse.c都在/usr/src/linux/drivers/hid/usbhid目錄下

USB 匯流排引出兩個重要的鏈表!

一個 USB 匯流排引出兩個重要的鏈表,一個為
USB 設備鏈表,一個為 USB 驅動鏈表。設備鏈表包含各種系統中的USB 設備以及這些設備的所有介面,驅動鏈表包含 USB 設備驅動程序(usb
device driver)和 USB 驅動程序(usb driver)。

USB 設備驅動程序(usb device driver)和 USB 驅動程序(usb driver)的區別是什麼?

USB 設備驅動程序包含 USB 設備的一些通用特性,將與所有 USB 設備相匹配。在 USB core 定義了:struct usb_device_driver usb_generic_driver。usb_generic_driver 是 USB 子系統中唯一的一個設備驅動程序對象。而 USB 驅動程序則是與介面相匹配,介面是一個完成特定功能的端點的集合。
設備是如何添加到設備鏈表上去的?
在設備插入 USB 控制器之後,USB core 即會將設備在系統中注冊,添加到 USB 設備鏈表上去。

USB 設備驅動程序(usb device driver)是如何添加到驅動鏈表上去的?
在系統啟動注冊 USB core 時,USB 設備驅動程序即將被注冊,也就添加到驅動鏈表上去了。

介面是如何添加到設備鏈表上去的?
在 USB 設備驅動程序和 USB 設備的匹配之後,USB core 會對設備進行配置,分析設備的結構之後會將設備所有介面都添加到設備鏈表上去。比如滑鼠設備中有一個介面,USB core 對滑鼠設備配置後,會將這個介面添加到設備鏈表上去。

USB 驅動程序(usb driver)是如何添加到驅動鏈表上去的?
在每個 USB 驅動程序的被注冊時,USB 驅動程序即會添加到驅動鏈表上去。
比如滑鼠驅動程序,usb_mouse_init 函數將通過 usb_register(&usb_mouse_driver)
將滑鼠驅動程序注冊到 USB core 中,然後就添加到驅動鏈表中去了。其中 usb_mouse_driver 是描述滑鼠驅動程序的結構體。

已配置狀態(configured status)之後話
當滑鼠的設備、介面都添加到設備鏈表,並且滑鼠驅動程序也添加到驅動鏈表上去了,
系統就進入一種叫做已配置(configured)的狀態。
要達到已配置狀態,將經歷復雜的過程,USB core 為 USB
設備奉獻著無怨無悔。在這個過程中,系統將會建立起該設備的的設備、配置、介面、設置、端點的描述信息,它們分別被
usb_device、usb_configuration、usb_interface、usb_host_interface、
usb_host_endpoint 結構體描述。
設備達到已配置狀態後,首先當然就要進行 USB 驅動程序和相應介面的配對,對於滑鼠設備來說則是滑鼠驅動程序和滑鼠中的介面的配對。USB core 會調用usb_bus 匯流排的usb_device_match
函數,通過比較設備中的介面信息和 USB 驅動程序中的 id_table,來初步決定該 USB 驅動程序是不是跟相應介面相匹配。通過這一道關卡後,USB core 會認為這個設備應該由這個驅動程序負責。
然而,僅僅這一步是不夠的,接著,將會調用 USB 驅動程序中的 probe 函數對相應介面進行進一步檢查。如果該驅動程序確實適合設備介面,對設備做一些初始化工作,分配 urb 准備數據傳輸。
當 滑鼠設備在用戶空間打開時,
將提交 probe 函數構建的 urb 請求塊,urb 將開始為傳送數據而忙碌了。urb 請求塊就像一個裝東西的「袋子」,USB
驅動程序把「空袋子」提交給 USB core,然後再交給主控制器,主控制器把數據放入這個「袋子」後再將裝滿數據的「袋子」通過 USB core
交還給
USB 驅動程序,這樣一次數據傳輸就完成了。

❹ LINUX怎麼添加USB串口驅動

Linux發行版自帶usb to serial驅動,以模塊方式編譯驅動,在內核源代碼目錄下運行Make MenuConfig選擇Devces drivers-->USB seupport--> USB Serial Converter support --

❺ linux自帶有usb驅動,為什麼還需要libusb呢,它們的區別是什麼

linux里的軟體分為用戶層和內核層兩種。比如內核里編譯了溫度感測器的驅動,還得有lm-sensors在用戶層負責解釋處理內核遞交出的數據。usb驅動是硬體驅動方面的東西,libusb是給應用軟體開發和usb驅動協同操作(在底層讀取usb內容)的功能時提供的庫。

❻ Linux USB主機控制器驅動的整體結構

USB主機控制器有這些規格:OHCI (Open Host Controller Interface)、UHCI (Universal HostController Interface)、EHCI (Enhanced Host Controller Interface)和xHCI (eXtensible Host ControllerInterface)。OHCI驅動程序用來為非PC系統上以及帶有SiS和ALi晶元組的PC主板上的USB晶元提供支持。UHCI驅動程序多用來為大多數其他PC主板(包括Intel和Via)上的USB晶元提供支持。EHCI由USB2.0規范所提出,它兼容於OHCI和UHCI。由於UHCI的硬體線路比OHCI簡單,所以成本較低,但需要較復雜的驅動程序,CPU負荷稍重。xHCI,即可擴展的主機控制器介面是Intel公司開發的一個USB主機控制器介面,它目前主要是面向USB 3.0的,同時它也支持USB 2.0及以下的設備。
1.主機控制器驅動
在Linux內核中,用usb hed結構體描述USB主機控制器驅動,它包含USB主機控制器的「家務」信息、硬體資源、狀態描述和用於操作主機控制器的hc_driver。
2.EHCI主機控制器驅動
EHCI HCD驅動屬於HCD驅動的實例,它定義了一個ehci_hed結構體,通常作為代碼清單16.6定義的usb_hed結構體的私有數據(hed_priv),這個結構體的定義位於rivers/usb/host/ehci.h中。

❼ linux系統下安裝usb網卡驅動圖文

  1. 確認usb-wifi設備型號 , 根據確認結果選擇驅動信息。

  2. 安裝驅動 mt7601u , 如果已經自帶跳過此步驟

  3. 配置驅動啟動後自動載入。

  4. 重啟驗證是否成功的自動載入驅動模塊。

  5. 確認usb-wifi設備型號 , 根據確認結果選擇驅動信息。


## 初始USB接入時載入顯示

lsusb| grep Ralink

Bus 001 Device 003: ID 148f:2878 Ralink Technology, Corp.

## lsusb執行後顯示信息中有 usb-wifi設備時繼續執行如下命令,進行模式切換(對於存在多模式設備可以正確顯示出wifi設備的真實型號)

usb_modeswitch -KW -v 148f -p 2878

## 模式切換後載入顯示

lsusb| grep Ralink

Bus 001 Device 003: ID 148f:7601 Ralink Technology, Corp.


可以看到型號為 7601 ,據此我們選擇 mt7601u 驅動進行『安裝。


安裝驅動 mt7601u , 如果已經自帶跳過此步驟

方法1:有可能系統內核已經集成好了你需要的驅動模塊,只需要手工載入以下驗證是否有效,如果無效再選擇方法2.

方法2:github 搜索型號的驅動源碼,手動編譯安裝 。


安裝完畢後,需要配置下 wlan0 的配置信息, 創建一個ifcfg-wlan0文件(如果使用的是 NetworkManager 服務可能不需要配置就可以使用了)


$ cat /etc/sysconfig/network/ifcfg-wlan0

BOOTPROTO='dhcp'

BROADCAST=''

DHCLIENT_SET_DEFAULT_ROUTE='yes'

ETHTOOL_OPTIONS=''

IPADDR=''

MTU=''

NAME=''

NETMASK=''

NETWORK=''

REMOTE_IPADDR=''

STARTMODE='auto'

WIRELESS_AP=''

WIRELESS_AP_SCANMODE='1'

WIRELESS_AUTH_MODE='psk'

WIRELESS_BITRATE='auto'

WIRELESS_CA_CERT=''

WIRELESS_CHANNEL=''

WIRELESS_CLIENT_CERT=''

WIRELESS_CLIENT_KEY=''

WIRELESS_CLIENT_KEY_PASSWORD=''

WIRELESS_DEFAULT_KEY='0'

WIRELESS_EAP_AUTH=''

WIRELESS_EAP_MODE=''

WIRELESS_ESSID='CPE_05010'

WIRELESS_FREQUENCY=''

WIRELESS_KEY=''

WIRELESS_KEY_0=''

WIRELESS_KEY_1=''

WIRELESS_KEY_2=''

WIRELESS_KEY_3=''

WIRELESS_KEY_LENGTH='128'

WIRELESS_MODE='Managed'

WIRELESS_NICK=''

WIRELESS_NWID=''

WIRELESS_PEAP_VERSION=''

WIRELESS_POWER='no'

WIRELESS_WPA_ANONID=''

WIRELESS_WPA_IDENTITY=''

WIRELESS_WPA_PASSWORD=''

WIRELESS_WPA_PSK='Abcd1234'

配置驅動啟動後自動載入。

具體配置方法可以參考 man moles-load.d 信息可以詳細理解。


創建一個 mt7601u.conf 文件, 內容如下


# echo "mt7601u" > /etc/moles-load.d/mt7601u.conf

# cat /etc/moles-load.d/mt7601u.conf

mt7601u

重啟驗證是否成功的自動載入驅動模塊。

❽ 求助:幫忙指導一下linux下usb驅動的移植方法

內核里已經做好了很完善的USB驅動了,可以支持大多數USB設備

配置內核,支持USB:
Device drivers --->
SCSI Device support --->
<*> SCSI device support
[*] legacy /proc/scsi/ support
<*> SCSI disk support
[*] HID Devices --->
<*> USB Human Interface Device (full HID) support
[*] /dev/hiddev raw HID device support
[*] USB support --->
<*> Support for Host-side USB
[*] USB device filesystem
[*] USB device class-devices (DEPRECATED)
<*> USB Monitor
<*> OHCI HCD support
<*> USB Mass Storage support
說明:USB Human Interface Device (full HID) support 是對 USB 滑鼠鍵盤的支持
SCSI disk support 和 USB Mass Storage support 是對 U 盤的支持

❾ linux主機側與設備側USB驅動

USB採用樹形拓撲結構,主機側和設備側的USB控制器分別稱為主機控制器((Host Controller)和USB設備控制器(UDC),每條匯流排上只有一個主機控制器,負責協調主機和設備間的通信,而設備不能主動向主機發送任何消息。

在Linux系統中,USB驅動可以從兩個角度去觀察,一個角度是主機側,一個角度是設備側。從上圖主機側去看,在Linux驅動中,處於USB驅動最底層的是USB主機控制器硬體,在其上運行的是USB主機控制器驅動,在主機控制器上的為USB核心層,再上層為USB設備驅動層(插入主機上的U盤、滑鼠、USB轉串口等設備驅動)。因此,在主機側的層次結構中,要實現的USB驅動包括兩類:USB主機控制器驅動和USB設備驅動,前者控制插入其中的USB設備,後者控制USB設備如何與主機通信。Linux內核中的USB核心負責USB驅動管理和協議處理的主要工作。主機控制器驅動和設備驅動之間的USB核心非常重要,其功能包括:通過定義一些數據結構、宏和功能函數,向上為設備驅動提供編程介面,向下為USB主機控制器驅動提供編程介面;維護整個系統的USB設備信息;完成設備熱插拔控制、匯流排數據傳輸控制等。

熱點內容
編譯器怎麼處理c變長數組 發布:2025-05-14 23:31:46 瀏覽:661
存摺每天可以輸錯多少次密碼 發布:2025-05-14 23:22:06 瀏覽:907
安卓手機怎麼找微信隱藏對話 發布:2025-05-14 23:07:47 瀏覽:336
怎麼查看泰拉伺服器ip 發布:2025-05-14 23:03:29 瀏覽:72
c語言學生成績查詢系統 發布:2025-05-14 22:58:30 瀏覽:4
怎麼進別人的伺服器 發布:2025-05-14 22:45:55 瀏覽:772
用編程寫音樂 發布:2025-05-14 22:45:08 瀏覽:782
如何識別電腦的網路配置 發布:2025-05-14 22:38:46 瀏覽:847
pipforpython3 發布:2025-05-14 22:38:34 瀏覽:350
如何把迷你世界的伺服器搞崩 發布:2025-05-14 22:37:15 瀏覽:94