嵌入式Linux下LED报警灯驱动设计及编程
实验5 嵌入式Linux Led程序设计

实验5 嵌入式Linux Led程序设计一、实验目的:1.了解实验板的硬件资源。
2.掌握嵌入式Linux Led程序设计。
3.掌握嵌入式linux程序下载运行方法。
二、实验板介绍1.Smart210 核心板介绍2.Smart210 底板介绍3.用户LED二、实验内容:1.启动终端(快捷键ctrl+alt+t),在ubuntu下的/mnt/nfs建立hello文件夹(如果已经创建忽略此步),使用Gedit软件编辑hello.c程序,文件名为hello.c. 编译程序生成可执行代码。
(5)输入源代码:(6)输入编译链接命令:(7)运行执行文件,在ubuntu上运行该文件查看运行结果hello_arm:2.minicom的使用实验内容:在终端运行minicom,设置相关参数,实现与ARM实验板的COM0通信。
步骤:(1)将实验箱的串口与PC电脑的串口相连。
(2)在电脑端插入USB转串口线,将USB转串口直接连接到ubuntu,如果成功显示为:出现minicom的配置界面,通过上下键进入Serial port setup选项。
修改“SerialDevice”为/dev/ttyUSB0,修改”Bps/Par/Bits”为”115200 8N1”。
直接“EXIT”,回到minicom的操作界面。
正确的话,进入实验板的嵌入式linux终端,按回车键显示如下:3.将hello程序运行在嵌入式linux(1)将实验步骤1生成的hello_arm,拷贝到u盘。
(2)将U盘插入实验板的usb口。
Minicom上会显示如下信息(3)查看嵌入式自动挂载U盘,挂载目录为/udisk运行执行文件,在实验板上运行hello_arms看运行结果4.嵌入式linux Led程序(1)进入/mnt/nfs(2)创建led文件夹:(3)进入led目录(4)使用Gedit软件编辑ledtest.c程序(5)输入源代码:(6)编译ledtest.c5.式linux,并运行,并观察结果。
cha7-嵌入式Linux系统Qt LED灯实验

实验七嵌入式Linux系统Qt LED灯实验7.0准备工作7.1建立工程文件7.2启动QT设计器,生成led.ui文件7.3由led.ui生成led.cpp文件7.4 创建main.cpp文件7.5 生成led.pro文件并修改内容7.6 由tmake生成MakeFile文件并修改内容7.7 修改led.cpp文件7.8 使用make编译7.9 把可执行文件hello放到实验箱的QT中运行7.0准备工作7.0.1打开虚拟机中的Fedora10系统,如下图:7.0.2首先保证此处状态无红叉;7.1建立工程文件7.1.1双击桌面Terminal,进入终端窗口;7.1.2在命令行输入:#cd /opt/cvtech/Qte/arm-qtopia-2.2.0/pro/进入该路径下的pro文件夹#mkdir led创建一个名为led的文件夹#cd led进入led文件夹# ls 可查看当前文件夹下的内容7.2启动QT设计器,生成led.ui文件7.2.1继续在命令行输入以下两条命令会弹出QT设计器# source /opt/cvtech/Qte/setARM_QpeEnv# /opt/cvtech/Qte/arm-qtopia-2.2.0/qt2/bin/designer &7.2.2Qt设计器的使用(1)新建文件项目:File→New→Widget→OK结果如下:(2)设置Form1的属性,修改“name” 为led,修改“caption”为Show led!如图:(3)添加三个按钮,分别修改“name”分别为PushButton1、PushButton2、PushButton3,修改“text”分别为ON 、OFF、close。
(开灯、关灯、close)示范一个,另外两个自己输入:(4)添加一个text图标,修改“name”为TextLabel1,修改“text”为空。
这里也可以在“font”设置text的字体大小:(6)添加函数选择工具栏中的Edit —>slot,新建三个函数,分别为on()、off()、close(),先点New slot,再修改函数名称,连续建完三个后点OK保存退出:(7)建立按钮与函数的关联注意:三个按钮都要关联,一个都不能省!尤其是close(),此步骤必须要做。
嵌入式linux 的LED 实验

(4)设备释放函数:
static int s3c2440_led_release(struct inode *inode, struct file *filp) { printk(KERN_INFO DEVICE_NAME ": released.\n"); return 0; }
(5)模块入口函数:
#define DEVICE_NAME "led" #define LEDRAW_MINOR 1 //注 2 MODULE_LICENSE("Dual BSD/GPL"); static int ledMajor = 233; //注 3 ① 注1,GPIO 寄存器的包含文件。 ② 注2,设备的次设备号定义为1。 ③ 注3,主设备号定义为233
实验内容:
1.阅读S3C2440 的数据手册,熟悉IO 端口的原理。 2.编写LED 应用程序。 3.编写makefile 文件。 4.下载并调试LED 应用程序。
预备条件:
首先在目标文件系统中手动创建一个 led 字符设备:
mknod dev/led c 233 1 试验设备及工具:
1.硬件:GEC2440开发板。 2.软件:PC 操作系统RED AS4.0 ,minicom,arm-linux开发环境,内核版本2.6.24 3.为编译配置所需的内核。 注意:.config 文件是默认的内核配置文件,我们在编译内核模块之前需要先把内核配置 成默认配置。当然还可以根据其他相关平台的配置文件,在其基础上用make menuconfig 进 一步配置生成目标配置文件; 配置完成并保存退出,产生.config 文件.
基于GEC2440的嵌入式linux
LED 实验
Linux学习之LED驱动程序简介

这里我们当然也要根据实际来思考我们的LED驱动程序。
在STM32点灯的时候,一般输出低电平点灯,输出高电平灭灯。
在嵌入Linux操作系统的情况下,我们自然也要想到有个写1/0的思想。
类比我们上一篇的hello程序:我们的LED程序自然要写入的数据为0/1来点亮、熄灭LED。
这里我们做的实验室与硬件无关的LED实验:我们的驱动程序在收到应用程序发送过来的0时打印led on、收到1时打印led off。
模仿上一篇的hello程序,我们修改得到的与硬件无关的LED程序(核心部分)如下:LED应用程序:LED驱动程序:加载led驱动模块及运行应用程序:与硬件有关的LED驱动上面那一节分享的是与硬件无关的LED驱动实验,主要是为了理清LED驱动的大体思路。
这里我们再加入与硬件有关的相关操作以构造与硬件有关的LED驱动程序。
我们在进行STM32的裸机编程的时候,对一些外设进行配置其实就是操作一些地址的过程,这些外设地址在芯片手册中可以看到:这是地址映射图,这里图中只是列出的外设的边界地址,每个外设又有很多寄存器,这些寄存器的地址都是对外设基地址进行偏移得到的。
同样的,对于NXP 的IMX6ULL芯片来说,也是有类似这样的地址的:此时我们要编写Linux系统下的led驱动,涉及到硬件操作的地方操作的并不是这些地址(物理地址),而是操作系统给我们提供的地址(虚拟地址)。
操作系统根据物理地址来给我们生成一个虚拟地址,我们的led驱动操控这个地址就是间接的操控物理地址。
至于这两个地址是怎么联系起来的,里面个原理我们暂且不展开。
我们从函数层面来看,内核给我们提供了ioremap 函数,这个函数可以把物理地址映射为虚拟地址。
这个函数在内核文件arch/arm/include/asm/io.h 中:void __iomem *ioremap(resource_size_t res_cookie, size_t size); •res_cookie:要映射给的物理起始地址。
基于linux的led驱动程序实现

基于linux的led驱动程序实现一.博创开发平台硬件LED的实现博创开发平台设置了3个GPIO控制的LED和一个可直接产生外部硬件中断的按键,LED分别使用了S3C2410的GPC5, GPC6, GPC7三个GPIO,按键接到INT5中断。
下面对S3C2410 GPIO的各个寄存器作出说明,用GPIO控制的LED就是通过操作GPIO的各个寄存器进行配置和操作的。
S3C2410包含GPA、GPB、……、GPH八个I/O端口。
它们的寄存器是相似的:GPxCON 用于设置端口功能(00表示输入、01表示输出、10表示特殊功能、11保留不用), GPxDAT用于读/写数据,GPxUP用于决定是否使用内部上拉电阻(某位为0时,相应引脚无内部上拉;为1时,相应引脚使用内部上拉)。
这里要稍微注意一点的地方是PORTA和其他几组端口的使用不太一样,这里不讨论A 口,B到H组口的使用完全相同。
以下是S3C2410手册上的数据[13]:The S3C241DX has 117 muhi-funotional input/output port pjfis. The ports are:—Port A (GPAl; 2>oulput port—Port B (GPBJ- 11-Fnpirt/output pert—Port C [GPC)' 16-input/output port— Part D (GPD): iG-iriput/output port—Pert E (GPE) 16-inpufoutput pert—Port F (GPF); 8-input/output port— Port G (GPG): 16*input/oiJtput port—Pert H (GPH); 11-inpuVoutput port图 1.1 S3C2410 端口GPC 口有16个IO 口,查datasheetS3C2410》所用的地址为:图1.2 C组GPIO的地址即GPCCON 地址为0x56000020, GPCDAT 地址为0x56000024,各位的设置具体见下图,则对应的GPCCON寄存器的位为:图1.3 GPCCON寄存器相应的位这里用到了5, 6, 7三个口,CON寄存器要完成对对应口的设置工作,将相应的口设置为输出状态,其他的口不用考虑,设置为输出的话就是0x15v<10, 这样3个IO 口就设置为了输出。
实验三 在嵌入式Linux上开发LED控制电路设备驱动程序

实验内容
• 在嵌入式Linux上设计LED控制电路设备驱动 程序ຫໍສະໝຸດ 嵌入式Linux字符型设备
• 嵌入式Linux基本设备类型
– 字符型设备 – 块设备 – 网络设备 – 其他设备(相关的协议栈由kernel附加层支持)
• 嵌入式Linux字符型设备
– 实现和管理简单 – 无需缓冲,直接读写的设备(例如串口设备) – 可以被看作一个类似文件的数据流
与设备驱动程序关联的内核数据结构
Linux内核模块
• Linux模块由没有链接成完整可执行文件的目标 代码组成 • Linux模块可以动态装载(链接)到运行中的内 核中,也可以从内核中动态卸载 • Linux内核提供了对许多模块类型的支持,其中 包括设备驱动程序 • 因为Linux模块运行在内核空间,所以只能调用 内核输出的函数,而不能调用外部库中的函数 (例如只能使用内核输出的printk 函数,而不 能使用libc中的printf函数)
• 申明模块退出函数
– module_exit(cleanup_function);
• 实现模块退出函数
static void __exit cleanup_function(void) { /* Cleanup code here */ }
Linux内核模块管理
• 加载模块(insmod) • 卸载模块(rmmod) • 查询内核中当前加载的模块列表(lsmod)
alteraquartusiiredhatlinuxgnu跨平台开发工具链在嵌入式linux上开发led控制电路设备驱动程序实验?实验原理嵌入式linux设备驱动程序与内核模块嵌入式linux字符型设备嵌入式linux中与设备驱动程序关联的内核数据嵌入式linux中与设备驱动程序关联的内核数据结构嵌入式linux字符型设备驱动程序框架led控制电路设备驱动程序工作原理嵌入式linux设备驱动程序?设备驱动程序是一种可以使计算机和设备通信的特殊程序相当于硬件的接口操作系统通过设备驱动程序来控制硬件设备的工作备的工作?嵌入式linux中设备驱动程序通常是以内核模块的形式存在的linux内核模块?linux模块由没有链接成完整可执行文件的目标代码组成?linux模块可以动态装载链接到运行中的内核中也可以从内核中动态卸载?linux内核提供了对许多模块类型的支持其中包括设备驱动程序?因为linux模块运行在内核空间所以只能调用内核输出的函数而不能调用外部库中的函数例如只能使用内核输出的printk函数而不能使用libc中的printf函数linux内核模块代码结构?申明模块初始化函数moduleinitinitializationfunction
基于嵌入式Linux的LED驱动开发与应用
基于嵌入式Linux的LED驱动开发与应用摘要:简要介绍了基于嵌入式ARM处理器芯片LPC3250的嵌入式Linux的LED驱动程序的开发原理、流程以及相关主要接口硬件电路的设计。
实际运行结果表明,该设计完全达到预期效果。
关键词:嵌入式Linux;LED;硬件;驱动程序0引言随着IT技术和嵌入式技术的快速发展,嵌入式产品已经广泛应用于工业、能源、环保、通信等各个行业,显示出其强大的生命力。
Linux是当今流行的操作系统之一,具有源代码开放、内核稳定、功能强大和可裁减等优点而成为众多应用的首选。
同样嵌入式Linux也继承了Linux的诸多优点。
对Linux应用程序来说,由于设备驱动程序屏蔽了硬件的细节,其硬件设备将作为一个特殊的文件,因此应用程序可以像操作普通文件一样对硬件设备进行操作。
本设计中驱动的设备是基于NXP公司的LPC3250微处理器开发的LED信号指示灯,利用这些指示灯来显示仪器的运行状态,方便用户了解仪器的工作状况。
1LPC3250简介及接口电路设计本设计中主控芯片采用LPC3250微处理器,具有高集成度、高性能、低功耗等特点。
它采用90nm工艺和ARM926EJS内核,主频最高为208MHz,具有全系列标准外设。
其中包括带专用DMA控制器的24位LCD控制器,可支持STN和TFT面板。
充分满足本设计的需要,外部只需加入很少芯片就可实现系统功能<sup>[1]</sup>。
LPC3250共有296个管脚。
对于4个LED灯来说需要用到4个引脚,这里使用GPIO端口来设计,GPM1~GPM3作为LED灯的控制端口,另外还需要为LED提供电源,这里需要3.3V的直流电源。
接口电路设计如图1所示。
GPM0~GPM3分别与电阻、LED连接,当GPM0~GPM3置为低电平时,相应的LED灯点亮。
2驱动程序设计在嵌入式Linux操作系统下,有三类主要的设备文件类型:字符设备、块设备和网络设备<sup>[2]</sup>。
嵌入式linux小项目实例
嵌入式linux小项目实例以下是一个嵌入式Linux小项目的实例:控制LED灯。
项目描述:实现一个嵌入式Linux系统,通过控制GPIO口来控制LED灯的开关状态。
当输入一个命令时,LED灯会根据命令的参数进行相应的操作,例如点亮、熄灭或闪烁。
所需硬件:1. 嵌入式开发板(支持Linux系统)2. LED灯3. 面包板4. 杜邦线步骤:1. 连接硬件:将LED灯的正极连接到GPIO口,将负极连接到地线,确保电路连接正确。
2. 在嵌入式开发板上安装Linux系统,并配置好相应的开发环境(交叉编译工具链、GPIO驱动等)。
3. 创建一个C语言源文件,该文件包含LED灯的控制代码。
在代码中,需要通过GPIO驱动控制LED灯的开关状态。
4. 使用交叉编译工具链编译源文件生成可执行文件。
5. 将可执行文件拷贝到嵌入式开发板上。
6. 在嵌入式开发板上打开终端,运行可执行文件,通过命令行输入参数来控制LED灯的开关状态。
示例代码:```c#include <stdio.h>#include <fcntl.h>#include <unistd.h>#define LED_GPIO_PIN 17int main(int argc, char *argv[]) {int fd;char buf[2];fd = open("/sys/class/gpio/export", O_WRONLY);write(fd, "17", 2);close(fd);fd = open("/sys/class/gpio/gpio17/direction", O_WRONLY); write(fd, "out", 3);close(fd);fd = open("/sys/class/gpio/gpio17/value", O_WRONLY);if (strcmp(argv[1], "on") == 0) {write(fd, "1", 1);printf("LED turned on.\n");} else if (strcmp(argv[1], "off") == 0) {write(fd, "0", 1);printf("LED turned off.\n");} else if (strcmp(argv[1], "blink") == 0) {int i;for (i = 0; i < 10; i++) {write(fd, "1", 1);sleep(1);write(fd, "0", 1);sleep(1);}printf("LED blinked.\n");} else {printf("Invalid command.\n");}close(fd);fd = open("/sys/class/gpio/unexport", O_WRONLY);write(fd, "17", 2);close(fd);return 0;}```编译和运行:1. 使用交叉编译工具链编译源文件:```$ arm-linux-gnueabi-gcc -o led_control led_control.c```2. 将可执行文件拷贝到嵌入式开发板上。
Tiny-S3C6410_Linux下LED灯驱动移植过程
UT-S3C6410 ARM11 Linux 下的LED驱动一、实验环境操作系统:fedora13交叉编译环境:arm-Linux-gcc 或以上,6410板子内核源码路径在:忘了,需要厂家给的内核源代码硬件平台:S3C6410开发板(其他类型的开发板也可以注意配置GPIO)注:交叉编译环境一定要装好,一般的开发板给的配套资料中都会有,安装过程也都有详细的过程,如果没有,亲,你只有自己解决了。
也可以联系我(****************),泪奔支持你们。
二、实验原理控制LED是最简单的一件事情,就像学C语言时候写的“hello world”程序一样,是一个入门的程序。
首先来了解一下相关的硬件知识:UT-S3C6410LED原理图UT-S3C6410LED外部引脚图从上面的原理图可以得知,LED与CPU引脚的连接方法如下,高电平点亮。
LED1 -GPM0LED2 -GPM1LED3 -GPM2LED4 -GPM3从数据手册可以找到相应的控制方法。
这里我们以LED1为例,介绍一下LED1的操作方法,其他的类似,请大家自行分析。
通过上面可以得知,需要先将GPM0设置为输出方式。
将寄存器GPMCON低四位配置成0001。
然后将GPMDAT寄存器的第0位置1灯亮,置LED0灯亮,开发板上有四个LED所以要对GPMDAT的低四位进行操作,就可以实现对灯的亮灭操作了。
三、实验步骤1、编写驱动程序mini6410_leds.c#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 DEVICE_NAME "leds"static long sbc2440_leds_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) {switch(cmd) {unsigned tmp;case 0:case 1:if (arg > 4) {return -EINVAL;}tmp = readl(S3C64XX_GPKDAT);tmp &= ~(1 << (4 + arg));tmp |= ( (!cmd) << (4 + arg) );writel(tmp, S3C64XX_GPKDAT);//printk (DEVICE_NAME": %d %d\n", arg, cmd); return 0;default:return -EINVAL;}}static struct file_operations dev_fops = {.owner = THIS_MODULE,.unlocked_ioctl = sbc2440_leds_ioctl,};static struct miscdevice misc = {.minor = MISC_DYNAMIC_MINOR,.name = DEVICE_NAME,.fops = &dev_fops,};static int __init dev_init(void){int ret;{unsigned tmp;tmp = readl(S3C64XX_GPKCON);tmp = (tmp & ~(0xffffU<<16))|(0x1111U<<16); writel(tmp, S3C64XX_GPKCON);tmp = readl(S3C64XX_GPKDAT);tmp |= (0xF << 4);writel(tmp, S3C64XX_GPKDAT);}ret = misc_register(&misc);printk (DEVICE_NAME"\tinitialized\n");return ret;}static void __exit dev_exit(void){misc_deregister(&misc);}module_init(dev_init);module_exit(dev_exit);MODULE_LICENSE("GPL");MODULE_AUTHOR("FriendlyARM Inc.");(1)把Hello,Module 加入内核代码树,并编译一般编译2.6 版本的驱动模块需要把驱动代码加入内核代码树,并做相应的配置,如下步骤(注意:实际上以下步骤均已经做好,你只需要打开检查一下直接编译就可以了):Step1:编辑配置文件Kconfig,加入驱动选项,使之在make menuconfig 的时候出现打开linux-2.6.38/drivers/char/Kconfig 文件,添加如图所示:#====================cgf add===================================== config MINI6410_LEDStristate "LED Support for Mini6410 GPIO LEDs"depends on CPU_S3C6410default yhelpThis option enables support for LEDs connected to GPIO lineson Mini6410 boards.#================================================================== 保存退出,这时在linux-2.6.38 目录位置运行一下make menuconfig 就可以在DeviceDrivers Character devices 菜单中看到刚才所添加的选项了,按下空格键将会选择为<M>,此意为要把该选项编译为模块方式;再按下空格会变为<*>,意为要把该选项编译到内核中,在此我们选择<M>,如图,如果没有出现,请检查你是否已经装载了缺省的内核配置文件,(2)Makefile文件Step2:通过上一步,我们虽然可以在配置内核的时候进行选择,但实际上此时执行编译内核还是不能把mini6410_leds.c编译进去的,还需要在Makefile 中把内核配置选项和真正的源代码联系起来,打开linux-2.6.38-cgf/drivers/char/Makefile,obj-$(CONFIG_MINI6410_LEDS) += mini6410_leds.o添加并保存退出Step3:这时回到linux-2.6.38 源代码根目录位置,执行make modules,就可以生成我们所需要的内核模块文件drivers/char/mini6410_leds.ko 了,注意:执行make modules 之前,必须先执行make zImage,只需一次就可以了。
嵌入式Linux下LED驱动程序
module_init(led_init);
MODULE_LICENSE("Dual BSD/GPL");
#endif
// MODULE
Led 测试小程序
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
printk(KERN_ERR "can't add led device"); return 0; } /*************************************************************************************/
#ifdef MODULE
#include <linux/poll.h> /* COPY_TO_USER */
#include <asm/system.h> /* cli(), *_flags */
#include <linux/cdev.h>
#include <asm/arch/regs-gpio.h> #include <asm/hardware.h>
switch(cmd){ case 1: //printk("runing command 1 \n"); if(arg==1){ s3c2410_gpio_setpin(S3C2410_GPC5,0); } if(arg==0){ s3c2410_gpio_setpin(S3C2410_GPC5,1); } break; case 2: if(arg==1){ s3c2410_gpio_setpin(S3C2410_GPC6,0); } if(arg==0){ s3c2410_gpio_setpin(S3C2410_GPC6,1); } break; case 3: if(arg==1){ s3c2410_gpio_setpin(S3C2410_GPC7,0); } if(arg==0){ s3c2410_gpio_setpin(S3C2410_GPC7,1); } break;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《嵌入式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. 。