led驱动代码如下:
#include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/miscdevice.h> #include <linux/ioctl.h> #include <linux/gpio.h> #include <mach/regs-gpio.h> #include "led.h" static int led_open(struct inode *inode, struct file *file) { s3c2410_gpio_cfgpin(S3C2410_GPB(5), S3C2410_GPIO_OUTPUT); s3c2410_gpio_setpin(S3C2410_GPB(5), 1); return 0; } static int led_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { switch (cmd) { case LED_ON: s3c2410_gpio_setpin(S3C2410_GPB(5), 0); return 0; case LED_OFF: s3c2410_gpio_setpin(S3C2410_GPB(5), 1); return 0; default: return -EINVAL; } } static struct file_operations led_fops = { .owner = THIS_MODULE, .open = led_open, .ioctl = led_ioctl, }; static struct miscdevice led_misc = { .minor = MISC_DYNAMIC_MINOR, .name = "led", .fops = &led_fops, }; static int led_init(void) { return misc_register(&led_misc); } static void led_exit(void) { misc_deregister(&led_misc); } MODULE_LICENSE("Dual BSD/GPL"); module_init(led_init); module_exit(led_exit);
#ifndef __LED_H #define __LED_H #define LED_ON _IO('l', 0) #define LED_OFF _IO('l', 1) #endif /* __LED_H */
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/ioctl.h> #include <unistd.h> #include <stdio.h> #include "led.h" int main(void) { int fd; fd = open("/dev/led", O_RDWR); if (fd < 0) { printf("No such device!\n"); return -1; } while (1) { ioctl(fd, LED_ON); sleep(1); ioctl(fd, LED_OFF); sleep(1); } close(fd); return 0; }