⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 leds.c

📁 第一个LED灯控制驱动 (基于AT91SAM9260开发板linux2.6.22)
💻 C
字号:
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
#include <asm/arch/io.h>
#include <asm/arch/gpio.h>
#define NAME "leds"
static int major =231;//定义主设备号
static unsigned long led_table [] = //定义不同的led控制引脚
{
    AT91_PIN_PA6,
    AT91_PIN_PA31,
    AT91_PIN_PA16,
    AT91_PIN_PA30,
};
static int myled_driver_open(struct inode *inode,struct file *file)
{
    unsigned m =iminor(inode);
    if(m>63) return -EINVAL;
    printk("led test driver opened!\n");
    return nonseekable_open(inode,file);
}
static int myled_driver_release(struct inode *inode,struct file *file)
{
    printk("my test driver released!\n");
    return 0;
}
static int myled_driver_ioctl(struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg)
{
      unsigned int regled1;
      regled1=gpio_get_value(led_table[arg]);
     // printk("led1 reg is : %d",regled1); 
      at91_set_gpio_output(led_table[arg],1);
      switch(cmd)//控制led_table[arg]的亮灭
      {
        case    0x00:at91_set_gpio_value(led_table[arg],0);
                    // printk("led is L");
                    break;      
        case    0x01:gpio_set_value(led_table[arg],1); 
                    // printk("led is H");
                    break;
        default:    
                    break;    
     }
     return 1;
}
static struct file_operations myled_driver_fops =  
{
    .owner =THIS_MODULE,
    .ioctl =myled_driver_ioctl,
    .open =myled_driver_open,
    .release =myled_driver_release,
};

static int __init myled_driver_init(void) //执行insmod的时候调用次函数
{
       int ret;    
       gpio_set_value(led_table[0],0);
       gpio_set_value(led_table[1],0);
       gpio_set_value(led_table[2],0);
       gpio_set_value(led_table[3],0);
       printk(KERN_ALERT "led modules is install\n");
       ret=register_chrdev(major,NAME,&myled_driver_fops);
       if(ret<0)
        {
             printk("unable to register myled driver!\n");
             return ret;
        }            
       return 0;
}
 
static void __exit myled_driver_exit(void)//执行rmmod的时候调用次函数
{
        unregister_chrdev(major,NAME);
        printk("Goodbye,cruel world!\n");
}
 
module_init(myled_driver_init);
module_exit(myled_driver_exit);

MODULE_AUTHOR("lxs(www.emtronix.com)");
MODULE_DESCRIPTION("this is test modules used to test at91sam9261 led");
MODULE_LICENSE("Dual BSD/GPL");   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -