linux device driver —— ioctl
实现了应用程序和设备驱动通过ioctl通信。还是对设备驱动没什么感觉,贴一下代码吧。
在Ubuntu 16.04 64bit中测试通过
ioctldemo.c
#include <linux/module.h> #include <linux/init.h> #include <linux/stat.h> #include <linux/types.h> #include <linux/kdev_t.h> #include <linux/fs.h> #include <linux/moduleparam.h> #include <linux/cdev.h> #include <asm-generic/uaccess.h> #include <asm-generic/ioctl.h> #include <asm-generic/current.h> #define IOCTLDEMO_MAJOR 0 #define MODULE_NAME "ioctldemo" #define DEMO_MAGIC 'm' #define DEMO_SIZE int #define DEMO_NR_MAX 1 #define MY_IOCTL_READ _IOR(DEMO_MAGIC,1,DEMO_SIZE); static int ioctldemo_major = IOCTLDEMO_MAJOR; void ioctldemo_exit(void); int ioctldemo_init(void); long my_unlocked_ioctl(struct file*, unsigned int, unsigned long); int my_cdev_open(struct inode*, struct file*); int my_cdev_release(struct inode*,struct file*); MODULE_LICENSE("Dual BSD/GPL"); module_param(ioctldemo_major,int,S_IRUGO); module_init(ioctldemo_init); module_exit(ioctldemo_exit); struct cdev *my_cdev; static struct file_operations cdev_ops = { .owner = THIS_MODULE, .open = my_cdev_open, .release = my_cdev_release, .unlocked_ioctl = my_unlocked_ioctl, }; int __init ioctldemo_init(void) { int ret; dev_t devno; printk(KERN_NOTICE "=== ioctldemo_init start"); devno = MKDEV(ioctldemo_major,); if(ioctldemo_major) { printk(KERN_NOTICE "=== ioctldemo_init try register"); ret = register_chrdev_region(devno,,MODULE_NAME); }else { printk(KERN_NOTICE "=== ioctldemo_init auto register"); ret = alloc_chrdev_region(&devno,,,MODULE_NAME); ioctldemo_major = MAJOR(devno); } ) { printk(KERN_NOTICE "=== ioctldemo_init register fail"); return ret; } my_cdev = cdev_alloc(); my_cdev->owner = THIS_MODULE; my_cdev->ops = &cdev_ops; ret = cdev_add(my_cdev,MKDEV(ioctldemo_major,),); ) { printk(KERN_NOTICE "=== ioctldemo_init add cdev fail"); return ret; } printk(KERN_NOTICE "=== ioctldemo_init finish"); ; } void __exit ioctldemo_exit(void) { printk (KERN_NOTICE "=== ioctldemo_exit"); cdev_del(my_cdev); unregister_chrdev_region(MKDEV(ioctldemo_major,),); } long my_unlocked_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) { ; if(_IOC_TYPE(cmd) != DEMO_MAGIC) return -ENOTTY; if(_IOC_NR(cmd) > DEMO_NR_MAX) return -ENOTTY; if(_IOC_DIR(cmd) & _IOC_READ) err = !access_ok(VERIFY_WRITE,(void __user*)arg, _IOC_SIZE(cmd)); if(err) return -EFAULT; printk(KERN_NOTICE "=== ioctldemo_ioctl current process is: %s, pid is: %d\n",current->comm,current->pid); ,(int *)arg); } int my_cdev_open(struct inode *node, struct file *filp) { ; } int my_cdev_release(struct inode *node, struct file *filp) { ; }
Makefile
ifneq ($(KERNELRELEASE),) mymodule-objs := ioctldemo obj-m := ioctldemo.o else PWD := $(shell pwd) KVER ?= $(shell uname -r) KDIR := /lib/modules/$(KVER)/build all: $(MAKE) -C $(KDIR) M=$(PWD) clean: rm -rf *.cmd *.o *.mod.c .tmp_versions *.order *.symvers endif
install.sh
#!/bin/bash module="ioctldemo" device="ioctldemo" name="ioctldemo" insmod $module.ko ] then exit fi major=$(awk "{if(\$2==\"$name\"){print \$1}}" /proc/devices) /dev/$device
uninstall.sh
#!/bin/bash module="ioctldemo" device="ioctldemo" file="/dev/$device" if [ -e $file ] then rm -rf /dev/$device echo 'rm device' fi echo 'rm module' /sbin/rmmod $module
测试程序:
#include <stdio.h> #include <fcntl.h> #include <sys/ioctl.h> #include <asm-generic/ioctl.h> #include <error.h> #define CMD _IOR('m',1,int) int main() { int fd, ret, arg; fd = open("/dev/ioctldemo",O_RDWR); ) { puts("open fail"); return fd; } ret = ioctl(fd,CMD,&arg); ) printf("ioctl result :%d",arg); else perror("ioctl fail"); close(fd); ; }
linux device driver —— ioctl的更多相关文章
- linux device driver —— 环形缓冲区的实现
还是没有接触到怎么控制硬件,但是在书里看到了一个挺巧妙的环形缓冲区实现. 此环形缓冲区实际为一个大小为bufsize的一维数组,有一个rp的读指针,一个wp的写指针. 在数据满时写进程会等待读进程读取 ...
- Linux Device Driver 学习(1)
Linux Device Driver 学习(1) 一.搭建虚拟机开发环境 1.选择虚拟机VirtualBox,官网下载.deb包安装: VirtualBox Linux 5.1.6 下载fedora ...
- how to write your first linux device driver
how to write your first linux device driver 0. environment-ubuntu 1804 64bit 1. apt-get install linu ...
- Linux Device Driver && Device File
catalog . 设备驱动程序简介 . I/O体系结构 . 访问设备 . 与文件系统关联 . 字符设备操作 . 块设备操作 . 资源分配 . 总线系统 1. 设备驱动程序简介 设备驱动程序是内核的关 ...
- How to learn linux device driver
To learn device driver development, like any other new knowledge, the bestapproach for me is to lear ...
- <<linux device driver,third edition>> Chapter 4:Debugging Techniques
Debugging by Printing printk lets you classify messages accoring to their severity by associating di ...
- <<linux device driver,third edition>> Chapter 3:Char Drivers
The Internal Representation of Device Numbers Within the kernel,the dev_t type(defined in linux/type ...
- Linux Device Driver 3th 中的一些坑
linux设备驱动第三版由于年代比较久远,有很多东西已过时.开一贴记录自己发现的一些问题. 4.3.1.4. seq_file接口 此节最后提到用 struct proc_dir_entry* cre ...
- linux device driver —— 字符设备
现在对linux设备驱动还没有什么认识,跟着书上敲了一个字符驱动,这里把代码贴一下. 测试环境是 Ubuntu 16.04 64bit 驱动程序: #include <linux/fs.h> ...
随机推荐
- VC6.0中重载操作符函数无法访问类的私有成员
整理日: 2015年03月18日 在 C++ 中,操作符(运算符)可以被重载以改写其实际操作.同时我们可以定义一个函数为类的朋友函数(friend function)以便使得这个函数能够访问类的私有成 ...
- ARCH Linux pacman 包管理器出错总结
最在使用ARCH的时候使用命令: sudo pacman -S Ruby 终端报错: error: could not open file /var/lib/pacman/sync/apricity- ...
- MockupBuilder
玩一下,想起了以前公司产品经理作的些事了...
- 【UVA1416】(LA4080) Warfare And Logistics (单源最短路)
题目: Sample Input4 6 10001 3 21 4 42 1 32 3 33 4 14 2 2Sample Output28 38 题意: 给出n个节点m条无向边的图,每条边权都为正.令 ...
- QPixmap有缓冲区的
我想qt 中QPixmap这个类大家都很熟悉,它可以很简单的在标签上贴图:例如: QPixmap p; p.load("1.png"): label->setPixmap(p ...
- 14.8.3 Physical Row Structure of InnoDB Tables InnoDB 表的物理行结构
14.8.3 Physical Row Structure of InnoDB Tables InnoDB 表的物理行结构 一个InnoDB 表的物理行结构取决于在创建表指定的行格式 默认, Inno ...
- 导航软件 CH Round #57 - Story of the OI Class
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2357%20-%20Story%20of%20the%20OI%20Class/导航软件 题解:刚开始看见题目, ...
- screen space directional occlusion(SSDO) in Unity5
也许是哪里出了问题..效果一般 16采样点 Gird . Random 博主近期渲染:最近用unity5弄的一些渲染 ---- by wolf96 http://blog.csdn.net/wolf ...
- 【转】OpenGL基础图形编程(一)
原文:http://blog.chinaunix.net/uid-20638550-id-1909183.html 分类: 一.OpenGL与3D图形世界 1.1.OpenGL使人们进入三维图形世界 ...
- JavaScript高级程序设计5.pdf
队列方法访问规则是FIFO(First-In-First-Out,先进先出),数组方法shift()能够移除数组中第一个项并返回该项,同时将数组长度减1,结合使用shift()和push(),可以像队 ...