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

上传人:Che****ry 文档编号:35755766 上传时间:2022-08-23 格式:PDF 页数:12 大小:103.39KB
返回 下载 相关 举报
2022年嵌入式Linux下LED报警灯驱动设计及编程 .pdf_第1页
第1页 / 共12页
2022年嵌入式Linux下LED报警灯驱动设计及编程 .pdf_第2页
第2页 / 共12页
点击查看更多>>
资源描述

《2022年嵌入式Linux下LED报警灯驱动设计及编程 .pdf》由会员分享,可在线阅读,更多相关《2022年嵌入式Linux下LED报警灯驱动设计及编程 .pdf(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、南京邮电大学计算机学院嵌入式系统与开发实验报告嵌入式 Linux 下 LED报警灯驱动设计及编程实验报告学生姓名:学号:专业班级:指导教师:完成时间:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 12 页 - - - - - - - - - 南京邮电大学计算机学院嵌入式系统与开发实验报告实验 5 嵌入式 Linux下 LED报警灯驱动设计及编程一.实验目的理解驱动本质, 掌握嵌入式 Linux系统下驱动开发相关知识, 包括端口寄存器访问、接口函数编写、和文件系统挂接、注

2、册及相关应用编程等知识点。二.实验内容实验 5.1 嵌入式 Linux 下 LED报警灯驱动设计及跑马灯应用编程实验 5.2 添加看门狗功能的跑马灯应用编程三.预备知识Linux使用、驱动相关知识等四.实验设备及工具(包括软件调试工具)硬件: ARM 嵌入式开发平台、 PC 机 Pentium100 以上、串口线。软件: WinXP或 UBUNTU开发环境。五.实验 5.1 步骤5.1 前期准备( 1)看懂相关硬件电路图【见S3C6410实验箱电路图 -底板 .pdf】 ,以 LED报警灯为例进行设计打开 PDF硬件电路图,明确LED灯用到的多个GPIO及其控制器本实验电路LED1-GPM0

3、LED2-GPM1 LED3-GPM2 LED4-GPM3 LED5-GPM4 LED6-GPM5 LED7-GPQ0 LED8-GPQ1 得出结论: 8 个 LED灯使用到的硬件控制器分别为GPM 和 GPQ两个硬件控制器( 2)在芯片手册中找到相应的硬件控制器部分,重心是看懂端口寄存器本实验要求完成LED流水灯设计,所以需要设置控制器中端口寄存器:GPMCON-设置相应位为输出口GPMDAT- 控制相应位输出高电平-点亮 LED灯输出低电平 -熄灭 LED灯(3) linux 内核中相关寄存器读写函数读寄存器函数readl(寄存器虚地址 ); 写寄存器函数writel(值(无符号整型 ),

4、 寄存器虚地址 ); 具体端口寄存器地址宏定义在/opt/FriendlyARM/linux-2.6.38/arch/arm/mach-s3c64xx/include/mach 文件夹下的文件中,如端口 M 寄存器在 gpio-bank-m.h文件中有定义:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 12 页 - - - - - - - - - 南京邮电大学计算机学院嵌入式系统与开发实验报告#define S3C64XX_GPMCON (S3C64XX_GPM_BAS

5、E + 0 x00) #define S3C64XX_GPMDAT (S3C64XX_GPM_BASE + 0 x04) 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 #in

6、clude #include #include #include #include #include #include #include #define ON 1 #define OFF 0 (2)编写驱动接口函数/* 功能:配置GPM05 /GPQ01 为输出口参数:无名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 12 页 - - - - - - - - - 南京邮电大学计算机学院嵌入式系统与开发实验报告返回值:无*/ void LedConfig(void) / 读

7、出端口M 控制寄存器( S3C64XX_GPMCON )值,修改并写回相关端口寄存器/add your code unsigned int tmp; tmp =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 个 L

8、ED灯返回值:无*/ void iLedOn(unsigned int iLed) / 读出端口M 数据寄存器 (S3C64XX_GPKDAT) 值,修改并写回相关端口寄存器/add your code here unsigned int tmp; tmp =readl(S3C64XX_GPMDAT); tmp &= (0X10X0)|(0X10X1)|(0X10X2)|(0X10X3)|(0X10X4)|(0X10X5); writel(tmp,S3C64XX_GPMDAT); /* 功能:熄灭第i 个 LED灯参数:无符号整型变量iLed,表示第 i 个 LED灯返回值:无*/ void

9、iLedOff (unsigned int iLed) / 读出端口M 数据寄存器 (S3C64XX_GPKDAT) 值,修改并写回相关端口寄存器/add your code here unsigned int tmp; tmp =readl(S3C64XX_GPMDAT); tmp &= (0X10X0)|(0X10X1)|(0X10X2)|(0X10X3)|(0X10X4)|(0X10X5); tmp |= (0X10X0)|(0X10X1)|(0X10X2)|(0X10X3)|(0X10X4)|(0X10X5); writel(tmp,S3C64XX_GPMDAT); 名师资料总结 -

10、- -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 12 页 - - - - - - - - - 南京邮电大学计算机学院嵌入式系统与开发实验报告(2)和文件系统接口对接static int s3c6410_led_open(struct inode *inode, struct file *filp) /把之前的端口K 控制寄存器值读出来保存起来/调用LedConfig 函数,把 GPIO口配置成输出口/add your code old_gpmcon_val=readl(S3C64XX_GP

11、MCON); LedConfig(); renturn 0; static int s3c6410_led _release(struct inode *inode, struct file *filp) / 恢复之前的端口K控制寄存器初始值/add your code writel(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: / 点亮所有

12、 LED灯/add your code iLedOn(); break; case OFF: / 熄灭所有 LED灯/add your code iLedOff(); break; struct file_operations led_fops= .open=_s3c6410_led_open_, .release=_s3c6410_led_release_, 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 12 页 - - - - - - - - - 南京邮电大学计算机

13、学院嵌入式系统与开发实验报告.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 ret; static void _exit led_dev_exit(void) / 注销设备/add your code _unregister_chrdev(leddevNo,leddev)_;

14、_ 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=$(shell pwd) modules clean: rm -rf *.ko *.o (3) 编译使用命令编译:_#make_ 编译完成后生成驱动文件 _leddrv.k

15、o_ 。(3) 加载驱动使用命令进行驱动加载 _#insmod leddrv.ko_ 。(4)创建设备文件,将驱动设备号和设备文件名关联相关命令为 : _#mknod /dev/leddev c 253 0_ 。5.3 编写应用程序任务:要求每 5 秒点亮所有的 LED灯,然后熄灭,过 5 秒再点亮 LED灯#include 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 12 页 - - - - - - - - - 南京邮电大学计算机学院嵌入式系统与开发实验报告#inc

16、lude #include #include #include #define ON 1 #define OFF 0 void 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跑马灯实验,请问是否可行_B_A.可行B.不可行 。如果不可行的话,应该怎样改造驱动代码和应用程序。驱动代码修改部分:应用程序修

17、改部分:六. 实验 5.2 步骤名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 12 页 - - - - - - - - - 南京邮电大学计算机学院嵌入式系统与开发实验报告6.1 实验预备知识(1)相关硬件看门狗硬件主要用于监控系统软件或者应用软件是否发生故障,如发生故障则可以通过发出硬件复位信号, 使得系统能够重启, 如果再配合相关自动加载应用程序等措施,则可以保证应用程序在发生故障后能够自恢复和重启。看门狗硬件由看门狗控制器组成,位于 S3C6410处理器内部, 无须

18、处理器外其它硬件配合,因此仅需直接编程端口寄存器,并封装成文件系统接口即可。(2)端口寄存器及相关操作在 内 核 代 码 文 件 中 已 经 定 义好 看 门 狗 相 关 端 口 寄 存 器 对 应 的 虚 地 址 , 见/opt/FriendlyARM/linux-2.6.38/arch/arm/plat-samsung/include/plat/regs-watchdog.h, 如下:#define S3C2410_WTCON S3C_WDOGREG(0 x00) #define S3C2410_WTDAT S3C_WDOGREG(0 x04) #define S3C2410_WTCNT

19、S3C_WDOGREG(0 x08) 读寄存器函数readl(寄存器虚地址 ); 写寄存器函数writel(值(无符号整型 ), 寄存器虚地址 ); 6.2 看门狗驱动代码( s3c6410_wdtdrv.c )设计(1)头文件包含和相关宏定义#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #undef S3C_VA_WATCHDOG #define S3C

20、_VA_WATCHDOG (0) #include 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 12 页 - - - - - - - - - 南京邮电大学计算机学院嵌入式系统与开发实验报告(2)编写驱动接口函数/* 功能:打开看门狗,允许复位,禁止看门狗中断,并设置看门狗最长看门时间参数:无返回值:无*/ void WdtConfig(void) / 读出看门狗控制寄存器S3C2410_WTCON ,保存原值,并按照要求修改/ 最后写回看门狗端口控制寄存器S3C241

21、0_WTCON /add your code unsigned int tmp; tmp=(0XFF8)|(0X06)|(0X15)|(0X23)|(0XFF8)|(0X02)|(0X11)|(0XFF8)|(0X10); writel(tmp,S3C2410_WTCON); (2)和文件系统接口对接static int s3c6410_wdt_open(struct inode *inode, struct file *filp) /打开看门狗,允许复位,禁止看门狗中断,并设置看门狗最长看门时间/add your code old_wdtcon_val=readl(S3C2410_WTCON

22、); WdtConfig(); static ssize_t s3c6410_wdt_write(struct file *file, const char _user *data,size_t len, loff_t *ppos) / 把 data指针所指向的用户空间值更新到看门狗计数寄存器S3C2410_WTCNT 中/add your code unsigned int val; copy_from_user(&val,data,4); writel(val,S3C2410_WTCNT); return 0; static int s3c6410_wdt_release(struct i

23、node *inode, struct file *filp) / 恢复之前的看门狗端口控制寄存器的原始值/add your code writel(old_wdtcon_val,S3C2410_WTCON); return 0; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 12 页 - - - - - - - - - 南京邮电大学计算机学院嵌入式系统与开发实验报告struct file_operations wdt_fops= .open=_ s3c6410_wdt

24、_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); return ret; static void _exit wdt_dev_exit(void) / 注销设备/add your code _ unregister_ch

25、rdev(wdtdevNo,wdtdev);_ module_init(wdt_dev_init); 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_SUBDIRS=$(shell pwd) modules clean: rm -rf *.ko *.o (3) 编译使用命令编译:_#make_

26、 编译完成后生成驱动文件 _wdtdrv.ko_ 。(3) 加载驱动使用命令进行驱动加载 _# insmod wdtdrv.ko_ 。(4)创建设备文件,将驱动设备号和设备文件名关联相关命令为 : 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 12 页 - - - - - - - - - 南京邮电大学计算机学院嵌入式系统与开发实验报告_#mknod /dev/leddev c 252 0_ 。5.3 编写应用程序任务:要求每 5 秒点亮所有的 LED灯,然后熄灭,过

27、5 秒再点亮 LED灯,要求能够添加看门狗支持#include #include #include #include #include #include #define ON 1 #define OFF 0 void *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 (pth

28、read_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); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 12 页 - - - - - - - - - 南京邮电大学计算机学院嵌入式系统与开发实验报告 void *wdt_thrd_func(void *arg) / 每隔 10 秒喂狗一次unsigned int wdt_val=0XFFFF; while(1) / 喂狗write(fd2,&wdt_val,sizeof(int); sleep(10); return; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 12 页 - - - - - - - - -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁