leddrv.c

来自「nano2410linux的led驱动」· C语言 代码 · 共 82 行

C
82
字号
#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 + =
减小字号Ctrl + -
显示快捷键?