电子科技大学微机实验报告 实验5

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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)

相关文档
最新文档