Lập trình các thiết bị USB đơn giản trong Delphi. Sách: Giao diện USB (thực hành sử dụng và lập trình)

Cuốn sách chứa đựng những thông tin cần thiết để tạo ra thiết bị USB và driver cho hệ điều hành
Microsoft Windows 2000/XP. Quá trình tạo một thiết bị USB được xem xét: từ việc viết chương trình vi điều khiển
(ví dụ được triển khai cho bộ vi xử lý AT89C5131) trước khi phát triển thực tế WDM-tài xế. Chứa
mô tả các lớp thiết bị đặc biệt: lớp HID, giúp loại bỏ nhu cầu phát triển trình điều khiển và
Lớp CDC, cho phép bạn làm việc với USB như với cổng COM thông thường. Việc sử dụng các chức năng được xem xét
API đầu vào thô, đầu vào trực tiếp và thiết lập, bao gồm một số lượng lớn lời khuyên và ví dụ thực tế
các chương trình trong Delphi, C và C#. Để thuận tiện cho độc giả, mọi thứ mã nguồnđược đưa ra trong tệp đính kèm
ĐĨA CD.

Cuốn sách là sự tiếp nối của cuốn sách năm 2004 ""
Cơ sở của cuốn sách chủ yếu là những câu hỏi mà độc giả đặt ra khi đọc cuốn sách đầu tiên.
Ngoài ra, một số tính năng có thể được thêm vào phòng mổ cũng được xem xét. Hệ thống Windows XP,
đơn giản hóa đáng kể công việc với giao diện USB. Tính năng DirectX Reading cũng sẽ được thảo luận
Dữ liệu thiết bị HID - lớp chức năng DirecInput

Cuốn sách này dành cho ai?
Cuốn sách này dành cho các lập trình viên thực hành.
Nó không chứa thông tin về phần cứng USB mà hoàn toàn dành cho các câu hỏi
lập trình.

Tên sách: Thực hành lập trình USB
Tác giả: Agurov Pavel Vladimirovich
Năm phát hành: 2006
Phiên bản: BHV-Petersburg
Số trang: 624
Định dạng tệp: DjVu
Kích thước tệp: 6,1 MB

Nội dung
Giới thiệu
Phần 1. Thông tin chung về USB
Chương 1.Đặc điểm kỹ thuật USB
Chương 2. Lập trình bằng C cho vi điều khiển
Chương 3.Công cụ
Chương 4. Nguyên tắc sử dụng hàm Win32 trong .NET
Phần 2 Các lớp USB
Chương 5. Lớp CDC
Chương 6. Lớp HID
Chương 7. Các lớp USB khác
Phần 3: Thực hành lập trình USB
Chương 8.Tạo thiết bị USB dựa trên AT89C5131
Chương 9 Triển khai lớp CDC
Chương 10. Triển khai lớp HID
Chương 11. Đặc biệt Tính năng của Windows
Chương 12. Phát triển trình điều khiển
Phần 4 Sổ tay
Chương 13. Định dạng tệp INF.
Chương 14. Chức năng cơ bản các cửa sổ
Chương 15. Cấu trúc và chức năng của Windows cho cổng nối tiếp
Chương 16. Cấu trúc và chức năng của API thiết lập Windows
Chương 17. Cấu trúc và chức năng của Windows HID API
Các ứng dụng.

Nhưng chỉ kết nối vật lý thiết bị với máy tính là chưa đủ, bạn còn cần thiết lập trao đổi dữ liệu giữa chúng. Làm cách nào để chọn cổng và tổ chức kết nối? Một vài năm trước, giải pháp tiêu chuẩn là sử dụng cổng COM. Nhân tiện, nhiều chuyên gia vẫn đang cài đặt 8, 16 hoặc thậm chí 32 cổng COM trên máy tính công nghiệp (có toàn bộ danh mục nhiều loại thẻ mở rộng nối tiếp PCI, bộ điều khiển, v.v.). Do đó, nếu bạn cần kết nối một số thiết bị bên ngoài với giao diện RS-232, bạn có thể cần các bộ điều hợp đắt tiền và các thẻ mở rộng kỳ lạ, theo truyền thống cũ, những thẻ này sẽ phải di chuyển đến Nga bằng tàu thủy trong nhiều tuần. Nhân tiện, tên của bộ chuyển đổi thông thường “Bộ chuyển đổi DB9m/DB25f” chỉ có thể gây khó chịu cho người quản lý cửa hàng máy tính.

Thiết bị HID là gì

Ngày nay, hầu hết tất cả các thiết bị đều được kết nối với máy tính thông qua giao diện USB. Vì vậy, nhiều PC mới hoàn toàn không có cổng COM.

Giao diện USB- giải pháp chuẩnđể ghép nối một thiết bị bên ngoài mới với máy tính, chính xác hơn là giao diện HID dựa trên giao thức USB 1.1.

Mặc dù nhiều người cho rằng giao diện HID (Human Interface Device) chỉ dành cho bàn phím, chuột và cần điều khiển nhưng nó phù hợp với nhiều giải pháp liên quan đến ghép nối thiết bị bên ngoài với máy tính.

Nếu người dùng cần thực hiện trao đổi dữ liệu tốc độ thấp (lên tới 64 kbit/s) và đồng thời muốn giảm thời gian phát triển trình điều khiển tẻ nhạt của riêng mình, thì HID khá phù hợp với anh ta. Đầu ra sẽ đơn giản và hoàn toàn giải pháp hiện đại dựa trên giao diện phần mềm USB tiêu chuẩn với sự hỗ trợ được đảm bảo trên tất cả các nền tảng phần mềm phổ biến.

Thuộc tính thiết bị HID

Từ quan điểm tổ chức hỗ trợ phần mềm cho thiết bị HID, mọi thứ trông khá hấp dẫn: làm việc theo Kiểm soát cửa sổ bạn có thể nhanh chóng tạo mã nhỏ gọn, dễ hiểu dựa trên các thuật toán đã được chứng minh, làm sẵn. Đồng thời, nhà phát triển sẽ có nhiều thời gian để thực hiện giao thức trao đổi dữ liệu của riêng mình cấp cao nhất, vì mức độ trừu tượng cần thiết đã được tổ chức thông qua giao thức HID (xem bảng). Ngoài ra, lập trình viên có thể dễ dàng gỡ lỗi giao thức trao đổi bằng văn bản (tất nhiên, nếu có thiết bị HID đang hoạt động) - do độ cứng tương đối của chính giao thức, chỉ cần phát triển một chương trình hỗ trợ máy tính cho giao thức là đủ. thiết bị. Vẫn sẽ như vậy! Người tạo ra thiết bị HID đã đảm nhận rất nhiều công việc.

Tổ chức trao đổi dữ liệu giữa thiết bị HID và máy tính

Để mô tả sự tương tác của thiết bị HID với máy tính, chúng tôi sẽ sử dụng thuật ngữ “máy chủ”. Trong trường hợp này, nó có nghĩa là thiết bị điều khiển trong kiến ​​trúc vật lý chung của sự tương tác thông qua giao thức USB. Vì vậy, tất cả các cổng trên máy tính đều là máy chủ. Bạn có thể kết nối với họ các thiết bị USB khác nhau(ổ đĩa flash, chuột, webcam, máy ảnh, v.v.) không có máy chủ. Máy chủ cung cấp khả năng khám phá thiết bị, kết nối, ngắt kết nối, cấu hình cũng như thu thập số liệu thống kê và quản lý năng lượng.

Thiết bị HID có thể đặt tần suất thăm dò riêng để xác định xem nó có chứa bất kỳ dữ liệu mới nào không. Điều này có nghĩa là ngay cả ở mức thấp như vậy, người lập trình vẫn có thể tin cậy vào hệ thống vì tần số hỏi vòng và các thông số truyền thông khác phải được cài đặt sẵn trong chương trình bộ điều khiển thiết bị HID. Đây là điểm khác biệt giữa giao thức HID với mô tả chung USB 1.1 hoặc USB 2.0, không có yêu cầu nghiêm ngặt về giao thức. Tuy nhiên, đối với những công việc cụ thể đòi hỏi mức cao hơn bảo mật, có thể khá khó khăn để thoát khỏi việc bỏ phiếu theo chu kỳ khi hầu hết các khối dữ liệu giống nhau được truyền liên tục.

Tính năng lập trình thiết bị HID

Thiết bị HID có bộ mô tả đặc biệt. Khi máy chủ xác định rằng thiết bị thuộc lớp HID, nó sẽ chuyển quyền điều khiển thiết bị đó cho trình điều khiển thích hợp. Người ta cho rằng việc trao đổi dữ liệu tiếp theo được thực hiện dưới sự lãnh đạo của ông.

Trong Windows, nó chịu trách nhiệm truy cập các thiết bị HID dịch vụ hệ thống HidServ. Thông tin chi tiết hơn về chức năng yêu cầu thiết bị HID và các tính năng khác khi làm việc với trình điều khiển HID được mô tả trong tác phẩm của P. V. Agurov “ Giao diện USB. Thực hành sử dụng và lập trình” (St. Petersburg: BHV-Petersburg, 2005).

Lập trình thiết bị HID ở “cấp cao nhất”

Cuộc sống khó khăn của các lập trình viên “ứng dụng” làm việc trong Pascal trở nên dễ dàng hơn nhờ mô-đun HID đã được kiểm chứng. P.A.S. vỏ bọcđể trốn. dll (Thư viện người dùng ẩn - như được chỉ định trong thuộc tính tệp). Các nhận xét cho tệp cho biết rằng nó dựa trên các mô-đun hidsdi.h và hidpi.h của Microsoft. Và chính tập tin HID. PAS là một phần của gói JEDI().

Để làm việc với thiết bị HID trong môi trường Delphi cho win32, thành phần TJvHidDeviceController được sử dụng, đây là một trình quản lý toàn cầu thuận tiện để truy cập các thiết bị HID. Và trên cơ sở đó, bạn có thể lấy một phiên bản đối tượng để làm việc với một thiết bị cụ thể.

Các thuộc tính và sự kiện cơ bản của thành phần TJvHidDeviceController

Hãy xem xét thành phần TJvHidDeviceController chi tiết hơn. Sự kiện OnArrival được kích hoạt khi một thiết bị HID truy cập (kết nối) với hệ thống; quyền truy cập vào thiết bị được cung cấp trong trình xử lý sự kiện này thông qua một phiên bản của lớp TJvHidDevice. Sự kiện OnDeviceChange đơn giản phản ứng với những thay đổi về trạng thái của thiết bị; nó chỉ báo hiệu những thay đổi trong hệ thống. Sự kiện OnDeviceData được kích hoạt khi dữ liệu đến từ một trong các thiết bị HID và chuyển thông tin sau tới trình xử lý: HidDev: TJvHidDevice; - thiết bị mà dữ liệu được nhận;

Sự kiện OnDeviceDataError thông báo về lỗi truyền dữ liệu bằng cách chuyển các tham số HidDev tới quy trình xử lý: TJvHidDevice; - Thiết bị HID và Lỗi: DWORD; - mã lỗi. Sự kiện OnDeviceUnplug thông báo rằng một thiết bị bị xóa khỏi danh sách các thiết bị đã cài đặt trên hệ thống. Các loại trình xử lý sự kiện trên Plug và Unplug giống nhau (trong văn bản nguồn: TJvHidUnplugEvent = TJvHidPlugEvent). Một đối tượng của lớp TJvHidDevice tương ứng với thiết bị HID được chuyển tới bộ xử lý.

Để liệt kê tuần tự các thiết bị HID có sẵn trong hệ thống bằng cách gọi phương thức Enumerate, sự kiện OnEnumerate được dự định, tức là trong trình xử lý sự kiện, các thiết bị tìm thấy sẽ được chuyển tuần tự dưới dạng đối tượng. Sự kiện này bị ép buộc bởi phương thức Enumerate, được sử dụng để “chuyển” các thiết bị HID hiện có thông qua một trình xử lý, chẳng hạn như khi sửa đổi trạng thái của thiết bị HID theo sáng kiến ​​của máy chủ (máy tính).

Sự kiện OnRemoval được kích hoạt khi một thiết bị bị xóa khỏi hệ thống về mặt vật lý và có cùng loại trình xử lý TJvHidUnplugEvent như đối với OnDeviceUnplug. Hàm CountByProductName trả về số lượng thiết bị khớp với tên sản phẩm được chỉ định trong đối số và CountByVendorName trả về tên nhà sản xuất được chỉ định trong đối số.

Các thuộc tính và sự kiện chính của lớp TJvHidDevice

Lớp TJvHidDevice là biểu diễn ảo của một thiết bị HID. Như đã đề cập, một đối tượng mới của lớp này có thể được lấy từ sự kiện OnArrival hoặc OnEnumerate. Chức năng của các lớp TJvHidDeviceController và TJvHidDevice được sao chép một phần, vì lớp đầu tiên tích hợp các công cụ phổ biến để làm việc với một bộ thiết bị HID có sẵn trong hệ thống và cơ chế truy cập một trong số chúng. Một thiết bị có thể được xác định duy nhất bằng các thuộc tính SerialNumber, ProductName và VendorName của nó. Để có được thông tin về việc dữ liệu đến bằng cách sử dụng đối tượng đó, bạn có thể sử dụng sự kiện OnData. Dữ liệu được gửi thông qua phương thức WriteFile (theo nghĩa chặt chẽ - thông qua một hàm). WriteFile là một trình bao bọc chức năng hệ thống WriteFile(kernel32).

Để kiểm soát xem thiết bị đã bị xóa hay chưa, bạn nên chỉ định trình xử lý của riêng mình cho sự kiện OnUnplug. Trước khi bắt đầu trao đổi dữ liệu với thiết bị HID, bạn cần đảm bảo rằng việc trao đổi đó có thể thực hiện được bằng HasReadWriteAccess. Lớp này thậm chí còn có sự kiện OnDataError riêng khi xảy ra lỗi trao đổi dữ liệu.

Bây giờ chúng ta hãy xem các đoạn mã từ một dự án “trực tiếp” triển khai thử nghiệm ứng dụng kháchđể tổ chức trao đổi dữ liệu với một thiết bị không chuẩn - thẻ chip nhựa dựa trên HID. Trong cuộc đấu tranh cho chủ nghĩa hiện thực, tác giả đã tự mình quyết định không loại bỏ các kết nối mã công nghệ “thêm” khỏi danh sách.

Phương pháp ScanDevices (Liệt kê 1) nhằm mục đích bắt đầu quá trình tìm kiếm hệ thống để tìm thiết bị HID được yêu cầu. Hầu hết mã, ngoại trừ lệnh gọi phương thức Enumerate, là tùy chọn và mang lại sự linh hoạt cho ứng dụng, chẳng hạn như khả năng hoạt động trên giao diện không phải HID có thể được thêm vào cùng một chương trình thử nghiệm. Phương thức AddError hiển thị thông tin gỡ lỗi trong cửa sổ khi chương trình đang chạy.

Liệt kê 2 hiển thị một trình xử lý sự kiện OnEnumerate để tìm thiết bị bên ngoài được yêu cầu. Để đơn giản, chúng tôi sẽ giả định rằng chương trình chỉ có thể hoạt động với một thiết bị thuộc loại mà nó cần.

Trước khi xem xét việc triển khai thêm dự án, chúng ta nên nói một chút về định dạng trao đổi dữ liệu cấp cao nhất được áp dụng, tức là về cấu trúc được thiết kế để làm trung gian giữa các phương thức nhận và truyền dữ liệu và vấn đề cụ thể đang được giải quyết. nhiệm vụ áp dụng. Thực tế là ở đây nhà phát triển có cơ hội hiện thực hóa khả năng sáng tạo của mình. Hay đúng hơn là các nhà phát triển, bởi vì quá trình tạo một giao thức mới thường diễn ra hai chiều và người chơi cảm thấy khó thực hiện thuật toán trao đổi hơn sẽ chơi trò chơi đầu tiên. Nói chung, bất kể giao thức trao đổi là gì, việc làm cho mỗi thực thể phần mềm trở nên trực quan và tự cung cấp nhất có thể luôn là điều tốt, ngay cả khi phải trả giá bằng một số truyền thống được chấp nhận rộng rãi. Vì Quyết định tốt nhất- điều gì đó sẽ được triển khai trong thời gian ngắn với sự kết nối tối thiểu với môi trường phần mềm và với những khả năng tuyệt vời phát triển hơn nữa. Dựa trên những nguyên tắc này, một giao thức trao đổi cấp cao nhất đã được tạo ra, trong đó khái niệm chính là “lệnh”. Liệt kê 3 cho thấy tác giả yêu thích dữ liệu chuỗi đến mức nào, điều này đã giúp anh ta nhiều lần trong quá trình gỡ lỗi. module phần mềm. Thật tuyệt vời làm sao khi chúng ta còn có cả kiểu String! Tất cả các lệnh giao thức được chia thành các danh mục (lớp), trong đó có một mã lệnh đặc trưng duy nhất cho mục đích của nó. Tham số edParam được sử dụng để gửi dữ liệu đến thiết bị và tham số edAnswerData chứa dữ liệu nhận được từ thiết bị. Kiểu chuỗi Các thành viên được mô tả của bản ghi cho phép bạn thao tác dữ liệu một cách tự do và rõ ràng ở định dạng chuỗi HEX. Và điều tuyệt vời nhất là định dạng của bản ghi được mô tả về mặt ý thức hệ nằm ở đâu đó giữa mục đích trực tiếp của nó và các hình thức trình bày khác nhau của nó (INI, HEX, XML, v.v.)

Việc thực thi lệnh, tức là gửi dữ liệu đến thiết bị, được thực hiện bằng cách gửi các gói dữ liệu dài 8 byte (Liệt kê 4). Độ dài này không phải là giải pháp duy nhất; sự lựa chọn này được quyết định bởi các yêu cầu của giao thức cấp trên và có thể khác nhau trong từng trường hợp cụ thể. Như họ nói, đây là vấn đề về hương vị. Cờ IsUSBMode kỳ lạ trong phương thức Thực thi Lệnh (Liệt kê 5 trong PC World) được để lại như một lời nhắc nhở rằng chúng ta có thể cần sử dụng cổng COM hoặc một số giao diện khác thay vì làm việc với USB. Khi bắt đầu nhóm dữ liệu đã gửi, một chuỗi đồng bộ hóa có định dạng được chọn ngẫu nhiên (ví dụ: 3E3E3E2B) được truyền đến thiết bị, thông báo cho thiết bị rằng thiết bị có dữ liệu hoàn toàn hợp pháp ở đầu vào. Hãy để tôi nhắc bạn rằng trong trường hợp này Chúng ta đang nói về không nói nhiều về HID mà là về một giao thức cấp cao nhất cụ thể, tách biệt về mặt ý thức hệ với phần cứng và nhằm giải quyết các vấn đề ứng dụng đặc biệt.

Trình xử lý GetDataExecutor cho dữ liệu nhận được từ thiết bị (gói 8 byte) sử dụng sự kiện OnNewInputData được tạo đặc biệt để truyền dữ liệu được xử lý ban đầu để xử lý tiếp, cho biết giá trị cũ và mới của chúng (Danh sách 6 trên “World of PC Disk ”). Bằng cách này, các sự kiện đến dữ liệu thô và các chỉ báo để xử lý tiếp sẽ được tách riêng, cho phép sớm bổ sung một số thuật toán cụ thể để cảnh báo chống lại thông tin đầu vào sai, trùng lặp hoặc không cần thiết.

Các ví dụ được trình bày ở đây về cách làm việc với thiết bị HID minh họa ý tưởng chung bài viết - sự dễ dàng tương đối của việc lập trình các thiết bị HID không chuẩn bằng Delphi.

Sách hay, giải thích được nhiều điều. Nó sẽ hữu ích cho những ai muốn hiểu cách truyền dữ liệu qua bus USB.

Giới thiệu 1
Cuốn sách này dành cho ai: 2
Những gì bạn sẽ tìm thấy trong cuốn sách 2
Yêu cầu phần mềm 3
Yêu cầu phần cứng 4
VỀ Mã chương trình 4
Mô tả ngắn gọn về chương 4
Ký hiệu 6
Cảm ơn 7
PHẦN I. GIỚI THIỆU VỀ USB 9
Chương 1. USB 11 là gì
1.1. Lịch sử của USB 11
1.2. so sánh USB với các giao diện khác 14
1.3. Khái niệm USB 16
1.3.1. Kiến trúc tổng thể lốp xe 16
1.3.2. Thể chất và kiến trúc logic lốp xe 16
1.3.3. Các thành phần của USB 18
1.3.4. Thuộc tính thiết bị USB 18
1.3.5. Thuộc tính trung tâm 19
1.3.6. Thuộc tính máy chủ 20
1.4. 20 ví dụ về thiết bị USB
1.4.1. Chuột và bàn phím., 21
1.4.2. Màn hình 21
1.4.3. Bộ chuyển đổi USB-to-COM và USB-to-LPT 22
1.4.4. Máy quét 23
1.4.5. Modem 23
1.4.6. Diễn giả 24
1.4.7. Ổ đĩa flash 25
1.4.8. Trung tâm 28
1.4.9. Công nghệ đo lường 28
1.4.10. Thiết bị kỳ lạ 29
1.5. Kết nối mạng qua USB 30
1.5.1. Bộ chuyển đổi USB-Ethernet 31
1.5.2. Kết nối trực tiếp qua cổng USB 31
1.6. Truyền dữ liệu 31
1.6.1. Nguyên tắc truyền dữ liệu 32
1.6.2. Cơ chế ngắt 32
1.6.3. Giao diện bộ điều hợp máy chủ 32
1.6.4. Khả năng DMA 34
1.6.5. Chế độ truyền dữ liệu 34
1.7. Cài đặt và cấu hình thiết bị USB 35
1.7.1. Cài đặt BIOS cho USB 38
1.7.2. Khắc phục sự cố 41
1.8. Hạn chế của USB 45
1.9. Nếu bạn mua một máy tính 46
1.9.1. HS và USB 2.0 không giống nhau! 46
1.9.2. bo mạch chủ 47
1.9.3. Tòa nhà 48
1.9.4. USB cho các dòng máy tính “cũ” 48
1.10. Tài nguyên trực tuyến cho Chương này 49
Chương 2. Phần cứng USB 51
2.1. Cáp và đầu nối 51
2.1.1. Các loại cáp 52
2.1.2. Chiều dài cáp 53
2.1.3. Đầu nối 53
2.2. Giao diện vật lý 55
2.2.1. Mã hóa dữ liệu 57
2.2.2. Nhận dạng thiết bị 58
2.3. Dinh dưỡng 59
2.3.1. Các loại nguồn USB 59
2.3.2. Quản lý năng lượng 60
2.3.3. Vào Chế độ Nguồn điện Thấp 61
2.4. Tài nguyên trực tuyến cho Chương này 61
PHẦN II. TỔ CHỨC NỘI BỘ USB 63
Chương 3. Tổ chức nội bộ của xe buýt 65
3.1. Mức độ giao tiếp logic 65
3.1.1. Phần mềm máy khách cấp 66
3.1.2. Mức độ trình điều khiển hệ thống USB 67
3.1.3. Giao diện lớp điều khiển máy chủ 68
3.1.4. Bus ngoại vi cấp 68
3.1.5. Thiết bị logic USB cấp 69
3.1.6. Mức độ chức năng của thiết bị USB 69
3.2. Truyền dữ liệu qua 69 cấp độ
3.3. Các loại truyền dữ liệu 71
3.4. Đồng bộ với truyền đẳng thời 73
3.5. Nhân sự 77
3.6. Điểm cuối 78
3.7. Kênh 79
3.8. Gói 81
3.8.1. Định dạng của gói đánh dấu IN, OUT, SETUP và PING 83
3.8.2. Định dạng gói SOF 83
3.8.3. Định dạng gói dữ liệu 84
3.8.4. Định dạng gói xác nhận< 84
3.8.5. Định dạng gói CHIA * 84
3.9. Kiểm tra tổng 85
3.9.1. Thuật toán tính CRC 86
3.9.2. Phần mềm tính toán CRC 87
3.10. Giao dịch 90
3.10.1. Các loại giao dịch 91
3.10.2. Xác nhận giao dịch và kiểm soát luồng 92
3.10.3. Giao thức giao dịch 93
Chương 4. Tổ chức bên trong của thiết bị 96
4.1. Yêu cầu tới thiết bị USB 96
4.1.1. Gói cấu hình 96
4.1.2. Truy vấn chuẩnđến thiết bị 99
4.1.3. Mô tả thiết bị 105
Chương 5. Tổ chức nội bộ của máy chủ và hub 123
5.1. Trung tâm 123
5.1.1. Tương tác của bộ điều khiển máy chủ với hub 126
5.1.2. Bộ mô tả trung tâm 127
5.1.3. Yêu cầu trung tâm 129
5.1.4. Yêu cầu CLEAR_HUB_FEATURE 130
5.1.5. Yêu cầu CLEAR PORT_FEATURE 130
5.1.6. Yêu cầu GET_BUS_STA TE 131
5.1.7. Yêu cầu GET_HUB_DESCRfPTOR 131
5.1.8. Yêu cầu GET_HUB_STATUS 131
5.1.9. Yêu cầu GET_PORT_STA TUS 132
5.1.10. Yêu cầu SET_HUB_DESCRIPTOR 134
5.1.11. Yêu cầu SET_HUB_FEATURE 134
5.1.12. Yêu cầu ĐẶT TÍNH NĂNG CỔNG. 134
5.2. Sự hợp tác thiết bị từ ở tốc độ khác nhau 135
Chương 6. USB không cần PC 137
6.1. Đầu nối OOT 138
6.2. Các loại thiết bịOTG 138
6.3. Mô tả thiết bịOTG 139
6.4. Tài nguyên trực tuyến cho Chương này 140
PHẦN III. THỰC HÀNH LẬP TRÌNH 141
Chương 7. Hỗ trợ USB trong Windows 143
7.1. Model WDM 144
7.2. Tương tác với trình điều khiển USB 146
Chương 8. Thiết bị HID * 149
8.1. Thuộc tính thiết bị HID 149
8.2. Cách giao tiếp với thiết bị HID 151
8.3. Cài đặt thiết bị HID 152
8.4. Nhận dạng thiết bị HID 152
8.4.1. Nhận biết thiết bị khởi động 153
8.4.2. Bộ mô tả cấu hình thiết bị HID 153
8.4.3. Bộ mô tả HID 154
8.4.4. Mô tả báo cáo 156
8,5. Cấu trúc mô tả báo cáo 156
8.5.1. Cấu trúc các thành phần báo cáo 156
8.5.2. Các loại thành phần báo cáo 157
8.5.3. Ví dụ về mô tả 165
8.6. Truy vấn thiết bị HID 168
8.6.1. Yêu cầu GET_REPORT. 169
8.6.2. Yêu cầu SET_REPORT 169
8.6.3. Yêu cầu GETJDLE. 170
8.6.4. Truy vấn SETJDLE 170
8.6.5. Yêu cầu GET_PROTOCOL 171
8.6.6. Yêu cầu SET_PROTOCOL 171
8.7. Công cụ 171
8,8. Tương tác với trình điều khiển HID 172
Chương 9. Giới thiệu về WDM 181
9.1. Lớp điều khiển 183
9.2. Tên thiết bị tượng trưng 184
9.3. Thủ tục cơ bản của trình điều khiển WDM 189
9.3.1. Trình điều khiển thủ tụcEntry 190
9.3.2. Thủ tục AddDevice 192
9.3.3. Thủ tục dỡ hàng 194
9.3.4. Quy trình vận hành tài xế 196
9.3.5. Phục vụ các yêu cầu IOCTL 203
9.4. Đang tải trình điều khiển và truy cập các thủ tục trình điều khiển 209
9.4.1. Quy trình làm việc với tài xế 209
9.4.2. Đăng ký lái xe 210
9.4.3. Tham khảo quy trình vận hành 217
9.4.4. Cất driver bên trong tập tin thực thi 218
9,5. Công cụ tạo trình điều khiển 220
9.5.1. Studio điều khiển NuMega 220
9.5.2. Jungo WinDriver 220
9.5.3. Trình điều khiển hạt nhân Jungo 220
Chương 10. Thông số kỹ thuật USB PnP 221
10.1. Giới thiệu về Plug and Play 221
10.1.1. Nhiệm vụ và chức năng cắm và chạy 221
10.1.2. Chạy thủ tục PnP 222
10.1.3. Thành phần phần mềm PnP 224
10.2. Cắm và chạy cho USB 225
10.2.1. Định cấu hình thiết bị USB 226
10.2.2. Đánh số thiết bị USB 226
10.2.3. Mã nhận dạng thiết bị USB PnP 228
10.3. Lấy danh sách các thiết bị USB 229
10.4. Tệp INF 234
10.4.1. Cấu trúc tệp INF 234
10.4.2. Phần Phiên bản 235
10.4.3. Nhà sản xuất phần 237
10.4.4. Phần ĐíchDirs 239
10.4.5. Mô tả mô hình Phần 241
10.4.6. Phần xxx.AddReg và xxx.DelReg. 242
10.4.7. Phần xxx.LogConfig 244
10.4.8. Phần xxx.CopyFiles 244
10.4.9. Phần chuỗi 245
10.4.10. Phần kết nối 246
10.4.11. Tạo và kiểm tra tệp INF 247
10.4.12. Cài đặt thiết bị bằng tệp INF 248
10,5. Nhánh đăng ký cho USB 249
Chương 11. Tính năng BIOS 251
11.1. Dịch vụ BIOS 1AN 251
11.1.1. Chức năng B101H - xác định sự hiện diện của PCI BIOS 252
11.1.2. Chức năng В102Н - tìm kiếm thiết bị PCI theo số nhận dạng
thiết bị và nhà sản xuất 253
11.1.3. Chức năng B103H - tìm kiếm thiết bị PCI theo mã lớp 254
11.1.4. Chức năng B108N - đọc thanh ghi cấu hình (Byte) 255
11.1.5. Hàm VYu9N - đọc thanh ghi cấu hình (Word) 256
11.1.6. Chức năng B10AN - đọc thanh ghi cấu hình (DWord) 256
11.1.7. Chức năng В10ВН - ghi thanh ghi cấu hình (Byte) 257
11.1.8. Hàm B10CH - ghi thanh ghi cấu hình (Word) 257
11.1.9. Hàm B10DH - Ghi thanh ghi cấu hình (DWord) 258
11.2. Ví dụ sử dụng 259
PHẦN IV. TẠO THIẾT BỊ USB 283
Chương 12. Thiết bị ngoại vi USB 285
12.1. chip Atmel 286
12.1.1. Bộ vi điều khiển có kiến ​​trúc MSC-51 286
12.1.2. Bộ điều khiển trung tâm 289
12.1.3. Bộ vi xử lý trung tâm có lõi AVR 289
12.1.4. Chip Atmel 290 khác
12.2. Chip Cygnal 291
12.2.1. Bộ vi xử lý C8051F320 và C8051F321 291
12.2.2. Các chip Cygnal 293 khác
12.3. chip FTDI 296
12.3.1. Chip FT232AM và FT232BM 297
12.3.2. Chip FT245AM và FT245BM 298
12.3.3. Chip FT2232BM 299
12.3.4. Chip FT8U100AX 300
12.3.5. Bộ công cụ gỡ lỗi và mô-đun 301
12.3.6. Trình điều khiển 302
12.3.7. Tiện ích bổ sung 303
12.3.8. Các mô-đun 304 khác
12.4. Chip Intel 304
12,5. Chip Microchip 308
12.6. Chip Motorola 308
12.7. Chip Philips 309
12.7.1. chip USB 310
12.7.2. Trung tâm 311
12.7.3. Chip Philips 313 khác
12.8. Chip Texas Instruments 314
12.9. Chip Trans Dimension 317
12.10. 318 chip bảo vệ nguồn
11/12. Tài nguyên trực tuyến cho Chương này 319
Chương 13. Thiết bị HID dựa trên Atmel AT89C5131 322
13.1. Sơ đồ kết cấu AT89S5131 322
13.2. Thanh ghi USB AT89С5131 324
13.2.1. Đăng ký USBCON 324
13.2.2. USBADDR Đăng ký 326
13.2.3. Thanh ghi USBINT 327
13.2.4. Đăng ký USBIEN 328
13.2.5. thanh ghi UEPNUM. 329
13.2.6. Đăng ký UEPCONX 330
13.2.7. thanh ghi UEPSTAX. 331
13.2.8. Đăng ký UEPRST. 334
13.2.9. thanh ghi UEPINT. 335
13.2.10. Đăng ký UEPIEN 336
13.2.11. Đăng ký UEPDATX 337
13.2.12. Đăng ký UBYCTLX 337
13.2.13. UFNUML Đăng ký 338
13.2.14. thanh ghi UFNUMH. 338
13.3. Mạch AT89S5131 338
13.4. Công cụ lập trình 339
13.4.1. Trình biên dịch 341
13.4.2. Lập trình viên 342
13,5. Chương trình cho bộ vi xử lý 349
13.5.1. Phiên bản đầu tiên của chương trình dành cho AT89S5131 349
13.5.2. Thêm mô tả chuỗi 369
13.5.3. Thêm điểm cuối 374
13.5.4. Tạo thiết bị HID 377
13.5.5. Giao tiếp với thiết bị HID 381
13.6. Đọc báo cáo trong Windows 388
13.7. Chức năng bổ sung Windows XP 396
13.8. Thiết bị có nhiều báo cáo 397
Chương 14. Tạo thiết bị USB dựa trên ATMEL AT89C5131 402
14.1. Thiết bị không phải HID 402
14.2. Tạo trình điều khiển với sử dụng Trình điều khiển Xưởng 405
14.2.1. Đôi lời về thư viện Driver Studio 407
14.2.2. Các lớp Driver Studio 411 khác
14.2.3. Tạo mẫu trình điều khiển bằng Driver Studio 412
14.2.4. Cải thiện mẫu trình điều khiển 422
14.2.5. Phương pháp cơ bản lớp thiết bị 423
14.2.6. Thực hiện đọc dữ liệu 426
14.2.7. Cài đặt trình điều khiển 428
14.2.8. Đầu đọc dữ liệu 429
14.2.9. Đọc dữ liệu từ các loại điểm cuối khác 438
14.2.10. Trình điều khiển USB “sạch” 439
Chương 15: Sử dụng chip FTDI 457
15.1. Sơ đồ chức năng FT232BM 457
15.2. Thiết kế mạch FT232BM 460
15.3. Chức năng của D2XX 460
15.4. Chuyển từ COM sang USB 465
15.4.1. Mô tả mạch chuyển đổi 465
15.4.2. Đặt tốc độ truyền 467
PHẦN V. SỔ TAY 469
Chương 16: Các tính năng cơ bản của Windows 471
16.1. Hàm CreateFile và CloseHandle: mở và đóng một đối tượng.471
16.1.1. thông tin thêm 472
16.1.2. Giá trị trả về 472
16.1.3. Ví dụ gọi 472
16.2. Chức năng đọc tệp: đọc dữ liệu 473
16.2.1. Thông tin bổ sung 474
16.2.2. Giá trị trả về 474
16.2.3. Ví dụ gọi 474
16.3. Chức năng WriteFile: truyền dữ liệu 475
16.3.1. Thông tin bổ sung 476
16.3.2. Giá trị trả về 476
16.3.3. Ví dụ gọi 476
16.4. Chức năng ReadFileEx. Đọc dữ liệu APC 477
16.4.1. Giá trị trả về 479
16.4.2. Thông tin bổ sung 479
16.4.3. Ví dụ gọi 479
16,5. Chức năng WriteFileEx: Truyền dữ liệu APC 480
16.5.1. Giá trị trả về 481
16.5.2. Ví dụ gọi 481
16.6. Hàm WaitForSingleObject chờ tín hiệu
trạng thái đối tượng 482
16.6.1. Giá trị trả về 482
16.7. Chức năng WaitForMultipleObjects: chờ tín hiệu
trạng thái đối tượng 483
16.7.1. Giá trị trả về 484
16.8. Kết quả hàm GetOverlappedResult của hoạt động không đồng bộ 484
16.8.1. Giá trị trả về 485
16.9. Chức năng DeviceIoControl: Điều khiển trình điều khiển trực tiếp 485
16.9.1. Giá trị trả về 487
16.10. Hàm QueryDosDevice: lấy tên thiết bị
bằng tên DOS của anh ấy là 487
16.10.1. Giá trị trả về 488
16.10.2. Ví dụ gọi 488
16.11: Định nghĩa chức năng Dos Device: thao tác với tên thiết bị DOS 489
16.11.1. Giá trị trả về 490
16.11.2. Ví dụ gọi 490
Chương 17. Các hàm API HID. 492
17.1. Hàm HidD_Hello: kiểm tra thư viện 492
17.2. Chức năng HidD_GetHidGuid: nhận GUID 492
17.3. Hàm HidD_GetPreparsedData: tạo bộ điều khiển thiết bị 493
17.4. Hàm HidD_FreePreparsedData: giải phóng bộ điều khiển thiết bị 493
17,5. Chức năng HidD_GetFeature: nhận báo cáo FEATURE 494
17.6. Hàm HidD_SetFeature: gửi báo cáo FEATURE 494
17.7. Hàm HidD_GetNumInputBuffers: lấy số lượng bộ đệm 495
17.8. Hàm HidD_SetNumInputBuffers: thiết lập số lượng bộ đệm là 495
17.9. Hàm HidD_GetAttribntes: lấy thuộc tính thiết bị 495
17.10. Hàm HidD_GetMamifactnrerStnng. nhận chuỗi nhà sản xuất 496
17.11. Hàm HidD_GetProductString. nhận dòng sản phẩm 497
17.12. Hàm HidD_ Lấy Serial MumberString. nhận được chuỗi
số sê-ri 497
17.13. Hàm HidD_GetIndexedString. nhận được một hàng ở chỉ số 498
17.14. Hàm HidDjGetlnputReporr. nhận báo cáo INPUT 498
17.15. Hàm HidD_SetOutputReport. gửi báo cáo OUTPUT 499
17.16. Hàm HidP_GetCaps: lấy thuộc tính thiết bị 499
17.17. Hàm HidP_MaxDataListLength: nhận kích thước báo cáo 500
Chương 18. Bộ điều khiển máy chủ UCH 502
18.1. Thanh ghi điều khiển bộ điều khiển máy chủ 502
18.1.1. Thanh ghi lệnh USB (USBCMD) ..504
18.1.2. Thanh ghi trạng thái USB (USBSTS) 506
18.1.3. Thanh ghi điều khiển ngắt (USBINTR) 506
18.1.4. Thanh ghi số khung (FRNUM) 507
18.1.5. Đăng ký địa chỉ cơ sở khung (FLBASEADD) 508
18.1.6. Bắt đầu đăng ký sửa đổi khung (SOFMOD) 508
18.1.7. Thanh ghi trạng thái và điều khiển cổng (PORTSC) 509
18.2. Cấu trúc dữ liệu bộ điều khiển máy chủ UCH 510
18.2.1. Danh sách khung 510
18.2.2. Mô tả chuyển giao i 511
18.2.3. Tiêu đề hàng đợi 514
18.3. Xử lý danh sách mô tả UCH 516
Chương 19. Công cụ 518
19.1. Công cụ Microsoft Visual Studio 518
19.1.1. Phụ thuộc 518
19.1.2. Tra cứu lỗi 518
19.1.3. Hướng dẫn Gen 518
19.2. Công cụ Microsoft DDK 520
19.2.1. Cây thiết bị 520
19.2.2. DevCon.-521
19.2.3. Chklnf và Genlnf. 526
19.3. Công cụ của Tập đoàn CompuWare 527
19.3.1. Màn hình 527
19.3.2. SymLink 527
19.3.3. EzDriverlnstaller 527
19.3.4. Wdm Đánh hơi 527
19.4. Phương tiện hệ thống 528
19.4.1. Winobj 528
19,5. Diễn đàn công cụ USB 531
19.5.1. Công cụ mô tả HID 531
19.6. Phần mềm ổ cứng 533
19.7. Công cụ Sourceforge 533
ỨNG DỤNG 535
Phụ lục 1. Chức năng bổ sung 537
Phụ lục 2. Bảng định danh ngôn ngữ (LangID) 539
Phụ lục 3. Bảng mã nhà sản xuất (Vendor ID, Device ID) 543
Phụ lục 4. Mô tả CD 546
Văn học 548
Chỉ số chủ đề 549