Linux下的led驱动程序,ok6410

本程序采用动态映射的方法控制led,硬件平台为飞凌的ok6410

led.h:定义控制命令

#ifndef  _LED_H
#define  _LED_H

#define LED_MAGIC 'M'
#define LED_ON  _IO(LED_MAGIC, 0)
#define LED_OFF _IO(LED_MAGIC, 1)

#endif

驱动程序led.c

#include <linux/module.h>
#include <linux/init.h>
#include <linux/cdev.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include "led.h"

#define  LEDCON 0x7f008820//与具体平台相关
#define  LEDDAT 0x7f008824

unsigned int *led_config;
unsigned int *led_data;

struct cdev leddev;
dev_t devno;

static int led_open(struct inode *inode, struct file *filp)
{
	return 0;
}

static int led_close(struct inode *inode, struct file *filp)
{
	return 0;
}

static long led_ioctl(struct file* filp, unsigned int cmd, unsigned long arg)
{
	switch (cmd)
	{
		case LED_ON:
			writel(0x00, led_data);
			break;
		case LED_OFF:
			writel(0xff, led_data);
			break;
		default:
			return -EINVAL;
	}
	return 0;
}

struct file_operations ledfops = {
	.open = led_open,
	.unlocked_ioctl = led_ioctl,
	.release = led_close,
};

static int led_init(void)
{
	/*注册字符设备*/
	cdev_init(&leddev, &ledfops);
	alloc_chrdev_region(&devno, 0, 1, "leddev");
	cdev_add(&leddev, devno, 1);

	/*映射配置寄存器*/
	led_config = ioremap(LEDCON, 4);
	/*低四位设置为输出模式,这里暴力简单的解决没做处理*/
	writel(0x00001111, led_config);
	/*映射数据寄存器*/
	led_data = ioremap(LEDDAT, 4);
	printk("led_init\n");
	return 0;
}

static void led_exit(void)
{
	iounmap(led_config);
	iounmap(led_data);
	cdev_del(&leddev);
	unregister_chrdev_region(devno, 1);
	printk("led_exit\n");
}

module_init(led_init);
module_exit(led_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("liuwei");
MODULE_DESCRIPTION("char driver");

应用程序led_app.c

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

int main(int argc, char *argv[])
{
	int cmd;
	if (argc < 2)
	{
		printf("Usage:%s <cmd>\n", argv[0]);
		return 0;
	}
	cmd = atoi(argv[1]);

	int fd = open("/dev/leddev", O_RDWR);
	if (fd == -1)
	{
		perror("open");
		return -1;
	}
	if (cmd == 1)
		ioctl(fd, LED_ON);
	else
		ioctl(fd, LED_OFF);

	close(fd);
	return 0;
}

编译程序,使用命令mknod /dev/leddev c 252 0创建设备节点,主设备号可通过cat /proc/devices

运行应用程序

./led_app 0                   熄灭led

./led_app 1                   点亮led

时间: 2024-08-02 15:26:25

Linux下的led驱动程序,ok6410的相关文章

linux下块设备驱动程序

块设备不能向字符设备那样访问,而是要先将请求放入队列,优化调整顺序后再执行,这种访问方式称为"电梯调度算法". 本篇文章通过ramdisk.nand flash.nor flash来讲解如何写块设备驱动程序. 一.ramdisk 1.因为块设备驱动程序是将请求放入队列然后调整顺序后执行,所以我们需要先定义请求队列: static unsigned char *ramblock_buf; ramblock_buf = kzalloc(RAMBLOCK_SIZE, GFP_KERNEL);

Linux下PCI设备驱动程序开发 --- PCI驱动程序实现(三)

三.PCI驱动程序实现 1. 关键数据结构 PCI设备上有三种地址空间:PCI的I/O空间.PCI的存储空间和PCI的配置空间.CPU可以访问PCI设备上的所有地址空间,其中I/O空间和存储空间提供给设备驱动程序使用,而配置空间则由Linux内核中的PCI初始化代码使用.内核在启动时负责对所有PCI设备进行初始化,配置好所有的PCI设备,包括中断号以及I/O基址,并在文件/proc/pci中列出所有找到的PCI设备,以及这些设备的参数和属性. Linux驱动程序通常使用结构(struct)来表示

Linux下的编程实战【转】

一篇比较不错的文章, 降到了 makefile make , gcc编译器,GDB调试器, Linux文件系统,Linux文件API,.C语言库函数(C库函数的文件操作实际上是独立于具体的操作系统平台的),进程控制与进程通信编程 1.Linux进程 Linux进程在内存中包含三部分数据:代码段.堆栈段和数据段.代码段存放了程序的代码.代码段可以为机器中运行同一程序的数个 进程共享.堆栈段存放的是子程序(函数)的返回地址.子程序的参数及程序的局部变量.而数据段则存放程序的全局变量.常数以及动态数

Linux下的C编程实战

Linux下的C编程实战(一) ――开发平台搭建 1.引言 Linux操作系统在服务器领域的应用和普及已经有较长的历史,这源于它的开源特点以及其超越Windows的安全性和稳定性.而近年来, Linux操作系统在嵌入式系统领域的延伸也可谓是如日中天,许多版本的嵌入式Linux系统被开发出来,如ucLinux.RTLinux.ARM-Linux等等. 在嵌入式操作系统方面,Linux的地位是不容怀疑的,它开源.它包含TCP/IP协议栈.它易集成GUI. 鉴于Linux操作系统在服务器和嵌入式系统领

【Linux驱动】TQ2440 LED驱动程序

★总体介绍 LED驱动程序主要实现了TQ2440开发板上的4个LED灯的硬件驱动,实现了对引脚GPIOB5.GPIOB6.GPIOB7.GPIOB8的高低电平设置(common-smdk.c中已经实现了对引脚的配置),利用测试程序调用该驱动程序,通过命令控制LED灯的亮灭. ★详细介绍 1.驱动程序代码:My_led.c #include <linux/module.h> #include <linux/kernel.h> #include <linux/fs.h> #

在Linux下的中断方式读取按键驱动程序

// 在Linux下的中断方式读取按键驱动程序 //包含外部中断 休眠 加入poll机制 // 采用异步通知的方式 // 驱动程序发 ---> app接收 (通过kill_fasync()发送) // 为了使设备支持异步通知机制,驱动程序中涉及以下3项工作: // 1. 支持F_SETOWN命令,能在这个控制命令处理中设置filp->f_owner为对应进程ID. // 不过此项工作已由内核完成,设备驱动无须处理. // 2. 支持F_SETFL命令的处理,每当FASYNC标志改变时,驱动程序

ok6410之led驱动程序编写

led驱动程序编写 本文主要包含三部分,led驱动程序led.c编写,编译驱动程序的makefile的编写,以及使用驱动程序的应用程序led_app的编写 一.led.c编写 1 #include <linux/module.h> 2 #include <linux/init.h> 3 #include <linux/cdev.h> 4 #include <linux/fs.h> 5 #include <linux/io.h> 6 #includ

Linux下编写驱动程序(VFS)

转:http://hi.baidu.com/firstm25/item/8fe022155e1fa78988a9568f 摘要:设备驱动程序是操作系统内核与机器硬件之间的接口.设备驱动程序为应用程序屏蔽了硬件的细节.那么驱动程序如何书写实现这一接口功能是本文讨论的重点,并以一简单的驱动程序介绍书写细节. 在用户进程调用驱动程序时,系统进入核心态,这时不再是抢先式调度.(应用程序一般是在用户态下进行)也就是说系统必须在驱动程序的子函数返回后才能进行其它的工作,即驱动程序不能进入死循环. 字符型设备

LED驱动程序 S3C6410

这两天写了个LED驱动程序,网上也看了好多的帖子. 开始思路很清晰了,就是先看电路图,发现LED灯是接在GPM端口上的, 然后看S3C6410数据手册,先向GPMCON口写命令字,让GPM0-5设置为输出,再向GPMDAT口写数据字,在GPM0-5引脚拉低或拉高电平, 从而控制LED的亮灭. 1.电路图 很显然LED灯是接在GPM口引脚下面的 2.数据手册 3.LED驱动程序 #include <linux/module.h> #include <linux/kernel.h> #