3个程序绝对可用,cmd=0,1例程就有,这里用的是定义命令和检查命令,以及在测试程序怎么应用这些命令。。
1。首先是memdev.h
#ifndef _MEMDEV_H_
#define _MEMDEV_H_
#include <linux/ioctl.h>
#define MEMDEV_IOC_MAGIC 'Z'
#define SET_LED_LIGHTED _IOW(MEMDEV_IOC_MAGIC,1,int)
#define SET_LED_OFF _IOW(MEMDEV_IOC_MAGIC,2,int)
#define SET_LED_ALL_LIGHTED _IO(MEMDEV_IOC_MAGIC,3)
#define SET_LED_ALL_OFF _IO(MEMDEV_IOC_MAGIC,4)
#define MEMDEV_IOC_MAXNR 4
#endif
2.LED驱动程序
#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<linux/gpio.h>
#include<asm/uaccess.h>
#include<asm/atomic.h>
#include "memdev.h"
#define DEVICE_NAME "leds"
static unsigned long led_table[]={
S3C2410_GPB(5),
S3C2410_GPB(6),
S3C2410_GPB(7),
S3C2410_GPB(8),
};
static unsigned int led_cfg_table[]={
S3C2410_GPIO_OUTPUT,
S3C2410_GPIO_OUTPUT,
S3C2410_GPIO_OUTPUT,
S3C2410_GPIO_OUTPUT,
};
static int mini2440_leds_ioctl(
struct inode* inode,
struct file* file,
unsigned int cmd,
unsigned long arg)
{
int i = 0;
int tmp = arg;
if (_IOC_TYPE(cmd) != MEMDEV_IOC_MAGIC)
return -EINVAL;
if (_IOC_NR(cmd) > MEMDEV_IOC_MAXNR)
return -EINVAL;
switch(cmd)
{
case SET_LED_ALL_OFF:
for (i = 0;i < 4; i++)
s3c2410_gpio_setpin(led_table,1);
return 0;
case SET_LED_ALL_LIGHTED:
for (i = 0; i < 4; i++)
s3c2410_gpio_setpin(led_table,0);
return 0;
case SET_LED_LIGHTED:
s3c2410_gpio_setpin(led_table[arg],0);
return 0;
case SET_LED_OFF:
s3c2410_gpio_setpin(led_table[arg],1);
return 0;
default: return -EINVAL;
}
}
static struct file_operations dev_fops = {
.owner = THIS_MODULE,
.ioctl = mini2440_leds_ioctl,
};
static struct miscdevice misc = {
.minor = MISC_DYNAMIC_MINOR,
.name = DEVICE_NAME,
.fops = &dev_fops,
};
static int __init dev_init(void)
{
int ret;
int i;
for (i =0; i < 4; i++)
{
s3c2410_gpio_cfgpin(led_table,led_cfg_table);
s3c2410_gpio_setpin(led_table,0);
}
ret = misc_register(&misc);
printk (DEVICE_NAME"\tinitialized\n");
return ret;
}
static void __exit dev_exit(void)
{
misc_deregister(&misc);
}
module_init(dev_init);
module_exit(dev_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("wilson Chen");
3。应用测试程序
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#define MEMDEV_IOC_MAGIC 'Z'
#define SET_LED_LIGHTED _IOW(MEMDEV_IOC_MAGIC,1,int)
#define SET_LED_OFF _IOW(MEMDEV_IOC_MAGIC,2,int)
#define SET_LED_ALL_LIGHTED _IO(MEMDEV_IOC_MAGIC,3)
#define SET_LED_ALL_OFF _IO(MEMDEV_IOC_MAGIC,4)
int main(int argc, char **argv)
{
int on;
int led_no;
int fd;
if (argc != 3 || sscanf(argv[1], "%d", &led_no) != 1 || sscanf(argv[2],"%d", &on) != 1 || led_no < 0 || led_no > 3) {
fprintf(stderr, "Usage: leds led_no 0|1\n");
exit(1);
}
fd = open("/dev/leds0", 0);
if (fd < 0) {
fd = open("/dev/leds", 0);
}
if (fd < 0) {
perror("open device leds");
exit(1);
}
switch(on)
{
case 1:ioctl(fd,SET_LED_LIGHTED,led_no);break;
case 2:ioctl(fd,SET_LED_OFF,led_no); break;
case 3:ioctl(fd,SET_LED_ALL_LIGHTED); break;
case 4:ioctl(fd,SET_LED_ALL_OFF); break;
default: break;
}
close(fd);
return 0;
}