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

简单的字符设备驱动

    来源: 互联网  发布时间:2016-07-16

    本文导语:  错误百出   高手帮忙看看吧  #include  #include #include #include #include #include #include #include #include #include #include #include #include MODULE_LICENSE("Dual BSD/GPL"); #define GLOBALMEM_SIZE 0x1000 //内存  4kb #define MEM_CLEAR  0x1  //清零内...

错误百出   高手帮忙看看吧 
#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
MODULE_LICENSE("Dual BSD/GPL");
#define GLOBALMEM_SIZE 0x1000 //内存  4kb
#define MEM_CLEAR  0x1  //清零内存
#define GLOBALMEM_MAJOR 254 //预设主设备号
static  int globalmem_major=GLOBALMEM_MAJOR;
struct globalmem_dev
{
    struct cdev cdev;
    unsigned char mem[GLOBALMEM_MAJOR];
}
struct globalmem_dev *globalmem_devp;
int globalmem_open(struct inode *inode,struct file* flip)
{
     filp->private_data=globalmem_devp;
     return 0;
}
int global_release(struct inode* inode,struct file *flip)
{
     return 0;
}

static int globalmem_ioctl(struct inode *inodep,struct file *flip,unsigned int
cmd ,unsigned long arg)
{
     struct globalmem_dev *dev=flip->private_data;
     switch(cmd)
                {
         case MEM_CLEAR:
          memset(dev->mem,0,GLOBALMEM_SIZE);
          printk(KERN_INFO "globalmem is set to zero n");
          break;
         default:
          return -EINVAL;
                 }
     return 0;
}



//读写函数
static ssize_t globalmem_read(struct file *flip,char __user *buf,size_t
size,loff_t *ppos)
{
    unsigned long p=*ppos ;
    unsigned int count=size;
    int ret =0;
    struct globalmem_dev *dev =filp->private_data;

    if(p>=GLOBALMEM_SIZE)
               {
       return count? -ENXIO:0;
                }
    if(count>GLOBALMEM_SIZE-p)
                 {
          count=GLOBALMEM_SIZE-p;
                  }
    if(copy_to_user(buf,(void*)(dev->mem+p),count))
               {
           ret=-EFAULT;
               }
    else
               { 
        *ppos+=count;
         ret=count;
         printk(KERN_INFO "rea %d bytes(s) from %d n",count,p);
                 }
     return  ret; 
}
static ssize_t globalmem_write(struct file *flip,const char __user *buf,size_t
size,loff_t *ppos)
{
    unsigned long p=*ppos;
    unsigned int count=size;
    int ret =0;
    struct globalmem_dev * dev=flip->private_data;
    if(p>=GLOBALMEM_SIZE)return count? -ENXIO:0;
    if(count>GLOBAL_SIZE-p)count=GLOBALMEM_SIZE-p;
    if(copy_from_user(dev->mem+p,buf,count))ret=-EFAULT;
    else
           {
       *ppos+=count;
        ret=count;
        printk(KEN_INFO "write %d bytes(s) from %d n",count,p);
            }
    return ret;
}
//seek 函数。
static loff_t globalmem_llseek(struc file *flip,loff_t offset,int orig)
{
     loff_t ret=0;
     switch(orig)
                  {
        case 0:
          if(offsetGLOBALMEM_SIZE)
                                {
               ret=-EINVAL;
               break;
                                  }  
          flip->f_pos =(unsigned int)offset;
          ret=flip->f_pos;
          break;
       case 1:
           if((flip->f_pos+offset)>GLOBALMEM_SIZE)
                                  {
               ret=-EINVAL;
               break;
                                   }
           if((flip->f_pos+offset)f_pos+=offset;
           ret=flip->f_pos;
           break;
        default:
           ret=-EINVAL;
                   }
     return ret;
}
//ioctl()函数 用于清零
static int globalmem_ioctl(struct inode* inodep,struct file *flip,unsigned int
cmd ,unsigned long arg)
{
    switch(cmd)
            {
       case MEM_CLEAR:
         memset(dev->mem,0,GLOBALMEM_SIZE);
         printk(KERN_INFO "globalmem is set to zeron");
         break;
       default:
         return -EINVAL;//不支持其他命令 
            }
  return 0;
}

static const struct file_operations globalmem_fops=
{
    .owner=THIS_MODULE,
    .llseek=globalmem_llseek,
    .read=globalmem_read,
    .write=globalmem_write,
    .ioctl=globalmem_ioctl,
    .open=globalmem_open,
    .release=globalmem_release,
};
static void globalmem_setup_cdev(struct globalmem_dev *dev,int index)
{
     int err,devno=MKDEV(globalmem_major,0);
     cdev_init(&dev.cdev,&globalmem_fops);
     dev.cdev.owner=THIS_MODULE;
     dev.cdev.ops=&globalmem_fops;
     err=cdev_add(&dev.cdev,devno,1);
     if(err)printk(KERN_NOTICE"ERROR %d adding globalmem",err);
}
int globalmem_init(void)
{
    int result;
    dev_t devno=MKDEV(globalmem_major,0);
    if(globalmem_major)result=register_chrdev_region(devno,1,"globalmem");
    else  
               {
        result=alloc_chrdev_region(&devno,0,1,"globalmem");
                     globalmem_major=MAJOR(devno);      
                }
    if(result

    
 
 

您可能感兴趣的文章:

  • Linux设备驱动(第三版)- 字符设备驱动 - 例子
  • 字符设备驱动,混杂设备驱动,总线、设备、驱动模型、平台驱动
  • 字符型设备驱动生成的块设备
  • Linux字符设备驱动疑难问题--printf打印信息发到字符设备write函数中
  • Linux下写了一个字符设备驱动,找不到设备文件在哪个目录
  • 关于字符设备驱动的一点疑问
  • 关于字符设备驱动读写的问题,求助
  • linux 下简单的字符设备驱动
  • 请教:Solaris10下如何让字符设备驱动在开机自动启动呢?在线等...
  • 字符设备驱动简单问题
  • Linux 中多个字符设备的驱动问题。
  • 字符设备驱动程序问题
  • 自己编写一个简单的字符设备驱动程序以后,改怎么使用它?
  • linux简单字符设备驱动的一点疑问,麻烦前辈进来指点一二!
  • 请教高手,有关字符设备驱动程序问题
  • 关于字符设备驱动的一个问题,谢谢!
  • 初学字符设备驱动遇到的问题
  • I2C总线上字符设备驱动加载不成功,probe函数没有执行。
  • 字符设备驱动程序编写中,被读写的数据到底应该定义在什么地方?
  • 关于linux字符驱动设备的一个疑问
  • linux驱动程序如何加版本字符串
  • 关于字符驱动的上限
  • 请教!关于linux字符驱动程序
  • 求助 简单测试字符驱动 Cannot allocate memory
  • 如何在内核模块中对linux字符驱动进行读写呢
  • sybase的JDBC驱动字符串是什么阿??
  • 在编译字符驱动程序时,为何总是找不到头文件!急......
  • 字符驱动程序的疑问!
  • 关于字符驱动struct cdev的问题
  • Linux字符驱动的一个问题?刚学,请高手指点下原因
  • 请问在linux下的字符界面下如何使用优盘?需要安装驱动程序吗?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • C++ Strings(字符串) 成员 size():返回字符串中字符的数量
  • 关于字符串的操作,我想得到字符串的长度,和他开始两位组成的新的字符串,例如::
  • C++ Strings(字符串) 成员 c_str():将字符串以C字符数组的形式返回
  • 请问怎样判断一个字符是中文字符还是英文字符?(空)
  • C++ Strings(字符串) 成员 find():在字符串中查找字符
  • C语言实现输入一个字符串后打印出该字符串中字符的所有排列
  • C++ Strings(字符串) 成员 end():返回一个迭代器,指向字符串的末尾。(最后一个字符的下一个位置)
  • 用Java正则去掉字符串中重复出现的字符
  • C++ I/O 成员 ignore():读取字符并忽略指定字符
  • 字符字符串加法问题?
  • C++ Strings(字符串) 成员 copy():将内容复制为一个字符数组
  • 怎样去掉字符串中的tab字符?
  • C++ Strings(字符串) 成员 rbegin():返回一个逆向迭代器,指向最后一个字符
  • 如何使GDB显示完整的字符串变量,当字符串比较长时。
  • C++ Strings(字符串) 成员 empty():如果字符串为空,返回真
  • 如何将一个双引号”放在一个字符串中,就是在字符串中如何转义一个双引号。谢谢!
  • C++ Strings(字符串) 成员 begin():返回一个迭代器,指向第一个字符
  • php判断字符串在另一个字符串位置的方法
  • C++ Strings(字符串) 成员 data():返回内容的字符数组形式
  • 请教,有关16进制字符串形成2进制字符串的问题!
  • C++ Strings(字符串) 成员 length():返回字符串的长度
  • crtl+alt+F1一直到F6都可以从图形到字符,那么,这和纯粹的字符界面有什么区别,也就是该/etc/initab的值为3后进入的字符界面?


  • 站内导航:


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

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

    浙ICP备11055608号-3