misc类型的gpio驱动模版-linu

原创 2015年02月03日 16:08:46


     还是闲着没事,丢个模版就跑惊讶


#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/miscdevice.h>
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/moduleparam.h>
#include <linux/slab.h>
#include <linux/ioctl.h>
#include <linux/cdev.h>
#include <linux/delay.h>
 
#include <linux/gpio.h>
#include <mach/gpio.h>
#include <plat/gpio-cfg.h>


#define DEVICE_NAME "av5260-leds"
#define LED_DEFAULT 0

static int led_gpios[] = {
	EXYNOS5260_GPX3(1), //r
	EXYNOS5260_GPX3(2), //g
	EXYNOS5260_GPX1(3), //b
};

#define LED_NUM		ARRAY_SIZE(led_gpios)


static long av5260_leds_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
	switch(cmd) {
		case 0:
		case 1:
			if (arg > LED_NUM) {
				return -EINVAL;
			}

			gpio_set_value(led_gpios[arg], cmd);
			//printk(DEVICE_NAME": %d %d\n", arg, cmd);
			break;

		default:
			return -EINVAL;
	}

	return 0;
}

static struct file_operations av5260_led_dev_fops = {
	.owner			= THIS_MODULE,
	.unlocked_ioctl	= av5260_leds_ioctl,
};

static struct miscdevice av5260_led_dev = {
	.minor			= MISC_DYNAMIC_MINOR,
	.name			= DEVICE_NAME,
	.fops			= &av5260_led_dev_fops,
};

static int __init av5260_led_dev_init(void) {
	int ret;
	int i;

	for (i = 0; i < LED_NUM; i++) {
		ret = gpio_request(led_gpios[i], "LED");
		if (ret) {
			printk("%s: request GPIO %d for LED failed, ret = %d\n", DEVICE_NAME, led_gpios[i], ret);
			return ret;
		}

		s3c_gpio_cfgpin(led_gpios[i], S3C_GPIO_OUTPUT);
		gpio_set_value(led_gpios[i], LED_DEFAULT);
	}

	ret = misc_register(&av5260_led_dev);

	printk(DEVICE_NAME"\tinitialized.\n");

	return ret;
}

static void __exit av5260_led_dev_exit(void) {
	int i;

	for (i = 0; i < LED_NUM; i++) {
		gpio_free(led_gpios[i]);
	}

	misc_deregister(&av5260_led_dev);
}

module_init(av5260_led_dev_init);
module_exit(av5260_led_dev_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Arashi Vision Inc.");


/*
Makefile:

obj-$(CONFIG_AV5260_LEDS)   += av5260_led.o

Kconfig:

config AV5260_LEDS
	tristate "LED Support for ArashiVision AV5260 GPIO LEDs"
	#depends on MACH_AV5260
	default y
	help
	  This option enables support for LEDs connected to GPIO lines
	  on AV5260 boards.

*/


Linux内核学习-misc杂项设备驱动

Linux里面的misc杂项设备是主设备号为10的驱动设备,它的注册跟使用比较的简单,所以比较适用于功能简单的设备。它有自己的设备结构体: struct miscdevice  {     int m...

linu spi子系统驱动开发笔记之实例(1)

linu spi子系统驱动开发实例 以W25Q32BV芯片为例子,介绍了 linu spi子系统驱动开发流程。platform_device设备定义及注册。platform_driver设备驱动实现。...

linu spi子系统驱动开发笔记之实例(2)

Linux SPI子系统驱动开发 介绍基于SPI子系统驱动开发框架,并以FS_S5PC100上的M25P10芯片为例(内核版本2.6.29),写了一个Linux SPI驱动实例。 实现流程:实现pla...

Linux misc 设备驱动

概述Linux内核中将无法归类的设备定义为misc设备,misc设备共享一个主设备号(MISC_MAJOR 10),各自的次设备号不同,miscdevice的实现位于drivers/char/misc...

Linux misc设备驱动理解

Linux里面的misc杂项设备是主设备号为10的驱动设备,它的注册跟使用比较的简单,所以比较适用于功能简单的设备。正因为简单,所以它通常嵌套在platform 总线驱动中,配合总线驱动达到更复杂,多...
  • armwind
  • armwind
  • 2016年08月11日 21:17
  • 4737

linux设备驱动归纳总结(十):1.udev&misc

CU首页 ┊ fh265>>博客 微博 相册 个人中心 好友 消息 [退出] ┊ 随便看看   博文 博主 相册  投票 活动 发博文 公告...
  • fh400
  • fh400
  • 2011年11月02日 18:02
  • 886

linux MISC 驱动模型分析

linux MISC 驱动模型分析         阅读led驱动程序的代码的时候,没有发现ldd3中提到的各种字符设备注册函数,而是发现了一个misc_register函数,这说明led设备...

linux 3.18 -- iic,input,misc,三轴加速度设备驱动(一)

三轴加速度设备驱动 i2c体系架构图: 一 层次架构: 1. I2C核心层 2. I2C总线驱动层 3. I2C设备驱动层 I2C核心层 提供了I2C总线驱动和设备驱动的注册和注销方法; ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:misc类型的gpio驱动模版-linu
举报原因:
原因补充:

(最多只允许输入30个字)