« Linux 驅動程式觀念解析, #4: Linux 驅動程式一般化設計流程 | Home | Linux 驅動程式觀念解析, #6: 依流程來實作 -- Physical Device Driver » Linux 驅動程式觀念解析, #5: 依流程來實作 -- Virtual Device Driverjollen 發表於 May 4, 2006 9:53 AM 根據Linux驅動程式的一般化設計流程,我們來設計一個真正可以動的驅動程式。 作者/陳俊宏 根據流程寫程式 定義 file_operations struct file_operations card_fops = { 由此定義可以,我們所計的驅動程式將提供 open/write/close(release)/ioctl 4 個 system call 介面給 user application。 實作 System Call 接著要實作我們所提供的4個 system call。open/close(即 release)/read/write/ ioctl 是初學 Linux 驅動程式最重要的 5 個 system call,了解如何實作不同的 system call,是學好 Linux 驅動程式的重要工作。 本文先介紹 open/close(release)/write 的實作。此部份說明如後。 註冊 Driver 將driver自己「註冊」到kernel的VFS層,註冊時所要呼叫的函數根據裝置類型的不同而不同。 將驅動程式「註冊」(registration)至kernel的動作必須在init_module()函數裡實作。根據裝置類型的不同,所呼叫的函數也不同,以下是幾個基本的裝置註冊函數:
本文範例註冊驅動程式的程式片斷如下: #define DEV_MAJOR 121 register_chrdev()參數說明如下:
註冊的動作是寫在init_module()裡,因此當使用者執行insmod載入驅動程式時,register_chrdev()便會執行。由此 可知,註冊驅動程式的時機為insmod時。相對的,在rmmod時,必須執行解除註冊的動作,此動作必須實作在cleanup_module()函數 裡。 前面所介紹的4個註冊函數,其相對應的解除註冊函數如下:
範例debug card 0.1.0解除註冊的程式片斷如下: void cleanup_module(void) Linux驅動程式的「註冊」是一個非常重要的動作,這個動作代表 Linux 驅動程式是一個嚴謹的分層式架構;換句話說, 定義chipset標頭檔 我們所要設計的 Port 80H 除錯卡驅動程式,不需要定義標頭檔;此部份可參考 kernel 裡的 BTTV 驅動程式。 定義I/O wrapper function 我們所要設計的 Port 80H 除錯卡驅動程式,不需要定義 I/O wrapper function;此部份可參考 kernel 裡的 BTTV 實作chipset控制函數 在我們所要設計的 Port 80H 除錯卡驅動程式中,我們是直接使用 kernel 的 I/O 介面來控制除錯卡,physiacl device open/release實作 open與release是Linux驅動程式最基本的2個system call。驅動程式應先實作此2個system call。
open與release system call的執行時機如下:
Linux驅動程式註冊至kernel時會指定device file的major number,user application便可以透過此符合此major file_operation是Linux驅動程式支援VFS的重要結構。學習file_operation的重要目的如下:
System call的實作原則即driver function所要負責處理的基本工作。學習Linux device driver的重要工作之一,便是一一了解fops裡每一個system call的實作原則,並依照實際需求來實作不同的 system call。 open System Call 以open system call為例,fops->open是在user呼叫open()函數時執行,即當user開啟driver所指定的device file時呼叫fops->open。 fops->open實作原則如下:
以下是本範例的fops->open實作: int card_open(struct inode *inode, struct file *filp) release System Call 當user application 呼叫close() 函數後,便執行fops->release。 有些驅動程式會將release method函數名稱命名為 XXX_close(),但建議以XXX_release()名稱為主,以避免混淆。 fops->release實作原則如下:
int card_release(struct inode *inode, struct file *filp) --jollen 引用通告如果您想引用這篇文章到您的Blog, |
Top | 授權條款 | Jollen's Forum: Blog 評論、討論與搜尋
Copyright(c) 2006 www.jollen.org