http://book.51cto.com 2007-08-16 09:37 蘇東 電子工業出版社易飛思公司
5.3.4 裝置驅動程式模板與實現
linux下的驅動程式雖然複雜,但是總結下來還是有很多的規律可尋。linux下的裝置驅動開始程式設計時顯得比較容易,可以輕鬆地開始驅動編寫,但是要把驅動寫好也的確需要花一定的時間去研究。
1.裝置驅動模板
裝置驅動模板**如例程5-4所示。
例程5 4 mydriver.c
#include#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
/*定義裝置的從裝置號*/
#define mydriver_minor 174
/*定義裝置相關資料結構*/
typedef struct _mydriver_dev
mydriver_dev, *pmydriver_dev;
/*定義裝置狀態資料結構*/
typedef struct _mydriver_dev_stats
mydriver_dev_stats, * mydriver_dev_stats;
unsigned int intinit=0;
/*定義裝置open介面函式*/
static int mydriver_open(struct inode *inode, struct file * filp)
#ifdef module
mod_inc_use_count; /*開啟使用次數累加*/
#endif
mydriver_dev.open_count++;
if ( mydriver_dev.open_count == 1 )
return 0;
}/*定義裝置close介面函式*/
static int mydriver_release(struct inode *inode, struct file *filp)
#ifdef module
mod_dec_use_count; /*開啟次數遞減*/
#endif
return 0;
}/*定義裝置read介面函式*/
static ssize_t mydriver_read(struct file *filp, char *buf, size_t size,
loff_t *offp)
/*定義裝置write介面函式*/
static ssize_t mydriver_write(struct file *filp, const char *buf, size_t
size, loff_t *offp)
/*定義裝置ioctl介面函式*/
static int mydriver_ioctl(struct inode *inode, struct file *filp, unsigned
int cmd, unsigned long arg)
return ret;
}/*定義裝置select函式介面*/
static unsigned int mydriver_poll(struct file *filp, poll_table *wait)
else
}/*定義裝置的file_operations*/
static struct file_operations mydriver_fops =
;/*定義裝置結構體*/
static struct miscdevice mydriver_miscdev =
;/*定義裝置init函式*/
int __init mydriver_init(void)
memset(&mydriver_dev, 0, sizeof(mydriver_dev));
init_waitqueue_head(&mydriver_dev.owait);
spin_lock_init(&mydriver_dev->dev_lock);
/*這裡可以放一些硬體初始化的函式*/
return 0;
}/*定義裝置exit函式*/
void __exit mydriver_exit(void)
module_init(mydriver_init);
module_exit(mydriver_exit);
module_license("gpl");
從上面的模板**可以看出,裝置驅動主要給上層提供file_operation和ioctl功能,實現上層對於底層裝置的管理和讀、寫操作等。另外不同的裝置呼叫的裝置註冊和登出函式有所不同,大家可以區分一下:misc_register()函式、register_chardev()函式、register_netdev()函式及misc_deregister()函式。也可以去分析一下deregister_chardev()函式和deregister_netdev() 函式的不同之處。
通常的裝置驅動參照上面的模板就可以實現基本的框架了,當然還需要注意有關硬體的一些操作,包括初始化、引數設定、中斷服務等。這些**可以根據系統的設計放在driver_init裡面,或者放在第一次開啟的時候。
雪花 tel:(010)68476606-8007】
linux驅動字元裝置模板
基於linux 4.4版本,板載6410 include 包含file operation結構體 include 包含module init module exit include 包含license的巨集 include 包含copy to user之類 include include 包含ior...
Linux 驅動學習筆記 字元裝置驅動模板 一
驅動入口函式 static int init init void 驅動出口函式 static void exit exit void 將上面兩個函式指定為驅動的入口和出口函式 module init init module exit exit module license gpl 新增協議 modu...
裝置驅動例項 字元裝置驅動
在整個linux裝置驅動學習中,字元裝置驅動較為基礎。通過對它的學習,對裝置驅動進一步加深了解 cdev 結構體struct cdev 講下比較重要的成員變數 dev t dev 定義了32位的裝置號,其中12位是主裝置號,20位是從裝置號。獲取主裝置號 major dev t dev 獲取從裝置號...