ok6410使用2.6内核驱动规范重写——led

买板子有段时间了,但一直总是有事,所以直到今天才开始学习
以前看过点驱动的内容,所以首先看的是自带的驱动,不过悲催的发现使用的好像是2.4内核的方法写的,不知道是我这的资料没有更新还是你们官方一直没有对这个上心。
反正都是学习,所以打算把里面的驱动重写,下面是我昨天晚上做的led和pwm的驱动,以后会持续更新!

/*************************************************************************
    > File Name: s3c6410_leds_new.c
    > Author: wangermao
    > Mail: wangermao@gmail.com 
    > Created Time: 2012年05月27日 星期天 15时34分36秒
 ************************************************************************/
#include <linux/miscdevice.h>
#include <linux/delay.h>
#include <asm/irq.h>
#include <mach/hardware.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/mm.h>
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/delay.h>
#include <linux/moduleparam.h>
#include <linux/slab.h>
#include <linux/errno.h>
#include <linux/ioctl.h>
#include <linux/cdev.h>
#include <linux/string.h>
#include <linux/list.h>
#include <linux/pci.h>
#include <asm/uaccess.h>
#include <asm/atomic.h>
#include <asm/unistd.h>
#include <asm/ioctl.h>

#include <mach/map.h>
#include <mach/regs-clock.h>
#include <mach/regs-gpio.h>

#include <plat/gpio-cfg.h>
#include <mach/gpio-bank-e.h>
#include <mach/gpio-bank-m.h>

#define GPIO_LED_MAJOR 0

//#define LED_MAGIC 1990

#ifndef LED_MAGIC
	#define LED_ON	0
	#define LED_OFF 1
#else
	#define LED_ON _IO(LED_MAGIC, 0)
	#define LED_OFF _IO(LED_MAGIC, 1)
#endif

static int gpio_led_major = GPIO_LED_MAJOR;
static struct cdev gpio_led_cdev;

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

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

static ssize_t GPIO_LED_read(struct file *filp, char __user *buf, size_t size, loff_t *pps)
{
	return size;
}

static ssize_t GPIO_LED_write(struct file *filp, const char __user *buf, size_t size, loff_t *pps)
{
	return size;
}

static long GPIO_LED_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
	unsigned int tmp;
	switch (cmd)
	{
		case LED_ON:
			tmp = ioread32(S3C64XX_GPMDAT);
			tmp &= ~(0x01<<arg); 
			iowrite32(tmp, S3C64XX_GPMDAT);
			break;
		case LED_OFF:
			tmp = ioread32(S3C64XX_GPMDAT);
			tmp |= (0x01<<arg);
			iowrite32(tmp, S3C64XX_GPMDAT);
			break;
		default:
			break;
			
	}
	return 0;
}

static struct file_operations gpio_led_fops = {
	.owner		=	THIS_MODULE,
	.open		=	GPIO_LED_open,
	.read		=	GPIO_LED_read,
	.write		=	GPIO_LED_write,
	//.ioctl		=	GPIO_LED_ioctl,
	.unlocked_ioctl		=	GPIO_LED_ioctl,
	.release	=	GPIO_LED_release,
};

static void gpio_led_setup_cdev(struct cdev *dev, int minor, struct file_operations *fops)
{
	int err, devno = MKDEV(gpio_led_major, minor);

	cdev_init(dev, fops);
	dev->owner = THIS_MODULE;
	dev->ops = fops;

	err = cdev_add(dev, devno, 1);
	if (err)
		printk(KERN_NOTICE "Error adding cdev");
}

int GPIO_LED_init(void)
{
	int ret,tmp;
	dev_t devno = MKDEV(GPIO_LED_MAJOR, 0);
	if (devno)
		ret = register_chrdev_region(devno, 1, "gpio_led");
	else {
		ret = alloc_chrdev_region(&devno, 0, 1, "gpio_led");
		gpio_led_major = MAJOR(devno);
	}

	if (ret < 0)
		return ret;

	gpio_led_setup_cdev(&gpio_led_cdev, 0, &gpio_led_fops);

	tmp = ioread32(S3C64XX_GPMCON);
	tmp &= (~0xffff);
	tmp |= 0x1111;
	iowrite32(tmp, S3C64XX_GPMDAT);

	tmp = ioread32(S3C64XX_GPMPUD);
	tmp &= (~0xff);
	tmp |= 0xaa;
	iowrite32(tmp, S3C64XX_GPMDAT);

	tmp = ioread32(S3C64XX_GPMDAT);
	tmp |= 0xf;
	iowrite32(tmp, S3C64XX_GPMDAT);

	printk(KERN_NOTICE "led init\n");

	return ret;
}

void GPIO_LED_exit(void)
{
	cdev_del(&gpio_led_cdev);
	unregister_chrdev_region(MKDEV(gpio_led_major, 0), 1);
	printk(KERN_NOTICE "uninstalled!\n");
}

MODULE_AUTHOR("WANGERMAO");
MODULE_LICENSE("GPL");

module_init(GPIO_LED_init);
module_exit(GPIO_LED_exit);


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值