<var id="fnfpo"><source id="fnfpo"></source></var>
<rp id="fnfpo"></rp>

<em id="fnfpo"><object id="fnfpo"><input id="fnfpo"></input></object></em>
<em id="fnfpo"><acronym id="fnfpo"></acronym></em>
  • <th id="fnfpo"><track id="fnfpo"></track></th>
  • <progress id="fnfpo"><track id="fnfpo"></track></progress>
  • <tbody id="fnfpo"><pre id="fnfpo"></pre></tbody>

  • x
    x

    Linux 2.6.32內核字符設備驅動模板

    發布時間:2013-4-8 14:42    發布者:crcrwxy
    關鍵詞: Linux , 內核
    Linux驅動中,字符設備的設計一般會占產品驅動開發的90%以上,作者根據驅動開發的實際經驗,總結了一個標準的字符設備驅動的模板,僅供參考。

    //=======================字符設備驅動模板開始 ===========================//
    #define CHAR_DEV_DEVICE_NAME   "char_dev"   // 設備名
    struct class *char_dev _class;  // class結構用于自動創建設備結點
    static int major = 0;/* 0表示動態分配主設備號,可以設置成未被系統分配的具體的數字。*/
    static struct cdev char_dev_devs;// 定義一個cdev結構
    // 設備建立子函數,被char_dev_init函數調用  
    static void char_dev_setup_cdev(struct cdev *dev, int minor, struct file_operations *fops)
    {
        int err, devno = MKDEV(major, minor);
       
        cdev_init(dev, fops);
        dev->owner = THIS_MODULE;
        dev->ops = fops;
       
        err = cdev_add(dev, devno, 1);
        if( err )
        {
            printk(KERN_NOTICE "Error %d adding char_dev %d\n", err, minor);
        }
    }

    //  file_operations 結構體設置,該設備的所有對外接口在這里明確,此處只寫出了幾常用的
    static struct file_operations char_dev_fops =
    {
        .owner = THIS_MODULE,
        .open  = char_dev_open,      // 打開設備
        .release = char_dev_release, // 關閉設備
        .read  = char_dev_read,      // 實現設備讀功能
        .write = char_dev_write,     // 實現設備寫功能
        .ioctl = char_dev_ioctl,     //實現設備控制功能
    };

    // 進行初始化設置,打開設備,對應應用空間的open 系統調用
    int char_dev_open (struct inode *inode, struct file *filp)
    {
    ...   //  這里可以進行一些初始化
    return 0;
    }
    // 釋放設備,關閉設備,對應應用空間的close 系統調用
    static int char_dev_release (struct inode *node, struct file *file)
    {
    ...    //  這里可以進行一些資源的釋放
    return 0;
    }
    // 實現讀功能,讀設備,對應應用空間的read 系統調用
    ssize_t char_dev_read (struct file *file,char __user *buff,size_t count,loff_t *offp)
    {
         ...
    return 0;
    }
    // 實現寫功能,寫設備,對應應用空間的write 系統調用
    ssize_t char_dev_write(struct file *file,const char __user *buff,size_t count,loff_t *offp)
    {
        ...
        return 0;
    }
    // 實現主要控制功能,控制設備,對應應用空間的ioctl 系統調用
    static int char_dev _ioctl(struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg)
    {  
        ...
        return 0;
    }
    //   設備初始化
    static int char_dev_init(void)
    {
        int result;
        dev_t dev = MKDEV(major, 0);
       
        if( major )
        {
    // 給定設備號注冊
            result = register_chrdev_region(dev, 1, CHAR_DEV_DEVICE_NAME);
        }
    else
        {
    // 動態分配設備號
            result = alloc_chrdev_region(&dev, 0, 1, CHAR_DEV_DEVICE_NAME);
            major = MAJOR(dev);
        }
       
        char_dev_setup_cdev(&char_dev_devs, 0, &char_dev_fops);
        printk("The major of the char_dev device is %d\n", major);
    //==== 有中斷的可以在此注冊中斷:request_irq,并要實現中斷服務程序 ===//
    // 創建設備結點
    char_dev _class = class_create(THIS_MODULE,"ad_class");
    if (IS_ERR(char_dev _class))
    {
        printk("Err: failed in creating class.\n");
        return 0;
    }
    device_create(char_dev_class, NULL, dev, NULL, "char_dev");
        return 0;
    }

    // 設備注銷
    static void char_dev_cleanup(void)
    {
    device_destroy(adc_class,dev);
    class_destroy(adc_class);
        cdev_del(&char_dev_devs);//字符設備的注銷*/
        unregister_chrdev_region(MKDEV(major, 0), 1);//設備號的注銷
    //========  有中斷的可以在此注銷中斷:free_irq  ======//

        printk("char_dev device uninstalled\n");
    }

    module_init(char_dev_init);//模塊初始化接口
    module_exit(char_dev_cleanup);//模塊注銷接口

    // 以下兩句不能省略,否則編譯不通過
    MODULE_AUTHOR("www.embedhq.org");
    MODULE_LICENSE("GPL");

    //==================== 字符設備驅動模板結束 ========================//

    用Makefile模板編譯,Makefile如下:
    //======================= Makefile開始 ===========================//
    ifeq ($(KERNELRELEASE),)
    #KERNELDIR ?= /your/target/source/directory/
    KERNELDIR ?= /opt/kernal/linux-2.6.32.10/
    PWD := $(shell pwd)
    modules:
        $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
    modules_install:
        $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
    clean:
        rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
    .PHONY: modules modules_install clean
    //========================= Makefile結束 =============================//

    make編譯后生成char_dev.ko,控制臺輸入加載和卸載命令,還可以使用lsmod查看已經加載的模塊信息。
    insmod char_dev.ko #加載驅動,會執行module_init中的語句
    rmmod char_dev     #卸載驅動,會執行module_exit中的語句
    本文地址:http://www.portaltwn.com/thread-113314-1-1.html     【打印本頁】

    本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
    crcrwxy 發表于 2013-4-8 15:07:02
    武漢華嵌嵌入式培訓
    咨詢QQ:1216677636   
          QQ:572658958
    咨詢電話:027-87780211
    rinllow6 發表于 2013-4-17 13:42:38
    謝謝。。。。。。。。。。。。。。。。。。。。。。。。!
    您需要登錄后才可以發表評論 登錄 | 立即注冊

    廠商推薦

    • Microchip視頻專區
    • EtherCAT®和Microchip LAN925x從站控制器介紹培訓教程
    • MPLAB®模擬設計器——在線電源解決方案,加速設計
    • 讓您的模擬設計靈感,化為觸手可及的現實
    • 深度體驗Microchip自動輔助駕駛應用方案——2025巡展開啟報名!
    • 貿澤電子(Mouser)專區

    相關視頻

    關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
    電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
    快速回復 返回頂部 返回列表
    精品一区二区三区自拍图片区_国产成人亚洲精品_亚洲Va欧美va国产综合888_久久亚洲国产精品五月天婷