实验一: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灯点亮的更多相关文章

  1. 通过按键实现LED灯的亮灭(含两种情况)

    #include "stm32f10x.h"// 相当于51单片机中的 #include <reg51.h> #include "stm32f10x_gpio ...

  2. (三)开关检测来控制LED灯的亮灭

    开关检测案例一: 具体电路图如下: K1--K4闭合,控制 D1—D4 亮灭 产生的问题: 1.关于 R8 R9 R7 R10 的阻值选择问题,倘若太大的话,  比如10K 不管开关断开还是闭合,好像 ...

  3. 第7章 使用寄存器点亮LED灯

    第7章     使用寄存器点亮LED灯 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fir ...

  4. 第7章 使用寄存器点亮LED灯—零死角玩转STM32-F429系列

    第7章     使用寄存器点亮LED灯 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fir ...

  5. 诺贝尔物理学奖公布:LED灯将点亮了整个21世纪

    很多其它精彩.破晓博客:点击打开链接 7日.在瑞典首都斯德哥尔摩,瑞典皇家科学院常任秘书诺尔马克(左二)宣布2014年诺贝尔物理学奖得主.新华社发 ■人物 中村修二 勇于追讨酬劳的科学家 被誉为&qu ...

  6. [转] 基于TINY4412的Andorid开发-------简单的LED灯控制

    阅读目录 一.编写驱动程序 二.编写代码测试驱动程序 三.编写HAL代码 四.编写Framework代码 五.编写JNI代码 六.编写App 参考资料: <Andriod系统源代码情景分析> ...

  7. 基于TINY4412的Andorid开发-------简单的LED灯控制

    参考资料: <Andriod系统源代码情景分析> <嵌入式Linux系统开发完全手册_基于4412_上册> 作者:彭东林 邮箱:pengdonglin137@163.com 平 ...

  8. 【转载】基于TINY4412的Andorid开发-------简单的LED灯控制

    阅读目录(Content) 一.编写驱动程序 二.编写代码测试驱动程序 三.编写HAL代码 四.编写Framework代码 五.编写JNI代码 六.编写App 参考资料: <Andriod系统源 ...

  9. 基于TINY4412的Andorid开发-------简单的LED灯控制【转】

    本文转载自:http://www.cnblogs.com/pengdonglin137/p/3857724.html 基于TINY4412的Andorid开发-------简单的LED灯控制   阅读 ...

随机推荐

  1. [luogu5426]Balancing Inversions

    由于交换是相邻交换,所以分为两类:1.左右区间内部交换,那么一定会让逆序对数量$\pm 1$,也就是说如果没有左右区间之间交换,那么答案就是$|ansL-ansR|$(ans表示逆序对数量)2.左右区 ...

  2. 青龙+Nvjdc短信登陆对接Xdd-plus推送+Ninja CK登陆教程(11.23更新)

    一.准备工作 1.shh工具(powshell.gitbash等等) 2.购买一台云服务器(阿里云.腾讯云都可以) 3.安装宝塔面板 宝塔Linux面板安装教程 - 2021年8月18日更新 - 7. ...

  3. Codeforces 1290F - Making Shapes(数位 dp)

    Codeforces 题面传送门 & 洛谷题面传送门 数位 dp 好题. 首先,由于是凸包,一但向量集合确定,凸包的形态肯定就已经确定了.考虑什么样的向量集合能够组成符合条件的凸包,我们假设第 ...

  4. C++ and OO Num. Comp. Sci. Eng. - Part 2.

    本文参考自<C++ and Object-Oriented Numeric Computing for Scientists and Engineers>. 1. Basic Types ...

  5. python11文件读写模块

    将文件的打开和关闭,交给上下文管理工具with去实现. def read_file(): """ 读取文件 :return: """ fil ...

  6. perl 获取目录信息

    1 #!/usr/bin/perl -w 2 use strict; 3 use FindBin qw($Bin $Script); 4 5 my $rp=$Bin; 6 print "th ...

  7. Redis的六种特性 场景

    Redis的六种特性 l Strings l Hashs l Lists l Sets l Sorted Sets l Pub/Sub Redis各特性的应用场景 Strings Strings 数据 ...

  8. 数据库之JDBC

    1.简单认识一下JDBC 1).JDBC是什么? java database connection       java数据库连接 作用:就是为了java连接mysql数据库嘛 要详细的,就面向百度编 ...

  9. linux "/tmp/crontab.14QJ49":1: bad minute errors in crontab file, can't install" 错误

    目录 报错及原因 crontab语句格式 报错及原因 这个错误的原因是crontab格式错误 "/tmp/crontab.sdXvj4":5: bad minute errors ...

  10. LeetCode 从头到尾打印链表

    LeetCode 从头到尾打印链表 题目描述 输入一个链表头节点,从尾到头反过来返回每个节点的值(用数组返回). 示例 1: 输入:head = [1,3,2] 输出:[2,3,1] 一得之见(Jav ...