嵌入式Linux下LED报警灯驱动设计及编程(共12页).doc
《嵌入式Linux下LED报警灯驱动设计及编程(共12页).doc》由会员分享,可在线阅读,更多相关《嵌入式Linux下LED报警灯驱动设计及编程(共12页).doc(12页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上嵌入式Linux下LED报警灯驱动设计及编程实验报告 学生姓名: 学 号: 专业班级: 指导教师: 完成时间: 实验5 嵌入式Linux下LED报警灯驱动设计及编程一.实验目的理解驱动本质,掌握嵌入式Linux系统下驱动开发相关知识,包括端口寄存器访问、接口函数编写、和文件系统挂接、注册及相关应用编程等知识点。二.实验内容实验5.1 嵌入式Linux下LED报警灯驱动设计及跑马灯应用编程实验5.2 添加看门狗功能的跑马灯应用编程三.预备知识Linux使用、驱动相关知识等四.实验设备及工具(包括软件调试工具)硬件:ARM 嵌入式开发平台、PC 机Pentium100 以
2、上、串口线。软件: 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流水灯设计,所以需要设置控制器中端口寄
3、存器: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 S3C6
4、4XX_GPMDAT(S3C64XX_GPM_BASE + 0x04)5.2 LED报警灯驱动设计s3c6410_leddrv.c(1)头文件包含和相关宏定义#include #include #include /#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #inc
5、lude #include #include #include #include #define ON 1#define OFF 0(2)编写驱动接口函数/*功能:配置GPM05/GPQ01为输出口参数:无返回值:无*/void LedConfig(void)/读出端口M控制寄存器(S3C64XX_GPMCON)值,修改并写回相关端口寄存器/add your code unsigned int tmp; tmp =readl(S3C64XX_GPMCON); tmp &= (0XF0X0)|(0XF0X4)|(0XF0X8)|(0XF0XC)|(0XF0X10)|(0XF0X14); tmp
6、|= (0X10X0)|(0X10X4)|(0X10X8)|(0X10XC)|(0X10X10)|(0X10X14); writel(tmp,S3C64XX_GPMCON); /*功能:点亮第i个LED灯参数:无符号整型变量iLed,表示第i个LED灯返回值:无*/void iLedOn(unsigned int iLed)/读出端口M数据寄存器(S3C64XX_GPKDAT)值,修改并写回相关端口寄存器/add your code hereunsigned int tmp;tmp =readl(S3C64XX_GPMDAT);tmp &= (0X10X0)|(0X10X1)|(0X10X2)
7、|(0X10X3)|(0X10X4)|(0X10X5);writel(tmp,S3C64XX_GPMDAT);/*功能:熄灭第i个LED灯参数:无符号整型变量iLed,表示第i个LED灯返回值:无*/void iLedOff (unsigned int iLed)/读出端口M数据寄存器(S3C64XX_GPKDAT)值,修改并写回相关端口寄存器/add your code hereunsigned int tmp;tmp =readl(S3C64XX_GPMDAT);tmp &= (0X10X0)|(0X10X1)|(0X10X2)|(0X10X3)|(0X10X4)|(0X10X5);tmp
8、 |= (0X10X0)|(0X10X1)|(0X10X2)|(0X10X3)|(0X10X4)|(0X10X5);writel(tmp,S3C64XX_GPMDAT);(2)和文件系统接口对接static int s3c6410_led_open(struct inode *inode, struct file *filp)/把之前的端口K控制寄存器值读出来保存起来/调用LedConfig函数,把GPIO口配置成输出口/add your codeold_gpmcon_val=readl(S3C64XX_GPMCON);LedConfig();renturn 0;static int s3c6
9、410_led _release(struct inode *inode, struct file *filp)/恢复之前的端口K控制寄存器初始值/add your codewritel(old_gpmcon_val,S3C64XX_GPMCON);renturn 0;static long s3c6410_led _ioctl(struct file *filp, unsigned int cmd, unsigned long arg)switch(cmd)case ON:/点亮所有LED灯/add your codeiLedOn();break;case OFF:/熄灭所有LED灯/add
10、 your codeiLedOff();break;struct file_operations led_fops=.open=_ s3c6410_led_open_,.release=_s3c6410_led_release_,. unlocked_ioctl=_ s3c6410_led_ioctl_,;(3)添加模块标记代码static int _init led_dev_init(void)int ret;ret = _ register_chrdev(0,leddev,&led_fops)_;/注册设备printk (DEVICE_NAMEtinitializedn);return r
11、et;static void _exit led_dev_exit(void)/注销设备/add your code_unregister_chrdev(leddevNo,leddev)_;_module_init(led_dev_init);module_exit(led_dev_exit);MODULE_LICENSE(GPL);MODULE_AUTHOR(licnjupt.);5.2 编写Makefile并加载到内核(1)编写Makefile如下:obj-m:=_ leddrv.o_all:make C _ /opt/FriendlyARM/linux-2.6.38 _SUBDIRS=$
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 Linux LED 警灯 驱动 设计 编程 12
限制150内