ioctl、文件操作接口函数以及nand的升级模式的操作过程详解

Linux下CS创世SD NAND三大读写方式性能对比:dd命令/标准IO/ioctl实战测评 本文深入评测了Linux下CS创世SD NAND的三种读写方式(dd命令、标准IO和ioctl)在RK3568和X2600e嵌入式平台上的性能表现。通过详实的测试数据对比,揭示了不同块大小下的吞吐量差异、延迟特性和CPU占用率,并提供了工业级应用中的降频优化、总线配置和电源管理等实战技巧,帮助开发者充分发挥SD NAND的硬件潜力。 阅读详情

概述

内核中驱动文件的操作通常是通过write和read函数进行的,但是很多时候再用户空间进行的操作或许不是内核中公共代码部分提供的功能,此时就需要使用一种个性化的方法进行操作--ioctl系统调用。

ioctl系统调用是一种用于设备控制的公共接口,主要分为两种,一种是用户空间使用的ioctl系统调用,函数原型为:

int ioctl(int fd,unsigned long cmd,...);

另一种是在内核空间使用的ioctl调用,函数原型为:

int (*ioctl)(struct inode *inode,struct file *filp,
             unsigned int cmd,unsigned long arg);

本文中主要介绍在用户空间使用的ioctl。

知其然,知其所以然

    ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率、马达的转速等等。

函数原型:

int ioctl(int fd, int cmd, ...);

其中fd就是用户程序打开设备时使用的open函数返回的文件标识符,cmd就是用户程序对设备的控制命令,至于后面的省略号,是可选参数,此参数的取值情况跟第二个参数有关。

函数的返回值,在传入非法命令式,Ioctl返回-EINVAL。

选择ioctl命令

为了防止对错误设备使用正确的命令,命令号应该在系统范围内唯一。从include/asm/ioctl.h头文件中,我们可以得出cmd为一个32位的无符号整数,被划分为4个段,具体表示如下:

 cmd
 direction
(bit31--bit30)
 size
(bit29--bit16)
type 
(bit15--bit8)
 number
(bit7--bit0)
 所占位数 2 14 8 8
 作用
 命令:区别读/写 数据大小 幻数:表示设备类型 命令顺序序号


#define         _IOC_NRBITS          8                               //序数(number)字段的字位宽度,8bits

#define         _IOC_TYPEBITS      8                               //幻数(type)字段的字位宽度,8bits

#define         _IOC_SIZEBITS       14                              //大小(size)字段的字位宽度,14bits

#define         _IOC_DIRBITS         2                               //方向(direction)字段的字位宽度,2bits

 

#define         _IOC_NRMASK        ((1 << _IOC_NRBITS)-1)    //序数字段的掩码,0x000000FF

#define         _IOC_TYPEMASK   ((1 << _IOC_TYPEBITS)-1)  //幻数字段的掩码,0x000000FF

#define         _IOC_SIZEMASK     ((1 << _IOC_SIZEBITS)-1)   //大小字段的掩码,0x00003FFF

#define         _IOC_DIRMASK      ((1 << _IOC_DIRBITS)-1)    //方向字段的掩码,0x00000003

 

#define        _IOC_NRSHIFT       0                                                         //序数字段在整个字段中的位移,0

#define        _IOC_TYPESHIFT   (_IOC_NRSHIFT+_IOC_NRBITS)         //幻数字段的位移,8

#define        _IOC_SIZESHIFT    (_IOC_TYPESHIFT+_IOC_TYPEBITS)  //大小字段的位移,16

#define        _IOC_DIRSHIFT      (_IOC_SIZESHIFT+_IOC_SIZEBITS)    //方向字段的位移,30

 

/*

 * Direction bits.

 */

#define _IOC_NONE     0U     //没有数据传输

#define _IOC_WRITE   1U     //向设备写入数据,驱动程序必须从用户空间读入数据

#define _IOC_READ     2U     //从设备中读取数据,驱动程序必须向用户空间写入数据

 

 

/*

*_IOC 宏将dir,type,nr,size四个参数组合成一个cmd参数,如下图:

*

*/


#define _IOC(dir,type,nr,size) \

       (((dir)  << _IOC_DIRSHIFT) | \

        ((type) << _IOC_TYPESHIFT) | \

        ((nr)   << _IOC_NRSHIFT) | \

        ((size) << _IOC_SIZESHIFT))

 

/*

* used to create numbers 

*/

//构造无参数的命令编号

#define _IO(type,nr)             _IOC(_IOC_NONE,(type),(nr),0) 

//构造从驱动程序中读取数据的命令编号

 

#define _IOR(type,nr,size)     _IOC(_IOC_READ,(type),(nr),sizeof(size)) 

//用于向驱动程序写入数据命令

#define _IOW(type,nr,size)    _IOC(_IOC_WRITE,(type),(nr),sizeof(size))

//用于双向传输

#define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size))

 

/* 

*used to decode ioctl numbers..

 */

//从命令参数中解析出数据方向,即写进还是读出

#define _IOC_DIR(nr)          (((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK)

//从命令参数中解析出幻数type

#define _IOC_TYPE(nr)              (((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK)

//从命令参数中解析出序数number

#define _IOC_NR(nr)           (((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK)

//从命令参数中解析出用户数据大小

#define _IOC_SIZE(nr)         (((nr) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK)

 

/* ...and for the drivers/sound files... */

 

#define IOC_IN            (_IOC_WRITE << _IOC_DIRSHIFT)

#define IOC_OUT         (_IOC_READ << _IOC_DIRSHIFT)

#define IOC_INOUT     ((_IOC_WRITE|_IOC_READ) << _IOC_DIRSHIFT)

#define IOCSIZE_MASK      (_IOC_SIZEMASK << _IOC_SIZESHIFT)

#define IOCSIZE_SHIFT      (_IOC_SIZESHIFT)


cmd参数在程序端由一些宏跟胡设备类型、序列号、传送方向、数据尺寸等生成,这个整数通过系统调用传递到内核中的驱动程序,再由驱动程序使用解码宏从这个整数中得到设备的类型、序列号、传送方向、数据尺寸等信息,然后通过switch{case A case B}结构进行相应的操作。

对于命名的规则可以参考Documentation/ioctl-number.txt.其中mtd设备的命名为:

'M'     01-16   mtd/mtd-abi.h           conflict!
                and drivers/mtd/mtdchar.c

通过上面的描述我们能够简单的了解到,ioctl命令能够为我们提供的便利。但是在实际应用中,ioctl会在某些情况下配合文件的相关操作命令完成想要的功能。

文件的操作中比较重要的一些操作主要包括open(),close(),lseek(),stat()等等的接口函数。

open函数用于打开文件,因为linux中一切皆文件的概念,所以我们可以将设备文件同普通文件一样使用正常的open函数进行打开。

close函数用于关闭之前打开的文件。

lseek函数用于确定文件的位置,包括三个参数SEEK_SET,SEEK_CUR,SEEK_END分别用于标识文件偏移值的起始位置分别在开始,当前位置或者文件末尾。

r\w函数用于文件的读写操作,

stat函数用于获取文件的相关信息,即结构体struct stat中的相关内容信息。

NAND Flash的相关知识

nand作为一种重要的存储设备被广泛的使用,作为基础知识的了解,可以通过访问URL:http://www.linux-mtd.infradead.org/

此处主要讲述使用yaffs2文件系统的情况下NAND Flash的一些特性。

YAFFS2文件系统

好马配好鞍,因此要更好的使用Nandflash这种存储介质,我们需要选择一种更加适合它物理特性的文件系统。

网上关于此方面的介绍很多,大家可以多进行翻阅集百家之言。此处只指出几点个人在实际的移植和开发过程中遇到的问题。

首先从实际的硬件结构上nand的存储分为两个部分,一个部分被称作data area;一个部分被称作spare area。这两个部分分别放置了不同的内容,一般在data area中存放实际的数据,而在spare area中存放了一些校验信息和FTL数据。在yaffs文件系统的挂载过程中会扫描这个spare area(oob)区,存放在这个区域的属于在yaffs2文件系统中称为FTL数据。这个通过读取此部分的数据和header page的数据确定数据的类型和文件的层次结构。如果这部分的数据是正确的,则系统能够正常的进行mount操作。

需要特别注意的是,要使用yaffs2文件系统,则需要将需要烧写的文件通过mkyaffs2imge工具进行操作,这个会在每一个page大小的数据之后产生FTL信息。因此,在实际数据的写入过程中需要特别注意将此两部分的数据进行区分处理。






MQX RTOS MFS文件系统IOCTL命令详解与应用实战 在嵌入式系统开发中,文件系统是管理存储设备的核心组件,它负责数据的组织、存储和检索。其工作原理是通过特定的数据结构(如FAT表、目录项)来映射逻辑文件操作到物理存储介质。IOCTL(输入输出控制)作为一种底层设备控制接口,为开发者提供了超越标准文件读写的高级管理能力,能够直接与驱动或文件系统交互,实现精细化的控制。这一机制在资源受限的嵌入式环境中具有重要技术价值,它使得开发者能够主动管理存储介质状态、优化性能并增强系统鲁棒性。其典型应用场景包括工业现场的数据黑匣子记录、医疗设备的可靠日志存储以及消费电子产品 阅读详情

相关推荐

详细介绍哦ioctl函数用法, 一看必然会用。。。。

详细介绍哦ioctl函数用法, 一看必然会用。。。。

关于flash的ioctl

很奇怪的问题 fd为一个打开的flash设备文件 ioctl(fd, MEMGETBADBLOCK, &offs); 当offs定义为unsigned int系统直接崩溃。。打印的错误大概是解引用地址为0处的内容   改为loff_t后就好了   loff_t似乎就是定义为long的,难道是符号的问题?还未尝试。。

1081

scratch航天梦主题课程作品分享,包含ppt、素材包

而今年多国都将发射探测器尝试登陆月球,2023年或将称为“登月年”,请大家发挥创新思维,以“星辰大海”为创作主题,搜集相关信息 、展开联想,为实现升空 、探测 、取样贡献创意!即使去淘宝买的素材,也要从百度网盘,但素材太多大了或者太多文件,也要充值百度网盘超级会员才能保存,提高下载速度。同学们大家好,今天我们就要开始航天主题-嫦娥五号探月工程系列的编程课程了,不仅可以学习到很多航天知识,了解本次嫦娥五号的发射历程,还能让我们用编程遨游太空呢。即使下载了,也要上传,不是特别方便,尤其是不好查找。

少儿编程吕口口 2483

linux设备驱动归纳总结(三):4.ioctl的实现

CU首页 ┊ fh265>>博客 微博 相册 个人中心 好友 消息 [退出] ┊ 随便看看   博文 博主 相册  投票 活动 发博文 公告:缅怀Dennis Ritchie活动开赛啦! 小白的博客——提升自已,分享别人 xiaobai.blog.chinaunix.net 好的女人可以不共享。好的技术绝对要共享!

fh400的专栏 8682

Zemax实战:手把手教你设计一个40倍、NA0.65的显微物镜(附初始结构文件)

本文详细介绍了使用Zemax设计40倍、NA0.65显微物镜的完整流程,从初始结构搭建到优化验证,涵盖光学设计的关键技巧和实战经验。通过分阶段优化策略和公差分析,帮助工程师快速掌握高倍显微物镜的设计方法,提升光学系统性能。

weixin_42525369的博客 344

libfacedetection 框架阅读及扩展经验

libfacedetection 框架源码解析与扩展心得1. libfacedetection 框架简介2. 源码解析2.1 facedetectcnn.h2.2 facedetectcnn.cpp2.3 facedetectcnn-model.cpp3. 其他层的扩展--depthwise convolution 前段时间因为工作需要,对libfacedetection框架做了些扩展,在阅读源...

weixin_42616332的博客 1500

关于LS1043A ioctl SIOCSMIIREG等命令读写PHY 返回 -EINVAL 的问题

LS1043A PHY IOCTL返回错误解决办法

这个地瓜真是甜啊 2018

linux驱动开发(四):ioctl()函数

Linux驱动程序中的ioctl接口,描述了内核空间和用户空间中分别对ioctl接口的定义和用法,介绍了两者间的传输协议,并通过举了一个简单的实例。

baidu_38797690的博客 2万+

windows11系统封装教程

1、 现在电脑品牌各式各样,小白对电脑软件的安装存在较大的难题,今天笔者针对以上的问题做如下教程:windows11系统封装教程方式为视频方式。

cyz141001的博客 5879

人工智能训练师三级考试题型全解析|190道真题样例+30天备考路线

人工智能训练师三级考试并不神秘:理论考190道选择题(刷题就能过),实操考代码+方案设计(练练就会)。核心是花时间——30天系统备考,足以从容通过。如果你想从零开始系统备考,覆盖所有考点和实操技能,欢迎查看我的专栏:📖《人工智能训练师三级·从零到拿证完全指南》80篇系统化内容,覆盖报名、备考、冲刺、拿证全流程六大模块知识点逐个击破,每个考点都讲透实操代码题手把手教学,附带完整参考代码高频考点速记 + 易错题精讲 + 3套模拟试卷30天备考计划 + 冲刺复习策略。

白话机器学习 6081

FLASH 的基本原理和分类

一、Flash的不同分类 - 百度文库1. FLASH根据内部存储结构的不同,闪存可分为NOR闪存和NAND闪存两种。NOR闪存:像访问SDRAM一样,可以根据数据/地址总线直接访问SDRAM。可以写入的次数少,速度慢。因为它的读写时序类似于SRAM,读地址是一种线性结构,多用于程序代码存储。NAND闪存:只有8位/16位/32位甚至更多位宽的总线,每次访问,都要将长地址分为几部分,一点点的分布传入才能访问nand flash。 Nand Flash相比其余的几种flash优势在于可擦写次数多,擦写速度快,

学海无涯的专栏 1万+

【CSP-S 提高组】考试大纲集合

【CSP-S提高组】考试大纲集合

weixin_42596089的博客 7255

对nand flash设备进行升级

前言 这段时间在给板子开发一个升级的功能,板子的Flash使用的是nand flash,使用mtd去管理分区。在正式开始讲升级部分之前,我们先了解一下nand flash和mtd的基本知识,最后我还会说一下怎么升级ubi格式的rootfs分区。 正文 1、nand flash 参考链接:https://blog.youkuaiyun.com/lee_jimmy/article/details/8208...

lee_jimmy的博客 3465

第0章 《机器人工程师带你入门SLAM》专栏所有文章目录汇总(截止目前115篇文章),方便大家查看阅读

《机器人工程师带你入门SLAM》专栏文章汇总:优快云热销专栏已更新100+篇优质内容,涵盖SLAM技术全栈知识体系。文章分为三大类:1)基础工具与环境配置,包括Ubuntu、Git等必备技能;2)C++编程从入门到进阶,详解变量、类、模板等核心概念;3)SLAM核心库实战,深入解析ROS、Eigen、PCL等关键库的应用。专栏提供从计算机基础到项目实战的系统学习路径,并附代码实例。点击专栏主页可订阅查看全部内容,后续将保持更新。

行知SLAM 1068

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

嵌入式设备OTA升级实战:如何安全读写UBI分区(附用户层ioctl操作指南)

本文详细解析了嵌入式设备OTA升级中UBI分区的安全擦写与用户层ioctl操作,提供了工业级可靠性的解决方案。通过介绍NAND闪存的特性、ioctl操作的三重防护机制以及差分升级包的安全写入流程,帮助开发者避免设备变砖风险。文章还涵盖了动态卷处理、电源故障防护和坏块管理等关键增强策略,适用于智能家居、工业控制等嵌入式场景。

weixin_30245867的博客 584

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

WinCE下面直接对Nand进行一些操作

有些时候我们需要在WinCE下面直接对Nand进行一些操作,比如erase,mask bad block,unmask bad block,或者一些基于block的数据操作。如果我们直接用Nand驱动去访问会造成一个问题,就是无法与系统的Nand驱动互斥访问,这样子很有可能会出现问题所以我们可以实现FMD_OEMIoControl这个函数来给我们直接提供一个接口由于通过DeviceIoContro

gooogleman#foxmail.com 2668

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

嵌入式编程知识2 - 在应用层对NAND FLASH进行操作

前言: 对与NandFlash等块设备的访问操作,mtd-utils工具集中提供了非常好的支持(可以到http://www.linux-mtd.infradead.org/进行了解),要使用mtd-utils工具集首先需要搞到mtd-utils的源码,并且使用目标设备上的交叉工具编译链进行编译。关于mtd-utils工具的使用可以参考:http://www.cnblogs.com/pengdo...

Clearfix_Xia 1981

nand flash 读写测试

参考链接:https://www.cnblogs.com/pengdonglin137/p/3468953.html 测试程序: #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <fc...

aaron_111的博客 3783

固态存储设备固件升级方案

随着数字化时代的发展,数字数据的量越来越大,相应的数据存储的需求也越来越大,存储设备产业也是蓬勃发展。存储设备产业中,发展最为迅猛的则是固态存储(Solid State Storage,SSS)。数字化时代,海量的数据,需要海量的存储设备。可以说,固态存储设备是数字化时代最重要的基础设施。为了解决发现的Bug,安全漏洞,或者为了提升性能,固态存储设备也有升级其固件的需求。

飞鹤的程序员人生 6872

linux ioctl驱动作用及程序示例

linux操作系统的目标之一是向用户掩盖系统硬件设备的特殊性。驱动程序调用步骤:应用程序、库、内核、驱动、硬件。linux嵌入式系统设备,例如:触摸屏、按键、 IIC总线、 LCD等是字符设备,他们特点是按字节流进行先后顺序读写操作设备的。ioctl是一种系统调用,用于在用户空间和内核空间之间传递控制命令。在Linux驱动程序中,ioctl通常用于实现设备驱动程序的控制接口。

focus on security 986

工业级 SD NAND FLASH 在瑞芯微RK与北京君正平台的应用实践与技术解析

本文围绕工业级 SD NAND FLASH 在瑞芯微 RK3568 与北京君正 X2600E 平台 Linux 系统(Ubuntu 20.04,交叉编译工具链分别为 aarch64-linux-gnu-、mips-linux-gnu-)中的应用展开,分享实践经验。内容涵盖操作 SD NAND 的常用命令(如查看设备、挂载分区、分区管理等)、SD 底层协议(含初始化流程、数据传输模式及注意事项)、三大读写方式(dd 命令、块设备标准接口、ioctl 系统调用)、以 RK 平台为例的 SD NAND 驱动框架(

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 15万+

Mobile的SD卡升级系统之一:两种升级方式

<br />      公司现在要实现sd卡升级操作系统,我查了下相关资料。发现目前有两种方式,在CE下和在bootloader下都可以实现更新NK。<br />(1)在CE下,可以直接用文件系统API读出NK.bin,放到内存buffer中,在通过DEVICEIOCTL的方式来调用nand驱动的一些接口来直接对nand flash进行写操作。<br />好处:跳过boot section,FAT/FAT32文件系统的解析;对内存大小无要求。<br />缺点:NAND驱动需要暴露读写的IOCTL,必须进入O

zhandoushi的专栏 1697
上一篇: linux make menuconfig\Makefile\Kconfig 详解
下一篇: Samsung K9F1G08U0D SLC NAND FLASH简介(待整理)
野-百-合
博客等级 码龄17年 308粉丝 118原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值