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

新手驱动问题

    来源: 互联网  发布时间:2016-06-22

    本文导语:  驱动程序: #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #define MEM_CLEAR 0 #define MEM_RE 1 #define MEM_SETSIZE 2 #define GLOBALMEM_SIZE 0x1000 #define GLOBALMEM_MAJOR 255 struct globalmem_...

驱动程序:
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define MEM_CLEAR 0
#define MEM_RE 1
#define MEM_SETSIZE 2

#define GLOBALMEM_SIZE 0x1000
#define GLOBALMEM_MAJOR 255

struct globalmem_dev
{
unsigned int count;
unsigned int size;
struct cdev cd;
unsigned char mem[GLOBALMEM_SIZE];
};
struct globalmem_dev *g_dev;
struct file_operations globalmem_fopes;
int globalmem_major=GLOBALMEM_MAJOR;

int globalmem_open(struct inode *inode,struct file *filp)
{
  filp->private_data=g_dev;
  g_dev->count++;
  return 0;
}

int globalmem_release(struct inode *inode,struct file *filp)
{
  if(g_dev->count>0)
    g_dev->count--;
  return 0;
}

int globalmem_ioctl(struct inode *inodep,
  struct file *filp,unsigned int cmd,unsigned long arg)
{
  int i;
  char c;
  switch(cmd)
  {
    case MEM_CLEAR:
      memset(g_dev->mem,0,g_dev->count);
      printk(KERN_INFO "globalmem is set to zeron");
      break;
    case MEM_RE:
      if(g_dev->count!=1)
        return -1;
      for(i=0;isize/2;i++){
        c=g_dev->mem[i];
        g_dev->mem[i]=g_dev->mem[g_dev->size-i-1];
        g_dev->mem[g_dev->size-i-1]=c;
      }
      break;
    case MEM_SETSIZE:
      if(argGLOBALMEM_SIZE)
        break;
      g_dev->size=arg;
      break;
    default:
      return -1;
  }
  return 0;
}

int globalmem_read(struct file *filp,char __user *buf,
  size_t size,loff_t *ppos)
{
  unsigned long pos=*ppos;
  unsigned long count=size;
  printk(KERN_INFO "readn");
  printk("%cn",g_dev->mem[0]);
  if(access_ok(VERIFY_WRITE,buf,count)==-EFAULT)
  {
    printk(KERN_INFO "read error1n");
    return -EFAULT;
  }
  if(*ppos+count>g_dev->size)
    count=g_dev->size-(*ppos);
  if(copy_to_user(buf,(void*)(g_dev->mem+pos),count))
  {
    printk(KERN_INFO "read error2n");
    return -EFAULT;
  }
  *ppos+=count;
  printk("%sn",g_dev->mem);
  printk(KERN_INFO "read overn");
  return count;
}

int globalmem_write(struct file *filp,char __user *buf,
  size_t size,loff_t *ppos)
{
  printk(KERN_INFO "writen");
  printk("%cn",g_dev->mem[0]);
  if(g_dev->count!=1)
  {
    printk(KERN_INFO "write error:g_dev!=1n");
    return -EFAULT;
  }
  unsigned long real_size;
  if(size+(g_dev->size) > GLOBALMEM_SIZE)
    real_size=GLOBALMEM_SIZE;
  else
    real_size=size;
  
  if(copy_from_user((g_dev->mem)+real_size,(void *)buf,real_size))
  {
    printk(KERN_INFO "write error 1n");
    return -EFAULT;
  }
  g_dev->size+=real_size;
  printk("%sn",g_dev->mem);
  printk(KERN_INFO "write overn");
  return real_size;
}

loff_t globalmem_llseek(struct file *filp,loff_t offset,int orig)
{
  switch(orig)
  {
    case 0://from the begin of the file
      if(offset GLOBALMEM_SIZE)
        return -EFAULT;
      filp->f_pos=(unsigned int)offset;
      return offset;
    case 1://from the current of the file
      if(filp->f_pos+offset>GLOBALMEM_SIZE || filp->f_pos+offsetf_pos+=offset;
      return filp->f_pos;
    case 2://from the end of the file
      if(offset>0 || offset+g_dev->sizef_pos=(unsigned int)(offset+g_dev->size);
      return filp->f_pos;
    default:
      return -EFAULT;
  }
}

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,index);
  cdev_init(&g_dev->cd,&globalmem_fops);
  g_dev->cd.owner=THIS_MODULE;
  g_dev->cd.ops=&globalmem_fops;
  err=cdev_add(&g_dev->cd,devno,1);
  if(err)
    printk(KERN_NOTICE "Error %d adding LED%d", err, index);
}

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(resultsize=0;
  g_dev->count=0;
  globalmem_setup_cdev(g_dev,0);
  return 0;
}

void globalmem_exit(void)
{
  cdev_del(&g_dev->cd);
  kfree(g_dev);
  unregister_chrdev_region(MKDEV(globalmem_major, 0), 1);
}

MODULE_AUTHOR("BLACK & WHITE");
MODULE_LICENSE("Dual BSD/GPL");

module_param(globalmem_major, int, S_IRUGO);

module_init(globalmem_init);
module_exit(globalmem_exit);


测试程序

#include 
#include 
#include 
#include 
void main()
{
int testdev;
int i;
char buf[21];
char wbuf[22]="shuchuanyushuchundfdd";
testdev=open("/dev/test",O_RDWR);
if ( testdev == -1 )
{
printf("Cann't open file n");
exit(0);
}
int w=write(testdev,wbuf,21);
//printf("buf:%sn",wbuf);
printf("%in",w);
read(testdev,buf,21);
//for (i = 0; i 

    
 
 

您可能感兴趣的文章:

  • 新手关于驱动开发的疑问
  • Linux新手请教声卡驱动!!!!!!!!!!!
  • 新手请教:我的声卡所附光盘提供了下面的这些文件,我怎么安装驱动?
  • 新手:在FC5下如何配置驱动开发环境?
  • 新手问题,如何应用内核中的i2c设备驱动
  • 驱动加载(新手问题)
  • 新手RedHat Linux问题, 显卡驱动与Codeblocks
  • 新手求助:BSP与驱动程序的差别
  • 新手着手Linux驱动程序开发~~~关于搭建环境的基础问题
  • 请教:新手入门,该怎么学习linux驱动?
  • 显示驱动求助!新手提问
  • 我是新手,不要笑我。问一个关于驱动安装的问题
  • 新手上路,Linux8下双网卡,驱动都装上了,怎么设置ip啊??
  • 我是个新手,请问个编译驱动的问题
  • Linux新手,求学习流程(近期要跟着老师做基于ARM的驱动……)
  • 大家好,我是新手。我正在看《linux驱动程序程序》问大家一个简单问题。
  • 我是linux新手,不会装显卡驱动程序,有人肯教我吗?
  • linux新手请教静态加载gpio驱动的问题
  • 新手第一次写驱动,发现一个关于数据传递的问题
  • JDBC的问题,新手高手都来看看吧,说不定能帮帮我这个新手呢,谢谢!
  • 新手问题:中文问题等
  • 新手问题,关于liux安装启动的问题。
  • 新手有关linux的问题!
  • (新手问题)关于QT的问题
  • 一个蛋疼的问题,我是新手
  • 新手问题:RH怎么退回字符界面? 急!!!!
  • 新手问SCO UNIX安装问题
  • 新手学linux,关于vmware tools的问题。
  • 新手求教:关于ftp命令的问题,请大家帮帮忙
  • Java新手上路之问题
  • 新手,关于Gaim的问题,在线等
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 新手如何加入开源项目 有什么好的c++,java 开源适合新手 请指点!
  • 想找共同学习Linux的新手,一起学习,共同成长
  • 新手急求~~~~~~~~~~~~~~~~~~~
  • 新手学习该用哪个版本
  • 面向新手的终端辅助工具 Clicompanion
  • 我是个新手,请各位老兄给介绍基本好书?
  • 新手请教啦~~能不能帮忙推荐几本书
  • 我是新手
  • 新手:用WEB页面修改数据库中的表?
  • 我是一名新手,请问如何学java
  • (新手)这里怎么看到300篇以外的所有文章?(不是搜索)
  • 新手求助!
  • 新手上路,怎样判断网卡是否安装成功?
  • !!新手求救!!
  • 新手在此多谢了:SUN的宠物商店
  • 新手请教,我用VI时按ESC键,总是回嘟嘟嘟嘟响,请问如何去掉!谢谢!
  • 新手求救!!关于变量初始化
  • 新手,请多指教!!
  • 我是新手,安装好unix后,要如何安装鼠标?
  • 我是JAVA新手,所以我不明白(JPanel)类的东西


  • 站内导航:


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

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

    浙ICP备11055608号-3