You are on page 1of 23

Touch Panel Driver

汪長剛 97951140
許良宇 97951126
游源智 97951123
驅動程式功能與架構
USB 驅動程式功能
•提供 system call 的作業方法
•提供給 usb core 裝置的作業方法

User space
Kernel space

usb driver

usb core
USB 驅動程式架構

/dev/idtk0
User space
Kernel space fops open
read
ioctl
release buffer

probe
usb core complete
disconnect
USB 驅動程式架構
User space
Kernel space
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 core 所需 的驅 動程式 資料 與作業 方法


static struct usb_driver idealtek_driver = {
.name = "idealtek",
.probe = idealtek_probe,
.disconnect = idealtek_disconnect,
.id_table = idealtek_ids,
};
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);
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);
Probe 作業方法
disconnect 作業方法
fops 作業方法

staticint idealtek_fops_open
對 /dev 下的 idtk0 進行開檔的
動作,並且標記此裝置已開啟

static int
idealtek_fops_release
對 /dev 下的 idtk0 進行關檔的動作
,並且標記此裝置已關閉
fops 作業方法
static
ssize_t idealtek_fops_read
Read 函式主要透過 usb core 對裝

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

AP buffer usb core


無鎖演算法

讀出資料
寫入資料

環狀暫存區
(circular buffer)
無鎖演算法 F I F O

in
out out

out
in
in

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


fops 作業方法

static int idealtek_fops_ioctl


1.command
2. 資料校正
3. 座標定位
測試驅動程式
操作過程之問題與解決
1. insmod driver
問題 :make 不成功,顯示 class 結構的 mode 和
driver 結構的 owner 無法使用。

解決辦法:不使用。

1. 使用裝置
問題 : 使用 lsmod 可以找到載入的 module
操作過程之問題與解決

但在 /proc/device 卻找不到??因此無法查詢
它的
major 和 minor ,導致無法在 /dev 使用
mknod 建立
虛擬裝置檔
操作過程之問題與解決

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


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


操作過程之問題與解決

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


識出
其廠牌、型號。

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

最終,發現當我們註冊 URB 的時候


usb_register_dev(intf, &touch_class)
操作過程之問題與解決

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



建立裝置檔。
操作過程之問題與解決

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

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


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

g. 擷取座標的時候,某部份的 Touch Panel 觸碰


後沒有反應?

原因: Controller 故障。


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

X 軸之資




Y 軸之資

預計目標

•校正觸控面板。

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