当前位置:  技术问答>linux和unix

ioctl()有关求助

    来源: 互联网  发布时间:2016-05-27

    本文导语:  ioctl()有关求助 以下内容为各部分文件,有问题的地方注释出了  先写出各部分文件 其中设备文件为:/dev/ioctldev c 240 0 顺便说一下,本人是自学,这里是离我最近的老师了。谢谢! ===============ioctl_test.h================...

ioctl()有关求助
以下内容为各部分文件,有问题的地方注释出了 
先写出各部分文件
其中设备文件为:/dev/ioctldev c 240 0
顺便说一下,本人是自学,这里是离我最近的老师了。谢谢!
===============ioctl_test.h==============================

#ifndef  _IOCTLTEST_H_
#define  _IOCTLTEST_H_

#define  IOCTLTEST_MAGIC 't'

typedef  struct
{
unsigned  long  size;
unsigned  char  buff[128];
}  __attribute__((packed))  ioctl_test_info;

#define IOCTLTEST_LEDOFF _IO(  IOCTLTEST_MAGIC,  0)
#define IOCTLTEST_LEDON _IO(  IOCTLTEST_MAGIC,  1)
#define IOCTLTEST_GETSTATE _IO(  IOCTLTEST_MAGIC,  2)

#define IOCTLTEST_READ _IOR(IOCTLTEST_MAGIC,  3, ioctl_test_info)
#define IOCTLTEST_WRITE _IOW(IOCTLTEST_MAGIC,  4, ioctl_test_info)
#define IOCTLTEST_WRITE_READ _IOWR(IOCTLTEST_MAGIC,    5, ioctl_test_info)

#define IOCTLTEST_MAXNR 6

#endif  //  IOCTLTEST_H_

=====================ioctl_dev.c==========================

#include  
#include  
#include  

#include 
#include 
#include 
#include 

#include 
#include 

#include "ioctl_test.h"

#define IOCTLTEST_DEV_NAME "ioctldev"
#define IOCTLTEST_DEV_MAJOR 240

#define IOCTLTEST_WRITE_ADDR 0x0378
#define IOCTLTEST_READ_ADDR 0x0379

int  ioctltest_open  (struct  inode  *inode,  struct  file  *filp)
{
return  0;
}

int  ioctltest_release  (struct  inode  *inode,  struct  file  *filp)
{
return  0;
}

int   ioctltest_ioctl  (struct   inode   *inode,   struct   file   *filp,   unsigned   int cmd,  unsigned  long  arg)
{
ioctl_test_info ctrl_info;
int err,  size;
int loop;

if(_IOC_TYPE(cmd)  !=  IOCTLTEST_MAGIC)  return  -EINVAL;
if(_IOC_NR(cmd) >=  IOCTLTEST_MAXNR)  return  -EINVAL;

size  =  _IOC_SIZE(cmd);

if(size)
{
err  =  0;

if(_IOC_DIR(cmd) & _IOC_READ )   err = access_ok(VERIFY_WRITE,(void  *)arg,size);
else   if(_IOC_DIR(cmd) & _IOC_WRITE)  err = access_ok(VERIFY_READ,(void  *)arg,size);

if(err)  return  err;
}
 
switch(cmd)
{
case  IOCTLTEST_LEDOFF :  outb(0x00,  IOCTLTEST_WRITE_ADDR);
break;

case  IOCTLTEST_LEDON :  outb(0xFF,  IOCTLTEST_WRITE_ADDR);
break;

case  IOCTLTEST_GETSTATE :  return  inb(IOCTLTEST_READ_ADDR);

case  IOCTLTEST_READ : //此条代码不响应应用程序(后面的还没能测试)

ctrl_info.buff[0]  =    inb(IOCTLTEST_READ_ADDR);
ctrl_info.size  =  1;
copy_to_user  ((void  *)  arg,  (const  void  *)&ctrl_info,  (unsigned  long)  size);
break;

case  IOCTLTEST_WRITE :
copy_from_user  ((void  *)&ctrl_info,  (const  void  *) arg, size);
for(loop  =  0;  loop  = 2)
{
cnt  =  0;
state  =  ~state;
}
usleep(100000);
}

ioctl(dev,  IOCTLTEST_LEDOFF);
 
close(dev);
}
return  0;
}


|
case  IOCTLTEST_READ : //此条代码不响应应用程序(后面的还没能测试) 

ctrl_info.buff[0]  =    inb(IOCTLTEST_READ_ADDR); 
ctrl_info.size  =  1; 
copy_to_user  ((void  *)  arg,  (const  void  *)&ctrl_info,  (unsigned  long)  size); 
break; 

不知道楼主指的不响应是什么意思?ioctl出错、应用层死机、核心挂掉、死等在读IOCTLTEST_READ_ADDR?

你也可以自己用软件天一些数据到ctrl_info.buff中,如

memcpy(ctrl_info.buff, "mytest", 6);
ctrl_info.size = 6;
copy_to_user  ((void  *)  arg,  (const  void  *)&ctrl_info,  (unsigned  long)  size); 

试试是否读硬件出错。

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 内核执行ioctl时会被其他的ioctl打断吗
  • 用户程序的ioctl是怎么和驱动程序中的ioctl实现联系
  • win内核驱动漏洞挖掘 IOCTL Fuzzer
  • ioctl调用的问题
  • 菜鸟问题:Linux下 ioctl 函数到底在哪?
  • system()调用 与 ioctl()调用
  • ioctl() 到底有什么作用??
  • ioctl()函数
  • ioctl執行的奇怪問題
  • 关于linux内核的ioctl函数,请高手指点一下
  • 请教一个关于Makefile的问题。提示出错:make: *** 没有规则可以创建“ioctl”需要的目标“gcc”。 停止。
  • ioctl&fcntl 函数的区别
  • 关于ioctl
  • 请教一个ioctl函数的参数问题
  • 给错误设备发送正确命令 -- ioctl问题
  • ioctl返回的地址问题?初学者,高人指点。
  • 用ioctl修改网卡接口eth0的ip地址的问题,请~
  • ioctl函数的用法
  • 求ioctl的中文资料
  • 关于:ioctl(fp,PIOCPSINFO,&psinfo);


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3