📄 myled_driver.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 "myfourled"
static int major =231;
static unsigned long led_table [] =
{
AT91_PIN_PA21,
AT91_PIN_PA22,
AT91_PIN_PA26,
AT91_PIN_PA24,
};
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)
{
case 0x00:at91_set_gpio_value(led_table[arg],0);
break;
case 0x01:gpio_set_value(led_table[arg],1);
break;
default:break;
}
return 1;
}
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 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);
}
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 + -