ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:40.02KB ,
资源ID:26925534      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/26925534.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(嵌入式Linux下LED报警灯驱动设计及编程.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

嵌入式Linux下LED报警灯驱动设计及编程.docx

1、嵌入式Linux下LED报警灯驱动设计及编程嵌入式Linux下LED报警灯驱动设计及编程实验报告学生姓名: 学 号: 专业班级: 指导教师: 完成时间: 实验 5 嵌入式 Linux 下 LED 报警灯驱动设计及编程1. 实验目的理解驱动本质, 掌握嵌入式 Linux 系统下驱动开发相关知识, 包括端口寄存器访问、 接口函数编写、和文件系统挂接、注册及相关应用编程等知识点。2. 实验内容实验 5.1 嵌入式 Linux 下 LED 报警灯驱动设计及跑马灯应用编程实验 5.2 添加看门狗功能的跑马灯应用编程3. 预备知识Linux 使用、驱动相关知识等4. 实验设备及工具(包括软件调试工具)硬件

2、: 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 两个硬件控制

3、器( 2)在芯片手册中找到相应的硬件控制器部分,重心是看懂端口寄存器本实验要求完成 LED 流水灯设计,所以需要设置控制器中端口寄存器:GPMCON 设置相应位为输出口GPMDAT 控制相应位输出高电平 点亮 LED 灯输出低电平 熄灭 LED 灯(3) linux 内核中相关寄存器读写函数读寄存器函数readl( 寄存器虚地址 );写寄存器函数writel( 值(无符号整型 ), 寄存器虚地址 );义在文件夹下具体端口寄存器地址宏定 /opt/FriendlyARM/linux-2.6.38/arch/arm/mach-s3c64xx/include/mach 的文件中,如端口 M 寄存器在

4、 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 #include #include /#include #include #include #include #include #include #include #include #include #include #include #include

5、 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define ON 1#define OFF 0(2) 编写驱动接口函数/*功能:配置 GPM05/GPQ01 为输出口参数:无返回值:无*/void LedConfig(void)/ 读出端口 M 控制寄存器( S3C64XX_GPMCON )值,修改并写回相关端口寄存器/add your codeunsigned int tmp;tmp

6、=readl(S3C64XX_GPMCON);tmp &=(0XF0X0)|(0XF0X4)|(0XF0X8)|(0XF0XC)|(0XF0X10)|(0XF0X14);tmp |=(0X10X0)|(0X10X4)|(0X10X8)|(0X10XC)|(0X10X10)|(0X10X14);writel(tmp,S3C64XX_GPMCON);/*功能:点亮第i个LED灯参数:无符号整型变量 iLed,表示第i个LED灯返回值:无*/void iLed On(un sig ned int iLed)/读出端口 M数据寄存器(S3C64XX_GPKDAT)值,修改并写回相关端口寄存器/add

7、your code hereunsigned int tmp;tmp =readl(S3C64XX GPMDAT);tmp &=(0X10X0)|(0X10X1)|(0X10X2)|(0X10X3)|(0X10X4)|(0X10X5);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 in

8、t tmp;tmp =readl(S3C64XX GPMDAT);tmp &=(0X10X0)|(0X10X1)|(0X10X2)|(0X10X3)|(0X10X4)|(0X10X5);tmp |=(0X10X0)|(0X10X1)|(0X10X2)|(0X10X3)|(0X10X4)|(0X10X5);writel(tmp,S3C64XX GPMDAT);(2)和文件系统接口对接static int s3c6410_led_open(struct inode *inode, struct file *filp)/把之前的端口 K控制寄存器值读出来保存起来/调用LedConfig 函数,把GP

9、IO 口配置成输出口/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 i

10、nt 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=.open= s3c6410 led open.release= s3c6410_led_release.unlocked_ioctl= s3c6410 led ioctl;(3) 添加模块标记代码static int _in it led_dev_i nit(voi

11、d)int ret;ret = register_chrdev(O,leddev,&led_fops)_ ;/ 注册设备prin tk (DEVICE_NAMEti ni tializedn);return ret;static void _exit led_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(licnjupt.);

12、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. 。(4) 创建设备文件,将驱动设备号和设备文件名关联相关命令为:_#mk nod /dev/leddev c 253 0_ 。5.3编写应用程序任务:要求

13、每5秒点亮所有的LED灯,然后熄灭,过5秒再点亮LED灯#i nclude #in elude #i nclude #in clude vfen tl.h#in clude #defi ne ON 1#defi ne OFF 0void main()fd=open(_ ”/dev/leddev ” _,O_RDWR);if(fd0)exit(1);while(1)/ 点亮 LED 灯ioctl(fd, ON);sleep(5);/ 熄灭 LED 灯_ ioctl(fd, OFF); sleep(5);close (fd);5.4 按照现在的驱动设计,假设要完成 LED 跑马灯实验,请问是否可行

14、 _B_A.可行 B.不可行。如果不可行的话,应该怎样改造驱动代码和应用程序。驱动代码修改部分:应用程序修改部分:六 . 实验 5.2 步骤6.1 实验预备知识(1)相关硬件看门狗硬件主要用于监控系统软件或者应用软件是否发生故障, 如发生故障则可以 通过发出硬件复位信号, 使得系统能够重启, 如果再配合相关自动加载应用程序等措施, 则可以保证应用程序在发生故障后能够自恢复和重启。看门狗硬件由看门狗控制器组成,位于 S3C6410 处理器内部,无须处理器外其它 硬件配合,因此仅需直接编程端口寄存器,并封装成文件系统接口即可。(2 )端口寄存器及相关操作在内核代码文件中已经定义好看门狗相关端口寄存

15、器对应的虚地址,见 /opt/FriendlyARM/linux-2.6.38/arch/arm/plat-samsung/include/plat/regs-watc hdog.h ,如下:写寄存器函数writel( 值(无符号整型 ), 寄存器虚地址 );6.2 看门狗驱动代码( s3c6410_wdtdrv.c )设计(1) 头文件包含和相关宏定义#include #include #include #include #include #include #include #include #include #include #include #include #include #incl

16、ude #include #include #undef S3C_VA_WATCHDOG#define S3C_VA_WATCHDOG (0)#include (2) 编写驱动接口函数/*功能:打开看门狗,允许复位,禁止看门狗中断,并设置看门狗最长看门时间参数:无返回值:无*/void WdtConfig(void)/ 读出看门狗控制寄存器 S3C2410_WTCON ,保存原值,并按照要求修改/ 最后写回看门狗端口控制寄存器 S3C2410_WTCON/add your codeunsigned int tmp;tmp=(0XFF8)|(0X06)|(0X15)|(0X23)|(0XFF8)

17、|(0X02)|(0X11)|(0XFF8)|(0X10);writel(tmp,S3C2410_WTCON);(2) 和文件系统接口对接static int s3c6410_wdt_open(struct inode *inode, struct file *filp)/ 打开看门狗,允许复位,禁止看门狗中断,并设置看门狗最长看门时间/add your codeold_wdtcon_val=readl(S3C2410_WTCON);WdtConfig();static ssize_t s3c6410_wdt_write(struct file *file, const char _user

18、*data,size_t len, loff_t *ppos)/ 把 data 指 针 所 指 向 的 用 户 空 间 值 更 新 到 看 门 狗 计 数 寄 存 器 S3C2410_WTCNT 中/add your codeunsigned int val;copy_from_user(&val,data,4);writel(val,S3C2410_WTCNT);return 0;static int s3c6410_wdt_release(struct inode *inode, struct file *filp)/ 恢复 之前的看门狗端口控制寄存器的原始值/add your codew

19、ritel(old_wdtcon_val,S3C2410_WTCON);return 0;struct file_operations wdt_fops=.open=_ s3c6410_wdt_open_,.release=_ s3c6410_wdt_release_,. write=_ s3c6410_wdt_write_,;(3) 添加模块标记代码static int _init wdt_dev_init(void)注册设备int ret;ret = _ register_chrdev(0,wdtdev,&wdt_fops) printk (DEVICE_NAMEtinitializedn

20、);return ret;static void _exit wdt_dev_exit(void)/ 注销设备/add your code unregister_chrdev(wdtdevNo,wdtdev); module_i nit(wdt_dev_i nit);module_exit(wdt_dev_exit);MODULE_LICENSE(GPL);MODULE_AUTHOR(licnjupt.);5.2编写Makefile并加载到内核(1)编写Makefile如下:obj-m:= wdtdrv.o all:make -C /opt/FriendlyARM/linux-2.6.38 S

21、UBDIRS=$(shell pwd)modulesclea n:rm -rf *.ko *.o(3) 编译使用命令编译: #make 编译完成后生成驱动文件 wdtdrv.ko 。(3)加载驱动使用命令进行驱动加载 # insmod wdtdrv.ko 。(4) 创建设备文件,将驱动设备号和设备文件名关联相关命令为: #mknod /dev/leddev c 252 0 。_5.3 编写应用程序任务:要求每5秒点亮所有的LED灯,然后熄灭,过5秒再点亮LED灯,要求能 够添加看门狗支持#include #include #include #include #include #include

22、#define ON 1#define OFF 0void *wdt_thrd_func(void *arg);void main()pthread_t wdt_thd;fd1=open(_/dev/leddev_,O_RDWR);/ 打开 LED 设备if(fd10)exit(1);fd2=open(_/dev/wdtdev_,O_RDWR);/ 打开看门狗设备if(fd20)exit(1);/ 创建看门狗喂狗线程if (pthread_create(&wdt_thd,NULL, wdt_thrd_func,NULL)!=0) printf(Create watchdog thread error!n);exit(1);while(1)/ 点亮 LED 灯ioctl(fd, ON);sleep(5);/ 熄灭 LED 灯ioctl(leddev fd,OFF);sleep(5);close (fd);void *wdt_thrd_func(void *arg)/ 每隔 10 秒喂狗一次 unsigned int wdt_val=0XFFFF;while(1)/ 喂狗write(fd2,&wdt_val,sizeof(int);sleep(10);return;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1