色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

電子發燒友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次下載  |  免費
主站蜘蛛池模板: 精品久久久久久久高清| 国家产午夜精品无人区| 中文字幕在线免费视频| 亚洲精品资源网在线观看| 特黄大片aaaaa毛片| 同时和两老师双飞| 兽交白浆喷水高潮| 色狠狠色综合吹潮| 午夜勾魂曲| 亚洲三级在线中文字幕| 亚洲综合国产精品| 中文视频在线| h版动漫在线播放的网站| WINDOWSCHANNEL老太| 打扑克床上视频不用下载免费观看 | 日韩欧美一级| 亚洲国产精品久久人人爱| 国产人妻人伦精品98| 亚欧视频在线观看| 花蝴蝶高清影视视频在线播放| 亚洲高清在线精品一区| 极品少妇小泬50PTHEPON| 亚洲在线2018最新无码| 久久香蕉国产线看观看首页| 中文字幕成人在线观看| YELLOW视频直播在线观看高清| 国产精品久久久久永久免费看| 极品少妇高潮啪啪无码吴梦| 免费毛片在线播放| 午夜在线播放免费人成无| 中文字幕在线永久| 福利视频一二三在线观看| 久久99国产精品蜜臀AV| 国产亚洲日韩欧美视频| 91精品国产91热久久p| 欧洲老妇人bb| 含羞草在线免费观看| 99re久久热最新地址一| 午夜国产福利| 欧美日韩1区| 九九精品国产亚洲A片无码|