5、字符設備驅動LEDS
static int first_drv_open(struct
inode *inode, struct file *file)
{
printk("first_drv_open\n");
return 0;
}
static int first_drv_read(struct file *filp, char __user *buff, size_t count, loff_t *offp)
{
printk("first_drv_read\n");
return 0;
}
static ssize_t first_drv_write(struct file *file, const char __user *buf, size_t count, loff_t * ppos)
{
printk("first_drv_write\n");
return 0;
}
將上面的函數告訴內核
a.需要定義一個結構體:
static struct file_operations first_drv_fops = {
.owner = THIS_MODULE, /* 這是一個宏,推向編譯模塊時自動創建的__this_module變量 */
.open = first_drv_open,
.read =
first_drv_read,
.write = first_drv_write,
};
b. 註冊,告訴內核
register_chrdev( major, "first_drv",first_drv_fops ); //主設備號,名字,結構體名字
c.通過入口函數調用register_chrdev,通過出口函數調用unregister_chrdev
int first_drv_init(void)
{
register_chrdev( 111, "first_drv",first_drv_fops );
return 0;
}
void first_drv_exit(void)
{
unregister_chrdev( 111, "first_drv" );
}
d.修飾入口函數/出口函數
module_init(first_drv_init); //定義一個結構體,調用其中函數指針指向入口函數first_drv_init
module_exit(first_drv_exit);
下面是應用程序和驅動之間通過主設備號,file_optation結構體連接起來的示意圖
編譯上述驅動程序的Makefile
KERN_DIR = /work/system/linux-2.6.22.6 //編譯使用的內核路徑,內核要編譯完成纔可用
all:
make -C $(KERN_DIR) M=`pwd` modules //-C會轉到KERN_DIR目錄中去,用目錄中的Makefile編譯。M=當前路徑是什麼。 modules是目標
clean:
make -C $(KERN_DIR) M=`pwd` modules clean
rm -rf modules.order
obj-m
+= myleds.o
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.