1. Trang chủ
  2. » Giáo Dục - Đào Tạo

BÀI TẬP LỚN CUỐI KỲ HỆ ĐIỀU HÀNH VIẾT DRIVER CHO USB TRÊN UBUNTU

48 31 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 48
Dung lượng 870,54 KB

Nội dung

lOMoARcPSD|9242611 TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN ĐIỆN TỬ VIỄN THÔNG BÀI TẬP LỚN CUỐI KỲ HỆ ĐIỀU HÀNH Đề tài: VIẾT DRIVER CHO USB TRÊN UBUNTU Nhóm Sinh viên thực hiện: 20172715 - PHÙNG THỊ KIM NGÂN 20182593 - PHẠM THỊ THANH HUYỀN 20182721 - TRỊNH THANH PHONG Giảng viên hướng dẫn: TS.NGUYỄN THANH BÌNH Hà Nội - 2022 lOMoARcPSD|9242611 LỜI NĨI ĐẦU Lập trình hệ thống nhúng, công việc quan trọng với lập trình ghép nối, điều khiển module, thiết bị ngoại vi ghép nối với hệ trung tâm Để làm việc này, ngồi kỹ lập trình cần phải thành thạo giao thức ghép nối phổ biến RS232, SPI, I2C đặc biệt nhu cầu tất yếu phải tìm hiểu chuẩn USB nói chuẩn phổ biến Tìm hiểu chuẩn USB giúp cho có kiến thức để làm nhiều cơng việc như: thiết kế, chế tạo thiết bị hoạt động theo chuẩn USB, viết driver cho thiết bị giao chuẩn USB Tìm hiểu hệ điều hành vận dụng kiến thức học giảng đường nên nhóm em lựa chọn đề tài: “Viết Driver cho USB Ubuntu” Đề tài nhóm hướng đến driver đơn giản để tìm hiểu trình hệ thống Linux làm việc với thiết bị USB Driver hướng đến chức sau: đăng ký/hủy đăng ký, ngắt kết nối, lấy thông tin, mở tập tin từ thiết bị, đọc/ghi liệu với thiết bị Nhóm chúng em xin gửi lời cảm ơn chân thành đến TS Nguyễn Thanh Bình hướng dẫn, đưa tiến trình tìm hiểu đề tài cụ thể để nhóm chúng em hồn thành mục tiêu tập lớn Trong trình thực đề tài, nhóm chúng em cố gắng khơng thể tránh khỏi thiếu sót Chúng em mong nhận dẫn góp ý thầy để đề tài ngày hoàn thiện Chúng em xin chân thành cảm ơn lOMoARcPSD|9242611 MỤC LỤC DANH MỤC HÌNH VẼ i CHƯƠNG TỔNG QUAN VỀ USB 1.1 Giới thiệu USB 1.1.1 Định nghĩa USB 1.1.2 Cấu tạo USB 1.2 Chuẩn tín hiệu 1.3 Mơ hình mạng 1.4 Quá trình hoạt động chuẩn USB 1.5 Chế độ truyền 1.6 Mô tả thiết bị 1.6.1 Standard USB descriptors (Mô tả chuẩn USB) 1.6.2 Human Interface Devices (HID) 10 CHƯƠNG VIẾT DRIVER CHO UBUNTU 11 2.1 Quá trình nhận dạng USB Linux 11 2.2 Xây dựng driver cho USB chuột 12 2.2.1 Khung USB driver 12 2.2.2 Lấy thông tin thiết bị USB giao tiếp (USB device) 14 2.2.3 Khai báo thư viện 14 2.2.4 Khởi tạo 15 2.2.5 Interupt 16 2.2.6 Thăm dò thiết bị Probe 17 2.2.7 Open syscall 22 2.2.8 Close syscall 22 2.2.9 Disconnect 23 CHƯƠNG KẾT QUẢ 25 lOMoARcPSD|9242611 3.1 Gỡ bỏ driver cũ 25 3.2 Viết driver biên dịch 25 3.3 Kết 27 PHỤ LỤC 31 lOMoARcPSD|9242611 DANH MỤC HÌNH VẼ Hình 1.1 Thiết bị USB Hình 1.2 Cấu tạo Hình 1.3 Chuẩn tín hiệu USB Hình 1.4 Mơ hình mạng thiết bị theo chuẩn USB Hình 1.5 Mơ tả thiết bị USB Hình 1.6 Bộ mô tả USB ánh xạ tới device layout Hình 1.7 Ví dụ Configuration Descriptor cho thiết bị USB webcam Hình 1.8 Ví dụ Interface Descriptor cho cài đặt thay Interface cho thiết bị webcam Hình 1.9 Ví dụ Endpoint Descriptor cho thiết bị webcam 10 Hình 2.1 Quá trình nhận dạng thiết bị USB Linux 12 Hình 2.2 Các thơng tin thiết bị USB 14 Hình 3.1 File Makefile 26 Hình 3.2 Biên dịch module 26 Hình 3.3 Gỡ bỏ Driver usbhid có sẵn 27 Hình 3.4 Kết chạy driver 27 Hình 3.5 Thiết bị USB sau kết nối đăng ký Driver 27 Hình 3.6 USB mouse đăng ký thành công 28 Hình 3.7 Giảm độ sáng hình chuột trái 28 Hình 3.8 Driver ngắt kết nối 28 i lOMoARcPSD|9242611 PHÂN CÔNG CÔNG VIỆC STT Tên Công việc Tổng quan USB Quá trình nhận dạng USB Linux Phạm Thị Thanh Huyền Khai báo thư viện, Khởi tạo Biên dịch chương trình Kiểm tra hoạt động thiết bị dùng driver Tổng quan USB Lấy thông tin thiết bị USB Phùng Thị Kim Ngân Interupt Thăm dò thiết bị Probe Xóa driver cũ Tổng quan USB Khung USB driver Trịnh Thanh Phong Open syscall, Close syscall Disconnect Biên dịch chương trình lOMoARcPSD|9242611 CHƯƠNG TỔNG QUAN VỀ USB 1.1 1.1.1 Giới thiệu USB Định nghĩa USB USB thiết bị lưu trữ di động công cụ để kết nối nhiều thiết bị ngoại vi với máy tính USB phát triển để đơn giản hóa cải thiện giao diện máy tính cá nhân thiết bị ngoại vi USB (Universal Serial Bus) chuẩn kết nối có dây máy tính, sử dụng nhằm kết nối điểm kỹ thuật máy tính với thiết bị ngoại vi Vào cuối năm 1994 đề xuất Intel, Compaq, IBM, Microsoft công ty khác Bây giờ, USB trở thành giao diện mở rộng máy tính tiêu chuẩn kỷ XXI phiên 3.1 tung thị trường USB kết nối với 127 thiết bị bên ngồi mà khơng làm giảm băng thơng USB địi hỏi hỗ trợ phần cứng máy chủ, hệ điều hành thiết bị ngoại vi để làm việc cách Giao diện USB đạt kết nối hai máy tính thơng qua cáp chun dụng tạo giao diện bổ sung nhiều thông qua Hub Ưu điểm: • Giao diện USB tự cấu hình, giúp người dùng khơng cần phải điều chỉnh cài đặt thiết bị tốc độ định dạng liệu, định cấu hình ngắt, địa đầu vào/ra kênh truy cập nhớ trực tiếp • Đầu nối USB tiêu chuẩn hóa máy chủ, thiết bị ngoại vi sử dụng hầu hết ổ cắm có sẵn • USB tận dụng tối đa sức mạnh xử lý bổ sung đưa vào thiết bị ngoại vi để chúng tự quản lý Do đó, thiết bị USB thường khơng có cài đặt giao diện người dùng điều chỉnh • Giao diện USB xác định giao thức để khôi phục từ lỗi phổ biến, cải thiện độ tin cậy so với giao diện trước • Tiêu chuẩn USB cung cấp nhiều lợi ích cho nhà sản xuất phần cứng nhà phát triển phần mềm, đặc biệt dễ thực tương đối • Tiêu chuẩn USB loại bỏ yêu cầu phát triển giao diện độc quyền cho thiết bị ngoại vi lOMoARcPSD|9242611 • Giao diện USB thiết kế để cung cấp độ trễ khả dụng tốt cho chức quan trọng thời gian thiết lập để thực chuyển liệu hàng loạt mà ảnh hưởng đến tài nguyên hệ thống Tiêu chuẩn USB cung cấp nhiều lợi ích cho nhà sản xuất phần cứng nhà phát triển phần mềm, đặc biệt dễ dàng thực hiện: • Tiêu chuẩn USB loại bỏ yêu cầu phát triển giao diện độc quyền cho thiết bị ngoại vi • Giao diện USB thiết kế để cung cấp độ trễ tốt cho chức quan trọng thời gian thiết lập để thực chuyển liệu hàng loạt mà ảnh hưởng đến tài nguyên hệ thống Hạn chế Như với tất tiêu chuẩn, USB có nhiều hạn chế thiết kế nó: • Cáp USB có chiều dài hạn chế, tiêu chuẩn dành cho thiết bị ngoại vi mặt bàn, khơng phải phịng tịa nhà Tuy nhiên, cổng USB kết nối với cổng truy cập thiết bị xa • USB có cấu trúc liên kết mạng nghiêm ngặt giao thức chủ / tớ để định địa thiết bị ngoại vi; thiết bị tương tác với ngoại trừ thông qua máy chủ lưu trữ hai máy chủ giao tiếp trực tiếp qua cổng USB chúng • Máy chủ lưu trữ khơng thể phát tín hiệu đến tất thiết bị ngoại vi lúc thiết bị phải định địa riêng Một số thiết bị ngoại vi tốc độ cao yêu cầu tốc độ ổn định khơng có tiêu chuẩn USB Hình 1.1 Thiết bị USB lOMoARcPSD|9242611 1.1.2 Cấu tạo USB Thơng thường gồm phận sau: • Bản mạch in nhỏ: chứa linh kiện điện tử (hoặc nhiều) chip nhớ flash hàn trực tiếp lên mạch in • Đầu cắm kết nối với cổng USB: kết nối thường sử dụng chuẩn A cho phép chúng kết nối trực tiếp với khe cắm USB máy tính • Vỏ bảo vệ: Tồn mạch in, chip nhớ flash nằm vỏ bảo vệ kim loại nhựa giúp đủ chắn • Lẫy gạt chống ghi: Một số ổ USB flash có thiết kế lẫy gạt để chống ghi liệu, không cho phép hệ điều hành ghi sửa đổi liệu vào ổ • Đèn báo hoạt động: Người sử dụng nên tự quan sát USB vài lần để biết quy luật hoạt động đèn báo tránh tháo thiết bị chúng làm việc Hình 1.2 Cấu tạo 1.2 Chuẩn tín hiệu Chuẩn USB sử dụng đường tín hiệu có đường cấp nguồn DC (VBUS5V GND) đường cịn lại cặp tín hiệu vi sai (D+ D-) cho phép truyền liệu Cặp dây tín hiệu nối xoắn bên nên có khả chống nhiễu tốt Lưu ý: cổng USB máy tính cho phép cấp nguồn ni bên ngồi với dịng lên tới 500mA Như vậy, thiết bị sử dụng điện chuột, thẻ nhớ USB lấy trực tiếp nguồn từ cổng USB máy tính mà khơng cần dùng thêm nguồn ngồi lOMoARcPSD|9242611 Hình 1.3 Chuẩn tín hiệu USB 1.3 Mơ hình mạng Hình 1.4 Mơ hình mạng thiết bị theo chuẩn USB Các thiết bị hoạt động theo chuẩn USB kết nối với theo đồ hình mạng hình phân cấp Trung tâm hình Hub Trong đồ hình trên, thiết bị USB chia làm loại chính: • USB Host: thiết bị đóng vai trị điều khiển tồn mạng USB (có thể lên tới tối đa 126 thiết bị) Ví dụ máy tính, USB Host gắn mainboard Để giao tiếp điều khiển USB device, USB Host controller cần thiết kế tích hợp với USB RootHub (Hub mức cao nhất) Vai trò thiết bị USB Host sau: – Trao đổi liệu với USB Device – Điều khiển USB Bus – Quản lý thiết bị cắm vào hay rút khỏi Bus USB qua trình điểm danh (Enumeration) lOMoARcPSD|9242611 Hình 3.6 USB mouse đăng ký thành công Kiểm tra usbmouse nạp vào Kernel module cách sử dụng chuột để điều chỉnh ánh sáng (click chuột trái để giảm độ sáng hình) Biên dịch file adjustBrightness-exiting.c, file biên dịch đọc từ dev/myDev để điều chỉnh độ sáng hình gcc adjustBrightness-exiting.c sudo /a.out Sau trình biên dịch, nhấn chuột trái để giảm sáng hình Kiểm tra thơng điệp usbmouse Kernel module: Chương trình đăng nhập vào giao diện cho server client sau: Đầu tiên giao diện bên phía server Tiếp theo giao diện bên phía client: Hình 3.7 Giảm độ sáng hình chuột trái Tháo USB khỏi máy tính Dùng lệnh dmesg để kiểm xem thông tin Ở Driver bị ngắt kết nối Hình 3.8 Driver ngắt kết nối 28 Downloaded by tran quang (quangsuphamhoak35@gmail.com) lOMoARcPSD|9242611 KẾT LUẬN Chúng em hiểu kiến thức cần thiết bổ ích hệ điều hành Ubuntu, giao thức USB, quy trình viết driver cho USB, cách biên dịch module kernel, trình làm đề tài Mặc dù kiến thức thành viên nhóm cịn nhiều hạn chế, cố gắng nhóm chúng em cịn nhiều thiếu sót việc thực đề tài Cuối cùng, nhóm chúng em xin chân thành cảm ơn hướng dẫn thầy TS Nguyễn Thanh Bình Chúng em mong nhận thêm góp ý, nhận xét thầy bạn để nhóm hồn thiện đề tài 29 Downloaded by tran quang (quangsuphamhoak35@gmail.com) lOMoARcPSD|9242611 TÀI LIỆU THAM KHẢO [1] https://vi.wikipedia.org/wiki/USB [2] https://fptshop.com.vn/tin-tuc/thu-thuat/o-usb-la-gi-127727 [3] https://sites.google.com/site/embedded247/embeddedsystem/usbprotocol [4] https://sites.google.com/site/embedded247/ddcourse/usb-device-drivers-phan-1usb-driver-tren-linux-1 [5] https://sites.google.com/site/embedded247/ddcourse/usb-device-drivers-phan-2usb-driver-tren-linux-2 [6] https://www.beyondlogic.org/usbnutshell/usb3.shtml [7] Lwn.net n.d Linux Device Drivers, Third Edition [LWN.net] [ONLINE] Available at: https://lwn.net/Kernel/LDD3/ [Accessed November 2021] [8] Docs.microsoft.com n.d USB descriptors - Windows drivers | Microsoft Docs [ONLINE] Available at: https://docs.microsoft.com/en-us/windowshardware/drivers/usbcon/usb-descriptors [Accessed November 2021] [9] https://matthias.vallentin.net/blog/2007/04/writing-a-linux-kernel-driver-for-anunknown-usb-device/ [10] https://github.com/KaustubhG/usb-mouse-driver 30 Downloaded by tran quang (quangsuphamhoak35@gmail.com) lOMoARcPSD|9242611 PHỤ LỤC usbmouse.c #include // Needed for KERN_INFO #include // Allocation/freeing memory in kernel space #include // Needed by all modules #include // Needed for the macros #include // Needed for device input #include // USB HID quirk support for Linux itdefines all USB_VENDOR_ID parameters #include // file_operations #include // Segment operation header file, which defines embedded assembly functions related to segment register operations #include // Contains function definitions such as copy_to_user, copy_from_user and the kernel to access the memory address of the user process #include // holds all the information that the kernel needs to manipulate buffers #include // contains some sections that are device specific: interrupt numbers, features, data structures and the address mapping for device-specific peripherals of devices #include // Utility Applications of the Control Device Interface /* * Version Information */ #define DRIVER_VERSION "v1.10" #define DRIVER_AUTHOR "Vojtech Pavlik " #define DRIVER_DESC "USB HID core driver" #define DRIVER_LICENSE "GPL" MODULE_AUTHOR(DRIVER_AUTHOR); MODULE_DESCRIPTION(DRIVER_DESC); MODULE_LICENSE(DRIVER_LICENSE); 31 Downloaded by tran quang (quangsuphamhoak35@gmail.com) lOMoARcPSD|9242611 static char current_data = 0; static int registered = 0; struct usb_mouse { //mouse description char name[128]; char phys[64]; struct usb_device *usbdev; struct input_dev *dev; struct urb *irq; //interrupt handler signed char *data; //interrupt buffer dma_addr_t data_dma; //dma address }; static void usb_mouse_irq(struct urb *urb) //to build urb callback functions { struct usb_mouse *mouse = urb->context; signed char *data = mouse->data; struct input_dev *dev = mouse->dev; int status; switch (urb->status) { case 0: /* success */ break; case -ECONNRESET: /* unlink */ case -ENOENT: case -ESHUTDOWN: return; /* -EPIPE: should clear the halt */ default: /* error */ goto resubmit; } input_report_key(dev, BTN_LEFT, data[0] & 0x01); // Left mouse input_report_key(dev, BTN_RIGHT, data[0] & 0x02); // Right mouse 32 Downloaded by tran quang (quangsuphamhoak35@gmail.com) lOMoARcPSD|9242611 input_report_key(dev, BTN_MIDDLE, data[0] & 0x04); // Middle mouse input_report_rel(dev, REL_X, data[1]); // horizontal axis input_report_rel(dev, REL_Y, data[2]); // vertical axis input_report_rel(dev, REL_WHEEL, data[3]); // knob coordinates input_sync(dev); // sync data with input device resubmit: status = usb_submit_urb (urb, GFP_ATOMIC); if (status) dev_err(&mouse->usbdev->dev, "can’t resubmit intr, %s-%s/input0, status %d\n", mouse->usbdev->bus->bus_name, mouse->usbdev->devpath, status); current_data = data[0]; if(!(data[0] & 0x01) && !(data[0] & 0x02)) { pr_info("No button pressed!\n"); return; //Neither button pressed } //check which button pressed if(data[0] & 0x01){ pr_info("Left mouse button clicked!\n"); } else if(data[0] & 0x02){ pr_info("Right mouse button clicked!\n"); } } // This function gets device data and send with urb static int usb_mouse_open(struct input_dev *dev) //opens mouse devices.and submit its status to build urb { 33 Downloaded by tran quang (quangsuphamhoak35@gmail.com) lOMoARcPSD|9242611 struct usb_mouse *mouse = input_get_drvdata(dev); mouse->irq->dev = mouse->usbdev; if (usb_submit_urb(mouse->irq, GFP_KERNEL)) return -EIO; return 0; } //device file ops static int my_open(struct inode *i, struct file *f) { printk(KERN_INFO "Driver: open()\n"); return 0; } static int my_close(struct inode *i, struct file *f) { printk(KERN_INFO "Driver: close()\n"); return 0; } static ssize_t my_read(struct file *f, char user *buf, size_t len, loff_t *off) { printk(KERN_INFO "Driver: read()\n"); return copy_to_user(buf, ¤t_data, 1) ? -EFAULT : 0; //Copy current click data to buffer current_data = 0; //Clear current data return 0; } static ssize_t my_write(struct file *f, const char user *buf, size_t len, loff_t *off) { printk(KERN_INFO "Driver: write()\n"); return len; } 34 Downloaded by tran quang (quangsuphamhoak35@gmail.com) lOMoARcPSD|9242611 static struct file_operations pugs_fops = { owner = THIS_MODULE, open = my_open, release = my_close, read = my_read, write = my_write }; // This function gets device’s data and cancel urb transmission static void usb_mouse_close(struct input_dev *dev) //turns of usb device at the end of urb cycle { struct usb_mouse *mouse = input_get_drvdata(dev); usb_kill_urb(mouse->irq); } // Probe if device is connected static int usb_mouse_probe(struct usb_interface *intf, const struct usb_device_id *id) { struct usb_device *dev = interface_to_usbdev(intf); // usb device type pointer struct usb_host_interface *interface; struct usb_endpoint_descriptor *endpoint; // contains infomations of endpoints struct usb_mouse *mouse; struct input_dev *input_dev; int pipe, maxp; int error = -ENOMEM; // memory overflow error int t; interface = intf->cur_altsetting; // pointer to its current setting if (interface->desc.bNumEndpoints != 1) return -ENODEV; 35 Downloaded by tran quang (quangsuphamhoak35@gmail.com) lOMoARcPSD|9242611 endpoint = &interface->endpoint[0].desc; if (!usb_endpoint_is_int_in(endpoint)) return -ENODEV; pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress); // create a pipeline to receive commands maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe)); // set the maximum packet for endpoint mouse = kzalloc(sizeof(struct usb_mouse), GFP_KERNEL); // device memory allocation input_dev = input_allocate_device(); if (!mouse || !input_dev) goto fail1; mouse->data = usb_alloc_coherent(dev, 8, GFP_ATOMIC, &mouse->data_dma); if (!mouse->data) goto fail1; mouse->irq = usb_alloc_urb(0, GFP_KERNEL); if (!mouse->irq) goto fail2; mouse->usbdev = dev; mouse->dev = input_dev; if (dev->manufacturer) // get infomations of mouse’s manufacturer strlcpy(mouse->name, dev->manufacturer, sizeof(mouse->name)); if (dev->product) { // get infomations of product if (dev->manufacturer) strlcat(mouse->name, " ", sizeof(mouse->name)); strlcat(mouse->name, dev->product, sizeof(mouse->name)); } if (!strlen(mouse->name)) // get productID, vendorID snprintf(mouse->name, sizeof(mouse->name), 36 Downloaded by tran quang (quangsuphamhoak35@gmail.com) lOMoARcPSD|9242611 "USB HIDBP Mouse %04x:%04x", le16_to_cpu(dev->descriptor.idVendor), le16_to_cpu(dev->descriptor.idProduct)); // create path to sysfs and complete initialization of mouse input device usb_make_path(dev, mouse->phys, sizeof(mouse->phys)); strlcat(mouse->phys, "/input0", sizeof(mouse->phys)); input_dev->name = mouse->name; input_dev->phys = mouse->phys; usb_to_input_id(dev, &input_dev->id); input_dev->dev.parent = &intf->dev; input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL); input_dev->keybit[BIT_WORD(BTN_MOUSE)] = BIT_MASK(BTN_LEFT) | BIT_MASK(BTN_RIGHT) | BIT_MASK(BTN_MIDDLE); input_dev->relbit[0] = BIT_MASK(REL_X) | BIT_MASK(REL_Y); input_dev->keybit[BIT_WORD(BTN_MOUSE)] |= BIT_MASK(BTN_SIDE) | BIT_MASK(BTN_EXTRA); input_dev->relbit[0] |= BIT_MASK(REL_WHEEL); input_set_drvdata(input_dev, mouse); input_dev->open = usb_mouse_open; input_dev->close = usb_mouse_close; usb_fill_int_urb(mouse->irq, dev, pipe, mouse->data, (maxp > ? : maxp), usb_mouse_irq, mouse, endpoint->bInterval); mouse->irq->transfer_dma = mouse->data_dma; mouse->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; error = input_register_device(mouse->dev); if (error) goto fail3; usb_set_intfdata(intf, mouse); 37 Downloaded by tran quang (quangsuphamhoak35@gmail.com) lOMoARcPSD|9242611 //register device t = register_chrdev(91, "mymouse", &pugs_fops); if(tirq); /* jump to fail2 in order to free buffer memory which is allocated by usb_alloc_coherent function */ fail2: usb_free_coherent(dev, 8, mouse->data, mouse->data_dma); /* jump to fail1 if cannot allocate memory or buffer memory for mouse device, fail1 free memory for input device and mouse */ fail1: input_free_device(input_dev); kfree(mouse); return error; } // This function is called when the mouse is disconnected from the computer static void usb_mouse_disconnect(struct usb_interface *intf) { struct usb_mouse *mouse = usb_get_intfdata (intf); usb_set_intfdata(intf, NULL); 38 Downloaded by tran quang (quangsuphamhoak35@gmail.com) lOMoARcPSD|9242611 if (mouse) { usb_kill_urb(mouse->irq); input_unregister_device(mouse->dev); usb_free_urb(mouse->irq); usb_free_coherent(interface_to_usbdev(intf), 8, mouse->data, mouse->data_dma); kfree(mouse); } //if registered, unregister device if(registered) unregister_chrdev(91, "mymouse"); registered = 0; } static struct usb_device_id usb_mouse_id_table [] = { { USB_INTERFACE_INFO(USB_INTERFACE_CLASS_HID, USB_INTERFACE_SUBCLASS_BOOT, 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, }; module_usb_driver(usb_mouse_driver); 39 Downloaded by tran quang (quangsuphamhoak35@gmail.com) lOMoARcPSD|9242611 adjustBrightness_exiting.c #include #include #include #include #include #define MOUSEFILE "/dev/myDev" // int main() { //brightness vars FILE *fp; int currentBrightness = 1; const char *kFileName ="/sys/class/backlight/intel_backlight/brightness"; //get current brightness //mouse vars int fd; struct input_event ie; unsigned char *ptr = (unsigned char*)&ie; unsigned char button,bLeft,bMiddle,bRight; char x,y; if((fd = open(MOUSEFILE, O_RDONLY | O_NONBLOCK )) == -1){ printf("NonBlocking %s open ERROR\n",MOUSEFILE); exit(EXIT_FAILURE); } else{ printf("NonBlocking %s open OK\n",MOUSEFILE); } printf(" \n"); printf("Left click to decrease brightness\n"); 40 Downloaded by tran quang (quangsuphamhoak35@gmail.com) lOMoARcPSD|9242611 printf(" \n"); while(1) { if(read(fd, &ie, sizeof(struct input_event))!=-1) { button=ptr[0]; printf(" -\n"); printf("%d\n", (int)button); bLeft = button & 0x1; printf("Left : %d\n", bLeft); printf(" -\n"); x=(char) ptr[1];y=(char) ptr[2]; //decrease brightness if(bLeft == 1){ //get current brightness fp = fopen(kFileName, "r"); fscanf(fp, "%d", ¤tBrightness); fclose(fp); //increase if(currentBrightness == 1){ continue; } else{ fp = fopen(kFileName, "w"); fprintf(fp, "%d\n", currentBrightness-100); fclose(fp); } } fflush(stdout); } } //wait for release of middle button int a; 41 Downloaded by tran quang (quangsuphamhoak35@gmail.com) lOMoARcPSD|9242611 int b; while(1){ if(read(fd, &ie, sizeof(struct input_event))!=-1){ a = ptr[0]; b = ( a & 0x4 ) > 0; if(b == 0) break; } } close(fd); fflush(stdout); return 0; } 42 Downloaded by tran quang (quangsuphamhoak35@gmail.com) ... 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,... https://sites.google.com/site/embedded247/ddcourse /usb- device-drivers-phan- 1usb -driver- tren-linux-1 [5] https://sites.google.com/site/embedded247/ddcourse /usb- device-drivers-phan- 2usb -driver- tren-linux-2 [6] https://www.beyondlogic.org/usbnutshell /usb3 .shtml... 10 CHƯƠNG VIẾT DRIVER CHO UBUNTU 11 2.1 Quá trình nhận dạng USB Linux 11 2.2 Xây dựng driver cho USB chuột 12 2.2.1 Khung USB driver

Ngày đăng: 05/02/2022, 12:26

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w