色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 嵌入式Linux設(shè)備驅(qū)動開發(fā)之:實(shí)驗(yàn)內(nèi)容——test驅(qū)動

          嵌入式Linux設(shè)備驅(qū)動開發(fā)之:實(shí)驗(yàn)內(nèi)容——test驅(qū)動

          作者: 時(shí)間:2013-09-13 來源:網(wǎng)絡(luò) 收藏

          本文引用地址:http://cafeforensic.com/article/257106.htm

          /*虛擬設(shè)備的file_operations結(jié)構(gòu)*/

          staticstructfile_operationstest_fops=

          {

          .owner=THIS_MODULE,

          .read=test_read,

          .write=test_write,

          .open=test_open,

          .release=test_release,

          };

          /*模塊注冊入口*/

          intinit_module(void)

          {

          intresult;

          dev_tdev=MKDEV(major,0);

          if(major)

          {/*靜態(tài)注冊一個(gè)設(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(result0)

          {

          printk(KERN_WARNINGTestdevice:unabletogetmajor%dn,major);

          returnresult;

          }

          test_setup_cdev(test_dev,0,test_fops);

          printk(Themajorofthetestdeviceis%dn,major);

          return0;

          }

          /*卸載模塊*/

          voidcleanup_module(void)

          {

          cdev_del(test_dev);

          unregister_chrdev_region(MKDEV(major,0),1);

          printk(Testdeviceuninstalledn);

          }

          (2)編譯代碼。

          虛擬設(shè)備的驅(qū)動程序的Makefile如下所示:

          ifeq($(KERNELRELEASE),)

          KERNELDIR?=/lib/modules/$(shelluname-r)/build/*內(nèi)核代碼編譯路徑*/

          PWD:=$(shellpwd)

          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:modulesmodules_installclean

          else

          obj-m:=test_drv.o/*將生成的模塊為test_drv.ko*/

          endif

          (3)加載和卸載模塊。

          通過下面兩個(gè)腳本代碼分別實(shí)現(xiàn)驅(qū)動模塊的加載和卸載。

          加載腳本test_drv_load如下所示:

          #!/bin/sh

          #驅(qū)動模塊名稱

          module=test_drv

          #設(shè)備名稱。在/proc/devices中出現(xiàn)

          device=test_dev

          #設(shè)備文件的屬性

          mode=664

          group=david

          #刪除已存在的設(shè)備節(jié)點(diǎn)

          rm-f/dev/${device}

          #加載驅(qū)動模塊

          /sbin/insmod-f./$module.ko$*||exit1

          #查到創(chuàng)建設(shè)備的主設(shè)備號

          major=`cat/proc/devices|awk\$2==$device{print\$1}`

          #創(chuàng)建設(shè)備文件節(jié)點(diǎn)

          mknod/dev/${device}c$major0

          #設(shè)置設(shè)備文件屬性

          chgrp$group/dev/${device}

          chmod$mode/dev/${device}

          卸載腳本test_drv_unload如下所示:

          #!/bin/sh

          module=test_drv

          device=test_dev

          #卸載驅(qū)動模塊

          /sbin/rmmod$module$*||exit1

          #刪除設(shè)備文件

          rm-f/dev/${device}

          exit0

          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

          linux相關(guān)文章:linux教程




          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉