简单的led驱动程序设计

基于ok6410:

led驱动程序:

vim led.c

#include<linux/kernel.h>
#include<linux/module.h>
#include<linux/init.h>
#include<linux/io.h>
#include<linux/fs.h>
#include<linux/cdev.h>
#include"led.h"
#include<mach/gpio-bank-k.h>

#define GPMCON 0x7f008820
#define GPMDAT 0x7f008824

unsigned int *led_config;
unsigned int *led_data;

struct cdev cdev;
dev_t devno;

long led_loctl(struct file *filp, unsigned int cmd, unsigned long arg) //实现对硬件的控制
{
switch(cmd)
{
case LED_ON:
writel(0x00,led_data);
return 0;

case LED_OFF:
writel(0xf,led_data);想寄存器写入数据,驱动专用函数
return 0;

default:
return -EINVAL;

}

}
int led_open(struct inode *node, struct file *filp)  //open中实现硬件初始化
{
led_config = ioremap(GPMCON,4);
writel(0x1111,led_config);
led_data = ioremap(GPMDAT,4);//将寄存器映射为虚拟内存。
return 0;
}

const struct file_operations led_fops =
{
.open = led_open,
.unlocked_ioctl = led_loctl,
};

static int led_init() //模块入口函数
{
cdev_init(&cdev, &led_fops);
alloc_chrdev_region(&devno, 0, 1, "myled");
cdev_add(&cdev, devno, 1);
return 0;
}
static void led_exit() //模块注销
{
cdev_del(&cdev);
unregister_chrdev_region(devno, 1);

}

module_init(led_init);
module_exit(led_exit);

头文件的包含必要的命令:

vim led.h

#define LED_MAGIC ‘l‘ //定义幻数
#define LED_ON _IO(LED_MAGIC,0)
#define LED_OFF _IO(LED_MAGIC,1)

应用程序编写:

vim led_app.c

#include"led.h"
#include<stdio.h>
#include<sys/fcntl.h>
#include<sys/ioctl.h>
#include<sys/stat.h>
#include<sys/types.h>

int main(int argc,char *argv[])
{
int cmd;
int fd;
if(argc<2){
printf("please enter the second para!\n");
return 0;}
cmd = atoi(argv[1]);
fd = open("/dev/myled",O_RDWR);
if(cmd == 1)
ioctl(fd,LED_ON);//设备驱动程序中对设备的I/O通道进行管理的函数。
else
ioctl(fd,LED_OFF);
return 0;}

安装模块,安装设备文件,执行编译好的应用程序。

时间: 2024-10-08 14:49:42

简单的led驱动程序设计的相关文章

led驱动程序设计

LED的驱动程序很简单,按照张字符型设备驱动设计方法顺下来即可实现,这里主要讲几个注意事项. 一.在linux系统中,操作硬件不能够使用物理地址,一定要用虚拟地址.将物理地址转化为虚拟地址的函数如下: #define    ioremap(cookie,size) 其中cookie为要转化的物理地址,size为转化空间的大小,单位为字节.返回值为转化后的虚拟地址. 二.在执行程序时我们需要顺带输入参数进去,但是是以字符串的形式输入的,不方便操控.所以用atoi函数将字符串转化为整数,函数原型如下

[国嵌攻略][117][LED驱动程序设计]

LED程序设计 1.编写内核模块 2.搭建字符驱动框架 3.实现设备方法 头文件 <linux/io.h> writel() leddev.h //设备命令 #define LED_MAGIC 'L' //LED幻数 #define LED_ON _IO(LED_MAGIC, 0) //打开LED #define LED_OFF _IO(LED_MAGIC, 1) //关闭LED leddev.c /***********************************************

专题11 LED驱动程序设计

一.理论分析1.现实生活中,对一个设备除了能够读写之外,我们还希望能够对设备进行控制,比如说LED的亮灭,电机的转动等.2.一般希望能从应用程序传递命令给内核从而使得能够调用控制函数实现不同的控制.3.在用户空间,使用ioctl系统调用来控制设备:(应用程序接口)int ioctl(int fd,unsigned long cmd,...):4.重点是第二个参数cmd,他实质上就是一个整数.分成几块构成.5.在内核空间,相应的设备函数应该是(设备驱动方法)cmd是通过应用程序传递进来的.二.定义

【转】linux设备驱动程序之简单字符设备驱动

原文网址:http://www.cnblogs.com/geneil/archive/2011/12/03/2272869.html 一.linux系统将设备分为3类:字符设备.块设备.网络设备.使用驱动程序: 1.字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据.字符设备是面向流的设备,常见的字符设备有鼠标.键盘.串口.控制台和LED设备等.2.块设备:是指可以从设备的任意位置读取一定长度数据的设备.块设备包括硬盘.磁盘.U盘和SD卡等.

arm-linux字符设备驱动开发之---简单字符设备驱动

一.linux系统将设备分为3类:字符设备.块设备.网络设备.使用驱动程序: 1.字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据.字符设备是面向流的设备,常见的字符设备有鼠标.键盘.串口.控制台和LED设备等.2.块设备:是指可以从设备的任意位置读取一定长度数据的设备.块设备包括硬盘.磁盘.U盘和SD卡等. 每一个字符设备或块设备都在/dev目录下对应一个设备文件.linux用户程序通过设备文件(或称设备节点)来使用驱动程序操作字符设备和

实验报告 实验4 外设驱动程序设计

北京电子科技学院(BESTI) 实     验    报     告 课程: 密码系统设计基础                                                               班级: 1352班.1353班 姓名:王玥.刘浩晨                                                                    学号:20135318.20135232 成绩:                      

实验四 外设驱动程序设计(小组)

小组成员:20135305姚歌 20135310陈巧然 一.实验目的与要求 掌握实时系统应用和驱动程序的编写 选择某个接口电路(串口.LED.LCD.USB) 平台可选择Windows或Linux 二.实验内容 在ARM开发平台下,选择某个进行接口电路驱动程序设计 三.实验步骤 1.阅读和理解源代码进入/arm2410cl/exp/drivers/01_demo,使用vi 编辑器或其他编辑器阅读理解源代码2.编译驱动模块及测试程序上面介绍了在 Makefile 中有两种编译方法,可以在本机上使用

虚拟网卡TUN/TAP 驱动程序设计原理

昨天韦哥写了<Linux下Tun/Tap设备通信原理>一文,只提到了两个使用Tun的用户进程之间的通信路径,并没有说明Tun虚拟网卡驱动是如何实现的,而正好看到了这里的一篇讲解这方面的文章,果断转载了,感谢作者,原文在这里:虚拟网卡TUN/TAP 驱动程序设计原理 简介 虚拟网卡Tun/tap驱动是一个开源项目,支持很多的类UNIX平台,OpenVPN和Vtun都是基于它实现隧道包封装.本文将介绍tun/tap驱动的使用并分析虚拟网卡tun/tap驱动程序在linux环境下的设计思路. tun

基于S3C2440的linux-3.6.6移植——LED驱动【转】

本文转载自:http://www.voidcn.com/blog/lqxandroid2012/article/p-625005.html 目前的linux版本的许多驱动都是基于设备模型,LED也不例外. 简单地说,设备模型就是系统认为所有的设备都是挂接在总线上的,而要使设备工作,就需要相应的驱动.设备模型会产生一个虚拟的文件系统——sysfs,它给用户提供了一个从用户空间去访问内核设备的方法,它在linux里的路径是/sys.如果要写程序访问sysfs,可以像读写普通文件一样来操作/sys目录