touch-panel-driver
TRANSCRIPT
![Page 1: touch-panel-driver](https://reader033.vdocuments.net/reader033/viewer/2022061117/5468524cb4af9fdf3f8b57de/html5/thumbnails/1.jpg)
Touch Panel DriverTouch Panel Driver
汪長剛 97951140許良宇 97951126游源智 97951123
![Page 2: touch-panel-driver](https://reader033.vdocuments.net/reader033/viewer/2022061117/5468524cb4af9fdf3f8b57de/html5/thumbnails/2.jpg)
驅動程式功能與架構驅動程式功能與架構
![Page 3: touch-panel-driver](https://reader033.vdocuments.net/reader033/viewer/2022061117/5468524cb4af9fdf3f8b57de/html5/thumbnails/3.jpg)
USB 驅動程式功能
usb driver
usb core
Kernel space
User space
•提供 system call 的作業方法•提供給 usb core 裝置的作業方法
![Page 4: touch-panel-driver](https://reader033.vdocuments.net/reader033/viewer/2022061117/5468524cb4af9fdf3f8b57de/html5/thumbnails/4.jpg)
USB 驅動程式架構
Kernel space
User space /dev/idtk0
fops open
release
ioctl
read
probe
disconnect
complete
buffer
usb core
![Page 5: touch-panel-driver](https://reader033.vdocuments.net/reader033/viewer/2022061117/5468524cb4af9fdf3f8b57de/html5/thumbnails/5.jpg)
static struct usb_class_driver touch_class = {.name = “idtk%d”, /* sysfs 中的裝置檔名稱 */.fops = &idealtek_fops, /* 作業方法 */.mode = S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP,
.minor_base = IDEALTEK_MINOR, /* minor 的開始值 */};
USB 驅動程式架構
Kernel space
User space
usb core 所需的驅動程式資料與作業方法static struct usb_driver idealtek_driver = {
.name = "idealtek",
.probe = idealtek_probe,
.disconnect = idealtek_disconnect,
.id_table = idealtek_ids,};
![Page 6: touch-panel-driver](https://reader033.vdocuments.net/reader033/viewer/2022061117/5468524cb4af9fdf3f8b57de/html5/thumbnails/6.jpg)
USB 驅動程式架構作業方法static struct file_operations idealtek_fops ={ .owner = THIS_MODULE,
.read = idealtek_fops_read,
.ioctl = idealtek_fops_ioctl,
.open = idealtek_fops_open,
.release = idealtek_fops_release,};
支援裝置列表struct usb_device_id idealtek_ids[] = { { USB_DEVICE(0x1391, 0x1000), driver_info: 0 }, {}};
MODULE_DEVICE_TABLE(usb, idealtek_ids);
![Page 7: touch-panel-driver](https://reader033.vdocuments.net/reader033/viewer/2022061117/5468524cb4af9fdf3f8b57de/html5/thumbnails/7.jpg)
USB 驅動程式架構驅動程式進入點static int __init idealtek_init(void){
int result;result = usb_register(&idealtek_driver);return result;
}module_init(idealtek_init);
清理函式static void __exit idealtek_exit(void){
usb_deregister(&idealtek_driver);}module_exit(idealtek_exit);
![Page 8: touch-panel-driver](https://reader033.vdocuments.net/reader033/viewer/2022061117/5468524cb4af9fdf3f8b57de/html5/thumbnails/8.jpg)
Probe 作業方法
![Page 9: touch-panel-driver](https://reader033.vdocuments.net/reader033/viewer/2022061117/5468524cb4af9fdf3f8b57de/html5/thumbnails/9.jpg)
disconnect 作業方法
![Page 10: touch-panel-driver](https://reader033.vdocuments.net/reader033/viewer/2022061117/5468524cb4af9fdf3f8b57de/html5/thumbnails/10.jpg)
static int idealtek_fops_open 對 /dev 下的 idtk0 進行開檔的動
作,並且標記此裝置已開啟
static int idealtek_fops_release
對 /dev 下的 idtk0 進行關檔的動作,並且標記此裝置已關閉
fops 作業方法
![Page 11: touch-panel-driver](https://reader033.vdocuments.net/reader033/viewer/2022061117/5468524cb4af9fdf3f8b57de/html5/thumbnails/11.jpg)
static ssize_t idealtek_fops_read Read 函式主要透過 usb core 對裝置
進行讀取,並將資料傳送至使用端
buffer
Kernel spaceUser space
usb coreAP
fops 作業方法
![Page 12: touch-panel-driver](https://reader033.vdocuments.net/reader033/viewer/2022061117/5468524cb4af9fdf3f8b57de/html5/thumbnails/12.jpg)
無鎖演算法無鎖演算法
環狀暫存區
(circular buffer)
寫入資料讀出資料
![Page 13: touch-panel-driver](https://reader033.vdocuments.net/reader033/viewer/2022061117/5468524cb4af9fdf3f8b57de/html5/thumbnails/13.jpg)
F I F O
暫存區已滿 暫存區無資料環狀暫存區
in
out
in
out
in
out
無鎖演算法無鎖演算法
![Page 14: touch-panel-driver](https://reader033.vdocuments.net/reader033/viewer/2022061117/5468524cb4af9fdf3f8b57de/html5/thumbnails/14.jpg)
static int idealtek_fops_ioctl 1.command 2. 資料校正 3. 座標定位
fops 作業方法
![Page 15: touch-panel-driver](https://reader033.vdocuments.net/reader033/viewer/2022061117/5468524cb4af9fdf3f8b57de/html5/thumbnails/15.jpg)
測試驅動程式測試驅動程式
![Page 16: touch-panel-driver](https://reader033.vdocuments.net/reader033/viewer/2022061117/5468524cb4af9fdf3f8b57de/html5/thumbnails/16.jpg)
操作過程之問題與解決操作過程之問題與解決1. insmod driver
問題 :make 不成功,顯示 class 結構的 mode 和 driver 結構的 owner 無法使用。
解決辦法:不使用。
2. 使用裝置檔 問題 : 使用 lsmod 可以找到載入的 module
![Page 17: touch-panel-driver](https://reader033.vdocuments.net/reader033/viewer/2022061117/5468524cb4af9fdf3f8b57de/html5/thumbnails/17.jpg)
操作過程之問題與解決操作過程之問題與解決
但在 /proc/device 卻找不到??因此無法查詢它的
major 和 minor ,導致無法在 /dev 使用mknod 建立
虛擬裝置檔
![Page 18: touch-panel-driver](https://reader033.vdocuments.net/reader033/viewer/2022061117/5468524cb4af9fdf3f8b57de/html5/thumbnails/18.jpg)
操作過程之問題與解決操作過程之問題與解決
不過使用 lsusb 還是可以發現 kernel 抓到這個裝置
此外, dmesg 同樣也可以發現 usb 的資訊
![Page 19: touch-panel-driver](https://reader033.vdocuments.net/reader033/viewer/2022061117/5468524cb4af9fdf3f8b57de/html5/thumbnails/19.jpg)
操作過程之問題與解決操作過程之問題與解決
因此我們可以判斷 USB 確實有被 Kernel 找到並且辨識出
其廠牌、型號。
陶世軒老師給我們提示所有的裝置一定會在 /dev 顯示。
最終,發現當我們註冊 URB 的時候usb_register_dev(intf, &touch_class)
![Page 20: touch-panel-driver](https://reader033.vdocuments.net/reader033/viewer/2022061117/5468524cb4af9fdf3f8b57de/html5/thumbnails/20.jpg)
操作過程之問題與解決操作過程之問題與解決
Kenerl 會使用 Class 結構裡面所定義的資訊替我們
建立裝置檔。
![Page 21: touch-panel-driver](https://reader033.vdocuments.net/reader033/viewer/2022061117/5468524cb4af9fdf3f8b57de/html5/thumbnails/21.jpg)
操作過程之問題與解決操作過程之問題與解決
3. 問題:① 為何之前都沒發現 /dev 底下會出現 usb 的裝置檔?
原因: USB 常常無法讀取,或是已經辨識 USB
的身份,卻沒有在 /dev 底下產生裝置
檔
② 擷取座標的時候,某部份的 Touch Panel 觸碰後沒有反應?
原因: Controller 故障。
![Page 22: touch-panel-driver](https://reader033.vdocuments.net/reader033/viewer/2022061117/5468524cb4af9fdf3f8b57de/html5/thumbnails/22.jpg)
解決卡住很久的瓶頸後,便可使用 USB 提取座標
X 軸之資料
Y 軸之資料
位
移
位
移
![Page 23: touch-panel-driver](https://reader033.vdocuments.net/reader033/viewer/2022061117/5468524cb4af9fdf3f8b57de/html5/thumbnails/23.jpg)
預計目標
•校正觸控面板。
•將驅動程式與 X window system 連結。