现在的位置: 首页 > 综合 > 正文

linux下的led驱动

2013年10月02日 ⁄ 综合 ⁄ 共 2861字 ⁄ 字号 评论关闭
 

转载请注明出处:http://blog.csdn.net/charistain_huang     
     文章中有什么不正确的地方恳请请各位网友指点
********************************************************
*****作者:黄仁军                                                                     *******
*****联系email:957626485@qq.com                                      *******
********************************************************

led设备介于字符设备和块设备之间我们称之为misc(杂设备),其实按linux下的驱动位置来讲还是一种字符设备。

本驱动用到的API:

misc_register(miscdevice *);  //注册一个misc设备

misc_deregister(miscdevice * ); //卸载一个misc设备

s3c2410_gpio_cfgpin(S3C2410_GPB5,S3C2410_GPB5_OUTP);  //将对应的引脚配置为输出

s3c2410_gpio_setpin(S3C2410_GPB5,0);  //将对应引脚输出低电平

 

 /*
  * A simple LED driver programer
  *
  * Written by huang renjun
  * All Rights Reserved
  */
 
#include <linux/miscdevice.h>
#include <linux/delay.h>
#include <asm/irq.h>
#include <mach/regs-gpio.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>

#define DEVICE_NAME "leds"

//the next two structs used to config the pins for leds
static unsigned long led_table[] = {
 S3C2410_GPB5,
 S3C2410_GPB6,
 S3C2410_GPB7,
 S3C2410_GPB8,
};

static unsigned int led_cfg_table[] = {
 S3C2410_GPB5_OUTP,
 S3C2410_GPB6_OUTP,
 S3C2410_GPB7_OUTP,
 S3C2410_GPB8_OUTP,
};

//cmd:  0---off  1---on
//arg: the led number(0----3)
static int s3c2440_led_ioctl(
 struct inode *inode,
 struct file  *file,
 unsigned int cmd,
 unsigned long arg)
{
 switch(cmd){
  case 0:
  case 1:
   if(arg > 3) {
    return -EINVAL;
   }
   s3c2410_gpio_setpin(led_table[arg],!cmd);
   return 0;
  default:
   return -EINVAL;
 }

}

static struct file_operations dev_ops = {
 .owner = THIS_MODULE,
 .ioctl = s3c2440_led_ioctl,
};

static struct miscdevice misc = {
 .minor = MISC_DYNMIC_MINOR, 
 .name  = DEVICE_NAME,
 .fops = &dev_ops,
};

static int __init dev_init()
{
 int i;
 int ret;
 for(i = 0; i < 4; i++) {
  s3c2410_gpio_cfgpin(led_table[i],led_cfg_table[i]);
  s3c2410_gpio_setpin(led_table[i],0); 
 }
 ret = misc_register(&misc);
 printk(DEVICE_NAME "initialized\n");
 return ret;
}

static void __exit dev_exit()
{
 misc_deregister(&misc);
}

module_init(dev_init);
module_exit(dev_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Hhuang renjun");

测试程序:

      

 /*
  * A  LED test programer
  *
  * Written by huang renjun
  * All Rights Reserved
  */

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/ioctl.h>

int main(int argc, char **argv)
{
 int fd;
 int led_num;  //led编号(0---3)
 int cmd ;//控制led 0:off  1:on
 
 if(argc !=3 || sscanf(argv[1],"%d", &led_num)!=1 ||sscanf(argv[2], "%d", &cmd)!=1
  || cmd<0 ||cmd >1 || led_num < 0 || led_num >3) {
  fprintf(stderr, "param erro!\n");
  exit(1);
  }
 fd = open("/dev/leds",0);
 if(fd <0){
  perror("open device leds error!\n");
  exit(1);
 }
 ioctl(fd, cmd, led_num);
 close(fd);
 return 0;
 
}

 

抱歉!评论已关闭.