/**************************************************************************
驅動框架
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;
}