本文主要介绍字符驱动编程(字符驱动程序),下面一起看看字符驱动编程(字符驱动程序)相关资讯。
在上一篇文章中,我记录了字符设备的发展。来读写内存数据,但是有一个问题。设备的创建依赖于手动mknod。无论改进与否,设备的自动创建都可以通过直接加载驱动程序来完成。这里增加了class_create的创建,实现驱动的加载,设备创建,同步触发。对于基于平台的设备,这样的创建也是可以接受的。代码附录如下:
include linux/module . hinc lude linux/types . hinc lude linux/fs . hinc lude linux/errno . hinc lude linux/mm . hinc lude linux/sched . hinc lude linux/init . hinc lude linux/cdev . hinc lude linux/uaccess . hinc lude linux/slab . hdefine globamem _ size 0x 1000 define mem _ clear 0x 1 define global mem _ major 0 define ins mod _ create _ devstatic int global mem _ major = global mem静态结构类* gmem _ class
/* globalmem设备结构*/structglobalmem _ dev { structcdev cdev;无符号字符mem[globamem _ size];};
struct global mem _ dev global mem _ devp;/文件打开函数*/int global mem _ open(struct inode * inode,struct file filp){//filp-private _ data = global mem _ devp;返回0;}/文件释放函数*/int global mem _ release(struct inode * inode,struct file * filp){ return 0;}
/* ioctl设备控制函数*/staticlongglobalmem _ ioctl(struct file * filp,unsigned int cmd,unsigned long arg) {//stru)ct global mem _ dev dev = filp-private _ data;/获取设备结构指针*/
switch(cmd){ case mem _ clear:mem set(dev-mem,0,globamem _ size);printk(kern _ info globalmem被设置为零);打破;default : return-einval;}返回0;}
/* read function */static size _ t global mem _ read(struct file * filp,char _ _ user * buf,size _ t size,loft _ t * ppos) {
无符号长p = * pposunsigned int count = sizeint ret = 0;struct global mem _ dev * dev = filp-private _ data;/*获取设备结构指针*/ if (p = globamem_size)返回0;if(count globamem _ size-p)count = globamem _ size-p;/*内核空间-用户空间*/if (copy _ to _ user (buf,(void *) (dev-memp),count)){ ret = efault;} else { * ppos = countret =计数;printk(kern _ info 从%lu读取%u字节\ n ,计数,p);ret返回;} static ssize _ t global mem _ write(struct file * filp,const char __user *buf,size_t size,loff_t *ppos){
无符号长p = * pposunsigned int count = sizeint ret = 0;struct global mem _ dev * dev = filp-private _ data;/*获取设备结构指针*/ if (p = globamem_size)返回0;如果(计数globamem _ size-p)count = globamem _ size-p;/*用户空间-内核空间*/if(copy _ from _ user((void *)(dev-memp),buf,count)){ ret = e fault;} else { * ppos = countret =计数;printk(kern _ info 从%lu写入%u字节\ n ,计数,p);ret返回;} static loff _ t global mem _ ll seek(struct file * filp,loff_t offset,int orig){
int ret = 0;struct global mem _ dev * dev = filp-private _ data;/*获取设备结构指针*/ret ret;}/*文件操作结构*/static construct file _ operationglobalmem _ fops = {。owner = this _ module,。llseek = globalmem _ llseek,。read = globalmem _ read,。write = globalmem_write,。unlocked_ioctl = globalmem_ioctl,。open = globalmem_open,。release = globalmem_release,};
/*初始化并注册cdev */staticvoid全局mem _ setup _ cdev (struct全局mem _ dev * dev,int index) {interr,devno = mkdev(全局mem _ major,index);cdev_init(dev-cdev,global mem _ fops);dev-cdev . owner = this _ module;err = cdev_add(dev-cdev,devno,1);if(err)printk(kern _ notice 添加globalmem %d时出现错误% d ,err,index);}
/*设备驱动程序模块加载函数*/int globalmem_init(void){
我fdef ins mod _ create _ devglobalmem _ major = register _ chrdev(0, gmem ,global mem _ fops);gmem _ class = class _ create(this _ module gmem );device_create(gmem_class,null,mkdev(globalmem_major,0),null, mgem );/*/dev/led */global mem _ devp = kmalloc(sizeof(struct global mem _ dev),gfp _ kernel);如果(!globalmem_devp) {/*应用程序失败*/printk(kern _ notice 错误kmalloc失败 );}返回0;elseint结果;dev _ t devno = mkdev(global mem _ major,0);//* devno = (25020) | 0 *//* *应用设备号*/if(global mem _ major)result = register _ chrdev _ region(devno,1, 全球记忆 );else {/*动态应用设备编号*/result = alloc _ chr dev _ region(devno,0,1 全球记忆与记忆);global mem _ major = major(devno);}if(结果0)返回结果;/*动态申请设备结构的内存*/global mem _ devp = kmalloc(sizeof(structglobalmem _ dev),gfp _ kernel);如果(!globalmem_devp) {/*应用程序失败*/result =-eno mem;goto fail _ malloc}memset (globalmem_devp,0,sizeof(struct global mem _ dev));global mem _ setup _ cdev(global mem _ devp,0);返回0;fail _ malloc: unregister _ chrdev _ region(devno,1);返回result
endif}
/*模块卸载函数*/void globalmem_exit(void){
ifdef ins mod _ create _ dev unregister _ chrdev(global mem _ major, gmem );device_destroy(gmem_class,mkdev(globalmem_major,0));class _ destroy(gmem _ class);elsecdev _ del(global mem _ devp-cdev);/*注销cdev */kfree(global mem _ devp);/*释放设备结构的内存*/unregister _ chrdev _ region(mkdev(global mem _ major,0),1);/*发布设备号*/endif}
模块作者( 傅立叶和傅立叶变换);模块许可证( 双bsd/gpl );
module_param(globalmem_major,int,s _ i rugo);
module_init(全局内存_初始化);模块_出口(全局内存_出口);
标签:
设备结构
了解更多字符驱动编程(字符驱动程序)相关内容请关注本站点。
硬盘最大容量是多大,硬盘最大是多少G
办公电脑性价比排行2021(日常办公电脑性价比高的)
苹果手机怎么改字体的大小(苹果手机怎样修改字体大小)
光遇安卓跟苹果可以加好友吗(光遇安卓和苹果能加好友吗)
电脑yy怎么开游戏直播视频教程(电脑yy怎么开直播视频)
字符驱动编写(字符驱动程序)
qq悬浮窗魅蓝怎么设置,qq悬浮窗如何设置
vb中的mod(vb中mod的用法)
windows7右键菜单清理(win7鼠标右键新建菜单清理)
联想电脑怎么分盘win11,我新买一台联想笔记本电脑怎么分盘啊
征服s8的对讲怎么使用,怎么用三星s8的耳机说话
哪一款移动硬盘好用又实惠
oppoa92s参数详细参数(oppoa92s参数zol)
硒鼓跟碳粉盒是一个东西吗怎么用(硒鼓跟碳粉盒是一个东西吗图片)
oppor7呼吸灯怎么调颜色
戴尔待机黑屏唤不醒,电脑休眠后无法唤醒 黑屏
酷开电视怎么下载应用(酷开电视怎么下载应用商店)
lnk是什么文件格式(ink文件是什么意思)
宫格位推送是什么意思(什么叫宫格位)
魅族来电铃声怎么设置,魅族18pro怎么设置铃声