嵌入式实验一:LED灯点亮
实验一:LED灯程序
一、 实验环境
开发机环境
 操作系统:ubuntu 12.04
 交叉编译环境:arm-linux-gcc 4.3.2
 6410板子内核源码:linux-3.0.1
目标板环境:OK6410-A linux-3.0.1
二、 实验原理

图1-OK6410LED原理图

图2-LED原理图
从上面的原理图可以得知,LED与CPU引脚的连接方法如下,低电平点亮。
LED1 -GPM0
LED2 -GPM1
LED3 -GPM2
LED4 -GPM3

通过上面可以得知,需要先将GPM0设置为输出方式。将相应的寄存器进行配置。然后将GPMDAT寄存器的第0位置0灯亮,置1灯灭。
三、 实验代码
1.编写驱动程序
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <asm/uaccess.h> /* copy_to_user,copy_from_user */
#include <linux/miscdevice.h>
#include <linux/pci.h>
#include <mach/map.h>
#include <mach/regs-gpio.h>
#include <mach/gpio-bank-m.h>
#include <plat/gpio-cfg.h>
#define LED_MAJOR 240
int led_open(struct inode *inode, struct file *filp)
{
	unsigned tmp;
	tmp = readl(S3C64XX_GPMCON);
	tmp = (tmp & ~(0x7U << 1)) | (0x1U);
	writel(tmp, S3C64XX_GPMCON);
	printk("#########open######\n");
	return 0;
}
ssize_t led_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos)
{
	printk("#########read######\n");
	return count;
}
ssize_t led_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos)
{
	char wbuf[10];
	unsigned tmp;
	printk("#########write######\n");
	copy_from_user(wbuf, buf, count);
	switch (wbuf[0])
	{
	case 0: //off
		tmp = readl(S3C64XX_GPMDAT);
		tmp |= (0xfU);
		writel(tmp, S3C64XX_GPMDAT);
		break;
	case 1: //on
		tmp = readl(S3C64XX_GPMDAT);
		tmp &= ~(0xfU);
		writel(tmp, S3C64XX_GPMDAT);
		break;
	default:
		break;
	}
	return count;
}
int led_release(struct inode *inode, struct file *filp)
{
	printk("#########release######\n");
	return 0;
}
struct file_operations led_fops = {
	.owner = THIS_MODULE,
	.open = led_open,
	.read = led_read,
	.write = led_write,
	.release = led_release,
};
int __init led_init(void)
{
	int rc;
	printk("Test led dev\n");
	rc = register_chrdev(LED_MAJOR, "led", &led_fops);
	if (rc < 0)
	{
		printk("register %s char dev error\n", "led");
		return -1;
	}
	printk("ok!\n");
	return 0;
}
void __exit led_exit(void)
{
	unregister_chrdev(LED_MAJOR, "led");
	printk("module exit\n");
	return;
}
module_init(led_init);
module_exit(led_exit);
2.编写Makefile文件
ifneq ($(KERNELRELEASE),)
obj-m := driver_led.o
else
KDIR := /work/linux-3.0.1
all:
	make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-
clean:
	rm -f *.ko *.o *.mod.o *.mod.c *.symvers
endif
3.编写测试文件
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main (void)
{
	int fd;
	char buf[10]={0,1,0,1};
	fd = open("/dev/my_led",O_RDWR);
	if (fd < 0)
	{
		printf ("Open /dev/my_led file error\n");
		return -1;
	}
	while(1)
	{
		write(fd,&buf[0],1);
		sleep(1);
		write(fd,&buf[1],1);
		sleep(1);
	}
	close (fd);
	return 0;
}
四、 实验步骤
1、编译驱动程序和测试程序
在终端中运行:#make命令,编译成功生生下列文件
在终端中运行:#arm-linux-gcc test.c -o test,编译成功生成文件
2、将文件拷贝到SD卡
3、将SD卡插入到OK6410开发板中
4、在OK6410终端中运行程序
加载驱动:#insmod sdcard/driver_led.ko
创建设备文件:# mknod /dev/my_led c 240 0
运行测试文件:#./sdcard/test
卸载驱动程序:#rmmod sdcard/driver_led.ko
5、运行结果
此时可以看到OK6410开发板的4个LED灯一直同时点亮,然后熄灭。
6、更改驱动程序里的代码可实现不同的功能
五、 实验总结
本次实验主要是熟悉交叉编译,测试的步骤,理解驱动程序和测试代码之间的关系,为后续更复杂的程序开发做准备。理解代码的实际意义,可以对代码进行二次开发。在实验过程中遇到的困难:Makefile文件命名要正确,文件内容格式要正确,注意Tab键的使用。
嵌入式实验一:LED灯点亮的更多相关文章
- 通过按键实现LED灯的亮灭(含两种情况)
		#include "stm32f10x.h"// 相当于51单片机中的 #include <reg51.h> #include "stm32f10x_gpio ... 
- (三)开关检测来控制LED灯的亮灭
		开关检测案例一: 具体电路图如下: K1--K4闭合,控制 D1—D4 亮灭 产生的问题: 1.关于 R8 R9 R7 R10 的阻值选择问题,倘若太大的话, 比如10K 不管开关断开还是闭合,好像 ... 
- 第7章     使用寄存器点亮LED灯
		第7章 使用寄存器点亮LED灯 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fir ... 
- 第7章 	使用寄存器点亮LED灯—零死角玩转STM32-F429系列
		第7章 使用寄存器点亮LED灯 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fir ... 
- 诺贝尔物理学奖公布:LED灯将点亮了整个21世纪
		很多其它精彩.破晓博客:点击打开链接 7日.在瑞典首都斯德哥尔摩,瑞典皇家科学院常任秘书诺尔马克(左二)宣布2014年诺贝尔物理学奖得主.新华社发 ■人物 中村修二 勇于追讨酬劳的科学家 被誉为&qu ... 
- [转] 基于TINY4412的Andorid开发-------简单的LED灯控制
		阅读目录 一.编写驱动程序 二.编写代码测试驱动程序 三.编写HAL代码 四.编写Framework代码 五.编写JNI代码 六.编写App 参考资料: <Andriod系统源代码情景分析> ... 
- 基于TINY4412的Andorid开发-------简单的LED灯控制
		参考资料: <Andriod系统源代码情景分析> <嵌入式Linux系统开发完全手册_基于4412_上册> 作者:彭东林 邮箱:pengdonglin137@163.com 平 ... 
- 【转载】基于TINY4412的Andorid开发-------简单的LED灯控制
		阅读目录(Content) 一.编写驱动程序 二.编写代码测试驱动程序 三.编写HAL代码 四.编写Framework代码 五.编写JNI代码 六.编写App 参考资料: <Andriod系统源 ... 
- 基于TINY4412的Andorid开发-------简单的LED灯控制【转】
		本文转载自:http://www.cnblogs.com/pengdonglin137/p/3857724.html 基于TINY4412的Andorid开发-------简单的LED灯控制 阅读 ... 
随机推荐
- 同时在多个 Git 分支上工作,老板要榨干我
			背景 上一篇文章 保持清洁的Git提交记录,三招就够了 ,大家看过后有私下留言说这是非常好用的功能,我突然想到工作中用到的另外一个 Git 功能那也是相当好用,必须全盘托出 作为程序员的我们应该都有一 ... 
- .Net Crank性能测试入门
			Crank 是微软新出的一个性能测试框架,集成了多种基准测试工具,如bombardier.wrk等. Crank通过统一的配置,可以转换成不同基准测试工具命令进行测试.可参考Bombardier Jo ... 
- idea反编译失败 /* compiled code */的解决方法
			最近在研究源码,但是我的idea有点奇怪,有的文件可以反编译,但有的文件反编译后方法内容是 /* compiled code */,查了下说是反编译失败了,都说是插件的原因. 然后我看了下idea的插 ... 
- MySQL全面瓦解28:分库分表
			1 为什么要分库分表 物理服务机的CPU.内存.存储设备.连接数等资源有限,某个时段大量连接同时执行操作,会导致数据库在处理上遇到性能瓶颈.为了解决这个问题,行业先驱门充分发扬了分而治之的思想,对大库 ... 
- LeeCode刷题笔记
			(本来想在LeeCode题目页面上做注释的,结果没找到位置,只好来这里了) 字符串部分: 14.最长公共前缀:编写一个函数来查找字符串数组中的最长公共前缀. 示例 1: 输入: ["flow ... 
- Pacbio三代基因组组装简介
			参考: 视频PPT来自欧易生物讲座:如何开启一个动植物基因组三代de novo项目? 
- expr判断是否为整数
			判断一个变量值或字符串是否为整数 原理:利用expr计算时变量或字符串必须为整数的规则,把变量和一个整数(非零) 相加,判断命令返回是否为0,0--成功为整数 #!/bin/bash expr $1 ... 
- 【Meta】16s rRNA和16s rDNA的区别
			在文章或宣传稿中经常看到两者滥用,实际上是不同的. 首先是各个字母的含义: 16S中的"S"是一个沉降系数,亦即反映生物大分子在离心场中向下沉降速度的一个指标,值越高,说明分子越大 ... 
- 短序列组装Sequence Assembly(转载)
			转载:http://blog.sina.com.cn/s/blog_4af3f0d20100fq5i.html 短序列组装(Sequence assembly)几乎是近年来next-generatio ... 
- Machine Learning读书会,面试&算法讲座,算法公开课,创业活动,算法班集锦
			Machine Learning读书会,面试&算法讲座,算法公开课,创业活动,算法班集锦 近期活动: 2014年9月3日,第8次西安面试&算法讲座视频 + PPT 的下载地址:http ... 
