PDA

View Full Version : Tạo driver cho USB bằng LibUSB


minh_cly
17-07-2011, 09:37 PM
Sau một thời gian trải nghiệm làm 1 cái thiết bị ngoại vi sử dụng USB, cái phần firmware và software trên PC thì tương đối là dễ, nhưng viết driver cho giao tiếp USB thì khó kinh khủng. Đương nhiên em ko có thời gian để ngồi mò mẫn viết driver nên sẽ dùng cái có sẵn. Hiện nay thấy phổ biến trên diễn đàn toàn xài cái Jungo WinDriver (USB Complete có đề cập) nhưng thằng này là bản quyền, nên em sẽ generate cái driver = LibUSB.
LibUSB là một thư viện kết nối USB, được viết trên Linux => mã nguồn mở, sau đó chuyển qua Win nên các bác an tâm về vụ bản quyền.
Em thích viết C# hơn (em là dân soft, tự nghiên cứu hard) nên sẽ down gói LibUSBDotNet : http://nchc.dl.sourceforge.net/project/libusbdotnet/LibUsbDotNet/LibUsbDotNet%20v2.2.8/LibUsbDotNet_Setup.2.2.8.exe. Còn các bác nào thích viết = VB hay C/C++ thì down gói LibUSB-win32 về : http://nchc.dl.sourceforge.net/project/libusb-win32/libusb-win32-releases/1.2.4.0/libusb-win32-bin-1.2.4.0.zip.
Các bác down mấy cái gói đó về (em xài LibUSBDotNet), cài đặt, cắm thiết bị USB, xong ròy vào thư mục cài đặt, mở file InfWizard.exe, chọn thiết bị vừa cắm, chọn nơi lưu file inf, xong rồi cài driver -> hết.

Sau đây là các lệnh C# để kết nối USB:
Using 2 cái này:
using LibUsbDotNet;
using LibUsbDotNet.Main;
Sau đó dùng lệnh:
UsbDevice usbdev;
UsbDeviceFinder usbdevfinder = new UsbDeviceFinder(VendorID, ProductID);
Cái này là khai báo ban đầu, tạo ra thiết bị USB với VID và PID tương ứng. Sau đó tìm thiết bị bằng lệnh:
usbdev = UsbDevice.OpenUsbDevice(usbdevfinder);
Nếu ko tìm thấy usbdev sẽ bằng null.
Nếu tìm thấy hãy xác lập Configure và Interface bằng lệnh:
IUsbDevice wholeusb = usbdev as IUsbDevice;
if (!ReferenceEquals(wholeusb, null))
{
wholeusb.SetConfiguration(Configure);
wholeusb.ClaimInterface(Interface);
}
Nếu muốn gởi dữ liệu:
writer = ppdev.OpenEndpointWriter(WriteEndpointID.Ep01); //tùy vào Endpoint mà xác lập
int byteWriten = 0;
writer.Write(data, timeout, out byteWriten);
Nếu muốn nhận dữ liệu:
reader = ppdev.OpenEndpointReader(ReadEndpointID.Ep01); //tùy vào Endpoint mà xác lập
int byteReaden = 0;
reader.Read(rev, timeout, out byteReaden);
Sau khi đã làm việc với USB xong xuôi, giải phóng USB bằng lệnh:
UsbDevice.Exit();
Em ko biết viết C/C++ nhiều lắm nên ko biết lệnh trong C ạ.
Thế là xong vụ giao tiếp với USB, em còn trẻ người non dạ, mong các bác đừng trách.

P/S: Em ko biết cách post hình, các bác chỉ em với để bài viết thêm sinh động

thanhth90
15-03-2012, 11:59 PM
Bạn ơi có thể cho mình nick yahoo không,mình có chỗ muốn nhờ bạn giúp.

vuhai_hui
04-11-2012, 09:16 PM
bác cho em hỏi khi em làm theo hướng dẫn rồi thì mình lưu cái file phát sinh đó ở đâu, và có phải thêm LIb vào Reference của project ko?.Khi em làm thì gọi 2 hàm:
using LibUsbDotNet;
using LibUsbDotNet.Main;
thì VC# báo lỗi là không tìm thấy 2 thư viện đó