Kevin Hoang
15-03-2012, 09:56 PM
Tập 1: Hiểu về USB Protocol và những khó khăn trong việc tương tác thiết bị USB từ ứng dụng Java
Phiên bản đầu tiên của Universal Serial Bus (USB) được đưa ra và phát hành vào năm 1996. Thiết bị USB có giá thành thấp, tốc độ truyền tải dữ liệu cao, dễ dàng sử dụng và mềm dẻo đã nhanh chóng được chấp nhận rộng rãi trong ngành công nghiệp máy tính. Cho đến hiện nay, rất nhiều thiết bị ngoại vi và các thiết bị khác kết nối với máy tính thông qua USB. Phần lớn các hệ điều hành phổ biến đều hỗ trợ tốt đối với các thiết bị USB, tương đối dễ dàng để phát triển ứng dụng tương tác USB trong C/C++ . Tuy nhiên, Java được thiết kế hỗ trợ rất ít để truy cập vào phần cứng (hardware), vì thế viết một ứng dụng Java để tương tác với các thiết bị USB khá vất vả.
Sự lỗ lực cố gắng để truy cập vào các thiết bị USB trong Java được bắt đầu năm 1999 bởi Dan Streetman tại IBM. Năm 2001, project của anh đã được chấp nhận như một chuẩn mở rộng (candidate extended standard) của Java thông qua Java Specification Request (JSR). Project này bây giờ gọi là JSR-80 đã được chính thức công khai dưới package javax.usb. Trong thời gian đó, khoảng tháng 01/2000 Mojo Jojo và David Brownell đã bắt đầu project Java USB trên SourceForge. Cả 2 project này đều đưa ra packages cho các Linux Developers, mặc dù cả 2 gần như đã hoàn hảo. Cả 2 project đều bắt đầu lỗ lực cung cấp khả năng truy cập thiết bị USB cho ứng dụng Java trên các hệ điều hành khác, tuy nhiên các packages không có sự nổi trội rõ nét.
Trong bài viết này, bạn sẽ được giới thiệu ngắn gọn về 2 project này. Nhưng trước hết hãy tìm hiểu một chút về USB
Giới thiệu về USB
Năm 1994, sự liên minh cộng tác của 4 công ty công nghiệp máy tính lớn (Compaq, Intel, Microsoft, và NEC) đã bắt đầu đưa ra USB Protocol. Mục tiêu ban đầu của Protocol này là kết nối máy tính PC với Telephone và cung cấp giao diện nhập xuất I/O có khả năng dễ dàng mở rộng và cấu hình. Tháng 1/1996, phiên bản đầu tiên của USB specification đã được phát hành, tiếp ngay sau đó là revision (version 1.1) được phát hành vào tháng 9/1998. Trong bản đặc tính kỹ thuật này đã cho phép 127 thiết bị connnect với nhau ở cùng thời điểm, với tổng cộng băng thông giao tiếp giới hạn đến 12MBs. Sau đó, có nhiều thành viên hơn (Hewlett-Packard, Lucent, và Philips) tham gia vào liên minh. Tháng 4/2000, phiên bản 2.0 của USB specification hỗ trợ transfer rate lên đến 480Mbs đã được phát hành. Hiện nay, USB đóng vai trò quan trọng trong các ứng dụng truyền dữ liệu tốc độ cao (video, image, storage) và băng thông rộng (audio, broadband, microphone). Cũng đa dạng hóa trong việc kết nối các thiết bị tốc độ thấp (keyboards, mice, game peripherals, virtual reality peripherals) với máy tính PC.
USB protocol là giao thức có thứ bậc. Trong bất kỳ hệ thống USB nào chỉ có duy nhất 1 host, và USB interface với host computer được xem là host controller. Có 2 chuẩn cho host controller đó là: Open Host Controller Interface (OHCI, by Compaq) và Universal Host Controller Interface (UHCI, by Intel). Cả 2 chuẩn cung cấp khả năng như nhau và làm việc với toàn bộ thiết bị USB. Xây dựng hardware cho UHCI đơn giản hơn, nhưng đòi hỏi device driver phức tạp hơn (hao tốn tài nguyên CPU hơn)
Kết nối vật lý của USB là cấu trúc sao tầng, lên tới 7 tầng. Một hub tại trung tâm, và USB host được hiểu là root hub. Mỗi phân đoạn là kết nối từng điểm giữa 1 hub và USB device; sau đó có thể một hub khác cung cấp bổ sung các điểm đính kèm vào hệ thống, hoặc 1 thiết bị hoặc một vài loại có khả năng. Host sử dụng một giao thức master/subordinate để giao tiếp với các USB device. Cách tiếp cận này đã giải quyết được vấn đề các gói dữ liệu đụng độ với nhau và ngăn ngừa các thiết bị được đính kèm liên lạc trực tiếp với nhau.
Toàn bộ việc truyền dữ liệu được khởi tạo bởi host controller. Dữ liệu được truyền thẳng từ host tới thiết bị được gọi là downstream hay out transfer, dữ liệu được truyền thẳng từ thiết bị tới host được gọi là upstream hay in transfer. Việc truyền dữ liệu được xảy ra gữa host và một endpoint riêng biệt trong thiết bị USB, việc liên kết dữ liệu giữa host và endpoint được gọi là pipe. Một thiết bị USB có thể có nhiều endpoint, số lượng của data pipes giữa host và thiết bị bằng số endpoints của thiết bị. Một pipe có thể là đơn hướng hoặc đa hướng, dòng dữ liệu trong 1 pipe là độc lập với dòng dữ liệu trong các pipe khác.
Việc giao tiếp trong mạng USB có thể sử dụng bất kỳ 1 trong 4 loại kiểu truyền dữ liệu:
Control transfers: Là các gói dữ liệu ngắn đối với việc điều khiển và cấu hình thiết bị, đặc biệt là lúc đính kèm thời gian
Bulk transfers: Là các gói dữ liệu tương đối lớn. Thiết bị như máy scan hoặc SCSI adapter sử dụng kiểu truyền dữ liệu này.
Interrupt transfers: Các gói dữ liệu được điều tra định kỳ. Host controller sẽ tự động gửi một interrupt trong một khoảng thời gian nhất định.
Isochronous transfers: Luồng dữ liệu theo thời gian thực với yêu cầu cao hơn về băng thông và độ tin cậy. Các thiết bị âm thanh, video thường sử dụng kiểu truyền dữ liệu này.
Giống như serial port, một USB Port trong máy tính được gán một số định danh duy nhất gọi là Port ID bởi USB controller. Khi một thiết bị USB đính kèm vào một USB Port. Post ID sẽ được gán cho thiết bị và bộ nhận diện thiết bị(device descriptor) được đọc bởi USB controller, device descriptor kèm theo các thông tin được áp dụng trên toàn cầu vào thiết bị cũng như thông tin cấu hình của thiết bị đó. Một cấu hình định nghĩa các chức năng và các ứng xử trong việc nhập xuất của thiết bị. Một thiết bị USB có thể có nhiều cấu hình được miêu tả bởi cấu hình tương ứng của chúng. Mỗi cấu hình có một hoặc nhiều interfaces được hiểu là kênh giao tiếp vật lý. Mỗi interface có không hoặc nhiều endpoints có thể là dữ liệu của nhà cung cấp, hoặc dữ liệu người dùng, hoặ cả 2. Interfaces được miêu tả bởi bộ nhận diện interface (interface descriptors) và endpoints được miêu tả bởi bộ nhận diện endpoints (end-point descriptors). Hơn nữa, một thiết bị có thể có một chuỗi descriptors để cung cấp bổ sung thông tin chẳng hạn như vendor name, device name, hoặc serial numbers
Như bạn đã thấy, một protocol như USB đã đưa ra một nhiệm vụ khó khăn cho developer sử dụng Java, ngôn ngữ cố gắng cho việc sử dụng trên nhiều platform không phụ thuộc vào phần cứng.
Tài liệu được dịch từ IBM Developer Works Library bởi Kevin Hoang dành cho thành viên cộng đồng C Việt!
Hết tập 1
Phiên bản đầu tiên của Universal Serial Bus (USB) được đưa ra và phát hành vào năm 1996. Thiết bị USB có giá thành thấp, tốc độ truyền tải dữ liệu cao, dễ dàng sử dụng và mềm dẻo đã nhanh chóng được chấp nhận rộng rãi trong ngành công nghiệp máy tính. Cho đến hiện nay, rất nhiều thiết bị ngoại vi và các thiết bị khác kết nối với máy tính thông qua USB. Phần lớn các hệ điều hành phổ biến đều hỗ trợ tốt đối với các thiết bị USB, tương đối dễ dàng để phát triển ứng dụng tương tác USB trong C/C++ . Tuy nhiên, Java được thiết kế hỗ trợ rất ít để truy cập vào phần cứng (hardware), vì thế viết một ứng dụng Java để tương tác với các thiết bị USB khá vất vả.
Sự lỗ lực cố gắng để truy cập vào các thiết bị USB trong Java được bắt đầu năm 1999 bởi Dan Streetman tại IBM. Năm 2001, project của anh đã được chấp nhận như một chuẩn mở rộng (candidate extended standard) của Java thông qua Java Specification Request (JSR). Project này bây giờ gọi là JSR-80 đã được chính thức công khai dưới package javax.usb. Trong thời gian đó, khoảng tháng 01/2000 Mojo Jojo và David Brownell đã bắt đầu project Java USB trên SourceForge. Cả 2 project này đều đưa ra packages cho các Linux Developers, mặc dù cả 2 gần như đã hoàn hảo. Cả 2 project đều bắt đầu lỗ lực cung cấp khả năng truy cập thiết bị USB cho ứng dụng Java trên các hệ điều hành khác, tuy nhiên các packages không có sự nổi trội rõ nét.
Trong bài viết này, bạn sẽ được giới thiệu ngắn gọn về 2 project này. Nhưng trước hết hãy tìm hiểu một chút về USB
Giới thiệu về USB
Năm 1994, sự liên minh cộng tác của 4 công ty công nghiệp máy tính lớn (Compaq, Intel, Microsoft, và NEC) đã bắt đầu đưa ra USB Protocol. Mục tiêu ban đầu của Protocol này là kết nối máy tính PC với Telephone và cung cấp giao diện nhập xuất I/O có khả năng dễ dàng mở rộng và cấu hình. Tháng 1/1996, phiên bản đầu tiên của USB specification đã được phát hành, tiếp ngay sau đó là revision (version 1.1) được phát hành vào tháng 9/1998. Trong bản đặc tính kỹ thuật này đã cho phép 127 thiết bị connnect với nhau ở cùng thời điểm, với tổng cộng băng thông giao tiếp giới hạn đến 12MBs. Sau đó, có nhiều thành viên hơn (Hewlett-Packard, Lucent, và Philips) tham gia vào liên minh. Tháng 4/2000, phiên bản 2.0 của USB specification hỗ trợ transfer rate lên đến 480Mbs đã được phát hành. Hiện nay, USB đóng vai trò quan trọng trong các ứng dụng truyền dữ liệu tốc độ cao (video, image, storage) và băng thông rộng (audio, broadband, microphone). Cũng đa dạng hóa trong việc kết nối các thiết bị tốc độ thấp (keyboards, mice, game peripherals, virtual reality peripherals) với máy tính PC.
USB protocol là giao thức có thứ bậc. Trong bất kỳ hệ thống USB nào chỉ có duy nhất 1 host, và USB interface với host computer được xem là host controller. Có 2 chuẩn cho host controller đó là: Open Host Controller Interface (OHCI, by Compaq) và Universal Host Controller Interface (UHCI, by Intel). Cả 2 chuẩn cung cấp khả năng như nhau và làm việc với toàn bộ thiết bị USB. Xây dựng hardware cho UHCI đơn giản hơn, nhưng đòi hỏi device driver phức tạp hơn (hao tốn tài nguyên CPU hơn)
Kết nối vật lý của USB là cấu trúc sao tầng, lên tới 7 tầng. Một hub tại trung tâm, và USB host được hiểu là root hub. Mỗi phân đoạn là kết nối từng điểm giữa 1 hub và USB device; sau đó có thể một hub khác cung cấp bổ sung các điểm đính kèm vào hệ thống, hoặc 1 thiết bị hoặc một vài loại có khả năng. Host sử dụng một giao thức master/subordinate để giao tiếp với các USB device. Cách tiếp cận này đã giải quyết được vấn đề các gói dữ liệu đụng độ với nhau và ngăn ngừa các thiết bị được đính kèm liên lạc trực tiếp với nhau.
Toàn bộ việc truyền dữ liệu được khởi tạo bởi host controller. Dữ liệu được truyền thẳng từ host tới thiết bị được gọi là downstream hay out transfer, dữ liệu được truyền thẳng từ thiết bị tới host được gọi là upstream hay in transfer. Việc truyền dữ liệu được xảy ra gữa host và một endpoint riêng biệt trong thiết bị USB, việc liên kết dữ liệu giữa host và endpoint được gọi là pipe. Một thiết bị USB có thể có nhiều endpoint, số lượng của data pipes giữa host và thiết bị bằng số endpoints của thiết bị. Một pipe có thể là đơn hướng hoặc đa hướng, dòng dữ liệu trong 1 pipe là độc lập với dòng dữ liệu trong các pipe khác.
Việc giao tiếp trong mạng USB có thể sử dụng bất kỳ 1 trong 4 loại kiểu truyền dữ liệu:
Control transfers: Là các gói dữ liệu ngắn đối với việc điều khiển và cấu hình thiết bị, đặc biệt là lúc đính kèm thời gian
Bulk transfers: Là các gói dữ liệu tương đối lớn. Thiết bị như máy scan hoặc SCSI adapter sử dụng kiểu truyền dữ liệu này.
Interrupt transfers: Các gói dữ liệu được điều tra định kỳ. Host controller sẽ tự động gửi một interrupt trong một khoảng thời gian nhất định.
Isochronous transfers: Luồng dữ liệu theo thời gian thực với yêu cầu cao hơn về băng thông và độ tin cậy. Các thiết bị âm thanh, video thường sử dụng kiểu truyền dữ liệu này.
Giống như serial port, một USB Port trong máy tính được gán một số định danh duy nhất gọi là Port ID bởi USB controller. Khi một thiết bị USB đính kèm vào một USB Port. Post ID sẽ được gán cho thiết bị và bộ nhận diện thiết bị(device descriptor) được đọc bởi USB controller, device descriptor kèm theo các thông tin được áp dụng trên toàn cầu vào thiết bị cũng như thông tin cấu hình của thiết bị đó. Một cấu hình định nghĩa các chức năng và các ứng xử trong việc nhập xuất của thiết bị. Một thiết bị USB có thể có nhiều cấu hình được miêu tả bởi cấu hình tương ứng của chúng. Mỗi cấu hình có một hoặc nhiều interfaces được hiểu là kênh giao tiếp vật lý. Mỗi interface có không hoặc nhiều endpoints có thể là dữ liệu của nhà cung cấp, hoặc dữ liệu người dùng, hoặ cả 2. Interfaces được miêu tả bởi bộ nhận diện interface (interface descriptors) và endpoints được miêu tả bởi bộ nhận diện endpoints (end-point descriptors). Hơn nữa, một thiết bị có thể có một chuỗi descriptors để cung cấp bổ sung thông tin chẳng hạn như vendor name, device name, hoặc serial numbers
Như bạn đã thấy, một protocol như USB đã đưa ra một nhiệm vụ khó khăn cho developer sử dụng Java, ngôn ngữ cố gắng cho việc sử dụng trên nhiều platform không phụ thuộc vào phần cứng.
Tài liệu được dịch từ IBM Developer Works Library bởi Kevin Hoang dành cho thành viên cộng đồng C Việt!
Hết tập 1