[Linux驱动]字符设备驱动学习笔记(三)———高级

一,ioctl使用实例

ioctl使用实例

驱动程序.h文件  memdev.h

[cpp] view plaincopy

  1. /* 定义幻数 */
  2. #define MEMDEV_IOC_MAGIC  ‘k‘
  3. /* 定义命令 */
  4. #define MEMDEV_IOCPRINT   _IO(MEMDEV_IOC_MAGIC, 1)
  5. #define MEMDEV_IOCGETDATA _IOR(MEMDEV_IOC_MAGIC, 2, int)
  6. #define MEMDEV_IOCSETDATA _IOW(MEMDEV_IOC_MAGIC, 3, int)
  7. #define MEMDEV_IOC_MAXNR 3

驱动程序.c文件

[cpp] view plaincopy

  1. /*IO操作*/
  2. int memdev_ioctl(struct inode *inode, struct file *filp,
  3. unsigned int cmd, unsigned long arg)
  4. {
  5. int err = 0;
  6. int ret = 0;
  7. int ioarg = 0;
  8. /* 检测命令的有效性 */
  9. if (_IOC_TYPE(cmd) != MEMDEV_IOC_MAGIC)
  10. return -EINVAL;
  11. if (_IOC_NR(cmd) > MEMDEV_IOC_MAXNR)
  12. return -EINVAL;
  13. /* 根据命令类型,检测参数空间是否可以访问 */
  14. if (_IOC_DIR(cmd) & _IOC_READ)
  15. err = !access_ok(VERIFY_WRITE, (void *)arg, _IOC_SIZE(cmd));
  16. else if (_IOC_DIR(cmd) & _IOC_WRITE)
  17. err = !access_ok(VERIFY_READ, (void *)arg, _IOC_SIZE(cmd));
  18. if (err)
  19. return -EFAULT;
  20. /* 根据命令,执行相应的操作 */
  21. switch(cmd) {
  22. /* 打印当前设备信息 */
  23. case MEMDEV_IOCPRINT:
  24. printk("<--- CMD MEMDEV_IOCPRINT Done--->\n\n");
  25. break;
  26. /* 获取参数 */
  27. case MEMDEV_IOCGETDATA:
  28. ioarg = 1101;
  29. ret = __put_user(ioarg, (int *)arg);
  30. break;
  31. /* 设置参数 */
  32. case MEMDEV_IOCSETDATA:
  33. ret = __get_user(ioarg, (int *)arg);
  34. printk("<--- In Kernel MEMDEV_IOCSETDATA ioarg = %d --->\n\n",ioarg);
  35. break;
  36. default:
  37. return -EINVAL;
  38. }
  39. return ret;
  40. }

应用程序

[cpp] view plaincopy

    1. #include "memdev.h"
    2. cmd = MEMDEV_IOCPRINT;
    3. if (ioctl(fd, cmd, &arg) < 0)
    4. {
    5. printf("Call cmd MEMDEV_IOCPRINT fail\n");
    6. return -1;
    7. }
    8. cmd = MEMDEV_IOCSETDATA;
    9. arg = 2007;
    10. if (ioctl(fd, cmd, &arg) < 0)
    11. {
    12. printf("Call cmd MEMDEV_IOCSETDATA fail\n");
    13. return -1;
    14. }
时间: 2025-01-09 03:59:34

[Linux驱动]字符设备驱动学习笔记(三)———高级的相关文章

Linux实现字符设备驱动的基础步骤

Linux应用层想要操作kernel层的API,比方想操作相关GPIO或寄存器,能够通过写一个字符设备驱动来实现. 1.先在rootfs中的 /dev/ 下生成一个字符设备.注意主设备号 和 从设备号.可用例如以下shell脚本生成: if [ ! -e audioIN ];then sudo mknod audioIN c 240 0 fi 生成的设备为 /dev/audioIN ,主设备号240,从设备号0. 2.写audioINdriver.ko ,audioINdriver.c 基本代码

[Linux驱动]字符设备驱动学习笔记(一)

一,主设备号和次设备号代表的含义?linu内核是如果根据主设备号找驱动,次设备号找设备的. 答:通常一个主设备号代表一个驱动,比如在block设备中,一个主设备号代表一个emmc设备,不同次设备号代表的是不同的分区 Linux内核允许多个驱动共享一个主设备号,但更多的设备都遵循一个驱动对一个主设备号的原则.内核维护者一个以主设备号为key的全局哈希表,而哈希表中数据部分则为与该主设备号设备对应的驱动程序(只有一个次设备)的指针或者多个次设备驱动程序组成的数组的指针(次设备共享主设备号) 二,编写

[Linux驱动]字符设备驱动学习笔记(二)———实例

一,注册字符设备 [cpp] view plaincopy #define GLOBALMEM_MAJOR 256 #define GLOBALMEM_SIZE 0X1000 //4k static int char_major=GLOBALMEM_MAJOR;//主设备号 struct chartest_dev { struct cdev cdev; unsigned char mem[GLOBALMEM_SIZE]; }; struct chartest_dev glob_char_dev;

python学习笔记(三) - 高级特性

一. 切片 切片操作和java中的subList类似,就是获取一个子列表 比如L=['zhangsan','lisi','wangwu'] 那么L[0, 2]表示从索引0开始取,直到索引2(不含2), 正好2个元素.如果第一个索引为0, 还可以省略. 下面我们创建一个0-99的数列: L = range(100) 1. 获取前10个数: L[:10] 2. 获取后10个数: L[-10:]    # 倒数第一个元素的索引是-1 3. 获取前11-20个数: L[10:20] 4. 获取前10个数

字符设备驱动、平台设备驱动、设备驱动模型、sysfs的关系

Linux驱动开发的童鞋们来膜拜吧:-)  学习Linux设备驱动开发的过程中自然会遇到字符设备驱动.平台设备驱动.设备驱动模型和sysfs等相关概念和技术.对于初学者来说会非常困惑,甚至对Linux有一定基础的工程师而言,能够较好理解这些相关技术也相对不错了.要深刻理解其中的原理需要非常熟悉设备驱动相关的框架和模型代码.网络上有关这些技术的文章不少,但多是对其中的某一点进行阐述,很难找到对这些技术进行比较和关联的分析.对于开发者而言,能够熟悉某一点并分享出来已很难得,但对于专注传授技术和经验给

[kernel]字符设备驱动、平台设备驱动、设备驱动模型、sysfs几者之间的比较和关联

转自:http://www.2cto.com/kf/201510/444943.html Linux驱动开发经验总结,绝对干货! 学习Linux设备驱动开发的过程中自然会遇到字符设备驱动.平台设备驱动.设备驱动模型和sysfs等相关概念和技术.对于初学者来说会非常困惑,甚至对Linux有一定基础的工程师而言,能够较好理解这些相关技术也相对不错了.要深刻理解其中的原理需要非常熟悉设备驱动相关的框架和模型代码.网络上有关这些技术的文章不少,但多是对其中的某一点进行阐述,很难找到对这些技术进行比较和关

linux设备驱动第三篇:写一个简单的字符设备驱动

在linux设备驱动第一篇:设备驱动程序简介中简单介绍了字符驱动,本篇简单介绍如何写一个简单的字符设备驱动.本篇借鉴LDD中的源码,实现一个与硬件设备无关的字符设备驱动,仅仅操作从内核中分配的一些内存. 下面就开始学习如何写一个简单的字符设备驱动.首先我们来分解一下字符设备驱动都有那些结构或者方法组成,也就是说实现一个可以使用的字符设备驱动我们必须做些什么工作. 1.主设备号和次设备号 对于字符设备的访问是通过文件系统中的设备名称进行的.他们通常位于/dev目录下.如下: [plain] vie

linux设备驱动第三篇:如何写一个简单的字符设备驱动?

在linux设备驱动第一篇:设备驱动程序简介中简单介绍了字符驱动,本篇简单介绍如何写一个简单的字符设备驱动.本篇借鉴LDD中的源码,实现一个与硬件设备无关的字符设备驱动,仅仅操作从内核中分配的一些内存. 下面就开始学习如何写一个简单的字符设备驱动.首先我们来分解一下字符设备驱动都有那些结构或者方法组成,也就是说实现一个可以使用的字符设备驱动我们必须做些什么工作. 1.主设备号和次设备号 对于字符设备的访问是通过文件系统中的设备名称进行的.他们通常位于/dev目录下.如下: [email prot

linux设备驱动第三篇:如何实现简单的字符设备驱动

在linux设备驱动第一篇:设备驱动程序简介中简单介绍了字符驱动,本篇简单介绍如何写一个简单的字符设备驱动.本篇借鉴LDD中的源码,实现一个与硬件设备无关的字符设备驱动,仅仅操作从内核中分配的一些内存. 下面就开始学习如何写一个简单的字符设备驱动.首先我们来分解一下字符设备驱动 都有那些结构或者方法组成,也就是说实现一个可以使用的字符设备驱动我们必须做些什么工作. 1.主设备号和次设备号 对于字符设备的访问是通过文件系统中的设备名称进行的.他们通常位于/dev目录下.如下: [email pro