字符型驱动程序设计基本步骤

来源:互联网 发布:kali linux 路由转发 编辑:程序博客网 时间:2024/05/18 01:59
字符型驱动程序设计基本步骤 08.02.19
驱动程序任务就是  
1.建立struct file_operations 结构,
2. 完成 struct file_operations 结构中device_seek,device_read等文件操作函数的实现。
3 .register_chrdev(DRAM_MEM_MAJOR,DEVICE_NAME,&dram_mem_ops);将驱动程序注册到内核。
   unregister_chrdev(Major,DEVICE_NAME);驱动程序从内核删除。
  
4.实现挂载卸载驱动程序的两个入口。
int init_module()
{
........
}
void cleanup_module()
{
........
}
模块方式驱动程序制作步骤:
1 . 建立.c文件,例如 dramOp.c 。注意和应用程序结构有所不同。
     其中没有头文件。主要有以下几个并行的部分;
(1)声明几个文件操作函数
static int device_open(struct inode *,struct file *);
static int device_release(struct inode *,struct file *);
static ssize_t device_read(struct file *,char *,size_t,loff_t *);
static ssize_t device_write(struct file *,const char *,size_t,loff_t *);
static loff_t device_seek(struct file *,loff_t,int);
(2)建立结构体。作用:《1》生成文件操作函数与应用程序相关函数对应关系。《2》用于驱动程序注册.
  
  struct file_operations  dram_mem_ops =
  {
   llseek:    device_seek,
   read:      device_read,
   write:     device_write,
   open:      device_open,
   release:   device_release
  };
(3) register_chrdev(DRAM_MEM_MAJOR,DEVICE_NAME,&dram_mem_ops);将驱动程序注册到内核。
      unregister_chrdev(Major,DEVICE_NAME);驱动程序从内核删除。
(4) 几个函数的具体实现(定义).
  static int device_open(struct inode * inode,struct file *file)
  {
  ...
  }
  static int device_release(struct inode * inode,struct file *file)
  {
  ...
  }
  static ssize_t device_read(struct file *file, char * buffer,size_t length,loff_t * offset)
  {
  ...
  }
  static ssize_t device_write(struct file *file,   const char * buffer,size_t  length,loff_t * offset)
  {
  ...
  }
  static loff_t device_seek(struct file *filp,loff_t off,int whence)
  {
  ...
  }
(5)两个函数名绝对不变的函数,与相应shell命令相对应,实现驱动的挂载和卸载。
int init_module()// 申请内存空间,且调用register_chrdev(含参数);实现真正挂载
{
}
void cleanup_module()//释放相应内存空间,且调用unregister_chrde(含参);实现真正卸载
{
}
2.完成上述dramOp.c,将其用驱动编译器编译成中间文件dramOp.o .注意他还不是可执行文件,之用真正与内核结合时(关联),才生成可执行文件dramOp。
3.在 arm板子的 shell 中mnt 本机 并在 dramOp.c 所在目录键入如下命令:
#insmod ./dramOp.o  //此命令调用init_module()函数,实现驱动注册,将其挂载到内核。
此时只要用以下命令
#mknod /dev/设备名  设备类型 主设备号 次设备号
生成与驱动程序中定义完全一致的文件,用以操作。要确保设备名  设备类型 主设备号与驱动程序中规定的完全一致。
例如
#mknod /dev/name c 30 20  //此命令只要在应用程序操作相应文件之前任何时间执行即可。
4. 就可以用应用程序对设备进行操作拉
5.不用的时候用如下命令将驱动模块卸载
#rmmod dramOp //此时可是可执行文件拉,因为在执行命令#insmod ./dramOp.o 时就将中间文件生成可执行文件拉。
  完工:
   

原创粉丝点击