• cmd 命令码的构建

书中截图

首先在用户层的 ioctl函数原型为 int iocotl(int fd,int cmd,…)

其实这个系统调用和kernel中 创建的字符驱动有关系

struct file_operations 中有两个 其中之一就是 unlokcked_ioctl ()通过ioctl 中的协议 填入和读取 数据

简单记录,晚上回去将这部分补充完整

#include <linux/ioctl> 中有详细的 计算 ioctl cmd 的 方式方法

使用方式总结(伪代码表示方法)

  • ioctl 在用户层 只有一个 参数
ioctl(int fd,int cmd)
  • ioctl 在用户有两个参数
ioctl(int fd,int cmd,unsigned long args);
  • ioctl 使用结构体向内核传递数据,这种方式装载的数据量大,符合常规开发需求, i2c 驱动设备中常用这种方式
struct msg{int32_t index;
int32_t value;
uint8 name[128];
};int ioctl(int fd,int cmd,&msg)

剩下的就是 cmd 命令的 组织方方法

ioctl() 命令分析


方向的问题
  • 关于 cmd 中的方向的问题 就占了 两个 bit 位 C21C_2^1C21​xC21C_2^1C21​ - 1 = 3 种情况 10 01 11 这三种情况
    1 从驱动中只读数据 RO
    2 向驱动中只写数据 WO
    3 可以同时读写数据 NONE
内核文档原文 (也建议在 kernel.org 的 documents 查阅内核开发文档)

Before implementing the ioctl function, the numbers corresponding to the commands must be chosen. One method is to choose consecutive numbers starting at 0, but it is recommended to use _IOC(dir, type, nr, size) macrodefinition to generate ioctl codes. The macrodefinition parameters are as follows:

  • dir represents the data transfer (_IOC_NONE , _IOC_READ, _IOC_WRITE).
  • type represents the magic number (Documentation/ioctl/ioctl-number.txt);
  • nr is the ioctl code for the device;
  • size is the size of the transferred data.

这些加粗的部分建议直接观看文档进行使用

本来一个 cmd 的 承载的数据量就是 32bit (sizeof(int32_t)) 8bit 的设备类型 + 8bit 的序列号 + 2bit数据传输的方向 + 13bit 的数据传输的大小, 2132^{13}213 方的大小, 当然是按照字节数的计算的所以

cmd 包含了你的驱动属性和传输的数据的大小,切记不要超过这个大小 2132^{13}213

在内核中有一个 api 可以快速计算出你要用的cmd 的数据包(我的描述的不太准确哈)

// _IOC_WRITE 代表传输的方向
// ‘k’ 代表的设备的 类型 如果是社区开发 建议使用内核文档提供的 字符
// 1 代表的是设备的藐视的id
// my_ioctl_data 是你的组包的 struct my_ioctl_data 大概就是这个意思

内核文档的示例代码

#include <asm/ioctl.h>// _IOC_WRITE 代表传输的方向
// 'k' 代表的设备的 类型 如果是社区开发 建议使用内核文档提供的 字符
// 1 代表的是设备的藐视的id
// my_ioctl_data 是你的组包的 struct my_ioctl_data 大概就是这个意思
#define MY_IOCTL_IN _IOC(_IOC_WRITE, 'k', 1, sizeof(my_ioctl_data))static long my_ioctl (struct file *file, unsigned int cmd, unsigned long arg)
{struct my_device_data *my_data =(struct my_device_data*) file->private_data;my_ioctl_data mid;switch(cmd) {case MY_IOCTL_IN:if( copy_from_user(&mid, (my_ioctl_data *) arg,sizeof(my_ioctl_data)) )return -EFAULT;/* process data and execute command */break;default:return -ENOTTY;}return 0;
}

这系宏定义只是做了一些位运算,所以知道代表什么意思 , 和怎么用就可以

extern unsigned int __invalid_size_argument_for_IOC;
#define _IOC_TYPECHECK(t) \((sizeof(t) == sizeof(t[1]) && \sizeof(t) < (1 << _IOC_SIZEBITS)) ? \sizeof(t) : __invalid_size_argument_for_IOC)#define _IOC(dir,type,nr,size) \(((dir)  << _IOC_DIRSHIFT) | \((type) << _IOC_TYPESHIFT) | \((nr)   << _IOC_NRSHIFT) | \((size) << _IOC_SIZESHIFT))/* used to create numbers */ //单功能创建 cmd 的方法
#define _IO(type,nr)        _IOC(_IOC_NONE,(type),(nr),0)
#define _IOR(type,nr,size)  _IOC(_IOC_READ,(type),(nr),(_IOC_TYPECHECK(size)))
#define _IOW(type,nr,size)  _IOC(_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size)))
#define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size)))
#define _IOR_BAD(type,nr,size)  _IOC(_IOC_READ,(type),(nr),sizeof(size))
#define _IOW_BAD(type,nr,size)  _IOC(_IOC_WRITE,(type),(nr),sizeof(size))
#define _IOWR_BAD(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size))/* used to decode ioctl numbers.. */ //驱动中需要对cmd 进行解析验证
#define _IOC_DIR(nr)        (((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK)
#define _IOC_TYPE(nr)       (((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK)
#define _IOC_NR(nr)     (((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK)
#define _IOC_SIZE(nr)       (((nr) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK)

对于其他的ioctl 的操作 也是遵循这个方式方法

ioctl kernel 构建注意事项相关推荐

  1. 小狗钱钱_✅每次构建待办事项列表应用程序时,都会有一只小狗? 死了?

    小狗钱钱 by Hrishi Mittal 由Hrishi Mittal ✅每次构建待办事项列表应用程序时,都会有一只小狗 ? 死了? (✅ Every time you build a to-do ...

  2. hyperapp 共享_使用Hyperapp(1KB JS微框架)构建待办事项列表

    hyperapp 共享 在本教程中,我们将使用Hyperapp构建待办事项列表应用程序. 如果您想学习函数式编程原理,但又不想陷入细节,请继续阅读. Hyperapp现在很热门. 它最近在GitHub ...

  3. android 上线apk,码云 Android apk 在线构建功能上线啦!

    原标题:码云 Android apk 在线构建功能上线啦! #点击上图,立即参与OSC珠海源创会# duang duang duang -- 各位看官,开源中国码云 Android 项目构建新功能上线 ...

  4. Open Harmony移植:build lite编译构建过程

    本文分享自华为云社区<移植案例与原理 - build lite编译构建过程>,作者: zhushy. 配置完毕产品解决方案.芯片开发板解决方案,就可以执行 hb build进行编译.但是产 ...

  5. Easypack: JEECG的容器化编译环境快速构建

    这篇文章整理一下使用镜像方式进行JEECG编译环境的标准化,并将标准化的编译镜像和脚本放到了easypack上. JEECG介绍 详细的介绍可以参看如下链接: http://www.jeecg.com ...

  6. 如何使用 JavaScript 构建计算器应用程序

    这个史诗般的教程通过描述如何使用该语言开发一个简单的计算器应用程序,为 JavaScript 新手提供了一个可靠的练习. 面向初学者的 javascript 项目(8 部分系列) 1 构建你的第一个 ...

  7. Kernel crash:总结

    文章目录 crash list timer 现场debug crash 常用的脚本 及常用命令 log 手动生成kernel crash 注意事项 手动crash的backtrace 在crash里可 ...

  8. Ninja 构建系统

    Ninja 构建系统 概述 Ninja([ˈnɪndʒə]忍者)是一个构建系统,与 Make 类似.作为输入,你需要描述将源文件处理为目标文件这一过程所需的命令. Ninja 使用这些命令保持目标处于 ...

  9. ALSA ASOC

    1       ALSA 1.1    架构简述 ALSA是Advanced Linux Sound Architecture 的缩写, 官网 : http://www.alsa-project.or ...

最新文章

  1. 过节的快乐,在于Free | 手把手带你学Django
  2. pat1014. Waiting in Line (30)
  3. 《数据库设计入门经典》读书笔记——第二章:工作场所中的数据库建模
  4. 鹦鹉助手模拟器 梦幻西游 找不到服务器,模拟器玩梦幻 17173鹦鹉助手模拟器上线...
  5. c++该转java吗_java多线程,静态方法加锁后,调用该方法会影响其它方法吗?
  6. python3菜鸟教程
  7. web项目对接钉钉扫码登录
  8. C语言实现多人坦克大战
  9. sqlserver 2017 windows版本下载
  10. 基于can总线的A2L文件解析(2)
  11. Windows查看电脑ip地址方法(用于连接远程桌面)
  12. FPGA零基础学习:FPGA芯片简介
  13. html css特效,15个超酷的CSS3代码特效展示
  14. django教程day06
  15. oracle基础|数据库模型|实体-关系图(E-R图)|什么是一对一、一对多、多对多
  16. 智能卡操作系统的程序代码结构
  17. 【10道大厂必考性能优化题】陶辉老师
  18. 计算机网络显示叉叉,解决修复vmware10创建虚拟机本地连接显示叉号无法使用网络的问题-网络教程与技术 -亦是美网络...
  19. python脚本备份linux,linux利用bypy自动备份文件上传百度云
  20. 实验一 运算器实验

热门文章

  1. python如何帮我在投资中获取更高收益
  2. 利用Swarmkit构建Windows/Linux混合Docker集群
  3. 6.3 Spring Boot集成mongodb开发
  4. 数据库收缩数据文件的尝试(二)(r11笔记第9天)
  5. SVG 基本知识:SVG 放大缩小之 viewbox 初探 (1)
  6. Tensorflow 变量的共享
  7. Android学习笔记之ProgressDialog
  8. python server page_python web-server
  9. java数组缓冲,java – 字节数组缓冲图像转换速度慢
  10. java option作用_java – 类Option [T]的意义是什么?