嵌入式LED实验_第1页
嵌入式LED实验_第2页
嵌入式LED实验_第3页
嵌入式LED实验_第4页
嵌入式LED实验_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、石家庄铁道大学嵌入式系统实验报告-实验四 LED 驱动及控制实验实验者姓名:崔乐乐实验者学号:同组人:孔维春实验者班级:信1201-2所在学院:信息科学与技术学院课程编号:L指导教师:刘展威报告完成日期:2015年4月 19 日1. 实验目的 了解 ARM 设备外围电路结构与接口原理 熟悉 Linux 系统下硬件驱动编程 编程实现对嵌入式设备上 LED 灯的控制2. 实验内容 阅读 UP-Magic6410 平台硬件文档,熟悉 ARM 处理硬件外围接口电路 编程实现 UP-Magic6410 平台设备上 LED 驱动及应用测试程序3. 实验环境 硬件:UP-Magic6410 型嵌入式实验平台

2、,PC 机 Pentium 500 以上, 硬盘 40G 以上,内存大于 256M 软件:Vmware Workstation +Fedora Core 8 + MiniCom/Xshell + ARM-LINUX 交叉编译开发环境4. 实验原理4.1 硬件接口原理 UP-Magic6410 魔法师实验套件 LED 硬件接口UP-Magic6410 魔法师实验套件上共有 5 个 LED 显示灯,分别接在 S3C6410X 处理器的 GPQ2、GPQ3、GPQ4、GPQ5、GPQ6 上。5 个 LED 显示灯分别共阳极 3.3V 电压,因此相应 GPIO 低电平点亮,高电平熄灭。如图 4.1.1

3、 所示: S3C6410 处理器 GPIO 寄存器S3C6410X 处理器的 GPIO 作为控制 I/O 要进行必要的设置才能对外设进行正确控制,此实验将相应 I/O 设置为输出模式,并向相应 I/O 数据寄存器进行写入数据便可控制 LED 的开关。如下表 4.1.2 给出的 S3C6410X GPIO 寄存器配置:GPQ IO 寄存器列表:GPQ 配置寄存器: GPQ 数据寄存器:4.2 关键代码分析Linux 系统下,应用程序不可直接操作底层硬件寄存器,必须经过驱动层来完成对硬件的操作。 驱动程序分析:#include #include #include #include #include

4、 #include #include #include #include MODULE_LICENSE(GPL);#define DEVICE_NAME leds /驱动名称#define DEVICE_MAJOR 231 /驱动主设备号#define DEVICE_MINOR 0 /驱动次设备号/声明字符设备类结构struct cdev *mycdev;struct class *myclass;dev_t devno;/ LED GPIO 列表static unsigned long led_table = S3C_GPQ2,S3C_GPQ3,S3C_GPQ4,S3C_GPQ5,S3C_G

5、PQ6,;/ LED GPIO 输出类型配置列表static unsigned int led_cfg_table = S3C_GPQ2_OUTP,S3C_GPQ3_OUTP,S3C_GPQ4_OUTP,S3C_GPQ5_OUTP,S3C_GPQ6_OUTP,;/ LED IOCTRL 处理函数,主要完成从用户空间传递数据进行 GPIO 引脚设置功能static int uptech_leds_ioctl(struct inode *inode,struct file *file,unsigned intcmd,unsigned long arg)switch(cmd) case 0:case

6、 1:if (arg 6) return -EINVAL;/ LED GPIO 设置函数接口s3c_gpio_setpin(led_tablearg, !cmd);return 0;default:return -EINVAL;/ 驱动层 file_operations 接口函数初始化static struct file_operations uptech_leds_fops = .owner = THIS_MODULE,.ioctl = uptech_leds_ioctl,;/驱动程序入口初始化函数,设置 LED GPIO、向内核注册设备。static int _init uptech_le

7、ds_init(void)int ret;int i;/ 注册 LED 设备devno = MKDEV(DEVICE_MAJOR, DEVICE_MINOR);/获取设备号mycdev = cdev_alloc();cdev_init(mycdev, &uptech_leds_fops);/初始化字符设备err = cdev_add(mycdev, devno, 1);/向系统添加 LED 设备if (err != 0)printk(s3c leds device register failed!n);myclass = class_create(THIS_MODULE, leds);if(I

8、S_ERR(myclass) printk(Err: failed in creating class.n);return -1;/建立 LED 设备节点class_device_create(myclass,NULL, MKDEV(DEVICE_MAJOR,DEVICE_MINOR), NULL,DEVICE_NAME,DEVICE_MINOR);/ LED GPIO 配置初始化for (i = 0; i 5; i+) s3c_gpio_cfgpin(led_tablei, led_cfg_tablei);s3c_gpio_setpin(led_tablei, 1);printk(DEVIC

9、E_NAME initializedn);return 0;/ 驱动卸载函数static void _exit uptech_leds_exit(void)/ 注销 LED 驱动设备unregister_chrdev(LED_MAJOR, DEVICE_NAME);/ 声明驱动程序入口函数module_init(uptech_leds_init);/ 声明驱动程序出口函数module_exit(uptech_leds_exit); 应用程序分析:#include #include #include #include int main(int argc, char *argv)int i;int

10、 on;int led_number;int fd;/*根据命令行参数内容,进行控制。将命令行参数 1 设置成 LED number,参数 2 设置成 LED 点亮熄灭状态 on*/if (argc != 3 | sscanf(argv1, %d, &led_number) != 1 | sscanf(argv2,%d,&on) != 1 |on 1 | led_number 5) fprintf(stderr, Usage:n);fprintf(stderr, t ./led led_number on|offn);fprintf(stderr, Options:n);fprintf(std

11、err, t led_number from 0 to 4n);fprintf(stderr, t on: 1 off: 0n);exit(1);/打开 LED 设备节点fd = open(/dev/leds, 0);if (fd 0) perror(open device /dev/leds);exit(1);/调用驱动层 ioctrl 接口,实现对 LED 控制ioctl(fd, on, led_number);for(i=0;i选项,如图进入 Character devices - 菜单选择 S3C LEDs Driver 模块方式编译 LED 驱动,如图:退出保存配置:3、重新编译内核

12、,运行 make 命令rootlocalhost linux-2.6.21# makescripts/kconfig/conf -s arch/arm/KconfigCHK include/linux/version.hSYMLINK include/asm-arm/arch - include/asm-arm/arch-s3cmake1: include/asm-arm/mach-types.h is up to date.CHK include/linux/utsrelease.hCHK include/linux/compile.h最终在内核源码目录的 drivers/char/目录下生

13、成 LED 驱动程序 s3c-leds.korootlocalhost linux-2.6.21# ls drivers/char/s3c-leds.kodrivers/char/s3c-leds.korootlocalhost linux-2.6.21#备注:以上在内核中添加对 LED 设备的支持的步骤,在 UP-Magic6410 设备出厂自带内核中已经默认添加进入了, 用户可以省略以上步骤。 以上步骤在于重现系统的构造。 LED 相应驱动已经在本实验目录的 driver 目录下给出。 编译 LED 应用测试程序1、进入实验目录:rootlocalhost # cd /UP-Magic64

14、10/SRC/exp/driver/02_leds/rootlocalhost 02_leds# lsMakefile driver led.c led.o led.sh test_ledrootlocalhost 02_leds#2、清除中间代码,重新编译rootlocalhost 02_leds# make cleanrm -f test_led *.elf *.gdb *.orootlocalhost 02_leds#rootlocalhost 02_leds# makearm-linux-gcc -c -o led.o led.carm-linux-gcc -o test_led le

15、d.o lmrootlocalhost 02_leds# lsMakefile driver led.c led.o led.sh test_ledrootlocalhost 02_leds#当前目录下生成可执行程序 test_led。 NFS 挂载实验目录测试1、启动 UP-Magic6410 实验系统,连好网线、串口线。通过串口终端挂载宿主机实验目录。rootUP_6410 yaffs# mountnfs 192.168.1.145:/UP-Magic6410 /mnt/nfs/2、进入串口终端的 NFS 共享实验目录。rootUP_6410 yaffs# cd /mnt/nfs/SRC/

16、exp/driver/02_leds/rootUP_6410 02_leds# lsMakefile driver led.c led.o led.sh test_ledrootUP_6410 02_leds#3、加载 LED 驱动程序。rootUP_6410 02_leds# insmod driver/s3c-leds.koleds initializedrootUP_6410 02_leds#此时会在 UP-Magic6410 型设备的/dev 目录下产生/dev/leds 设备节点。4、执行应用程序测试该驱动点亮 LED1rootUP_6410 02_leds# ./test_led

17、1 1 熄灭 LED1rootUP_6410 02_leds# ./test_led 1 0点亮 LED2rootUP_6410 02_leds# ./test_led 2 1熄灭 LED2rootUP_6410 02_leds# ./test_led 2 0点亮 LED3rootUP_6410 02_leds# ./test_led 3 1熄灭 LED3rootUP_6410 02_leds# ./test_led 3 0备注:注意 test_led 的命令行参数设置,用户也可以根据实验目录下的 led.sh 测试脚本来测试 LED 驱动程序。6. 思考题 应用程序如何调用设备驱动程序接口?1通过为设备创建的一个符号链;2通过输出到一个接口 设备驱动程序的接口函数如何实现?嵌入式Linux中如何实现应用程序与驱动程序函数接口问题,以GPIO为例驱动中的函数定义:static int sbc2440_leds_ioctl( struct inode *inode, struct file *file, unsigned int cmd, u

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论