新聞中心

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

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

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

本文引用地址:http://2s4d.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,

};

/*模塊注冊(cè)入口*/

intinit_module(void)

{

intresult;

dev_tdev=MKDEV(major,0);

if(major)

{/*靜態(tài)注冊(cè)一個(gè)設(shè)備,設(shè)備號(hào)先前指定好,并設(shè)定設(shè)備名,用cat/proc/devices來(lái)查看*/

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ū)動(dòng)程序的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ū)動(dòng)模塊的加載和卸載。

加載腳本test_drv_load如下所示:

#!/bin/sh

#驅(qū)動(dòng)模塊名稱

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ū)動(dòng)模塊

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

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

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ū)動(dòng)模塊

/sbin/rmmod$module$*||exit1

#刪除設(shè)備文件

rm-f/dev/${device}

exit0

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

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




評(píng)論


相關(guān)推薦

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

關(guān)閉