touch-panel-driver

23
Touch Panel Driver Touch Panel Driver 汪汪汪 97951140 汪汪汪 97951126 汪汪汪 97951123

Upload: bryant6831

Post on 13-Nov-2014

799 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: touch-panel-driver

Touch Panel DriverTouch Panel Driver

汪長剛 97951140許良宇 97951126游源智 97951123

Page 2: touch-panel-driver

驅動程式功能與架構驅動程式功能與架構

Page 3: touch-panel-driver

USB 驅動程式功能

usb driver

usb core

Kernel space

User space

•提供 system call 的作業方法•提供給 usb core 裝置的作業方法

Page 4: touch-panel-driver

USB 驅動程式架構

Kernel space

User space /dev/idtk0

fops open

release

ioctl

read

probe

disconnect

complete

buffer

usb core

Page 5: touch-panel-driver

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

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

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

Probe 作業方法

Page 9: touch-panel-driver

disconnect 作業方法

Page 10: touch-panel-driver

static int idealtek_fops_open 對 /dev 下的 idtk0 進行開檔的動

作,並且標記此裝置已開啟

static int idealtek_fops_release

對 /dev 下的 idtk0 進行關檔的動作,並且標記此裝置已關閉

fops 作業方法

Page 11: touch-panel-driver

static ssize_t idealtek_fops_read Read 函式主要透過 usb core 對裝置

進行讀取,並將資料傳送至使用端

buffer

Kernel spaceUser space

usb coreAP

fops 作業方法

Page 12: touch-panel-driver

無鎖演算法無鎖演算法

環狀暫存區

(circular buffer)

寫入資料讀出資料

Page 13: touch-panel-driver

F I F O

暫存區已滿 暫存區無資料環狀暫存區

in

out

in

out

in

out

無鎖演算法無鎖演算法

Page 14: touch-panel-driver

static int idealtek_fops_ioctl 1.command 2. 資料校正 3. 座標定位

fops 作業方法

Page 15: touch-panel-driver

測試驅動程式測試驅動程式

Page 16: touch-panel-driver

操作過程之問題與解決操作過程之問題與解決1. insmod driver

問題 :make 不成功,顯示 class 結構的 mode 和 driver 結構的 owner 無法使用。

解決辦法:不使用。

2. 使用裝置檔 問題 : 使用 lsmod 可以找到載入的 module

Page 17: touch-panel-driver

操作過程之問題與解決操作過程之問題與解決

但在 /proc/device 卻找不到??因此無法查詢它的

major 和 minor ,導致無法在 /dev 使用mknod 建立

虛擬裝置檔

Page 18: touch-panel-driver

操作過程之問題與解決操作過程之問題與解決

不過使用 lsusb 還是可以發現 kernel 抓到這個裝置

此外, dmesg 同樣也可以發現 usb 的資訊

Page 19: touch-panel-driver

操作過程之問題與解決操作過程之問題與解決

因此我們可以判斷 USB 確實有被 Kernel 找到並且辨識出

其廠牌、型號。

陶世軒老師給我們提示所有的裝置一定會在 /dev 顯示。

最終,發現當我們註冊 URB 的時候usb_register_dev(intf, &touch_class)

Page 20: touch-panel-driver

操作過程之問題與解決操作過程之問題與解決

Kenerl 會使用 Class 結構裡面所定義的資訊替我們

建立裝置檔。

Page 21: touch-panel-driver

操作過程之問題與解決操作過程之問題與解決

3. 問題:① 為何之前都沒發現 /dev 底下會出現 usb 的裝置檔?

原因: USB 常常無法讀取,或是已經辨識 USB

的身份,卻沒有在 /dev 底下產生裝置

② 擷取座標的時候,某部份的 Touch Panel 觸碰後沒有反應?

原因: Controller 故障。

Page 22: touch-panel-driver

解決卡住很久的瓶頸後,便可使用 USB 提取座標

X 軸之資料

Y 軸之資料

Page 23: touch-panel-driver

預計目標

•校正觸控面板。

•將驅動程式與 X window system 連結。