转载请注明出处: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;
}