導航:首頁 > 編程系統 > linuxusb驅動源碼

linuxusb驅動源碼

發布時間:2022-10-18 00:36:18

1. linux的U盤驅動源碼

根據你的描述,估計FUSE不適合你。

參考以下幾個文件吧(我的系統是DEBIAN LENNY)

localhost:/home/aaa/program# apt-cache search libusb
libusb-0.1-4 - userspace USB programming library
libusb-1.0-0 - userspace USB programming library
libusb-1.0-0-dev - userspace USB programming library development files
libusb-dev - userspace USB programming library development files

用apt-get source libusb下載過來的內如如下所示:
total 1688
-rw-r--r-- 1 500 500 2661 2005-02-14 acinclude.m4
-rw-r--r-- 1 500 500 244051 2006-03-04 aclocal.m4
drwxrwxrwx 2 500 500 4096 2006-03-04 apidocs
-rw-r--r-- 1 500 500 130 2004-04-22 AUTHORS
-rw-r--r-- 1 500 500 16833 2006-03-04 bsd.c
-rw-r--r-- 1 500 500 189 2004-01-28 ChangeLog
-rwxr-xr-x 1 500 500 3642 2004-03-12 compile
-rwxr-xr-x 1 500 500 42037 2004-04-12 config.guess
-rw-r--r-- 1 500 500 2467 2006-03-04 config.h.in
-rwxr-xr-x 1 500 500 30221 2004-04-12 config.sub
-rwxr-xr-x 1 500 500 746195 2006-03-04 configure
-rw-r--r-- 1 500 500 6777 2006-03-04 configure.in
-rw-r--r-- 1 500 500 26428 2004-01-28 COPYING
-rw-r--r-- 1 500 500 35685 2006-03-04 darwin.c
drwxr-xr-x 3 root root 4096 02-19 18:51 debian
-rwxr-xr-x 1 500 500 14841 2004-03-12 depcomp
-rw-r--r-- 1 500 500 15021 2006-03-04 descriptors.c
drwxrwxrwx 2 500 500 4096 02-19 18:49 doc
-rw-r--r-- 1 500 500 44099 2006-03-04 Doxyfile
-rw-r--r-- 1 500 500 44154 2006-02-07 Doxyfile.in
-rw-r--r-- 1 500 500 759 2004-01-28 error.c
-rw-r--r-- 1 500 500 716 2004-01-28 error.h
-rw-r--r-- 1 500 500 2043 2006-03-04 INSTALL.libusb
-rw-r--r-- 1 500 500 2063 2004-01-28 INSTALL.libusb.in
-rwxr-xr-x 1 500 500 9208 2004-03-12 install-sh
-rw-r--r-- 1 500 500 1267 2004-01-28 libusb-config.in
-rw-r--r-- 1 500 500 196 2005-02-15 libusb.pc.in
-rw-r--r-- 1 500 500 1290 2006-03-04 libusb.spec
-rw-r--r-- 1 500 500 1293 2006-03-04 libusb.spec.in
-rw-r--r-- 1 500 500 2248 2004-01-28 LICENSE
-rw-r--r-- 1 500 500 19148 2006-03-04 linux.c

2. 如何編譯linux usb驅動

得自己寫makefile文件

ifneq($(KERNELRELEASE),)
obj-m:=xxx.o
else
KERNELDIR?=/lib/moles/$(shelluname-r)/build
PWD:=$(shellpwd)
default:
$(MAKE)-C$(KERNELDIR)M=$(PWD)moles
endif
clean:
rm-rf*.mod.**.o*.ko.*.ko.*.tmp*.*.mod.o.*.*.o.*


其 中xxx是源文件的文件名,在linux下直接執行就可以生成驅動模塊(xxx.ko)了。生成驅動模塊後使用insmod xxx.ko就可以插入到內核中運行了,用lsmod可以看到你插入到內核中的模塊,也可以從系統中用命令rmmod xxx把模塊卸載掉;如果把編譯出來的驅動模塊拷貝到/lib/moles/~/kernel/drivers/usb/下,然後depmod一下, 那麼你在插入USB設備的時候,系統就會自動為你載入驅動模塊的;當然這個得有hotplug的支持;載入驅動模塊成功後就會在/dev/下生成設備文件 了,如果用命令cat /proc/bus/usb/devices,我們可以看到驅動程序已經綁定到介面上了:
T: Bus=03 Lev=01 Prnt=01 Port=01 Cnt=01 Dev#= 2 Spd=12 MxCh= 0
D: Ver= 1.10 Cls=02(comm.) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1
P: Vendor=1234 ProdID=2345 Rev= 1.10
C:* #Ifs= 1 Cfg#= 1 Atr=c0 MxPwr= 0mA
I: If#= 1 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=test_usb_driver /*我們的驅動*/
E: Ad=01(O) Atr=02(Bulk) MxPS= 64 Ivl=0ms
E: Ad=82(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms
此框架程序生成的是skel0(可以自由修改)的設備文件,現在就可以對這個設備文件進行打開、讀寫、關閉等的操作了。

3. linux的U盤驅動源碼

根據你的描述,估計FUSE不適合你。

參考以下幾個文件吧(我的系統是DEBIAN LENNY)

localhost:/home/aaa/program# apt-cache search libusb
libusb-0.1-4 - userspace USB programming library
libusb-1.0-0 - userspace USB programming library
libusb-1.0-0-dev - userspace USB programming library development files
libusb-dev - userspace USB programming library development files

用apt-get source libusb下載過來的內如如下所示:
total 1688
-rw-r--r-- 1 500 500 2661 2005-02-14 acinclude.m4
-rw-r--r-- 1 500 500 244051 2006-03-04 aclocal.m4
drwxrwxrwx 2 500 500 4096 2006-03-04 apidocs
-rw-r--r-- 1 500 500 130 2004-04-22 AUTHORS
-rw-r--r-- 1 500 500 16833 2006-03-04 bsd.c
-rw-r--r-- 1 500 500 189 2004-01-28 ChangeLog
-rwxr-xr-x 1 500 500 3642 2004-03-12 compile
-rwxr-xr-x 1 500 500 42037 2004-04-12 config.guess
-rw-r--r-- 1 500 500 2467 2006-03-04 config.h.in
-rwxr-xr-x 1 500 500 30221 2004-04-12 config.sub
-rwxr-xr-x 1 500 500 746195 2006-03-04 configure
-rw-r--r-- 1 500 500 6777 2006-03-04 configure.in
-rw-r--r-- 1 500 500 26428 2004-01-28 COPYING
-rw-r--r-- 1 500 500 35685 2006-03-04 darwin.c
drwxr-xr-x 3 root root 4096 02-19 18:51 debian
-rwxr-xr-x 1 500 500 14841 2004-03-12 depcomp
-rw-r--r-- 1 500 500 15021 2006-03-04 descriptors.c
drwxrwxrwx 2 500 500 4096 02-19 18:49 doc
-rw-r--r-- 1 500 500 44099 2006-03-04 Doxyfile
-rw-r--r-- 1 500 500 44154 2006-02-07 Doxyfile.in
-rw-r--r-- 1 500 500 759 2004-01-28 error.c
-rw-r--r-- 1 500 500 716 2004-01-28 error.h
-rw-r--r-- 1 500 500 2043 2006-03-04 INSTALL.libusb
-rw-r--r-- 1 500 500 2063 2004-01-28 INSTALL.libusb.in
-rwxr-xr-x 1 500 500 9208 2004-03-12 install-sh
-rw-r--r-- 1 500 500 1267 2004-01-28 libusb-config.in
-rw-r--r-- 1 500 500 196 2005-02-15 libusb.pc.in
-rw-r--r-- 1 500 500 1290 2006-03-04 libusb.spec
-rw-r--r-- 1 500 500 1293 2006-03-04 libusb.spec.in
-rw-r--r-- 1 500 500 2248 2004-01-28 LICENSE
-rw-r--r-- 1 500 500 19148 2006-03-04 linux.c
-rw-r--r-- 1 500 500 3146 2005-02-03 linux.h
-rw-r--r-- 1 500 500 183730 2004-04-12 ltmain.sh
-rw-r--r-- 1 500 500 2220 2006-03-04 Makefile.am
-rw-r--r-- 1 500 500 34139 2006-03-04 Makefile.in
-rwxr-xr-x 1 500 500 10678 2004-03-12 missing
-rw-r--r-- 1 500 500 8 2004-01-28 NEWS
-rw-r--r-- 1 500 500 2546 2006-03-04 README
-rw-r--r-- 1 500 500 2556 2006-03-04 README.in
drwxrwxrwx 2 500 500 4096 2006-03-04 tests
-rw-r--r-- 1 500 500 6443 2006-03-04 usb.c
-rw-r--r-- 1 500 500 8367 2006-03-04 usb.h.in
-rw-r--r-- 1 500 500 1771 2006-03-04 usbi.h
-rw-r--r-- 1 500 500 13511 2006-03-04 usbpp.cpp
-rw-r--r-- 1 500 500 24428 2005-02-10 usbpp.h
可以從usb.c, usb.h.in入手來研究。

4. linux下的usb手柄驅動代碼,注意,是代碼。萬分感謝!!

代碼是什麼東東?

內核裡面就有 USB 手柄的 USB HID 驅動了啊。而且也有專門的型號的驅動。
調用我記得 xorg 通用 evdev 就能支持。

5. 怎樣寫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文件。

6. linux下usb驅動程序開發有哪些背景及其意義

在Linux kernel源碼目錄中driver/usb/usb-skeleton.c為我們提供了一個最基礎的USB驅動程序。我們稱為USB骨架。通過它我們僅需要修改極少的部分,就可以完成一個USB設備的驅動。我們的USB驅動開發也是從她開始的。

7. linux下usb驅動程序開發有哪些背景及其意義

在Linux kernel源碼目錄中driver/usb/usb-skeleton.c為我們提供了一個最基礎的USB驅動程序。

8. LINUX怎麼添加USB串口驅動

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

閱讀全文

與linuxusb驅動源碼相關的資料

熱點內容
無廣告在線觀看電影電視劇網站 瀏覽:511
有個機械人短發女孩的電影 瀏覽:701
c多線程資料庫 瀏覽:419
3d左右分屏高清電影下載 瀏覽:316
女主向晚 瀏覽:357
蘋果6步行運動數據在哪裡看 瀏覽:492
下巴長睾丸電影 瀏覽:529
linux監控cpu內存 瀏覽:9
帶著智能手機闖盪異世界輕小說 瀏覽:91
java判斷是不是迴文數 瀏覽:750
一個泰國電影女的給小孩餵奶最後發現是人販子 瀏覽:41
d盤的壓縮文件打不開怎麼辦 瀏覽:411
泰國電影審判2004完整版在線觀看 瀏覽:737
國外在線 瀏覽:987
免費,無需下載的網站 瀏覽:701
給眼睛按個摩電影叫什麼 瀏覽:518
主角是輔助的異界小說 瀏覽:736
中英文字幕的電影男女 瀏覽:201
javastring多個空格 瀏覽:62
愛戀墨菲把孩子怎麼了 瀏覽:382

友情鏈接