📄 led.c
字号:
/** ************************************************************************* ** ** includes ** ************************************************************************* **/#include <linux/init.h>#include <linux/module.h>#include <linux/kernel.h>#include <linux/config.h>#include <linux/slab.h>#include <linux/vmalloc.h>#include <linux/ioctl.h>#include <linux/major.h>#include <linux/delay.h>#include <asm/errno.h>#include <asm/irq.h>#include <asm/uaccess.h>#include <asm/io.h>#include <asm/delay.h>#include "led.h"#ifdef __KERNEL_2_6_X__#include <linux/proc_fs.h>#endifvolatile unsigned short * led_base;static int led_open(struct inode* inode, struct file* filp){#ifdef __KERNEL_2_4_X__ MOD_INC_USE_COUNT;#endif
printk("led driver is opened\n"); return 0;}static int led_release(struct inode* inode, struct file* filp){#ifdef __KERNEL_2_4_X__ MOD_DEC_USE_COUNT;#endif
printk("led driver is closed\n"); return 0;}static int led_ioctl (struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg){
printk("led driver ioctl\n"); return ret;}/* LED file operations */static struct file_operations led_fops = { open: led_open, ioctl: led_ioctl, release: led_release};int init_led(void){ volatile int ret; printk("LED Driver Initialized...\n"); led_base = (volatile unsigned short *)ioremap(LED_PHY_ADDR, LED_MAP_SIZE); printk("init_led %p\n",led_base); ret = register_chrdev(LED_MAJOR, "led", &led_fops); if (ret < 0) { printk("init_led: led register failed\n"); return ret; } return 0;}void exit_led(void){ volatile int ret; ret = unregister_chrdev(LED_MAJOR, "led"); if (ret < 0) { printk("exit_led: led unregister failed\n"); return; } iounmap((void *)led_base); return;}module_init(init_led)module_exit(exit_led)#ifdef __KERNEL_2_6_X__MODULE_LICENSE("Dual BSD/GPL");#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -