-
P.
1
专业:测控技术与仪器
实验名称:
姓名:
学号:
姓名:颜睿
学号:
3130103850
日期:
2018.3.28
实验报告
地点:创客空间
课程名称:
嵌入式系统设计
指导老师:马永昌
成绩:
________________
< br>实验名称:实验五
Linux
字符驱动开发
实验类型:验证型
同组学生姓名:
__
孙凡原
_______
一、实验目的和要求(必填)
二、实验内容和原理(必填)
三、主要仪器设备(必填)
四、操作方法和实验步骤
五、实验数据记录和处理
六、实验结果与分析(必填)
七、讨论、心得
一、实验目的和要求
1.
掌握字符设备驱动程序的基本结构和开发方法
2.
掌握用户空间调用设备驱动的方法
二、实验内容和原理
1.
编写字符驱动实现按键驱动,控制
LED
2.
编写应用程序调用驱动
三、主要仪器设备
树莓派、
PC
机
四、操作方法和实验步骤
1
编译运行所给样例驱动程序,验证实验现象,熟悉驱动开发过程。编译
时注意修改
Makefile
中的相关路
径
1
)
将编译得到的可执行文件
demo
和模块
放入树莓派
SD
卡
< br>
2
)将树莓派
SD
卡中的内核镜像文件
替
换为第二次实验所编译得到的内核镜像
3
)运行树莓派,用串口或
SSH
登录到树莓派,使用
insmod
命令加载模块
4
)将
< br>8
按键模块和
LED
灯接到相应
的
GPIO
口,运行
demo
观察现象
2
修改样例
驱动程序,实现对超声波传感器的控制,并编写相应的应用程序读取超声波传感器的数据,显
示距离。
五、实验数据记录和处理
1.
超声波传感器驱动
demo.c
#include
#include
#include
#include
#include
#include
#include
#include
装
订
线
P.
2
实验名称:
姓名:
学号:
#include
#include
#include
#define DRIVER_NAME
#define
DEVICE_NAME
static dev_t
demo_devno; //
设备号
static struct class *demo_class;
static struct cdev demo_dev;
static struct
gpio_config{
int trig_num;
int echo_num;
long time;
}config;
//
结构体用于用户态和内核态之间传递数据
static int flag
= 0;
struct timeval tv1;
struct timeval tv2;
//open
函数,应用程序调用
o
pen
系统调用时会调用本函数
static int demo_open(struct inode
*inode,struct file *filp)
{
printk(KERN_INFO
return 0;
}
//release
函数,应用程
序调用
close
系统调用时会调用本函数
static int demo_release(struct inode
*inode, struct file *filp)
{
if(flag){
gpio_free(_num);
gpio_free(_num);
flag = 0;
}
printk(KERN_INFO
return 0;
}
//ioctl
控制函数,应用程序调用
ioctl
系统调用时会调用本函数
装
订
线
P.
3
实验名称:
姓名:
学号:
static long demo_ioctl(struct file
*filp,unsigned int cmd,unsigned long arg)
{
int err = 0;
long start;
long stop;
switch(cmd){
case 0://0
表示命令号,一般都用宏定义来控制
//GPIO
口进行初始化
{
if(copy_from_user(&config,(void
*)arg,sizeof(struct
gpio_config))){
//
从用户程序中获取配
置数据
printk(KERN_ERR
return -EFAULT;
}
printk(KERN_INFO
%d]:
Get
trig
gpio
num:
%d
and
echo
gpio
num:
%dn
err =
gpio_request_one(_num,GPIOF_IN,
if(err){
printk(KERN_ERR
return -EFAULT;
}
err
= gpio_request_one(_num,GPIOF_OUT_INIT_LOW,
if(err){
printk(KERN_ERR
gpio_free(_num);
}
flag = 1;
break;
}
case 1:
{
gpi
o_direction_output(_num,0);
//
设置
GPIO
口方向
gpio_direction_input(_num);
gpi
o_set_value(_num,0)
;//
根据传感器时
序图进行操作
udelay(10);
gpio_set_value(_num,1);
udelay(20);
gpio_set_value(_num,0);
while(gpio_get_value(_num)==0)
{}
do_gettimeofday(&tv1);
//
获取声波开始时间
while(gpio_get_value(_num)==1)
{}
装
订
线
P.
4
实验名称:
姓名:
学号:
do_
gettimeofday(&tv2);
//
获取声波返回时
间
start=_sec*1000000+_usec;
p>
//
数据转换为微妙
stop= _sec*1000000+_usec;
=stop-start;
if(copy_to_user((void
*)arg,&config,sizeof(struct
gpio_config))){printk(KERN_ERR
%d]
:
copy
to user
failed
!n
//
数据由内核传送至用户
return -EFAULT;
}
flag=1;
break;
}
default:
printk(KERN_INFO
break;
}
return 0;
}
static struct
file_operations demo_fops = {
.owner = THIS_MODULE,
.open
=
demo_open,
.release
= demo_release,
.unlocked_ioctl = demo_ioctl,
};
static int __init demo_init(void)
{
int err;
printk(KERN_INFO
err =
alloc_chrdev_region(&demo_devno,0,1,DRIVER_NAME);
if(err < 0){
goto err;
}
cdev_init(&demo_dev,&demo_fops);
err =
cdev_add(&demo_dev,demo_devno,1);
if(err < 0)
装
订
线
-
-
-
-
-
-
-
-
-
上一篇:法语词汇-工具、机械法语翻译
下一篇:麟龙普及版使用说明书