chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

電子發(fā)燒友App

硬聲App

掃碼添加小助手

加入工程師交流群

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

完善資料讓更多小伙伴認(rèn)識你,還能領(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
Linux
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1冷柜-電氣控制系統(tǒng)講解
  2. 13.68 MB  |  4次下載  |  10 積分
  3. 2安川A1000變頻器中文版說明書
  4. 20.16 MB  |  3次下載  |  3 積分
  5. 3直流電路的組成和基本定律
  6. 1.67 MB   |  2次下載  |  免費
  7. 4丹佛斯2800系列變頻器說明書
  8. 8.00 MB  |  1次下載  |  5 積分
  9. 5PC8011同步開關(guān)型降壓3.5A單節(jié)鋰電池充電管理電路技術(shù)手冊
  10. 0.74 MB   |  1次下載  |  免費
  11. 6ES7243E+ES8311音頻錄制與播放電路資料
  12. 0.06 MB   |  1次下載  |  5 積分
  13. 7SDM02 激光測距模塊產(chǎn)品手冊
  14. 0.43 MB   |  1次下載  |  免費
  15. 8SDFM 激光測距模塊模組手冊
  16. 0.54 MB   |  1次下載  |  免費

本月

  1. 1CH341編程器軟件NeoProgrammer_2.2.0.10
  2. 20.47 MB   |  170次下載  |  1 積分
  3. 22025智能家居傳感器市場分析及創(chuàng)新應(yīng)用
  4. 3.11 MB  |  43次下載  |  免費
  5. 3RV1126B系列開發(fā)板產(chǎn)品資料
  6. 4.19 MB  |  18次下載  |  免費
  7. 4CH341編程軟件下載
  8. 2.50 MB   |  16次下載  |  5 積分
  9. 5全志系列-米爾基于T153核心板開發(fā)板 四核異構(gòu)、3路千兆網(wǎng),賦能多元化工業(yè)場景
  10. 3.05 MB  |  12次下載  |  免費
  11. 6【開源】60余套STM32單片機、嵌入式Linux、物聯(lián)網(wǎng)、人工智能項目案例及入門學(xué)習(xí)資源包
  12. 10.55 MB  |  8次下載  |  免費
  13. 7冷柜-電氣控制系統(tǒng)講解
  14. 13.68 MB  |  4次下載  |  10 積分
  15. 8特斯拉MODEL S車載充電機主電路回路原理圖
  16. 0.81 MB   |  4次下載  |  3 積分

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935137次下載  |  10 積分
  3. 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計
  4. 1.48MB  |  420064次下載  |  10 積分
  5. 3Altium DXP2002下載入口
  6. 未知  |  233094次下載  |  10 積分
  7. 4電路仿真軟件multisim 10.0免費下載
  8. 340992  |  191448次下載  |  10 積分
  9. 5十天學(xué)會AVR單片機與C語言視頻教程 下載
  10. 158M  |  183356次下載  |  10 積分
  11. 6labview8.5下載
  12. 未知  |  81604次下載  |  10 積分
  13. 7Keil工具MDK-Arm免費下載
  14. 0.02 MB  |  73824次下載  |  10 積分
  15. 8LabVIEW 8.6下載
  16. 未知  |  65991次下載  |  10 積分