📄 leddrv.c
字号:
#include<linux/config.h>#include<linux/module.h>#include<linux/kernel.h>#include<linux/init.h>#include<linux/miscdevice.h>#include<linux/sched.h>#include<linux/delay.h>#include<linux/poll.h>#include<linux/spinlock.h>#include<linux/irq.h>#include<asm/mach-types.h>#include<asm/hardware.h>#define DEVICE_NAME "ledtest" /*定义led设备名字*/#define LED_MAJOR 230 /*定义led设备主设备号*///适用于2.4与2.6内核的模块许可证声明模板MODULE_LICENSE("GPL");/*LED设备对应的硬件资源*/static unsigned long led_table[]={ GPIO_G2, GPIO_E13, GPIO_E12, GPIO_E11, };/*设备文件操作函数的实现*/static int nano2410av2_leds_ioctl(struct inode * inode,struct file * filp,unsigned int cmd,unsigned long arg){ switch(cmd){ case 0: case 1: if(arg>4){ return -EINVAL; } write_gpio_bit(led_table[arg],!cmd); default: return -EINVAL; }}static struct file_operations nano2410av2_leds_fops={ owner:THIS_MODULE, ioctl:nano2410av2_leds_ioctl,};/*模块初始化*/static devfs_handle_t devfs_handle;static int __init nano2410av2_leds_init(void){ int ret; int i; /*在内核注册设备*/ ret=register_chrdev(LED_MAJOR,DEVICE_NAME,&nano2410av2_leds_fops); if(ret<0){ printk(DEVICE_NAME"can`t register major number\n"); return ret; } //devfs_handle=devfs_register() devfs_handle = devfs_register(NULL, DEVICE_NAME, DEVFS_FL_DEFAULT, LED_MAJOR, 0, S_IFCHR | S_IRUSR | S_IWUSR, &nano2410av2_leds_fops, NULL); for(i=0;i<8;i++){ set_gpio_ctrl(led_table[i] | GPIO_PULLUP_EN | GPIO_MODE_OUT); write_gpio_bit(led_table[i],1); } printk(DEVICE_NAME"initialized\n"); return 0;}static void __exit nano2410av2_leds_exit(void){ //devfs_unregister(devfs_handle); devfs_unregister(devfs_handle); unregister_chrdev(LED_MAJOR,DEVICE_NAME); printk(DEVICE_NAME"removed\n"); //不用devfs注册时不会执行该句!}module_init(nano2410av2_leds_init);module_exit(nano2410av2_leds_exit);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -