买板子有段时间了,但一直总是有事,所以直到今天才开始学习 以前看过点驱动的内容,所以首先看的是自带的驱动,不过悲催的发现使用的好像是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);
|