分享

LED驱动(原创)

 champion_xu 2012-04-21
#include<linux/kernel.h>
#include<linux/module.h>
#include<linux/init.h>
#include<linux/fs.h>
#include<linux/pci.h>
#include<linux/ioctl.h>
#include<linux/types.h>
#include<linux/cdev.h>
#include<linux/device.h>
#include<linux/gpio.h>
#include<mach/hardware.h>
#include<mach/regs-gpio.h>
#include<plat/gpio-cfg.h>
#include <mach/map.h>

#define DEVICE_NAME "s3c6410leds"
#define LED_ON 1
#define LED_OFF 0
dev_t devid;


static int leds_open(struct inode *inode , struct file *file)
{
  unsigned tmp;

  for(tmp=0;tmp<4;tmp++)
  s3c_gpio_cfgpin(S3C64XX_GPM(tmp),S3C_GPIO_SFN(1));
 
  return 0;
}

static long leds_ioctl( struct file *filp,unsigned int cmd,
                        unsigned long arg)
                      
{

  if(arg>4) return -EINVAL;

  switch(cmd)
  {
    case LED_ON:  gpio_set_value(S3C64XX_GPM(arg),0);
                                 return 0;
    case LED_OFF: gpio_set_value(S3C64XX_GPM(arg),1);
                                  return 0;
    default: return -EINVAL;
  }
}

static struct file_operations leds_ops = {
    .owner = THIS_MODULE,
    .open = leds_open,
    .unlocked_ioctl = leds_ioctl,
};

static struct cdev *cdev_led;
static struct class *led_class;

static int __init s3c6410_leds_init(void)
{
  int val;
  unsigned tmp;
 
  tmp = readl(S3C64XX_GPMPUD); //pull up gpiom0~3
  tmp &= ~(0xffff);
  tmp |= 0xaa;
  writel(tmp,S3C64XX_GPMPUD);

//  devid = MKDEV(LED_MAJOR,0);
//  val = register_chrdev_region(devid,1,DEVICE_NAME);
  val = alloc_chrdev_region(&devid,0,1,DEVICE_NAME);
  if(val) return -1;

  cdev_led = cdev_alloc();
  cdev_init(cdev_led,&leds_ops);
  val = cdev_add(cdev_led,devid,1);
  if(val)
  {
 //   printk(KERN_INFO "Add device led error!\n");
    return -1;
  }
 
  led_class = class_create(THIS_MODULE,DEVICE_NAME);
  device_create(led_class,NULL,devid,NULL,"%s",DEVICE_NAME);

 // printk(KERN_INFO "LED Initilized I'm in! ^_^ \n");
  return 0;
}

static void __exit s3c6410_leds_exit(void)
{
  cdev_del(cdev_led);
  device_destroy(led_class,devid);
  class_destroy(led_class);  
  unregister_chrdev_region(devid, 1);
}

module_init(s3c6410_leds_init);
module_exit(s3c6410_leds_exit);
 

MODULE_AUTHOR("embedded lover");
MODULE_DESCRIPTION("s3c6410 led test");
MODULE_LICENSE("GPL");

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多