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等。...