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

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

發布時間:2011-2-17 14:37    發布者:crcrwxy
關鍵詞: Linux
Linux 2.6.32內核字符設備驅動模板


作者:嵌入式學院武漢華嵌嵌入式培訓中心
講師:李家凱



引言: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.embedhq.org/,
轉載請注明出處)
本文地址:http://m.qingdxww.cn/thread-54377-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • 利用模擬開發工具生態系統進行安全電路設計
  • 想要避免發生災難,就用MPLAB SiC電源仿真器!
  • 深度體驗Microchip自動輔助駕駛應用方案——2025巡展開啟報名!
  • 更佳設計的解決方案——Microchip模擬開發生態系統
  • 貿澤電子(Mouser)專區

相關視頻

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品综合视频 | 女人18特级一级毛片免费视频 | 日韩欧美久久一区二区 | 两个人免费观看视频高清视频 | 2021国产麻豆剧果冻传媒入 | 四虎精品免费国产成人 | 亚洲一区二区影视 | 在线国产视频 | 不卡一级毛片免费高清 | 99视频精品全国在线观看 | 激情天堂 | 国产日韩欧美亚洲青青草原 | 天天插天天操天天干 | 日韩一区二区三区四区不卡 | 亚洲不卡视频在线 | 自拍偷拍亚洲区 | 火辣福利视频 | 4hu永久影院在线四虎 | 四虎黄色网 | 91麻豆精品国产高清在线 | 家庭教师在线观看 | 香蕉尹人在线观看免费下载 | 91亚洲视频在线观看 | 日韩一级高清 | 精品国产a| 91网址在线播放 | 国产成人综合亚洲欧美天堂 | 4hu四虎免费影院www | 四虎黄网 | 插插插操操操 | 国产精品日本一区二区在线播放 | 日韩 欧美 中文字幕 不卡 | 欧美一级高清免费a | 日韩视频在线观看一区二区 | 国产综合精品久久久久成人影 | 天天摸天天操天天干 | www日本高清 | 国内精品福利在线视频 | 天天插天天插天天插 | 99精品福利 | 成人黄色片在线观看 |