- 1、本文档共6页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
嵌入式实验六
实验六 嵌入式设备驱动程序设计
班级:计算机14-1 学号:140344123139 姓名:23223 成绩:
实验目的
1. 掌握设备驱动程序的基本框架结构;
2. 掌握设备进入点的创建、查看、删除方法;
3. 掌握设备驱动程序模块的加载、查看、卸载方法;
4. 编写简单字符设备驱动程序,并测试运行。
实验内容
编写一个字符设备驱动程序,可实现字符串的读、写操作,再编写一个调用该设备驱动程序功能接口(打开、关闭、读、写)的用户程序,测试该驱动程序是否能正常运行。
对上述驱动程序进行修改,实现设备的互斥访问(设备上锁)。
(1)
(2)模块
(3)
(4)
(5) 程序代码如下
.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 1024
static int my_open(struct inode *inode, struct file *file);
static int my_release(struct inode *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 message[MAX_SIZE] = -------congratulations--------!;
static int device_num = 0;//设备号
static int counter = 0;//计数用
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创建时,系统一个可以用的设备号创建模块 */
ret = register_chrdev(0, devName, pStruct);
if (ret 0)
{
printk(regist failure!\n);
return -1;
}
else
{
printk(the device has been registered!\n);
device_num = ret;
printk(1the virtual devices major number %d.\n, device_num);
printk(1Or you can see it by using\n);
printk(1------more /proc/devices-------\n);
printk(1To talk to the driver,create a dev file with\n);
printk(1------mknod /dev/myDevice c %d 0-------\n, device_num);
printk(1Use \rmmode\ to remove the module\n);
return 0;
}
}
/* 注销模块,函数名很特殊 */
void cleanup_module()
{
unregister_chrdev(device_num, devName);
printk(unregister it success!\n);
}
static int my_open(struct inode *inode, struct file *file)
{
if(m
文档评论(0)