电子发烧友App

硬声App

0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示
创作
电子发烧友网>电子资料下载>嵌入式开发>嵌入式Linux设备驱动开发之test驱动实验内容解析

嵌入式Linux设备驱动开发之test驱动实验内容解析

2017-10-18 | rar | 0.4 MB | 次下载 | 1积分

资料介绍

11.7 实验内容——test驱动
  1.实验目的
  该实验是编写最简单的字符驱动程序,这里的设备也就是一段内存,实现简单的读写功能,并列出常用格式的Makefile以及驱动的加载和卸载脚本。读者可以熟悉字符设备驱动的整个编写流程。
  2.实验内容
  该实验要求实现对虚拟设备(一段内存)的打开、关闭、读写的操作,并要通过编写测试程序来测试虚拟设备及其驱动运行是否正常。
  3.实验步骤
  (1)编写代码。
  这个简单的驱动程序的源代码如下所示:
  /* test_drv.c */
  #include 《linux/module.h》
  #include 《linux/init.h》
  #include 《linux/fs.h》
  #include 《linux/kernel.h》
  #include 《linux/slab.h》
  #include 《linux/types.h》
  #include 《linux/errno.h》
  #include 《linux/cdev.h》
  #include 《asm/uaccess.h》
  #define TEST_DEVICE_NAME “test_dev”
  #define BUFF_SZ 1024
  /*全局变量*/
  static struct cdev test_dev;
  unsigned int major =0;
  static char *data = NULL;
  /*读函数*/
  static ssize_t test_read(struct file *file,
  char *buf, size_t count, loff_t *f_pos)
  {
  int len;
  if (count 《 0 )
  {
  return -EINVAL;
  }
  len = strlen(data);
  count = (len 》 count)?count:len;
  if (copy_to_user(buf, data, count)) /* 将内核缓冲的数据拷贝到用户空间*/
  {
  return -EFAULT;
  }
  return count;
  }
  /*写函数*/
  static ssize_t test_write(struct file *file, const char *buffer,
  size_t count, loff_t *f_pos)
  {
  if(count 《 0)
  {
  return -EINVAL;
  }
  memset(data, 0, BUFF_SZ);
  count = (BUFF_SZ 》 count)?count:BUFF_SZ;
  if (copy_from_user(data, buffer, count)) /* 将用户缓冲的数据复制到内核空间*/
  {
  return -EFAULT;
  }
  return count;
  }
  /*打开函数*/
  static int test_open(struct inode *inode, struct file *file)
  {
  printk(“This is open operation\n”);
  /* 分配并初始化缓冲区*/
  data = (char*)kmalloc(sizeof(char) * BUFF_SZ, GFP_KERNEL);
  if (!data)
  {
  return -ENOMEM;
  }
  memset(data, 0, BUFF_SZ);
  return 0;
  }
  /*关闭函数*/
  static int test_release(struct inode *inode,struct file *file)
  {
  printk(“This is release operation\n”);
  if (data)
  {
  kfree(data); /* 释放缓冲区*/
  data = NULL; /* 防止出现野指针 */
  }
  return 0;
  }
  /* 创建、初始化字符设备,并且注册到系统*/
  static void test_setup_cdev(struct cdev *dev, int minor,
  struct file_operations *fops)
  {
  int err, devno = MKDEV(major, minor);
  cdev_init(dev, fops);
  dev-》owner = THIS_MODULE;
  dev-》ops = fops;
  err = cdev_add (dev, devno, 1);
  if (err)
  {
  printk (KERN_NOTICE “Error %d adding test %d”, err, minor);
  }
  }
  /* 虚拟设备的file_operations结构 */
  static struct file_operations test_fops =
  {
  .owner = THIS_MODULE,
  .read = test_read,
  .write = test_write,
  .open = test_open,
  .release = test_release,
  };
  /*模块注册入口*/
  int init_module(void)
  {
  int result;
  dev_t dev = MKDEV(major, 0);
  if (major)
  {/* 静态注册一个设备,设备号先前指定好,并设定设备名,用cat /proc/devices来查看 */
  result = register_chrdev_region(dev, 1, TEST_DEVICE_NAME);
  }
  else
  {
  result = alloc_chrdev_region(&dev, 0, 1, TEST_DEVICE_NAME);
  }
  if (result 《 0)
  {
  printk(KERN_WARNING “Test device: unable to get major %d\n”, major);
  return result;
  }
  test_setup_cdev(&test_dev, 0, &test_fops);
  printk(“The major of the test device is %d\n”, major);
  return 0;
  }
  /*卸载模块*/
  void cleanup_module(void)
  {
  cdev_del(&test_dev);
  unregister_chrdev_region(MKDEV(major, 0), 1);
  printk(“Test device uninstalled\n”);
  }
  (2)编译代码。
  虚拟设备的驱动程序的Makefile如下所示:
  ifeq ($(KERNELRELEASE),)
  KERNELDIR ?= /lib/modules/$(shell uname -r)/build /*内核代码编译路径*/
  PWD := $(shell pwd)
  modules:
  $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
  modules_install:
  $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
  clean:
  rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
  .PHONY: modules modules_install clean
  else
  obj-m := test_drv.o /* 将生成的模块为test_drv.ko*/
  endif
下载该资料的人也在下载 下载该资料的人还在阅读
更多 >

评论

查看更多

下载排行

本周

  1. 1TC358743XBG评估板参考手册
  2. 1.36 MB  |  330次下载  |  免费
  3. 2开关电源基础知识
  4. 5.73 MB  |  6次下载  |  免费
  5. 3100W短波放大威廉希尔官方网站 图
  6. 0.05 MB  |  4次下载  |  3 积分
  7. 4嵌入式linux-聊天程序设计
  8. 0.60 MB  |  3次下载  |  免费
  9. 5基于FPGA的光纤通信系统的设计与实现
  10. 0.61 MB  |  2次下载  |  免费
  11. 6基于FPGA的C8051F单片机开发板设计
  12. 0.70 MB  |  2次下载  |  免费
  13. 751单片机窗帘控制器仿真程序
  14. 1.93 MB  |  2次下载  |  免费
  15. 8基于51单片机的RGB调色灯程序仿真
  16. 0.86 MB  |  2次下载  |  免费

本月

  1. 1OrCAD10.5下载OrCAD10.5中文版软件
  2. 0.00 MB  |  234315次下载  |  免费
  3. 2555集成威廉希尔官方网站 应用800例(新编版)
  4. 0.00 MB  |  33564次下载  |  免费
  5. 3接口威廉希尔官方网站 图大全
  6. 未知  |  30323次下载  |  免费
  7. 4开关电源设计实例指南
  8. 未知  |  21548次下载  |  免费
  9. 5电气工程师手册免费下载(新编第二版pdf电子书)
  10. 0.00 MB  |  15349次下载  |  免费
  11. 6数字威廉希尔官方网站 基础pdf(下载)
  12. 未知  |  13750次下载  |  免费
  13. 7电子制作实例集锦 下载
  14. 未知  |  8113次下载  |  免费
  15. 8《LED驱动威廉希尔官方网站 设计》 温德尔著
  16. 0.00 MB  |  6653次下载  |  免费

总榜

  1. 1matlab软件下载入口
  2. 未知  |  935054次下载  |  免费
  3. 2protel99se软件下载(可英文版转中文版)
  4. 78.1 MB  |  537796次下载  |  免费
  5. 3MATLAB 7.1 下载 (含软件介绍)
  6. 未知  |  420026次下载  |  免费
  7. 4OrCAD10.5下载OrCAD10.5中文版软件
  8. 0.00 MB  |  234315次下载  |  免费
  9. 5Altium DXP2002下载入口
  10. 未知  |  233046次下载  |  免费
  11. 6威廉希尔官方网站 仿真软件multisim 10.0免费下载
  12. 340992  |  191185次下载  |  免费
  13. 7十天学会AVR单片机与C语言视频教程 下载
  14. 158M  |  183278次下载  |  免费
  15. 8proe5.0野火版下载(中文版免费下载)
  16. 未知  |  138040次下载  |  免费