/************************************************************************** 驅動框架 1、寫出led_open、led_read 2、怎樣告訴內核 a、定義一個file_operations b、把這個結構告訴內核register_chrdev c、誰來調用澹(這個稱為驅動的入口函數) d、修飾 *******************************************************************************************/ #include<linux/module.h> #include<linux/kernel.h> #include<linux/fs.h> #include<linux/init.h> #include<linux/delay.h> #include<asm/uaccess.h> #include<asm/irq.h> #include<asm/io.h> #include<asm/arch/regs-gpio.h> #include<asm/hardware.h> /*打開設備函數*/ static int my_led_open(struct inode *inode,struct file *file) { printk("my_led here\n"); return 0; } /*設備寫函數*/ static ssize_t my_led_write(struct file *file,const char __usr *buf,size_t count,loff_t *ppos) { printk("my_led out\n"); return 0; } /*定義一個file_operations結構*/ static struct file_operations my_led_fops={ .owner = THIS_MODULE, /*這是一個宏,推向編譯模塊時自動創建的__this_module變*/ .open = my_led_open, .open = my_led_write, }; int my_led_init(void)//入口函數 { register_chrdev(111,"my_led",&my_led_fops);//注冊驅動 return 0; } int my_led_exit(void)//出口函數 { unregister_chrdev(111,"my_led");//注銷驅動 return 0; } module_init(my_led_init);//修飾(即用一個宏來定義一個結構體) module_exit(my_led_init);//修飾(即用一個宏來定義一個結構體)
#include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> #include<stdio.h> int main(int argc,char **argv) { int fd; int val = 1; fd = open("/dev/my_led",O_RDWR); if(fd<0) printf("open err\n"); write(fd,&val,4); return 0; }