Tìm source code của USB Driver trên Linux

Ở bài Tìm driver cho Linux cũng đã nói qua rồi, nhưng bài này muốn chỉ ra chi tiết hơn một chú cho nhưng ai muốn đọc source.

Cách tìm source code driver cho thiết bị USB

1. Nói qua về thiết bị USB

  • Linux kernel xác định driver phù hợp cho thiết bị bằng 2 thông tin chính.
    Đó là Vendor (nhà sản xuất), và Product (sản phẩm).
    Thông tin về Vendor được mô tả bằng một id, trong source thường là idVendor.
    Thông tin về Product cũng được mô tả bằng một id, trong source thường là idProduct.
    2 thông tin trên sẽ xác định duy nhất một loại thiết bị.
    Thông tin về id của mỗi Vendor, Product được đăng kí với tổ chức hỗ trợ USB.

Tiếp tục đọc

USB cho dev (Chap.06 – Các gói tin Setup)

Mỗi thiết bị USB phải trả lời các gói tin Setup (Setup packets) trên Endpoint mặc định (Endpoint Zero). Các gói tin Setup được sử dụng cho việc phát hiện thiết bị, cấu hình, cũng như lấy các thông tin khác như các thông tin về chức năng, địa chỉ thiết bị, kiểm tra trạng thái các Endpoint.

Chuẩn USB yêu cầu Host sẽ mon muốn về mặt thời gian từ phát hiện đến lấy đầy đủ các thông tin trên trong vòng không quá 5 giây. Ngoài ra, nó cũng quy định chặt hơn cho từng Request từ phía Host.

  • Yêu cầu thông tin chuẩn của thiết bị (Standard Device request) mà không có dữ liệu (hay DATA Stage) thì phải hoàn thành trong vòng 50ms.
  • Nếu yêu cầu có dữ liệu kèm theo (có DATA stage) thì dữ liệu phải được trao đổi sau ít nhất 500ms sau request được gửi đến.
    • Mỗi gói dữ liệu phải gửi trong 500ms sau khi gói trước được gửi
    • Thông báo trạng thái (Status Stage) phải hoàn thành trong vòng 50ms sau khi gửi gói tin cuối cùng.
  • Lệnh SetAddresss (có chưa phần Data) phải được thực hiện và trả lại Status trong vòng 50ms. Phía thiết bị có 2ms để thực hiện thay địa chỉ trước khi request tiếp theo được gửi đến. Tiếp tục đọc

USB cho dev (Chap.05 – Đặc tả thiết bị)

Tất cả các thiết bị nằm trong 1 hệ thống phân cấp các miêu tả (hierachy of descriptors), miêu tả cho Host biết các thông tin về Thiết bị gì?Nhà sản xuất? Phiên bản của giao thức USB nó hỗ trợ?Các cách để cấu hình? Số lượng Endpoint và loại truyền tương ứng.

Các đặc tả phổ biết nhất bao gồm:

  • Miêu tả thiết bị (Device Descriptors)
  • Miêu tả các cấu hình (Configuration Descriptors)
  • Miêu tả giao diện (Interface Descriptors)
  • Miêu tả điểm đầu cuối (EndPoint Descriptors)
  • Các chuỗi sử dụng trong các miêu tả trên.

Tiếp tục đọc

USB cho dev (Chap.03 – Giao thức)

Không giống như RS-232 và nhiều giao tiếp tuần tự khác, cái mà không định nghĩa dạng dữ liệu được gửi. USB được tạo bởi nhiều lớp protocol. Nghe có vẻ “nguy hiểm”, nhưng cứ bình tõm, nó không ghê gớm đến thế đâu. Một khi bạn hiểu cái gì đang diễn ra thì cái bạn thực sự phải bỏ công sức vào chỉ là các lớp ở tầng trên thôi. Trong thực tế, hầu hết USB Controller I.C.s sẽ lo hết mấy tầng dưới rồi. Hay nói cách khác, mấy tầng đó nhà phát triển cũng không thấy được.

Mỗi USB Transaction bao gồm

  • SMột packet chứa Token (Giống như Header cho biết cái gì sẽ đến tiếp sau đó) – luôn có
  • Một packet chứa dữ liệu (có thể không có) , (chứa payload)
  • Một packet chứa trạng thái (được sử dụng để thông báo trạng thái truyền và cung cấp cơ chế kiểm soát lỗi nữa) Tiếp tục đọc

USB cho Dev (Chp.02 – Phần cứng)

Tiếp theo bài chương đầu tiên về USB, chương này sẽ nói về phần cứng.

Đầu kết nối (Connectors)

Mọi thiết bị có một upstream “chảy”đến host, và mọi host có một downstream “chảy” thiết bị. Các điểm kết nối với Upstream, downstream không phải ở dạng hoán đổi cơ học thì thế phải các kết nối vòng không hợp lệ (illegal loopback connections) như downstream chảy đến downstream chẳng hạn phải được loại bỏ ở hubs. Có 2 loại connector phổ biến là type A và type B. Như hình bên dưới đây:

Type A USB Connector Type B USB Connector

Tiếp tục đọc

SCSI – Giao tiếp với USB Memory

8GB-USB-Flash-Drive-Rotation-2-0-USB-DISK-Model-Pen-drive-memory-stick-8G-HOT.jpg

Gần đây, do phải tìm hiểu khả năng porting USB Memory Driver sang NORTi nên đã có dịp tìm hiểu và tự confirm trên code một số điều liên quan đến thiết bị nhớ USB (hay ta vẫn gọi là USB Flash Memory). “USB Flash Memory” bao gồm USB: là tên giao diện cả mềm, cứng; Flash : là chất liệu của chip nhớ, Memory : là chỉ thiết bị nhớ nói chung.

Ở một số bài trước, tôi cũng viết về một số điểm chính của giao tiếp USB.

Về cơ bản, phần mềm mà programer có thể viết cho USB hầu như được xác định từ sau bước tín hiệu. Tức là phía ứng dụng mức thấp (tức driver ấy) sẽ sử dụng các thanh và các ngắt được cung cấp để setup, nhận dữ liệu, gửi dữ liêu, phát hiện kết nối.

Tiếp tục đọc

Hiểu thêm về HID Report Descriptor

Đang hì hục đọc sách các kiểu con đà điều để hiểu kĩ hơn về HID Report Descriptor (Đặc tả cấu trúc dữ liệu trao đổi của HID). Thì tìm được bài này, nó giải thích hầu hết những chỗ khó hiểu một cách dễ hiểu, và đặc biệt có ví dụ minh họa.

Giờ xin dịch lại bài này một cách khái quát nhất.

Vì để hiểu bài này cần biết đến một vài khái niệm về USB, về HID Device, nữa nên để xin tóm tắt nội dung bên dưới như sau. Qua giao tiếp USB, máy tính có thể giao tiếp với rất nhiều thiết bị từ USB Flash Memory (hay gọi là USB), chuột, bàn phím,..etc. Vì có rất nhiều thiết bị có thể kết nối được, nên để dễ phân biệt và dễ dàng cho việc phát triển Driver trên máy tính, người ta chia thành các lớp thiết bị. Có rất nhiều lớp không thể kể hết được, nhưng xin có 2 lớp chính đó là Mass Storage Device (chính là USB Flash Memory đấy), và HID Device (chính là chuột, bàn phím).

Về nguyên tắc, từ khi cắm 1 thiết bị USB bất kì cắm vào cổng, cần trải qua 3 giai đoạn giao tiếp giữa máy tính và thiết bị để có thể hiểu nhau. Đó là Reset (về điện đóm), Configured (load các driver tương ứng), Sử dụng được (khi chúng di chuyển được con chuột, hoặc gõ được phím).

Trong bài này giới thiệu dữ liệu trao đổi giữa HID Driver (nằm trên máy tính) và HID Device (hay về mặt phần mềm là Firmware chạy trên Device). Mà cụ thể nói về “HID Report Descriptor”, cái được HID Device gửi lên HID Driver để báo cho Driver biết HID Device có những dữ liệu gì mà Driver có thể hỏi được, được tổ chức như thế nào.

Link : http://eleccelerator.com/tutorial-about-usb-hid-report-descriptors/

Một USB HID Report là một trong những descriptor (đặc tả) mà Host yêu cầu từ thiết bị USB. Thiết bị USB sẽ trả lời yêu cầu này bằng các Report. Nhưng Report này sẽ nói cho Host biết các dữ liệu trong quá trình sử dụng mà Device gửi lên nên được hiểu như thế nào. Trong bài này, tác giả Frank-Zhang(Sony Engineer) đã giới thiệu theo từng ví dụ. Tiếp tục đọc

USB cho Dev (Chp.01 – Giới thiệu)

USB – Một chuẩn giao tiếp phổ biến nhất (tính đến 2016), hãy cùng tìm hiểu một chút về nó. Bài này không phải dành cho người sử dụng bằng nhứng con số về tốc độ, hay cách cắm vật lý. Bài này là một bài dịch, mình thấy cần rất hữu ích khi bắt đầu phát triển sử dụng USB.

Link gốc tại http://www.beyondlogic.org/usbnutshell/usb1.shtml

Tóm tắt về USB

Hiểu chuẩn USB để sử dụng trong phát triển

Tiếp tục đọc

Tầng thấp của USB

USB – Khỏi cần nói thì nó cũng đã quá nổi tiếng về sự phổ biến rồi. Gần như mọi thứ đều mặc định phải có kết nối USB, cổng USB gần như là bắt buộc trên máy tính, và rất nhiều thiết bị điện tử ta thấy. Từ USB1.1 đến 2.0, rồi gần đây nhất là 3.0. Rồi gần đây người ta có nhắc nhiều đến USB Type C.
Tất cả những mĩ từ đó dùng để PR tính năng của sản phẩm đến người dùng. Tất nhiên blog này tôi không muốn nói về những thứ đó. Tôi muốn về những thứ tôi nghĩ là cần phải biết để lập trình được với USB. Đó là phần mềm chạy trên thiết bị của 2 đầu dây USB.

Bài đầu tiên này sẽ nói về tầng giao tiếp gần phần cứng nhất. Vì thế tôi muốn đặt tên nó là Tầng tháp của USB. Thực ra nó cũng không thấp lắm vì tầng tín hiệu điện tử mới thực là thấp.
Nhưng kết nối USB có một điểm khác biệt với các kết nối Serial trước đó. Trong một số kết nối Serial hay Parallel trước USB. Người lập trình hoàn toán có thể tác động lên từng Pin của kết nối để thực hiện việc giao tiếp với thiết bị.
USB không như thế. Người ta thường tích hợp sãn những module phần cứng ở cả 2 đầu của sợi dây. Vì thế việc trao đổi dữ liệu ở mức tín hiệu số đã được làm sẵn rồi. Việc phần mềm 2 đầu sợi dây phải làm là : thiếp lập thông số cho các phần cứng đó, giao nhận, gửi dữ liệu đi, đón nhận các thông báo từ cứng thông qua các ngắt và thanh ghi của phần cứng.

Ta cũng nên mô tả bố cục của bài tóm lược để tránh lan man

  1. Cấu tạo phần cứng, các loại kết nối
  2. Phía thiết bị
  3. Phía Host
  4. Các trạng thái kết nối
  5. Phải hỏi mới được trả lời
  6. Tốc độ