Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 21 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
21
Dung lượng
917,94 KB
Nội dung
Viết driver cho thiết bị USB mouse BÁO CÁO BÀI TẬP LỚN HỆ ĐIỀU HÀNH Đề tài: Viết driver cho thiết bị USB mouse. Nhóm sinh viên thực hiện: Nhóm 04 – K55 Thành viên: Nguyễn Trí Đức 20102634 Nguyễn Xuân Sỹ 20102115 Lý Đức Vượng 20102591 Hà Nội ngày 02 tháng 05 năm 2014 Viết driver cho thiết bị USB mouse Mục lục Viết driver cho thiết bị USB mouse 1. Tổng quan về Chuẩn USB 1.1 Chuẩn tín hiệu Chuẩn USB sử dụng 4 đường tín hiệu trong đó có hai đường cấp nguồn DC (VBUS-5V và GND), hai đường còn lại là một cặp tín hiệu vi sai (D+ và D) cho phép truyền dữ liệu. Cặp dây tín hiệu này được nối xoắn ở bên trong, có khả năng chống nhiễu tốt. Hình 1 Sơ đồ usb 1.2 Mô hình phân cấp Viết driver cho thiết bị USB mouse Hình 2.Mô hình phân cấp Các thiết bị hoạt động theo chuẩn USB được kết nối với nhau theo đồ hình mạng hình sao phân cấp. Trung tâm của mỗi hình sao này là các Hub. USB Host: thiết bị đóng vai trò điều khiển toàn bộ mạng USB. Ví dụ như trên máy tính, USB Host được gắn trên mainboard. Để giao tiếp và điều khiển các USB device, USB Host controller cần được thiết kế tích hợp với USB RootHub (Hub mức cao nhất). Vai trò: Trao đổi dữ liệu với các USB Device Điều khiển USB Bus - Quản lý các thiết bị cắm vào hay rút ra khỏi Bus USB qua quá trình liệt kê (Enumeration). - Quản lý luồng dữ liệu trên Bus, đảm bảo các thiết bị đều có cơ hội trao đổi dữ liệu tùy thuộc vào cấu hình của mỗi thiết bị. USB Device: là các thiết bị đóng vai trò như các slave giao tiếp với USB Host. Các thiết bị này đóng vai trò bị động, không được tự ý gửi gói tin lên Viết driver cho thiết bị USB mouse USB Host hay gửi gói tin giữa các USB Device với nhau, tất cả đều phải thông qua quá trình điều phối của USB Host. Chức năng của thiết bị USB Device: • Trao đổi dữ liệu với USB Host • Phát hiện gói tin hay yêu cầu từ USB Host theo giao thức USB. USB Hub: đóng vai trò như các Hub trong mạng Ethernet. Cấp nguồn cho các thiết bị USB. 1.3 Kịch bản hoạt động Quá trình hoạt động của chuẩn USB có thể được chia làm hai giai đoạn chính: Quá trình liệt kê (Enumeration): là quá trình USB Host phát hiện các thiết bị cắm vào và rút ra khỏi đường USB Bus. Mỗi khi một thiết bị tham gia vào Bus USB, USB Host sẽ tiến hành đọc các thông tin mô tả (Description) của USB Device, từ đó thiết lập địa chỉ (NodeID) và chế độ hoạt động tương ứng cho thiết bị USB Device. Các địa chỉ sẽ được đánh từ 1->126 nên về lý thuyết, chuẩn USB cho phép kết nối 126 thiết bị vào đường Bus. Khi thiết bị rút ra khỏi đường Bus, địa chỉ này sẽ được thu hồi. Viết driver cho thiết bị USB mouse Hình 3 quá trình liệt kê Quá trình truyền dữ liệu: để hiểu quá trình truyền dữ liệu này, ta phải hiểu được hai khái niệm quan trọng nhất trong chuẩn USB, đó là khái niệm Interface và Endpoint (chỉ USB device có Endpoint, USB Host không có). Một thiết bị USB sẽ có thể có nhiều Interface, một Interface có thể sử dụng nhiều Endpoint. Ví dụ: Thẻ nhớ USB chỉ sử dụng 1 Interface theo chuẩn USB Mass storage, interface này sử dụng 3 Endpoint. Viết driver cho thiết bị USB mouse Bộ USB 3G sử dụng các Interface khác nhau như: CD Room, Mass storage và Communication, mỗi interface lại sử dụng nhiều Endpoint khác nhau. - Endpoint cũng như các Port trong chuẩn TCP/IP đóng vai trò như các bộ đệm truyền/nhận dữ liệu. Nhờ việc sử dụng nhiều bộ đệm mà các quá trình truyền thông được tiến hành song song và cho tốc độ cao hơn, bên cạnh đó giúp cho việc phân tách các dịch vụ khác nhau. Với chuẩn USB, các thiết bị được thiết kế với tối đa là 16 Enppoint. Các Endpoint được phân loại theo hướng truyền dữ liệu nhìn từ phía USB Host. Cụ thể: • Các Endpoint truyền dữ liệu từ USB Device tới USB Host là endpoint IN. • Các Endoint truyền dữ liệu từ USB Host tới USB Device là endpoint OUT. - Các thông tin cấu hình của một thiết bị USB hoạt động với 1 Interface, Interface này sử dụng hai Endpoint (0x01 và 0x82), 1 Endpoint In và một Endpoint Out, cả hai Endpoint hoạt động ở chế độ Bulk Transfer. Trên Linux, ta có thể dùng lệnh lsusb để xem các thông tin này với bất cứ thiết bị USB nào cắm vào Bus. Viết driver cho thiết bị USB mouse 1.4 Chế độ truyền Chuẩn USB cung cấp 4 chế độ truyền: Truyền điều khiển (Control transfer): là chế độ truyền được tất cả các thiết bị USB hỗ trợ để truyền các thông tin điều khiển với tốc độ tương đối chậm. Truyền ngắt (Interrupt transfer): sử dụng cho các thiết bị cần truyền một lượng dữ liệu nhỏ, tuần hoàn theo thời gian ví dụ như chuột, bàn phím. Khi đó, ví dụ cứ 10s một lần USB Host sẽ gửi request xuống và USB Device sẽ trả dữ liệu về cho USB Host (với trường hợp Interrupt In Endpoint). Truyền theo khối (Bulk transfer): sử dụng cho các thiết bị cần truyền một lượng dữ liệu lớn, yêu cầu độ chính xác tuyệt đối, không có ràng Viết driver cho thiết bị USB mouse buộc quá chặt chẽ về thời gian thực (tương tự giao thức TCP/IP trong mạng Ethernet). Ví dụ: thẻ nhớ USB, máy in. Truyền đẳng thời (Isochronous transfer): sử dụng cho các thiết bị cần truyền một lượng dữ liệu lớn với tốc độ rất nhanh, đảm bảo ràng buộc về thời gian thực tuy nhiên chấp nhận hy sinh độ chính xác ở một mức nhất định như các thiết bị nghe nhạc, xem phim kết nối theo chuẩn USB. (tương tự giao thức UDP trong mạng Ethernet). 2. Quy trình viết device driver trên Linux 2.1 Mô hình phân lớp hệ thống usb trên linux Tầng USB Device Drivers nằm giữa 2 tầng: USB Core và các hệ thống con khác nhau của nhân (Kernel Subsystems) như: hệ thống con thiết bị kiểu khối (Block), hệ thống con thiết bị kiểu kí tự (Char), hệ thống con thiết bị đầu vào (Input) USB Core do nhân hệ điều hành Linux cung cấp, với các API (Application Programming Interface) nhằm hỗ trợ các thiết bị USB và USB Host Controller. Vai trò: USB Core là trừu tượng hóa tất cả các phần cứng và các thành phần phụ thuộc thiết bị. Viết driver cho thiết bị USB mouse Các USB Device Driver sử dụng các tham số của tầng USB Core, không cần quan tâm tới các nền tảng phần cứng khác nhau. USB Device Driver xuất ra các API lên tầng trên. Tùy theo thiết bị có thể được xếp vào các lớp con như lớp vào dữ liệu (Input), lớp âm thanh (Sound), lớp bộ nhớ (memory) mà Driver có thể xuất ra các API khác nhau. Các ứng dụng người dùng khi muốn giao tiếp với thiết bị phần cứng sẽ sử dụng các API này để yêu cầu USB Device Driver thực hiện: USB core tham số hóa thiết bị để USB device dirver có thể làm việc được với mọi thiết bị có chuẩn USB. USB device driver lái luồng dữ liệu, luồng điều khiển để hardware và application bên trên có thể liên lạc với nhau một cách chính xác. 2.2 Danh sách thiết bị điều khiển bởi usb Khi viết một USB Driver người lập trình viên cần chỉ định xem Driver này sẽ được sử dụng cho các thiết bị hoặc các lớp thiết bị nào. Cấu trúc usb_device_id cung cấp một kiểu thiết bị, nó có thể là một thiết bị cụ thể cũng có thể là một lớp thiết bị. Có một số macro để khởi tạo cấu trúc này. Ví dụ: Sử dụng macro USB_DEVICE (vendor, product) để tạo ra một cấu trúc usb_device_id với IDvendor và IDproduct. Sau khi đã tạo ra một cấu trúc usb_device_id ta cần phải khai báo cấu trúc này với USB Core, để làm việc này ta sử dụng macro. MODULE_DEVICE_TABLE(usb, usb_device_id[]); Trong đó usb_device_id[] là một mảng các cấu trúc usb_device_id đã khởi tạo trước đó. Ví dụ: static struct usb_device_id mydev_table[] = { { USB_DEVICE (0x2179, 0x1989) }, { } }; MODULE_DEVICE_TABLE(usb, mydev_table); Viết driver cho thiết bị USB mouse 2.3 Khai báo cấu trúc dữ liệu thiết bị Trong quá trình thăm dò thiết bị, có rất nhiều thông tin về thiết bị ta truy nhập được và cần phải lưu lại để sử dụng về sau. Các thông tin cần thiết bao gồm: thiết bị cụ thể (được xác định bởi cấu trúc usb_device), thông tin các Configuration, Interface, Endpoint của thiết bị. Tùy theo đặc điểm của từng phần cứng cụ thể mà ta định nghĩa một cấu trúc dữ liệu phù hợp. 2.4 Đăng ký và hủy đăng ký usb Device Driver Để tầng USB Core có thể nhận ra Driver, lập trình viên cần phải đăng kí Driver đó. Sử dụng hàm sau để làm việc này: usb_register(struct usb_driver &); Hàm này thường được gọi trong hàm khởi tạo mô-đun Driver đang viết.Tham số cần truyền cho hàm này là một con trỏ tới cấu trúc usb_driver. Cấu trúc này bao gồm các thông tin về Driver đang viết. Cấu trúc này được định nghĩa như sau: struct usb_driver { const char * name; int (* probe) (struct usb_interface *intf, const struct usb_device_id *id); void (* disconnect) (struct usb_interface *intf); int (* ioctl) (struct usb_interface *intf, unsigned int code, void *buf); int (* suspend) (struct usb_interface *intf, pm_message_t message); int (* resume) (struct usb_interface *intf); int (* reset_resume) (struct usb_interface *intf); int (* pre_reset) (struct usb_interface *intf); int (* post_reset) (struct usb_interface *intf); const struct usb_device_id * id_table; struct usb_dynids dynids; [...]... space) giống như file thiết bị thì ở đây, usb driver cần thực hiện kết nối đến thiết bị thật trong tầng phần cứng (hardware-space) Các hàm API của tầng USB core để thực hiện đăng ký và hủy đăng ký thiết bị như sau (nằm trong tệp tiêu đề ): Viết driver cho thiết bị USB mouse int usb_ register(struct usb _driver *driver) ; void usb_ deregister(struct usb _driver *); Cấu trúc usb _driver chứa các trường... \n"); usb_ set_intfdata(intf, NULL); if (mouse) { usb_ kill_urb (mouse- >irq); input_unregister_device (mouse- >dev); usb_ free_urb (mouse- >irq); Viết driver cho thiết bị USB mouse usb_ buffer_free(interface_to_usbdev(intf), 8, mouse- >data, mouse> data_dma); kfree (mouse) ; } } static struct usb_ device_id usb_ mouse_ id_table [] = { { USB_ INTERFACE_INFO (USB_ INTERFACE_CLASS_HID, USB_ INTERFACE_SUBCLASS_BOOT, USB_ INTERFACE_PROTOCOL _MOUSE) ... USB_ INTERFACE_PROTOCOL _MOUSE) }, { } /* Terminating entry */ }; MODULE_DEVICE_TABLE (usb, usb_ mouse_ id_table); static struct usb _driver usb_ mouse _driver = { name = "usbmouse", probe = usb_ mouse_ probe, disconnect = usb_ mouse_ disconnect, id_table = usb_ mouse_ id_table, }; static int init usb_ mouse_ init(void) { int retval = usb_ register( &usb_ mouse _driver) ; if (retval == 0) printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_ VERSION... Chúng em đã thu được những kết quả cụ thể như sau: Viết driver cho thiết bị USB mouse Đã thực hiện: - Nghiên cứu, và lập trình trên linux - Viết được driver usb mouse - Xây dựng kiến thức về lập trình driver trên linux Định hướng mở rộng: - Xây dựng driver hoàn thiện cho các loại driver usb - Cải thiện được driver usb cho những sãn phấp phần cứng thiết kế Do thời gian có hạn và năng lực của nhóm còn... hủy đăng kí một USB Device Driver ra khỏi hệ thống, ta sử dụng hàm sau: usb_ deregister(struct usb _driver &); Hàm này thường được gọi trong hàm kết thúc mô-đun Driver đang viết 2.5 Thăm dò thiết bị Khi thiết bị mới được kết nối tới hệ thống, nếu Driver được chỉ định cho điều khiển thiết bị đó thì hàm thăm dò của Driver sẽ được gọi USB Core truyền tới hàm thăm dò một con trỏ tới cấu trúc usb_ interface... tên driver, bảng ID để dò thiết bị tự động, và 2 hàm callback được gọi bởi USB core trong quá trình kết nối thiết bị (hot plugging) và ngắt kết nối thiết bị (hot removal) 3 Quá trình build trên linux (ubuntu 12.04) Mục đích build ra file file ko để cài đặt driver mouse Quá trình buil file ko(kenal object) Thư mục build file ko Cài đặt file ko 4 Code driver mouse Code :driver_ mouse. c Viết driver cho thiết. .. here 16 \n"); if (dev->manufacturer) Viết driver cho thiết bị USB mouse strlcpy (mouse- >name, dev->manufacturer, sizeof (mouse- >name)); if (dev->product) { if (dev->manufacturer) strlcat (mouse- >name, " ", sizeof (mouse- >name)); strlcat (mouse- >name, dev->product, sizeof (mouse- >name)); } if (!strlen (mouse- >name)) snprintf (mouse- >name, sizeof (mouse- >name), "USB HIDBP Mouse %04x:%04x", le16_to_cpu(dev->descriptor.idVendor),... REL_WHEEL, data[3]); Viết driver cho thiết bị USB mouse input_sync(dev); resubmit: status = usb_ submit_urb (urb, GFP_ATOMIC); if (status) err ("can't resubmit intr, %s-%s/input0, status %d", mouse- >usbdev->bus->bus_name, mouse- >usbdev->devpath, status); printk(KERN_INFO "Something important happened here 13 \n"); } static int usb_ mouse_ open(struct input_dev *dev) { struct usb_ mouse *mouse = input_get_drvdata(dev);... \n"); mouse- >irq->dev = mouse- >usbdev; if (usb_ submit_urb (mouse- >irq, GFP_KERNEL)) return -EIO; return 0; } static void usb_ mouse_ close(struct input_dev *dev) { struct usb_ mouse *mouse = input_get_drvdata(dev); usb_ kill_urb (mouse- >irq); printk(KERN_INFO "Something important happened here 16 \n"); } static int usb_ mouse_ probe(struct usb_ interface *intf, const struct usb_ device_id *id) { struct usb_ device... usb_ interface mô tả Interface được chọn trên thiết bị Trong hàm thăm dò, Driver cần thực hiện một số công việc sau: Viết driver cho thiết bị USB mouse Lấy ra địa chỉ các Endpoint cần dùng, lấy ra kích thước các bộ đệm cho thiết bị Cấp phát bộ đệm Lưu lại các thông tin (địa chỉ Endpoint, kích thước bộ đệm, địa chỉ bộ đệm…) Đăng kí lớp thiết bị cho Driver Truy cập các thông tin Endpoint Lưu . Viết driver cho thiết bị USB mouse BÁO CÁO BÀI TẬP LỚN HỆ ĐIỀU HÀNH Đề tài: Viết driver cho thiết bị USB mouse. Nhóm sinh viên thực hiện: Nhóm 04 –. 20102591 Hà Nội ngày 02 tháng 05 năm 2014 Viết driver cho thiết bị USB mouse Mục lục Viết driver cho thiết bị USB mouse 1. Tổng quan về Chuẩn USB 1.1 Chuẩn tín hiệu Chuẩn USB sử dụng 4 đường tín hiệu trong. các thiết bị USB và USB Host Controller. Vai trò: USB Core là trừu tượng hóa tất cả các phần cứng và các thành phần phụ thuộc thiết bị. Viết driver cho thiết bị USB mouse Các USB Device Driver