嵌入式实验六

上传人:ni****g 文档编号:563443422 上传时间:2024-02-16 格式:DOCX 页数:6 大小:31.92KB
返回 下载 相关 举报
嵌入式实验六_第1页
第1页 / 共6页
嵌入式实验六_第2页
第2页 / 共6页
嵌入式实验六_第3页
第3页 / 共6页
嵌入式实验六_第4页
第4页 / 共6页
嵌入式实验六_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《嵌入式实验六》由会员分享,可在线阅读,更多相关《嵌入式实验六(6页珍藏版)》请在金锄头文库上搜索。

1、实验六 嵌入式设备驱动程序设计班级:计算机 14-1 学号:140344123139 姓名:23223 成绩: 一、实验目的1. 掌握设备驱动程序的基本框架结构;2. 掌握设备进入点的创建、查看、删除方法;3. 掌握设备驱动程序模块的加载、查看、卸载方法;4. 编写简单字符设备驱动程序,并测试运行。二、实验内容1. 编写一个字符设备驱动程序,可实现字符串的读、写操作,再编写一个调用该设备 驱动程序功能接口(打开、关闭、读、写)的用户程序,测试该驱动程序是否能正常 运行。2. 对上述驱动程序进行修改,实现设备的互斥访问(设备上锁)。(1)编译rootgusername - vitual-rnad

2、hine/home/E弼 rakemake -C /lib/nodules/3.5.0-23-generic/build M=/home/ny modules makel:正在进入目录 /usr/src/nJX-headers-3*5.9-23-genericCC M /home/my/devDrv.oBuilding modules, stage 2.MODPOST 1 nodulesCC/home/my/devDrv.rod.oLD M /hoHe/ny/devDrv.komakel:正在离弃目录 /usr/src/linux-headers-3.5.0-23-generic1(2)装载模

3、块rootusername-virtual-machine:/home/my# insnod devDrv.ko rootusername-virtual-machine:/home/ny# LsmodModuleSizeUseddevDrv127200nls_utf8125581isofs403971vmhgfs550461vsock476870acpiphp24232曲c f丼El_0_a3)创建设备进入点rootgusernane-virtual.machine:/home/my# cat /proc/devtces Character devices:1 Hen4 /dev/vc/94

4、 tty4 ttyS5 /dev/tty5 /dev/console5 /dev/ptmx5 ttyprtntk6 Ip7 vcs10 nisc13 input14 sound21 sg29 fb99 ppdev108 ppp116 alsa128 ptm136 pts180 usb* 189 usb device216 rfcomm226 drn259 nyDevicerootgusername-virtual-machine:/home/my# mknod /dev/myDevtce c 259 0roo已iirtual-machine:/ home/my# l /devagpgartLo

5、op4ram8tty22tty55ttyS29alarmLoop5ram9tty23tty56ttySSashmenloopfirandomtty24tty57ttySSOautofsloop7rfktllttv25tty58ttyS31bin derloop-controlrtctty26tty59ttyS4blockIpOrtcOtty27tty6ttySSbsgmappersdatty28tty60ttyS6btrfs-controlmcelogsdaltty29tty61ttyS7busmemsda2tty3tty62ttySScd roRmidisda5tty30tty63ttySS

6、cd rwnyDevlcesda6tty31tty7uinputcharnetsgOtty32ttySurandomconsolenetwork_latenuysgitty33tty9vcs4)测试驱动程序Please input the device1s name you wanna to use :myDevice The device ias inited with a t:ing : How are you!Please Input a string :How are you!The string in the device now is : How are you(5) 程序代码如下

7、 devDrv.c#include linux/kernel.h#include linux/module.h#include linux/fs.h#include linux/init.h#include linux/types.h#include linux/errno.h#include linux/uaccess.h#include linux/kdev_t.h#define MAX_SIZE 1024static int my_open(struct inode *inode, struct file *file);static int my_release(struct inode

8、 *inode, struct file *file);static ssize_t my_read(struct file *file, char _user *user, size_t t, loff_t *f);static ssize_t my_write(struct file *file, const char _user *user, size_t t, loff_t *f);static char messageMAX_SIZE = congratulations!;static int device_num = 0;/设备号static int counter = 0;/计数

9、用static int mutex = 0;/互斥用static char* devName = myDevice;/设备名struct file_operations pStruct = open:my_open, release:my_release, read:my_read, write:my_write, ;/* 注册模块 */int init_module()int ret;/* 函数中第一个参数是告诉系统,新注册的设备的主设备号由系统分配 * 第二个参数是新设备注册时的设备名字,* 第三个参数是指向 file_operations 的指针,* 当用设备号为 0 创建时,系统一个可

10、以用的设备号创建模块 */ ret = register_chrdev(0, devName, &pStruct);if (ret 0)printk(regist failure!n);return -1;elseprintk(the device has been registered!n); device_num = ret;printk(the virtual devices major number %d.n, device_num); printk(Or you can see it by usingn);printk(more /proc/devicesn);printk(To t

11、alk to the driver,create a dev file withn);printk(mknod /dev/myDevice c %d 0n, device_num);printk(Use rmmode to remove the modulen);return 0;/* 注销模块,函数名很特殊 */void cleanup_module()unregister_chrdev(device_num, devName); printk(unregister it success!n);static int my_open(struct inode *inode, struct fi

12、le *file)if(mutex)return -EBUSY;mutex = 1;/上锁printk(main device : %dn, MAJOR(inode-i_rdev); printk(slave device : %dn, MINOR(inode-i_rdev); printk(%d times to call the devicen, +counter); try_module_get(THIS_MODULE);return 0;/* 每次使用完后会 release */static int my_release(struct inode *inode, struct file

13、 *file)printk(Device released!n); module_put(THIS_MODULE);mutex = 0;/开锁return 0;static ssize_t my_read(struct file *file, char _user *user, size_t t, loff_t *f)if(copy_to_user(user,message,sizeof(message)return -EFAULT;return sizeof(message);static ssize_t my_write(struct file *file, const char _use

14、r *user, size_t t, loff_t *f) if(copy_from_user(message,user,sizeof(message)return -EFAULT;return sizeof(message);测试程序test.c#include #include #include #include #include #include #include #define MAX_SIZE 1024int main(void)int fd;char bufMAX_SIZE;char getMAX_SIZE;char devName20, dir50 = /dev/; system(ls /dev/)

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号