历史上的今天
返回首页

历史上的今天

今天是:2025年02月15日(星期六)

2019年02月15日 | ARM驱动开发之ioctl函数的使用

2019-02-15 来源:eefocus

0. linux 版本对 ioct l的影响


kernel 2.6.36 中已经完全删除了fs.h中的struct file_operations 中的ioctl 函数指针,取而代之的是unlocked_ioctl 


我们这里还是用 ioctl指针介绍吧,但实际使用的时候要注意自己的linux版本,如果是2.6.36以上的,在其fs.h中的


struct file_operations 也会有 unlock_ioctl函数指针的。


1.ioctl应用程序(用户空间)向驱动程序(内核空间)发送命令(当然也可以反过来内核空间向用户空间发命令),内核程序也有一个ioctl对应的函数用来接收命令,然后通过一个switch语句判断命令然后执行相应的操作。(不止可以发命令,也可以发参数过去)


2.内核空间的 ioct l函数和 应用空间的 ioctl 函数


内核空间:(在linux内核 fs.h中的结构体 file_operation 可以找到)


int (*ioctl)(struct inode *i, struct file *f, unsigned int cmd, unsigned long args)  //这里只是函数指针,把(*ioctl)任意改个名字就可以往下编写这个函数了


其中 cmd 表示发送的命令,args表示附带的参数,不写也行


用户空间:int ioctl(int fd, int cmd,int args)


      fd 表示文件描述符


      cmd 表示命令


      args表示附带的参数,不写也行



当用户空间调用 ioctl后,对应内核空间的 ioctl 函数也会被调用


3.ioctl 命令的定义:


例如:



#define COMMAND1 _IOWR('I',0,unsigned long)

#define COMMAND2 _IOWR('I',1,unsigned long)

其中的 _IOWR是构造命令的,表示可读写的,类型为I,分别为类型 I 的0号命令和1号命令。 类型为 I 也是为了区分命令,就如一个人性陈,叫陈一,陈二

后面的 usigned long 是这个命令附带的参数的类型


还有几种构造命令的宏:


#define _IO(type,n)     ------构造无参数命令


#define _IOR(type,n,size) -------构造从驱动中读取数据的命令,size为命令附带参数的类型


#define _IOW(type,n,size) ------构造向驱动写入数据的命令,size为命令附带参数的类型


#define _IOWR(type,n,size) -------构造驱动程序和应用程序双向传输数据的命令,size为命令附带参数的类型


4.代码:


应用程序:


#include

#include

#include

#include

#include

#include

#include

 

#define COMMAND1 _IOWR('I',0,unsigned long)

#define COMMAND2 _IOWR('I',1,unsigned long)

 

int main()

{

int fd;

fd = open("/dev/ioctlt",O_RDWR);

if(fd<0)

{

perror("failed to open");

return -1;

}

 

while(1)

{

ioctl(fd,COMMAND1,100);//向驱动程序发COMMAND1命令,并附带参数100

sleep(1);

ioctl(fd,COMMAND2);//向驱动程序发COMMAND1命令,不附带参数

sleep(1);

}

return 0;

}


驱动程序:

#include

#include

#include

#include

#include

#include

#include

#include

#include

 

#define COMMAND1 _IOWR('I',0,unsigned long)

#define COMMAND2 _IOWR('I',1,unsigned long)

 

int ioctl_open(struct inode *i, struct file *f)

{

printk("open!\n");

return 0;

}

 

int ioctl_ioctl(struct inode *i, struct file *f, 

unsigned int cmd, unsigned long args)

{

switch(cmd)

{

case COMMAND1:

printk("enter COMMAND1 program!,arg=%ld\n",args);break;//收到命令1后,并打印附带的参数

case COMMAND2:

printk("enter COMMAND2 program!\n");break;

}

return 0;

}

 

static struct file_operations fops ={

.owner = THIS_MODULE,

.open = ioctl_open,

.ioctl = ioctl_ioctl,

};

 

static struct miscdevice misc={

.minor = MISC_DYNAMIC_MINOR,

.name = "ioctlt",

.fops = &fops,

};

 

 

 

static int __init io_init(void)

{

int ret;

printk("init!\n");

ret = misc_register(&misc);

if(ret<0)

{

printk("failed to register misc\n");

return -1;

}

return 0;

}

 

static void __exit io_exit(void)

{

printk("rmmod mod!\n");

misc_deregister(&misc);

return ;

}

 

module_init(io_init);

module_exit(io_exit);

MODULE_LICENSE("GPL");


推荐阅读

史海拾趣

远阳(FLYOUNG)公司的发展小趣事

福建国光新业科技股份有限公司,作为全球领先的聚合物片式叠层铝电解电容器(MLPC)制造商,自成立之初便致力于国产高端被动元器件的技术开发与产品创新。面对高端电容器被国外厂商长期垄断的局面,国光新业经过长期技术积累与研发,成功打破了国际垄断,实现了MLPC电容器的国产替代。这一成就不仅填补了国内空白,还使公司在细分领域发明专利授权数量上跃居全球第一,荣获多项国家级荣誉称号。

意瑞(COSEMITECH)公司的发展小趣事

随着技术的不断成熟和产品的不断优化,意瑞半导体的市场影响力逐渐扩大。其高集成度、高性能的芯片广泛应用于国内外主流OEM及全球知名Tier1厂商。在汽车电子领域,公司布局了动力总成、车身控制、电源管理和底盘安全等模块,其产品在多家主机厂成功导入并量产,性能超过了国外老牌芯片,成为该品类中本土鲜有的实现汽车市场大批量出货的产品。

Anvo-Systems公司的发展小趣事

随着公司业务的不断扩展,Anvo-Systems开始实施国际化战略。公司先后在亚洲、欧洲和北美等地设立了研发中心和生产基地,以更好地满足不同地区的市场需求。同时,Anvo-Systems积极参与国际电子展会和技术交流活动,与全球同行建立了广泛的合作关系。这一全球化布局不仅提升了公司的竞争力,也为公司的长期发展打开了新的空间。

Global Navigation Systems公司的发展小趣事
远程无线防盗报警系统可以通过智能家居系统平台进行集成。通过智能家居系统的控制中心和通信协议,可以将防盗报警系统与家中的其他智能设备(如灯光、窗帘、空调等)进行联动控制。例如,当防盗报警系统触发报警时,可以自动关闭家中的门窗、开启灯光等,以吓退入侵者或提醒家庭成员注意安全。同时,用户还可以通过智能手机等终端设备远程查看和控制家中的安全状况和设备状态。
Focus公司的发展小趣事

Focus Enhancements, Inc.(根据参考文章中的信息)是一家无晶圆厂集成电路(IC)公司,专注于为家庭影院系统、便携式媒体播放器、智能手机等消费电子设备开发和销售IC解决方案和组件。自1996年以来,该公司凭借其强大的研发团队和敏锐的市场洞察力,不断推出创新产品,赢得了包括微软、东芝、LG、索尼等全球知名OEM厂商的青睐。随着物联网和智能设备的兴起,Focus Enhancements加大了对低功耗、高性能芯片的研发力度,成功拓展了智能家居、可穿戴设备等领域的应用市场。

FEI Microwave Inc公司的发展小趣事

为了进一步拓展国际市场,FEI Microwave Inc公司积极寻求与国际知名企业的合作。通过与欧洲宇航防务集团下属的子公司Astrium的合作,FEI Microwave Inc公司的微波技术成功应用于航天领域,为火箭发射任务提供了关键的技术支持。这次成功的合作不仅提升了FEI Microwave Inc公司的品牌知名度,也为其在国际市场上赢得了更多的机会。

问答坊 | AI 解惑

求助:问个电路板的问题

1.电路板(除去元器件)由什么材料制成? 2.电路板用PROTEL画图的时候,哪些层分别对应着哪些位置?(比如;topoverly,layout...) 3.什么是波峰焊,回流焊?…

查看全部问答>

哈佛结构

哈佛结构   哈佛结构是一种将程序指令存储和数据存储分开的存储器结构。中央处理器首先到程序指令存储器中读取程序指令内容,解码後得到数据地址,再到相应的数据存储器中读取数据,并进行下一步的操作(通常是执行)。程序指令存储和数据存储 ...…

查看全部问答>

免费教你实现LED指示灯,不容错过哦!

replyreload += \',\' + 371188;Timson,如果您要查看本帖隐藏内容请回复…

查看全部问答>

测脉冲,波形不能稳定

1、  用示波器测试脉冲时波形不能稳定下来,我用的时鼎阳SDS1102C,大家有没有遇到过这个问题?…

查看全部问答>

收购:现需要收购 SmartARM2400 的包装盒若干个,以及装书的那个硬包装盒若干个,谢谢!

发现 SmartARM 2400 的包装盒装东西非常合适,想弄几个, SmartARM套件中的那个装书的硬纸盒也非常不错,用来整理书架是非常不错的选择,非常想多弄几个。 可以和我邮件联系,  rampc@sian.com 不要太贵哦,我明天再把我想要的 ...…

查看全部问答>

有没有哪位在wince 6.0 r2上定制出中文模拟器?

自己在wince 6.0 r2上定制了一个模拟器,但不能显示中文,汉字都是以空框显示,不知道是什么原因?请高人指点一下!…

查看全部问答>

求教:stm的rtc用的爱普生的晶振叫什么晶振

                                 该晶振的1,4脚与OSC32IN,OSC32OUT 的连接有没规定:哪个脚跟哪个脚相连,找不到相关材料,望知情高手指导下,拜谢 ...…

查看全部问答>

有关rtdx的问题!

若想在H.263程序运行时,看到实时的压缩数据流,是否只能使用rtdx?仿真器必须用560吗?我现在用的是DM642,510JTAG,求各位大人给予高见!! …

查看全部问答>

利尔达开发板的问题,232串口调试不成功

1、PC机串口连接TEST44X学习板的9芯串行接口 J5_232 // 2、对拨动开关P_232、P1、U_USART,只有拨动开关 U_USART 的P2脚和P5脚拨到ON 的位置; 按照上面的设置设置了,我从pc端给开发板发数据,没有回来的数据,没反应,其他几个历程也不行,请问 ...…

查看全部问答>

前仿真与后仿真结果不同,原因是什么?

前仿真出来的状态机时钟正确的, 而后仿真出来的状态机中,有些状态之间就会有很短时间的其他状态,时间不到系统时钟的十分之一。 上图是后仿真时序,状态3后应该是状态4,但是实际却是状态7 和 6 ,而且时间很短,不到一个时钟周期,这导致了后 ...…

查看全部问答>