网络安全参考 | UNIX参考 | GPS参考 | 无线参考 | 在线手册 | OSBUG.ORG | SUNNY-NETWORK.COM
天线制作 GPS 地标
网站地图 RSS订阅
高级搜索 收藏本站
Home | 业界动态 | Open source | GNU | Linux | BSD | Solaris | AIX | HP-UX | IRIX | Mac OS X | Minix | Tru64 | SCO UNIX | Network | Security | X-Window | Database | 应用服务 | Programming | 经典著作 | 永远的纪念 | 杂项
 当前位置: Home > Linux > 设备驱动 > 文章  
如何编写Linux设备驱动程序
文章来源: 利索脚 文章作者: 未知 发布时间: 2004-05-21   字体: [ ]  
 

  下面就开始写子程序.

#include <linux/types.h>
#include <linux/fs.h>
#include <linux/mm.h>
#include <linux/errno.h>
#include <asm/segment.h>

unsigned int test_major = 0;

static int read_test(struct inode *node, struct file *file, char *buf, int count)
{
  int left;

  if (verify_area(VERIFY_WRITE, buf, count) == -EFAULT )
    return -EFAULT;

  for(left = count ; left > 0 ; left--)
  {
    __put_user(1, buf, 1);
    buf++;
  }

  return count;
}

  这个函数是为read调用准备的.当调用read时,read_test()被调用,它把用户的缓冲区全部写1.buf 是read调用的一个参数.它是用户进程空间的一个地址.但是在read_test被调用时,系统进入核心态.所以不能使用buf这个地址,必须用__put_user(),这是kernel提供的一个函数,用于向用户传送数据.另外还有很多类似功能的函数.请参考.在向用户空间拷贝数据之前,必须验证buf是否可用。
  这就用到函数verify_area.

static int write_tibet(struct inode *inode, struct file *file, const char *buf, int count)
{
  return count;
}

static int open_tibet(struct inode *inode, struct file *file )
{
  MOD_INC_USE_COUNT;
  return 0;
}

static void release_tibet(struct inode *inode, struct file *file )
{
  MOD_DEC_USE_COUNT;
}

  这几个函数都是空操作.实际调用发生时什么也不做,他们仅仅为下面的结构提供函数指针。

struct file_operations test_fops =
{
  NULL,
  read_test,
  write_test,
  NULL, /* test_readdir */
  NULL,
  NULL, /* test_ioctl */
  NULL, /* test_mmap */
  open_test,
  release_test, NULL, /* test_fsync */
  NULL, /* test_fasync */
  /* nothing more, fill with NULLs */
};

  设备驱动程序的主体可以说是写好了。现在要把驱动程序嵌入内核。驱动程序可以按照两种方式编译。一种是编译进kernel,另一种是编译成模块(modules),如果编译进内核的话,会增加内核的大小,还要改动内核的源文件,而且不能动态的卸载,不利于调试,所以推荐使用模块方式。

int init_module(void)
{
  int result;

  result = register_chrdev(0, "test", &test_fops);

  if (result < 0)
  {
    printk(KERN_INFO "test: can't get major number\n");
    return result;
  }

  if (test_major == 0) test_major = result; /* dynamic */
    return 0;
}

 
推荐文章
·让arm-linux支持普通USB摄像头
·Linux设备驱动编程之结构化设备
·Linux设备驱动编程之复杂设备驱
·深入浅出Linux设备驱动之并发控
·深入浅出Linux设备驱动之字符设
·深入浅出Linux设备驱动编程之内
·深入浅出Linux设备驱动编程之引
·Linux设备驱动编程之定时器
·Linux设备驱动编程之中断处理
·Linux设备驱动编程之异步通知
·Linux设备驱动编程之阻塞与非阻
·Linux设备驱动编程之内存与I/O操
·摄像头(WebCam)在Linux操作系
·中星微芯片(301,302)USB 摄像头
 

 
↑返回顶部   打印本页   关闭窗口↓  

Google
 
Web oldhand.org unixreference.net meshmea.org
相关分类
热点文章
·摄像头(WebCam)在Linu
·在Linux中使用中星微301
·中星微芯片(301,302)USB
·Linux设备驱动编程之内
·深入浅出Linux设备驱动
·Linux培训园地:Linux下
·Linux的I2C驱动架构
·让arm-linux支持普通USB
相关文章
·摄像头(WebCam)在Linu
·Linux 无线网络技术系列
·高级文件系统实现者指南
·Linux 无线网络技术系列
·Linux 无线网络技术系列
·移动电话准备好接受Linu
·中星微芯片(301,302)USB
·基于嵌入式Linux系统的
更多...
 
 

Copyright(c) 2001-2009 OLDHAND ORGANIZATION, All Rights reserved.
Power by DedeCms 织梦内容管理系统