電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>嵌入式開發(fā)>嵌入式Linux設(shè)備驅(qū)動開發(fā)之test驅(qū)動實驗內(nèi)容解析

嵌入式Linux設(shè)備驅(qū)動開發(fā)之test驅(qū)動實驗內(nèi)容解析

2017-10-18 | rar | 0.4 MB | 次下載 | 1積分

資料介紹

11.7 實驗內(nèi)容——test驅(qū)動
  1.實驗?zāi)康?br />   該實驗是編寫最簡單的字符驅(qū)動程序,這里的設(shè)備也就是一段內(nèi)存,實現(xiàn)簡單的讀寫功能,并列出常用格式的Makefile以及驅(qū)動的加載和卸載腳本。讀者可以熟悉字符設(shè)備驅(qū)動的整個編寫流程。
  2.實驗內(nèi)容
  該實驗要求實現(xiàn)對虛擬設(shè)備(一段內(nèi)存)的打開、關(guān)閉、讀寫的操作,并要通過編寫測試程序來測試虛擬設(shè)備及其驅(qū)動運行是否正常。
  3.實驗步驟
  (1)編寫代碼。
  這個簡單的驅(qū)動程序的源代碼如下所示:
  /* 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;
  /*讀函數(shù)*/
  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)) /* 將內(nèi)核緩沖的數(shù)據(jù)拷貝到用戶空間*/
  {
  return -EFAULT;
  }
  return count;
  }
  /*寫函數(shù)*/
  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)) /* 將用戶緩沖的數(shù)據(jù)復(fù)制到內(nèi)核空間*/
  {
  return -EFAULT;
  }
  return count;
  }
  /*打開函數(shù)*/
  static int test_open(struct inode *inode, struct file *file)
  {
  printk(“This is open operation\n”);
  /* 分配并初始化緩沖區(qū)*/
  data = (char*)kmalloc(sizeof(char) * BUFF_SZ, GFP_KERNEL);
  if (!data)
  {
  return -ENOMEM;
  }
  memset(data, 0, BUFF_SZ);
  return 0;
  }
  /*關(guān)閉函數(shù)*/
  static int test_release(struct inode *inode,struct file *file)
  {
  printk(“This is release operation\n”);
  if (data)
  {
  kfree(data); /* 釋放緩沖區(qū)*/
  data = NULL; /* 防止出現(xiàn)野指針 */
  }
  return 0;
  }
  /* 創(chuàng)建、初始化字符設(shè)備,并且注冊到系統(tǒng)*/
  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);
  }
  }
  /* 虛擬設(shè)備的file_operations結(jié)構(gòu) */
  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)
  {/* 靜態(tài)注冊一個設(shè)備,設(shè)備號先前指定好,并設(shè)定設(shè)備名,用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”);
  }
 ?。?)編譯代碼。
  虛擬設(shè)備的驅(qū)動程序的Makefile如下所示:
  ifeq ($(KERNELRELEASE),)
  KERNELDIR ?= /lib/modules/$(shell uname -r)/build /*內(nèi)核代碼編譯路徑*/
  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開關(guān)電源基礎(chǔ)知識
  4. 5.73 MB  |  6次下載  |  免費
  5. 3100W短波放大電路圖
  6. 0.05 MB  |  4次下載  |  3 積分
  7. 4嵌入式linux-聊天程序設(shè)計
  8. 0.60 MB  |  3次下載  |  免費
  9. 5基于FPGA的光纖通信系統(tǒng)的設(shè)計與實現(xiàn)
  10. 0.61 MB  |  2次下載  |  免費
  11. 6基于FPGA的C8051F單片機開發(fā)板設(shè)計
  12. 0.70 MB  |  2次下載  |  免費
  13. 751單片機窗簾控制器仿真程序
  14. 1.93 MB  |  2次下載  |  免費
  15. 8基于51單片機的RGB調(diào)色燈程序仿真
  16. 0.86 MB  |  2次下載  |  免費

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費
  3. 2555集成電路應(yīng)用800例(新編版)
  4. 0.00 MB  |  33564次下載  |  免費
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費
  7. 4開關(guān)電源設(shè)計實例指南
  8. 未知  |  21548次下載  |  免費
  9. 5電氣工程師手冊免費下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費
  11. 6數(shù)字電路基礎(chǔ)pdf(下載)
  12. 未知  |  13750次下載  |  免費
  13. 7電子制作實例集錦 下載
  14. 未知  |  8113次下載  |  免費
  15. 8《LED驅(qū)動電路設(shè)計》 溫德爾著
  16. 0.00 MB  |  6653次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  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十天學(xué)會AVR單片機與C語言視頻教程 下載
  14. 158M  |  183278次下載  |  免費
  15. 8proe5.0野火版下載(中文版免費下載)
  16. 未知  |  138040次下載  |  免費