精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

電子發燒友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次下載  |  免費