国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

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://m.qingdxww.cn/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視頻專區
  • 我們是Microchip
  • Cortex-M4外設 —— TC&TCC結合事件系統&DMA優化任務培訓教程
  • 利用模擬開發工具生態系統進行安全電路設計
  • 你仿真過嗎?使用免費的MPLAB Mindi模擬仿真器降低設計風險
  • 貿澤電子(Mouser)專區

相關視頻

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 火影忍者纲f手黄漫acg | 日韩精品国产一区 | 欧乱色国产精品兔费视频 | 国产精品久久免费观看 | 91久热| 上游电视剧在线观看免费影视大全 | 一区二区视频免费观看 | 欧美日韩不卡视频 | 欧美另类hd | 亚洲精品xxx | 奇淫三国 | 亚洲欧美日韩在线线精品 | 污网站免费在线观看 | 精品在线91 | 欧美激情在线精品video | 国产综合精品日本亚洲777 | 天堂在线观看免费观看 | 向日葵视频在线免费观看 | 国产一区二区三区免费观看 | 九九99香蕉在线视频网站 | 国产精品国产欧美综合一区 | 亚洲影院在线播放 | 91精品国产免费自在线观看 | 恋老oldmantv| 国产福利自产拍在线观看 | 精品久久久久久 | 久久香蕉国产线看观看8青草 | 亚洲第一成年网站大全亚洲 | 亚洲欧美在线观看 | 中文字幕 二区 三区 搜查官 | 亚洲国产精品线观看不卡 | 久久九九有精品国产56 | 亚洲视频二区 | 国产美女免费国产 | 亚洲看片| 欧美一区二区三区gg高清影视 | 看免费人成va视频全 | 甜甜的肉禽系统小说娱乐圈 | 成年人三级毛片 | h肉动漫在线观看免费资源 h肉动漫在线观看高清 | 亚洲欧美一区二区三区二厂 |