电子科技大学微机实验报告 实验5
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验五基于ARM的模块方式驱动程序实验
【实验目的】
1.掌握Linux 系统下设备驱动程序的作用与编写技巧
2.掌握Linux 驱动程序模块加载和卸载的方法
3.了解Linux 内核中的makefile和kconfig文件
【实验内容】
1.基于s3c2440 开发板编写led 驱动程序。
2.将编写好的led驱动加入linux内核中,修改makefile和kconfig文件,配置和编译内核。
3.编写关于led 的测试程序,交叉编译后运行,控制led 灯的亮灭。
【预备知识】
1.了解ARM9处理器结构和Linux 系统结构
2.熟练掌握C语言。
【实验设备和工具】
⏹硬件:ARM嵌入式开发平台,PC机Pentium100 以上。
⏹软件:PC机Linux操作系统+MINICOM+AMRLINUX 开发环境
【实验原理】
⏹linux设备驱动程序
⏹驱动的模块式加载和卸载
⏹编译模块
⏹装载和卸载模块
⏹led 驱动的原理
在本开发板上有八个led指示灯,从下往上分别为LED0-LED7。这八个led灯都是接的芯片上的gpio口(通用功能输入输出口)。在本实验的开发板硬件设计中,当led 灯对应的gpio的电平为低时,led灯被点亮;当led灯对应的gpio的电平为高时,led灯灭。本驱动的作用就是通过设置对应gpio口的电平来控制led 的亮灭。
因为ARM 芯片内的GPIO口都是复用的,即它可以被配置为多种不同的功能,本实验是使用它的普通的I/O口的输出功能,故需要对每个GPIO口进行配置。在内核中已经定义了对GPIO口进行配置的函数,我们只需要调用这些函数就可以完成对GPIO口的配置。
【实验步骤】实验程
序运行效果:
程序会提示:“p leaseenterthe led stat us”
输入与希望显示的led状态对应的ledstatus值(输入十进制值即可),观察led 的显示情况。
例如:
⏹输入数字“3”,对应的二进制数字为00000011
故点亮LED2~LED7
⏹输入数字“4”,对应的二进制数字为00000100
故点亮LED0,LED1,LED3~LED7
【实验结果和程序】
C语言程序:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#defineDEVICE_NAME "s3c2440-led"
static intLedMajor=231;
staticintLedMinor=0;
static charledstatus=0xff;
staticstructclass*s3c2440_class;
staticstructcdev *s3c2440_led_cdev;
/*
******************************************************************************* ************************
** Function name:Update_led()
**Descriptions :update the led status
**Input :NONE
**Output :NONE
******************************************************************************* ************************
*/
staticvoid Update_led(void)
{
if(ledstatus&0x01)
s3c2410_gpio_setpin(S3C2410_GPC7,1); //LED0灭
else
s3c2410_gpio_setpin(S3C2410_GPC7,0); //LED0亮
if(ledstatus&0x02)
s3c2410_gpio_setpin(S3C2410_GPC5,1); //LED1灭
else
s3c2410_gpio_setpin(S3C2410_GPC5,0); //LED1亮
if(ledstatus&0x04)
s3c2410_gpio_setpin(S3C2410_GPH9,1); //LED2灭
else
s3c2410_gpio_setpin(S3C2410_GPH9,0); //LED2亮
if(ledstatus&0x08)
s3c2410_gpio_setpin(S3C2410_GPB4,1); //LED3灭
else
s3c2410_gpio_setpin(S3C2410_GPB4,0); //LED3亮
if(ledstatus&0x10)
s3c2410_gpio_setpin(S3C2410_GPG5,1); //LED4灭
else
s3c2410_gpio_setpin(S3C2410_GPG5,0); //LED4亮
if(ledstatus&0x20)
s3c2410_gpio_setpin(S3C2410_GPG6,1); //LED5灭
else
s3c2410_gpio_setpin(S3C2410_GPG6,0); //LED5亮
if(ledstatus&0x40)