<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 嵌入式Linux設備驅動(dòng)開(kāi)發(fā)之:實(shí)驗內容——test驅動(dòng)

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

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

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

11.7實(shí)驗內容——

1.實(shí)驗目的

該實(shí)驗是編寫(xiě)最簡(jiǎn)單的字符驅動(dòng)程序,這里的設備也就是一段內存,實(shí)現簡(jiǎn)單的讀寫(xiě)功能,并列出常用格式的Makefile以及驅動(dòng)的加載和卸載腳本。讀者可以熟悉字符的整個(gè)編寫(xiě)流程。

2.實(shí)驗內容

該實(shí)驗要求實(shí)現對虛擬設備(一段內存)的打開(kāi)、關(guān)閉、讀寫(xiě)的操作,并要通過(guò)編寫(xiě)測試程序來(lái)測試虛擬設備及其驅動(dòng)運行是否正常。

3.實(shí)驗步驟

(1)編寫(xiě)代碼。

這個(gè)簡(jiǎn)單的驅動(dòng)程序的源代碼如下所示:

/*test_drv.c*/

#includelinux/module.h>

#includelinux/init.h>

#includelinux/fs.h>

#includelinux/kernel.h>

#includelinux/slab.h>

#includelinux/types.h>

#includelinux/errno.h>

#includelinux/cdev.h>

#includeasm/uaccess.h>

#defineTEST_DEVICE_NAMEtest_dev

#defineBUFF_SZ1024

/*全局變量*/

staticstructcdevtest_dev;

unsignedintmajor=0;

staticchar*data=NULL;

/*讀函數*/

staticssize_ttest_read(structfile*file,

char*buf,size_tcount,loff_t*f_pos)

{

intlen;

if(count0)

{

return-EINVAL;

}

len=strlen(data);

count=(len>count)?count:len;

if(copy_to_user(buf,data,count))/*將內核緩沖的數據拷貝到用戶(hù)空間*/

{

return-EFAULT;

}

returncount;

}

/*寫(xiě)函數*/

staticssize_ttest_write(structfile*file,constchar*buffer,

size_tcount,loff_t*f_pos)

{

if(count0)

{

return-EINVAL;

}

memset(data,0,BUFF_SZ);

count=(BUFF_SZ>count)?count:BUFF_SZ;

if(copy_from_user(data,buffer,count))/*將用戶(hù)緩沖的數據復制到內核空間*/

{

return-EFAULT;

}

returncount;

}

/*打開(kāi)函數*/

staticinttest_open(structinode*inode,structfile*file)

{

printk(Thisisopenoperationn);

/*分配并初始化緩沖區*/

data=(char*)kmalloc(sizeof(char)*BUFF_SZ,GFP_KERNEL);

if(!data)

{

return-ENOMEM;

}

memset(data,0,BUFF_SZ);

return0;

}

/*關(guān)閉函數*/

staticinttest_release(structinode*inode,structfile*file)

{

printk(Thisisreleaseoperationn);

if(data)

{

kfree(data);/*釋放緩沖區*/

data=NULL;/*防止出現野指針*/

}

return0;

}

/*創(chuàng )建、初始化字符設備,并且注冊到系統*/

staticvoidtest_setup_cdev(structcdev*dev,intminor,

structfile_operations*fops)

{

interr,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_NOTICEError%daddingtest%d,err,minor);

}

}

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)

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



上一頁(yè) 1 2 3 4 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>