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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章