《嵌入式Linux下LED报警灯驱动设计及编程》实验报告学生姓名:____________________学号:________________专业班级:_______指导教师:_____________________完成时间:______________实验 5 嵌入式Linux 下LED 报警灯驱动设计及编程一.实验目的理解驱动本质,掌握嵌入式 Linux 系统下驱动开发相关知识,包括端口寄存器访问、接口函数编写、和文件系统挂接、注册及相关应用编程等知识点。
二.实验内容实验 5.1 嵌入式 Linux 下 LED 报警灯驱动设计及跑马灯应用编程实验 5.2 添加看门狗功能的跑马灯应用编程三.预备知识Linux 使用、驱动相关知识等四.实验设备及工具(包括软件调试工具)硬件: ARM 嵌入式开发平台、 PC 机 Pentium100 以上、串口线。
软件: WinXP 或 UBUNTU 开发环境。
五.实验 5.1 步骤5.1 前期准备( 1 )看懂相关硬件电路图【见 S3C6410 实验箱电路图 -底板 .pdf 】,以 LED 报警灯为例进行设计打开 PDF 硬件电路图,明确 LED 灯用到的多个 GPIO 及其控制器本实验电路 LED1 ------- GPM0LED2 ---- GPM1LED3 ---- GPM2LED4 ---- GPM3LED5 ---- GPM4LED6 ---- GPM5LED7 ---- GPQ0LED8 ---- GPQ1得出结论: 8 个 LED 灯使用到的硬件控制器分别为 GPM 和 GPQ 两个硬件控制器( 2)在芯片手册中找到相应的硬件控制器部分,重心是看懂端口寄存器本实验要求完成 LED 流水灯设计,所以需要设置控制器中端口寄存器:GPMCON ----- 设置相应位为输出口GPMDAT ----- 控制相应位输出高电平 ----- 点亮 LED 灯输出低电平 -- 熄灭 LED 灯(3) linux 内核中相关寄存器读写函数读寄存器函数readl( 寄存器虚地址 );写寄存器函数writel( 值(无符号整型 ), 寄存器虚地址 );具体端口寄存器地址宏定 /opt/FriendlyARM/linux-2.6.38/arch/arm/mach-s3c64xx/include/mach 的文件中,如端口 M 寄存器在 gpio-bank-m.h 文件中有定义:义在文件夹下#define S3C64XX_GPMCON (S3C64XX_GPM_BASE + 0x00) #define S3C64XX_GPMDAT (S3C64XX_GPM_BASE + 0x04) 5.2 LED 报警灯驱动设计 s3c6410_leddrv.c(1)头文件包含和相关宏定义#include <linux/miscdevice.h>#include <linux/delay.h>#include <asm/irq.h>//#include <mach/regs-gpio.h>#include <mach/hardware.h>#include <linux/kernel.h>#include <linux/module.h>#include <linux/init.h>#include <linux/mm.h>#include <linux/fs.h>#include <linux/types.h>#include <linux/delay.h>#include <linux/moduleparam.h>#include <linux/slab.h>#include <linux/errno.h>#include <linux/ioctl.h>#include <linux/cdev.h>#include <linux/string.h>#include <linux/list.h>#include <linux/pci.h>#include <asm/uaccess.h>#include <asm/atomic.h>#include <asm/unistd.h>#include <mach/map.h>#include <mach/regs-clock.h> #include <mach/regs-gpio.h> #include <plat/gpio-cfg.h>#include <mach/gpio-bank-e.h> #include <mach/gpio-bank-k.h> #define ON 1#define OFF 0(2)编写驱动接口函数/*功能:配置 GPM0~5/GPQ0~1 为输出口参数:无返回值:无*/void LedConfig(void){// 读出端口 M 控制寄存器( S3C64XX_GPMCON )值,修改并写回相关端口寄存器//add your codeunsigned int tmp;tmp =readl(S3C64XX_GPMCON);tmp &= ~((0XF<<0X0)|(0XF<<0X4)|(0XF<<0X8)|(0XF<<0XC)|(0XF<<0X10)|(0XF<<0X14));tmp |= (0X1<<0X0)|(0X1<<0X4)|(0X1<<0X8)|(0X1<<0XC)|(0X1<<0X10)|(0X1<<0X14);writel(tmp,S3C64XX_GPMCON);}/*功能:点亮第i个LED灯参数:无符号整型变量iLed,表示第i个LED灯返回值:无*/void iLed On(un sig ned int iLed){//读出端口 M数据寄存器(S3C64XX_GPKDAT)值,修改并写回相关端口寄存器//add your code hereunsigned int tmp;tmp =readl(S3C64XX GPMDAT);tmp &= ~((0X1<<0X0)|(0X1<<0X1)|(0X1<<0X2)|(0X1<<0X3)|(0X1<<0X4)|(0X1<<0X5));writel(tmp,S3C64XX GPMDAT);/*功能:熄灭第i个LED灯参数:无符号整型变量 iLed,表示第i个LED灯返回值:无*/void iLedOff (un sig ned in t iLed){//读出端口 M数据寄存器(S3C64XX_GPKDAT)值,修改并写回相关端口寄存器//add your code hereun sig ned int tmp;tmp =readl(S3C64XX GPMDAT);tmp &= ~((0X1<<0X0)|(0X1<<0X1)|(0X1<<0X2)|(0X1<<0X3)|(0X1<<0X4)|(0X1<<0X5));tmp |= (0X1<<0X0)|(0X1<<0X1)|(0X1<<0X2)|(0X1<<0X3)|(0X1<<0X4)|(0X1<<0X5);writel(tmp,S3C64XX GPMDAT);}(2)和文件系统接口对接static int s3c6410_led_open(struct inode *inode, struct file *filp)//把之前的端口 K控制寄存器值读出来保存起来//调用LedConfig 函数,把GPIO 口配置成输出口//add your codeold gpmco n val=readl(S3C64XX GPMCON);LedC on fig();ren turn 0;}static int s3c6410_led _release(struct inode *ino de, struct file *filp){//恢复之前的端口 K控制寄存器初始值//add your codewritel(old gpmcon val,S3C64XX GPMCON);ren turn 0;}static long s3c6410_led _ioctl(struct file *filp, unsigned int cmd, unsigned long arg){switch(cmd)case ON://点亮所有LED灯//add your codei LedO n();break;case OFF:〃熄灭所有LED灯//add your code iLedOff();break;}}struct file_operati ons led_fops=.release= _ s3c6410_led_release.unlocked_ioctl= _ s3c6410 led ioctl };(3)添加模块标记代码static int __in it led_dev_i nit(void)int ret;prin tk (DEVICE_NAME"\ti ni tialized'n");return ret;static void __exit l ed_dev_exit(void){//注销设备 //add your codeun register chrdev(leddevNo,"leddev");.module_i nit(led_dev_i nit);module_exit(led_dev_exit);MODULE_LICENSE("GPL");MODULE_AUTHOR("lic@njupt.");5.2编写Makefile并加载到内核(1)编写Makefile如下:obj-m:= ______ leddrv.o_ __________________all:make -C /opt/FriendlyARM/linux-2.6.38____ SUBDIRS=$(shell pwd)modulesclea n:rm -rf *.ko *.o(3)编译使用命令编译:_____ #make ________________________________编译完成后生成驱动文件 ______leddrv.ko_________________(3)加载驱动使用命令进行驱动加载#in smod leddrv.ko. 。