#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"); |
|
来自: champion_xu > 《my driver》