使用usbfs與核心驅動之間的衝突

2021-08-18 11:51:54 字數 2488 閱讀 7649

usb驅動分為通過usbfs操作裝置的使用者空間驅動,核心空間的核心驅動。兩者不能同時進行,否則容易引發對共享資源訪問的問題,死鎖!使用了核心驅動,就不能在usbfs裡驅動該裝置。libusb中須要先detach核心驅動後,才能claim inte***ce,否則claim會返回的vice busy的錯誤。如果你不dettach,也不claim inte***ce,也能使用libusb對裝置進行訪問,但是,容易導致核心usbfs癱瘓,這是不允許的。

如果不能dettach核心驅動,那麼你不能通過usbfs訪問裝置,也就是不能使用libusb。若確實需要usbfs才能完成的操作,如控制傳輸,中斷傳輸等,可以在核心驅動裡給ioctl新增對應的功能,即可通過核心驅動完成usb裝置的所有原始通訊。

使用libusb讀寫ft232的eeprom,不允許把核心驅動dettach的情況下,經常導致usbfs癱瘓,所有usb都處於disk sleep狀態。這裡我之用得到control傳輸,經過一番思考,我在核心驅動裡面的ioctl裡新增了usbdevfs_control選項,通過核心驅動完成usb control msg,測試了好幾天,沒發現任何問題。好,基本完成任務。

以下是我的操作:

在裝置驅動檔案ftdi_sio.c的ioctl函式裡面新增:

[cpp]view plain

copy

static

intftdi_ioctl (

struct

usb_serial_port *port, 

struct

file * file, unsigned 

intcmd, unsigned 

long

arg)  

dev_printk(kern_debug, &dev->dev, "control read: brequest=%02x brrequesttype=%02x wvalue=%04x windex=%04x\n"

, ctrl.brequest, ctrl.brequesttype, ctrl.wvalue, ctrl.windex);  

i = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), ctrl.brequest, ctrl.brequesttype,  

ctrl.wvalue, ctrl.windex, tbuf, ctrl.wlength, tmo);  

if((i > 0) && ctrl.wlength)   

}  } else

}  dev_printk(kern_debug, &dev->dev, "control write: brequest=%02x brrequesttype=%02x wvalue=%04x windex=%04x\n"

, ctrl.brequest, ctrl.brequesttype, ctrl.wvalue, ctrl.windex);  

i = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), ctrl.brequest, ctrl.brequesttype,  

ctrl.wvalue, ctrl.windex, tbuf, ctrl.wlength, tmo);  

}  free_page((unsigned long

)tbuf);  

if(i<0)   

return

i;  

}  好了,編譯載入後,裝置檔案就支援usb_control_msg了。以下是使用者程式的usb_control_msg

[cpp]view plain

copy

#define ioctl_usb_control   _iowr('u', 0, struct usb_ctrltransfer)

struct

usb_ctrltransfer ;  

static

intusb_control_msg(

intfd, 

intrequesttype, 

intrequest,  

intvalue, 

intindex, 

char

*bytes, 

intsize, 

inttimeout)  

其實,上面的usb_ctrltransfer和usbdevice_fs.h 裡的struct usbdevfs_ctrltransfer是一樣的,只是為了方便查閱,才定義了另外乙個在原始檔裡。

linux-2.6.8.1/include/linux/usbdevice_fs.h

[cpp]view plain

copy

/* usbdevfs ioctl codes */

struct

usbdevfs_ctrltransfer ;  

#define usbdevfs_control           _iowr('u', 0, struct usbdevfs_ctrltransfer)

Linux核心驅動GPIO的使用

linux核心中gpio 是最簡單 最常用的資源 和 interrupt dma,timer一樣 驅動程式,應用程式都能夠通過相應的介面使用gpio,gpio使用0 max int之間的整數標識,不能使用負數,gpio與 硬體體系密切相關的 不過linux 有乙個框架 處理gpio 能夠使用統一的介...

Linux核心驅動GPIO的使用

linux核心中gpio 是最簡單 最常用的資源 和 interrupt dma,timer一樣 驅動程式,應用程式都能夠通過相應的介面使用gpio,gpio使用0 max int之間的整數標識,不能使用負數,gpio與 硬體體系密切相關的 不過linux 有乙個框架 處理gpio 能夠使用統一的介...

linux核心 驅動和硬體之間的關係和通訊

linux驅動是直接和硬體打交道的軟體程式。層次結構上 它處於作業系統和硬體之間。驅動與linux核心的關係 驅動程式提供的一組裝置驅動介面函式device driver inte ce給作業系統在linux中,這一組裝置驅動介面函式一般包括open,close,read,write,ioctl等。...